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 22 74 6c 73 55 75 69 64 2e nclude "tlsUuid.
0390: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 h".#include <ope
03a0: 6e 73 73 6c 2f 72 73 61 2e 68 3e 0a 23 69 6e 63 nssl/rsa.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 61 lude <openssl/sa
03c0: 66 65 73 74 61 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d festack.h>../* M
03d0: 69 6e 20 4f 70 65 6e 53 53 4c 20 76 65 72 73 69 in OpenSSL versi
03e0: 6f 6e 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 on */.#if OPENSS
03f0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
0400: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 23 < 0x10101000L.#
0410: 65 72 72 6f 72 20 22 4f 6e 6c 79 20 4f 70 65 6e error "Only Open
0420: 53 53 4c 20 76 31 2e 31 2e 31 20 6f 72 20 6c 61 SSL v1.1.1 or la
0430: 74 65 72 20 69 73 20 73 75 70 70 6f 72 74 65 64 ter is supported
0440: 22 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 20 2a ".#endif.../*. *
0450: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 Forward declara
0460: 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69 tions. */..#defi
0470: 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64 73 70 29 ne F2N(key, dsp)
0480: 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e \..(((key) == N
0490: 55 4c 4c 29 20 3f 20 28 63 68 61 72 20 2a 29 4e ULL) ? (char *)N
04a0: 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f 54 72 ULL : \...Tcl_Tr
04b0: 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 anslateFileName(
04c0: 69 6e 74 65 72 70 2c 20 28 6b 65 79 29 2c 20 28 interp, (key), (
04d0: 64 73 70 29 29 29 0a 0a 73 74 61 74 69 63 20 53 dsp)))..static S
04e0: 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69 74 SL_CTX *CTX_Init
04f0: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 (State *statePtr
0500: 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 , int isServer,
0510: 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 int proto, char
0520: 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 2a 63 65 *key,...char *ce
0530: 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 rtfile, unsigned
0540: 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 6e 31 2c char *key_asn1,
0550: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
0560: 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 69 6e 74 cert_asn1,...int
0570: 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e 2c 20 69 key_asn1_len, i
0580: 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65 6e nt cert_asn1_len
0590: 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c 20 , char *CApath,
05a0: 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a 09 09 char *CAfile,...
05b0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 char *ciphers, c
05c0: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
05d0: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 s, int level, ch
05e0: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a ar *DHparams);..
05f0: 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 4c 69 static int.TlsLi
0600: 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 bInit(int uninit
0610: 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 69 6e ialize);..#defin
0620: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 e TLS_PROTO_SSL2
0630: 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20 54 ..0x01.#define T
0640: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 09 30 LS_PROTO_SSL3..0
0650: 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f x02.#define TLS_
0660: 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 30 34 PROTO_TLS1..0x04
0670: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
0680: 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 0a 23 TO_TLS1_1.0x08.#
0690: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f define TLS_PROTO
06a0: 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 64 65 _TLS1_2.0x10.#de
06b0: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 fine TLS_PROTO_T
06c0: 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 66 69 LS1_3.0x20.#defi
06d0: 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c ne ENABLED(flag,
06e0: 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29 20 mask).(((flag)
06f0: 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61 & (mask)) == (ma
0700: 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 53 53 sk))..#define SS
0710: 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 53 53 LKEYLOGFILE.."SS
0720: 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a 2f 2a LKEYLOGFILE"../*
0730: 0a 20 2a 20 54 68 72 65 61 64 2d 53 61 66 65 20 . * Thread-Safe
0740: 54 4c 53 20 43 6f 64 65 0a 20 2a 2f 0a 0a 23 69 TLS Code. */..#i
0750: 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44 53 fdef TCL_THREADS
0760: 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 53 53 4c .#define OPENSSL
0770: 5f 54 48 52 45 41 44 5f 44 45 46 49 4e 45 53 0a _THREAD_DEFINES.
0780: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 #include <openss
0790: 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e 66 2e 68 3e l/opensslconf.h>
07a0: 0a 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c ..#ifdef OPENSSL
07b0: 5f 54 48 52 45 41 44 53 0a 23 69 6e 63 6c 75 64 _THREADS.#includ
07c0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 79 70 74 e <openssl/crypt
07d0: 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f o.h>.#include <o
07e0: 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 0a 2f penssl/ssl.h>../
07f0: 2a 0a 20 2a 20 54 68 72 65 61 64 65 64 20 6f 70 *. * Threaded op
0800: 65 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 73 eration requires
0810: 20 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c 62 61 63 locking callbac
0820: 6b 73 0a 20 2a 20 42 61 73 65 64 20 66 72 6f 6d ks. * Based from
0830: 20 2f 63 72 79 70 74 6f 2f 63 72 79 70 74 6c 69 /crypto/cryptli
0840: 62 2e 63 20 6f 66 20 4f 70 65 6e 53 53 4c 20 61 b.c of OpenSSL a
0850: 6e 64 20 4e 53 4f 70 65 6e 53 53 4c 2e 0a 20 2a nd NSOpenSSL.. *
0860: 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 /..static Tcl_Mu
0870: 74 65 78 20 2a 6c 6f 63 6b 73 20 3d 20 4e 55 4c tex *locks = NUL
0880: 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f L;.static int lo
0890: 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 73 74 cksCount = 0;.st
08a0: 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 69 atic Tcl_Mutex i
08b0: 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64 69 66 20 2f nit_mx;.#endif /
08c0: 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 * OPENSSL_THREAD
08d0: 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 54 S */.#endif /* T
08e0: 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 0a 0c CL_THREADS */...
08f0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
0900: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c 62 ******/./* Callb
0910: 61 63 6b 73 20 20 20 20 20 20 20 20 2a 2f 0a 2f acks */./
0920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0930: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ****/../*. *----
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0980: 20 2a 0a 20 2a 20 45 76 61 6c 20 43 61 6c 6c 62 *. * Eval Callb
0990: 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 ack Command --.
09a0: 2a 0a 20 2a 09 45 76 61 6c 20 63 61 6c 6c 62 61 *. *.Eval callba
09b0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 63 ck command and c
09c0: 61 74 63 68 20 61 6e 79 20 65 72 72 6f 72 73 0a atch any errors.
09d0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
09e0: 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 *.0 = Command re
09f0: 74 75 72 6e 65 64 20 66 61 69 6c 20 6f 72 20 65 turned fail or e
0a00: 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c val returned TCL
0a10: 5f 45 52 52 4f 52 0a 20 2a 09 31 20 3d 20 43 6f _ERROR. *.1 = Co
0a20: 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 73 mmand returned s
0a30: 75 63 63 65 73 73 20 6f 72 20 65 76 61 6c 20 72 uccess or eval r
0a40: 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f 4b 0a 20 eturned TCL_OK.
0a50: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
0a60: 73 3a 0a 20 2a 09 45 76 61 6c 75 61 74 65 73 20 s:. *.Evaluates
0a70: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
0a80: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
0ad0: 61 74 69 63 20 69 6e 74 0a 45 76 61 6c 43 61 6c atic int.EvalCal
0ae0: 6c 62 61 63 6b 28 54 63 6c 5f 49 6e 74 65 72 70 lback(Tcl_Interp
0af0: 20 2a 69 6e 74 65 72 70 2c 20 53 74 61 74 65 20 *interp, State
0b00: 2a 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 4f *statePtr, Tcl_O
0b10: 62 6a 20 2a 63 6d 64 50 74 72 29 20 7b 0a 20 20 bj *cmdPtr) {.
0b20: 20 20 69 6e 74 20 63 6f 64 65 2c 20 6f 6b 20 3d int code, ok =
0b30: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 0;.. dprintf
0b40: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
0b50: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 76 Tcl_Preserve((v
0b60: 6f 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a oid *) interp);.
0b70: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
0b80: 28 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 ((void *) stateP
0b90: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 tr);.. /* Eva
0ba0: 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 l callback with
0bb0: 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f success for ok o
0bc0: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 31 r return value 1
0bd0: 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 , fail for error
0be0: 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 or return value
0bf0: 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 0 */. Tcl_Re
0c00: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 setResult(interp
0c10: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 );. code = Tc
0c20: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 l_EvalObjEx(inte
0c30: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f rp, cmdPtr, TCL_
0c40: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 EVAL_GLOBAL);.
0c50: 20 20 64 70 72 69 6e 74 66 28 22 45 76 61 6c 43 dprintf("EvalC
0c60: 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f allback: %d", co
0c70: 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 de);. if (cod
0c80: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 e == TCL_OK) {..
0c90: 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74 20 /* Check result
0ca0: 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 for return value
0cb0: 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 */..Tcl_Obj *re
0cc0: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 sult = Tcl_GetOb
0cd0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b jResult(interp);
0ce0: 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 ..if (result ==
0cf0: 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 NULL || Tcl_GetI
0d00: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
0d10: 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 , result, &ok) !
0d20: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
0d30: 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 ok = 1;..}..dpr
0d40: 69 6e 74 66 28 22 52 65 73 75 6c 74 3a 20 25 64 intf("Result: %d
0d50: 22 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c ", ok);. } el
0d60: 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d se {../* Error -
0d70: 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 reject the cert
0d80: 69 66 69 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 ificate */..dpri
0d90: 6e 74 66 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f ntf("Tcl_Backgro
0da0: 75 6e 64 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 undError");.#if
0db0: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
0dc0: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
0dd0: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
0de0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
0df0: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
0e00: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
0e10: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
0e20: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
0e30: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
0e40: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 76 Tcl_Release((v
0e50: 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 oid *) statePtr)
0e60: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
0e70: 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 65 72 e((void *) inter
0e80: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f p);. return o
0e90: 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d k;.}.../*. *----
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0ee0: 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 *. * InfoCallba
0ef0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 ck --. *. *.Moni
0f00: 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 tors SSL connect
0f10: 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 ion process. *.
0f20: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
0f30: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
0f40: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
0f50: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
0f60: 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ined). *. *-----
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0fb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 49 */.static void.I
0fc0: 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 nfoCallback(cons
0fd0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 t SSL *ssl, int
0fe0: 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 0a where, int ret).
0ff0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
1000: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
1010: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 SSL_get_app_data
1020: 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 ((SSL *)ssl);.
1030: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
1040: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
1050: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
1060: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
1070: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 61 const char *ma
1080: 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 jor, *minor;..
1090: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
10a0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
10b0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
10c0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
10d0: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 LL)..return;..
10e0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 if (where & SS
10f0: 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 L_CB_HANDSHAKE_S
1100: 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d TART) {..major =
1110: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d "handshake";..m
1120: 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 3b 0a inor = "start";.
1130: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 } else if (w
1140: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 here & SSL_CB_HA
1150: 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a NDSHAKE_DONE) {.
1160: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 .major = "handsh
1170: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 ake";..minor = "
1180: 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 done";. } els
1190: 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65 20 26 e {..if (where &
11a0: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 SSL_CB_ALERT)..
11b0: 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b major = "alert";
11c0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 ..else if (where
11d0: 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 & SSL_ST_CONNEC
11e0: 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e T).major = "conn
11f0: 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 ect";..else if (
1200: 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 where & SSL_ST_A
1210: 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 CCEPT)..major =
1220: 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 "accept";..else.
1230: 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b ....major = "unk
1240: 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 nown";...if (whe
1250: 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 re & SSL_CB_READ
1260: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 )..minor = "read
1270: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 ";..else if (whe
1280: 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 re & SSL_CB_WRIT
1290: 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 E)..minor = "wri
12a0: 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 te";..else if (w
12b0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f here & SSL_CB_LO
12c0: 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f OP)..minor = "lo
12d0: 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 op";..else if (w
12e0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 here & SSL_CB_EX
12f0: 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 IT)..minor = "ex
1300: 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d it";..else.....m
1310: 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 inor = "unknown"
1320: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
1330: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
1340: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
1350: 63 68 61 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e chan, major, min
1360: 6f 72 2c 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 or, message, and
1370: 20 74 79 70 65 20 61 72 67 73 20 2a 2f 0a 20 20 type args */.
1380: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
1390: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
13a0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
13b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
13c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
13d0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
13e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
13f0: 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 info", -1));.
1400: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
1410: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1420: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
1430: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1440: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
1450: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
1460: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 f), -1));. Tc
1470: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1480: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
1490: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
14a0: 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d ringObj(major, -
14b0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
14c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
14d0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
14e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
14f0: 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a bj(minor, -1));.
1500: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 . if (where &
1510: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b SSL_CB_ALERT) {
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 69 6e 74 65 72 endElement(inter
1540: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
1550: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1560: 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f (SSL_alert_desc_
1570: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 string_long(ret)
1580: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
1590: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
15a0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
15b0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
15c0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 ringObj(SSL_aler
15d0: 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f t_type_string_lo
15e0: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 ng(ret), -1));.
15f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c } else {..Tcl
1600: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1610: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1620: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
1630: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
1640: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e state_string_lon
1650: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 g(ssl), -1));..T
1660: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1670: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1680: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
1690: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c tringObj("info",
16a0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 -1));. }..
16b0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
16c0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
16d0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
16e0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
16f0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
1700: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
1710: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
1720: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
1730: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Ptr);.}.../*. *-
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1780: 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 --. *. * Message
1790: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 Callback --. *.
17a0: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 *.Monitors SSL p
17b0: 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 rotocol messages
17c0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
17d0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
17e0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
17f0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
1800: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1850: 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 ---. */.#ifndef
1860: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 OPENSSL_NO_SSL_T
1870: 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 RACE.static void
1880: 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b .MessageCallback
1890: 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e (int write_p, in
18a0: 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 t version, int c
18b0: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e ontent_type, con
18c0: 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 st void *buf, si
18d0: 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 ze_t len, SSL *s
18e0: 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b sl, void *arg) {
18f0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
1900: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
1910: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
1920: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
1930: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
1940: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
1950: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65 tr;. char *ve
1960: 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 r, *type;. BI
1970: 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 O *bio;. char
1980: 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a buffer[15000];.
1990: 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 buffer[0] =
19a0: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
19b0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
19c0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
19d0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f llback == (Tcl_O
19e0: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 bj*)NULL)..retur
19f0: 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76 n;.. switch(v
1a00: 65 72 73 69 6f 6e 29 20 7b 0a 20 20 20 20 63 61 ersion) {. ca
1a10: 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a se TLS1_VERSION:
1a20: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b ..ver = "TLSv1";
1a30: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1a40: 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e e TLS1_1_VERSION
1a50: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e :..ver = "TLSv1.
1a60: 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 1";..break;.
1a70: 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 case TLS1_2_VERS
1a80: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 ION:..ver = "TLS
1a90: 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 v1.2";..break;.
1aa0: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 case TLS1_3_V
1ab0: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 ERSION:..ver = "
1ac0: 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b TLSv1.3";..break
1ad0: 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76 ;. case 0:..v
1ae0: 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 er = "none";..br
1af0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 eak;. default
1b00: 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 :..ver = "unknow
1b10: 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 n";..break;.
1b20: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 }.. switch (c
1b30: 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 ontent_type) {.
1b40: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1b50: 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 HEADER:..type =
1b60: 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b "Header";..break
1b70: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1b80: 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 RT_INNER_CONTENT
1b90: 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 _TYPE:..type = "
1ba0: 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 Inner Content Ty
1bb0: 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 pe";..break;.
1bc0: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 case SSL3_RT_CH
1bd0: 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 ANGE_CIPHER_SPEC
1be0: 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 :..type = "Chang
1bf0: 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61 e Cipher";..brea
1c00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 k;. case SSL3
1c10: 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 _RT_ALERT:..type
1c20: 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 = "Alert";..bre
1c30: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c ak;. case SSL
1c40: 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 3_RT_HANDSHAKE:.
1c50: 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61 .type = "Handsha
1c60: 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 ke";..break;.
1c70: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 case SSL3_RT_AP
1c80: 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a PLICATION_DATA:.
1c90: 09 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74 .type = "App Dat
1ca0: 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 a";..break;.#if
1cb0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
1cc0: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
1cd0: 30 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54 000L. case DT
1ce0: 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 LS1_RT_HEARTBEAT
1cf0: 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 :..type = "Heart
1d00: 62 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 beat";..break;.#
1d10: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c endif. defaul
1d20: 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e t:..type = "unkn
1d30: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 own";. }..
1d40: 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c /* Needs compil
1d50: 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 e time option "e
1d60: 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 nable-ssl-trace"
1d70: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69 . */. if ((bi
1d80: 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f o = BIO_new(BIO_
1d90: 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c s_mem())) != NUL
1da0: 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 L) {..int n;..SS
1db0: 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c L_trace(write_p,
1dc0: 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e version, conten
1dd0: 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e t_type, buf, len
1de0: 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 , ssl, (void *)b
1df0: 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 io);..n = BIO_re
1e00: 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 ad(bio, buffer,
1e10: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 BIO_pending(bio)
1e20: 20 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 < 15000 ? BIO_p
1e30: 65 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 ending(bio) : 14
1e40: 39 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 999);..n = (n<0)
1e50: 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 ? 0 : n;..buffe
1e60: 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 r[n] = 0;..(void
1e70: 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b )BIO_flush(bio);
1e80: 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b ..BIO_free(bio);
1e90: 0a 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 . }.. /* Cr
1ea0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
1eb0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
1ec0: 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 76 an, direction, v
1ed0: 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20 61 6e ersion, type, an
1ee0: 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 20 2a d message args *
1ef0: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
1f00: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
1f10: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
1f20: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 ck);. Tcl_Lis
1f30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1f40: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
1f50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
1f60: 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 2d 31 bj("message", -1
1f70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
1f80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1f90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
1fa0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
1fb0: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
1fc0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
1fd0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
1fe0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1ff0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2000: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
2010: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 77 l_NewStringObj(w
2020: 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 22 20 rite_p ? "Sent"
2030: 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 2d 31 : "Received", -1
2040: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2050: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2060: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2070: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2080: 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20 20 j(ver, -1));.
2090: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
20a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
20b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
20c0: 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 65 2c wStringObj(type,
20d0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
20e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
20f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2100: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
2110: 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 gObj(buffer, -1)
2120: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 );.. /* Eval
2130: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
2140: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
2150: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
2160: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 ;. EvalCallba
2170: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ck(interp, state
2180: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 Ptr, cmdPtr);.
2190: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
21a0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 nt(cmdPtr);.}.#e
21b0: 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ndif.../*. *----
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2200: 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c *. * VerifyCall
2210: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f back --. *. *.Mo
2220: 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 nitors SSL certi
2230: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f ficate validatio
2240: 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 64 20 n process. Used
2250: 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 to control the.
2260: 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20 *.behavior when
2270: 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 the SSL_VERIFY_P
2280: 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 74 2e EER flag is set.
2290: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 0a This is called.
22a0: 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 63 65 *.whenever a ce
22b0: 72 74 69 66 69 63 61 74 65 20 69 73 20 69 6e 73 rtificate is ins
22c0: 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 64 65 pected or decide
22d0: 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c 65 d invalid. Calle
22e0: 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 63 65 d for. *.each ce
22f0: 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 68 65 rtificate in the
2300: 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a 0a cert chain.. *.
2310: 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 54 68 * Checks:. *.Th
2320: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 63 68 e certificate ch
2330: 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 ain is checked s
2340: 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 tarting with the
2350: 20 64 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 deepest nesting
2360: 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 level. *. (the
2370: 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 root CA certifi
2380: 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 cate) and worked
2390: 20 75 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 upward to the p
23a0: 65 65 72 27 73 20 63 65 72 74 69 66 69 63 61 74 eer's certificat
23b0: 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 e.. *.All signat
23c0: 75 72 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 ures are valid,
23d0: 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 current time is
23e0: 77 69 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 within first and
23f0: 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 last validity t
2400: 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 ime.. *.Check th
2410: 61 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61 at the certifica
2420: 74 65 20 69 73 20 69 73 73 75 65 64 20 62 79 20 te is issued by
2430: 74 68 65 20 69 73 73 75 65 72 20 63 65 72 74 69 the issuer certi
2440: 66 69 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 ficate issuer..
2450: 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f *.Check the revo
2460: 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f cation status fo
2470: 72 20 65 61 63 68 20 63 65 72 74 69 66 69 63 61 r each certifica
2480: 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 te.. *.Check the
2490: 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 validity of the
24a0: 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 given CRL and t
24b0: 68 65 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 he cert revocati
24c0: 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 on status.. *.Ch
24d0: 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 eck the policies
24e0: 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 of all the cert
24f0: 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 ificates. *. * A
2500: 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 rgs. *.preverify
2510: 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 _ok indicates wh
2520: 65 74 68 65 72 20 74 68 65 20 63 65 72 74 69 66 ether the certif
2530: 69 63 61 74 65 20 76 65 72 69 66 69 63 61 74 69 icate verificati
2540: 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 on passed (1) or
2550: 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 not (0). *. * R
2560: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c esults:. *.A cal
2570: 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 lback bound to t
2580: 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 he socket may re
2590: 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 turn one of:. *.
25a0: 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 0...- the ce
25b0: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 rtificate is dee
25c0: 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e med invalid, sen
25d0: 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 d verification.
25e0: 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 *.... failure a
25f0: 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e lert to peer, an
2600: 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 d terminate hand
2610: 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 shake.. *. 1.
2620: 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 ..- the certific
2630: 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 ate is deemed va
2640: 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 lid, continue wi
2650: 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a th handshake.. *
2660: 09 20 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e . empty strin
2670: 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f g.- no change to
2680: 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c certificate val
2690: 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 idation. *. * Si
26a0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 de effects:. *.T
26b0: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 he err field of
26c0: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 the currently op
26d0: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73 erative State is
26e0: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 set. *. to a s
26f0: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 tring describing
2700: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 the SSL negotia
2710: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 tion failure rea
2720: 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d son. *. *-------
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
2770: 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 .static int.Veri
2780: 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f fyCallback(int o
2790: 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 k, X509_STORE_CT
27a0: 58 20 2a 63 74 78 29 0a 7b 0a 20 20 20 20 54 63 X *ctx).{. Tc
27b0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
27c0: 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d SSL *ssl..=
27d0: 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 (SSL*)X509_STOR
27e0: 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 E_CTX_get_ex_dat
27f0: 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 a(ctx, SSL_get_e
2800: 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 x_data_X509_STOR
2810: 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 E_CTX_idx());.
2820: 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d X509 *cert..=
2830: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
2840: 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 get_current_cert
2850: 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 (ctx);. State
2860: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 *statePtr.= (St
2870: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 ate*)SSL_get_app
2880: 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 _data(ssl);.
2890: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
28a0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
28b0: 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 nterp;. int d
28c0: 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f epth..= X509_STO
28d0: 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 RE_CTX_get_error
28e0: 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 _depth(ctx);.
28f0: 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 int err..= X509
2900: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 _STORE_CTX_get_e
2910: 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 rror(ctx);..
2920: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
2930: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 );. dprintf("
2940: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 VerifyCallback:
2950: 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 %d", ok);.. i
2960: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d f (statePtr->vcm
2970: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e d == (Tcl_Obj*)N
2980: 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f ULL) {../* Use o
2990: 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72 69 66 k value if verif
29a0: 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 ication is requi
29b0: 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 red */..if (stat
29c0: 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 ePtr->vflags & S
29d0: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 SL_VERIFY_FAIL_I
29e0: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 F_NO_PEER_CERT)
29f0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b {.. return ok
2a00: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
2a10: 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 return 1;..}.
2a20: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 } else if (cer
2a30: 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c t == NULL || ssl
2a40: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
2a50: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 urn 0;. }..
2a60: 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 dprintf("Verif
2a70: 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20 yCallback: eval
2a80: 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 callback");..
2a90: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
2aa0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 nd to eval with
2ab0: 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74 68 2c fn, chan, depth,
2ac0: 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c cert info list,
2ad0: 20 73 74 61 74 75 73 2c 20 61 6e 64 20 65 72 72 status, and err
2ae0: 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 or args */. c
2af0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
2b00: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
2b10: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 r->vcmd);. Tc
2b20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2b30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2b40: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
2b50: 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 22 ringObj("verify"
2b60: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
2b70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2b80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
2b90: 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 Ptr,..Tcl_NewStr
2ba0: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
2bb0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
2bc0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
2bd0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2be0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2bf0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
2c00: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 70 74 l_NewIntObj(dept
2c10: 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 h));. Tcl_Lis
2c20: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2c30: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2c40: 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a , Tls_NewX509Obj
2c50: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b (interp, cert));
2c60: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2c70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2c80: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
2c90: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 l_NewIntObj(ok))
2ca0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2cb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2cc0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
2cd0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2ce0: 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 ((char*)X509_ver
2cf0: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 ify_cert_error_s
2d00: 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 tring(err), -1))
2d10: 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e ;.. /* Preven
2d20: 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c t I/O while call
2d30: 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 back is in progr
2d40: 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 ess */. /* st
2d50: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d atePtr->flags |=
2d60: 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 TLS_TCL_CALLBAC
2d70: 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 K; */.. /* Ev
2d80: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
2d90: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
2da0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
2db0: 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 tr);. ok = Ev
2dc0: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 alCallback(inter
2dd0: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 p, statePtr, cmd
2de0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 Ptr);. Tcl_De
2df0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
2e00: 72 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 r);.. dprintf
2e10: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b ("VerifyCallback
2e20: 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 : command result
2e30: 20 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 = %d", ok);..
2e40: 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 /* statePtr->f
2e50: 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 lags &= ~(TLS_TC
2e60: 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a L_CALLBACK); */.
2e70: 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f return ok;./
2e80: 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 * By default, le
2e90: 61 76 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e ave verification
2ea0: 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d unchanged. */.}
2eb0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
2f00: 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 * Tls_Error --.
2f10: 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 *. *.Calls callb
2f20: 61 63 6b 20 77 69 74 68 20 65 72 72 6f 72 20 6d ack with error m
2f30: 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 essage.. *. * Si
2f40: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 de effects:. *.T
2f50: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 he err field of
2f60: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 the currently op
2f70: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73 erative State is
2f80: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 set. *. to a s
2f90: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 tring describing
2fa0: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 the SSL negotia
2fb0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 tion failure rea
2fc0: 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d son. *. *-------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3010: 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 .void.Tls_Error(
3020: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c State *statePtr,
3030: 20 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 char *msg) {.
3040: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
3050: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
3060: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
3070: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c _Obj *cmdPtr, *l
3080: 69 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 istPtr;. unsi
3090: 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 gned long err;.
30a0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 statePtr->err
30b0: 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 = msg;.. dpr
30c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
30d0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
30e0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 r->callback == (
30f0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 Tcl_Obj*)NULL)..
3100: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 return;.. /*
3110: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
3120: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
3130: 63 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67 chan, and messag
3140: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d e args */. cm
3150: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
3160: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
3170: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ->callback);.
3180: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3190: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
31a0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
31b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f wStringObj("erro
31c0: 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 r", -1));. Tc
31d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
31e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
31f0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
3200: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
3210: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
3220: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
3230: 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d -1));. if (m
3240: 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 sg != NULL) {..T
3250: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3260: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3270: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
3280: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 tringObj(msg, -1
3290: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 ));.. } else
32a0: 69 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 if ((msg = Tcl_G
32b0: 65 74 53 74 72 69 6e 67 28 54 63 6c 5f 47 65 74 etString(Tcl_Get
32c0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
32d0: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ))) != NULL) {..
32e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
32f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
3300: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
3310: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d StringObj(msg, -
3320: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 1));.. } else
3330: 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 {..listPtr = Tc
3340: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
3350: 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 NULL);..while ((
3360: 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 err = ERR_get_er
3370: 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 ror()) != 0) {..
3380: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3390: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
33a0: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 erp, listPtr, Tc
33b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 l_NewStringObj(E
33c0: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f RR_reason_error_
33d0: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 string(err), -1)
33e0: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f );..}..Tcl_ListO
33f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3400: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3410: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a listPtr);. }.
3420: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
3430: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
3440: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
3450: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
3460: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 EvalCallback(
3470: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
3480: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
3490: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
34a0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a cmdPtr);.}.../*.
34b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c -----. *. * KeyL
3500: 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a ogCallback --. *
3510: 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 . *.Write receiv
3520: 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c ed key data to l
3530: 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 og file.. *. * S
3540: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
3550: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d none. *. *------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
35a0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c /.void KeyLogCal
35b0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
35c0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 *ssl, const char
35d0: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 *line) {. ch
35e0: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 ar *str = getenv
35f0: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b (SSLKEYLOGFILE);
3600: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a . FILE *fd;..
3610: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
3620: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
3630: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 str) {..fd = fop
3640: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 en(str, "a");..f
3650: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e printf(fd, "%s\n
3660: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 ",line);..fclose
3670: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a (fd);. }.}...
3680: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 --------. *. * P
36d0: 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b assword Callback
36e0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 --. *. *.Called
36f0: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 when a password
3700: 20 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 61 is needed for a
3710: 20 70 72 69 76 61 74 65 20 6b 65 79 20 77 68 65 private key whe
3720: 6e 20 6c 6f 61 64 69 6e 67 0a 20 2a 09 6f 72 20 n loading. *.or
3730: 73 74 6f 72 69 6e 67 20 61 20 50 45 4d 20 63 65 storing a PEM ce
3740: 72 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 rtificate with e
3750: 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 ncryption. Evals
3760: 20 63 61 6c 6c 62 61 63 6b 0a 20 2a 09 73 63 72 callback. *.scr
3770: 69 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 ipt and returns
3780: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 the result as th
3790: 65 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e e password strin
37a0: 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 g in buf.. *. *
37b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 Results:. *.None
37c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
37d0: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 cts:. *.Calls ca
37e0: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e llback (if defin
37f0: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e ed). *. * Return
3800: 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 s:. *.Password s
3810: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 ize in bytes or
3820: 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e -1 for an error.
3830: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
3880: 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 atic int.Passwor
3890: 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a dCallback(char *
38a0: 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 buf, int size, i
38b0: 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 nt rwflag, void
38c0: 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 *udata) {. St
38d0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 ate *statePtr.=
38e0: 28 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b (State *) udata;
38f0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
3900: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
3910: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
3920: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
3930: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 . int code;.
3940: 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b Tcl_Size len;
3950: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
3960: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
3970: 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c If no callback,
3980: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c use default cal
3990: 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 lback */. if
39a0: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
39b0: 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ord == NULL) {..
39c0: 69 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 if (Tcl_EvalEx(i
39d0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 nterp, "tls::pas
39e0: 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f sword", -1, TCL_
39f0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 EVAL_GLOBAL) ==
3a00: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 TCL_OK) {.. c
3a10: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 har *ret = (char
3a20: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e *) Tcl_GetStrin
3a30: 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 gFromObj(Tcl_Get
3a40: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
3a50: 29 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 ), &len);.. i
3a60: 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 f (len > (Tcl_Si
3a70: 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 09 ze) size-1) {...
3a80: 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 len = (Tcl_Size)
3a90: 20 73 69 7a 65 2d 31 3b 0a 09 20 20 20 20 7d 0a size-1;.. }.
3aa0: 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 . strncpy(buf
3ab0: 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 , ret, (size_t)
3ac0: 6c 65 6e 29 3b 0a 09 20 20 20 20 62 75 66 5b 6c len);.. buf[l
3ad0: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20 en] = '\0';..
3ae0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 return (int) le
3af0: 6e 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 n;..} else {..
3b00: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a return -1;..}.
3b10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
3b20: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
3b30: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 72 77 eval with fn, rw
3b40: 66 6c 61 67 2c 20 61 6e 64 20 73 69 7a 65 20 61 flag, and size a
3b50: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
3b60: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
3b70: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 eObj(statePtr->p
3b80: 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 assword);. Tc
3b90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3ba0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3bb0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
3bc0: 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 ringObj("passwor
3bd0: 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 d", -1));. Tc
3be0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3bf0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3c00: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e mdPtr, Tcl_NewIn
3c10: 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 tObj(rwflag));.
3c20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3c30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3c40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3c50: 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 NewIntObj(size))
3c60: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 ;.. Tcl_Prese
3c70: 72 76 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 rve((void *) int
3c80: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 erp);. Tcl_Pr
3c90: 65 73 65 72 76 65 28 28 76 6f 69 64 20 2a 29 20 eserve((void *)
3ca0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
3cb0: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
3cc0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
3cd0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
3ce0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
3cf0: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
3d00: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
3d10: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
3d20: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
3d30: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
3d40: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
3d50: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
3d60: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
3d70: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
3d80: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
3d90: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
3da0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
3db0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
3dc0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
3dd0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
3de0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
3df0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
3e00: 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 void *) statePtr
3e10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 );.. /* If su
3e20: 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62 ccessful, pass b
3e30: 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72 ack password str
3e40: 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65 ing and truncate
3e50: 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a if too long */.
3e60: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 if (code ==
3e70: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20 TCL_OK) {..char
3e80: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 *ret = (char *)
3e90: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
3ea0: 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 mObj(Tcl_GetObjR
3eb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 esult(interp), &
3ec0: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e len);..if (len >
3ed0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 (Tcl_Size) size
3ee0: 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d -1) {.. len =
3ef0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 (Tcl_Size) size
3f00: 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28 -1;..}..strncpy(
3f10: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f buf, ret, (size_
3f20: 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65 t) len);..buf[le
3f30: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f n] = '\0';..Tcl_
3f40: 52 65 6c 65 61 73 65 28 28 76 6f 69 64 20 2a 29 Release((void *)
3f50: 20 69 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 interp);..retur
3f60: 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20 n (int) len;.
3f70: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 }. Tcl_Relea
3f80: 73 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 65 se((void *) inte
3f90: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 rp);. return
3fa0: 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d -1;.}.../*. *---
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ff0: 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 . *. * Session C
4000: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 allback for Clie
4010: 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c nts --. *. *.Cal
4020: 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73 led when a new s
4030: 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20 ession is added
4040: 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e to the cache. In
4050: 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 TLS 1.3. *.this
4060: 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64 may be received
4070: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 multiple times
4080: 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 after the handsh
4090: 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c ake. For. *.earl
40a0: 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 ier versions, th
40b0: 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 is will be recei
40c0: 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 ved during the h
40d0: 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 andshake.. *.Thi
40e0: 73 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72 s is the preferr
40f0: 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e ed way to obtain
4100: 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73 a resumable ses
4110: 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 sion.. *. * Resu
4120: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
4130: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4140: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
4150: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
4160: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
4170: 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 es:. *.0 = error
4180: 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77 where session w
4190: 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65 ill be immediate
41a0: 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 ly removed from
41b0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 the internal cac
41c0: 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 he.. *.1 = succe
41d0: 73 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74 ss where app ret
41e0: 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 ains session in
41f0: 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 session cache, a
4200: 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c nd must call SSL
4210: 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 _SESSION_free()
4220: 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a when done.. *. *
4230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4270: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
4280: 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 nt.SessionCallba
4290: 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c ck(SSL *ssl, SSL
42a0: 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f _SESSION *sessio
42b0: 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a n) {. State *
42c0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
42d0: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 e*)SSL_get_app_d
42e0: 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b ata((SSL *)ssl);
42f0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
4300: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
4310: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
4320: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
4330: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
4340: 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 ned char *ticket
4350: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
4360: 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 gned char *sessi
4370: 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f on_id;. size_
4380: 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 t len2;. unsi
4390: 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a gned int ulen;..
43a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
43b0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
43c0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
43d0: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
43e0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
43f0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
4400: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 K;. } else if
4410: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b (ssl == NULL) {
4420: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
4430: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4440: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
4450: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
4460: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 val with fn, cha
4470: 6e 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 n, session id, s
4480: 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 ession ticket, a
4490: 6e 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73 nd lifetime args
44a0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
44b0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
44c0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c j(statePtr->call
44d0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c back);. Tcl_L
44e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
44f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4500: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
4510: 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 gObj("session",
4520: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
4530: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4540: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4550: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
4560: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
4570: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
4580: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
4590: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 );.. /* Sessi
45a0: 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 on id */. ses
45b0: 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 sion_id = SSL_SE
45c0: 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 SSION_get_id(ses
45d0: 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 sion, &ulen);.
45e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
45f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4600: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
4610: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 ewByteArrayObj(s
4620: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f ession_id, (Tcl_
4630: 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 Size) ulen));..
4640: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 /* Session ti
4650: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f cket */. SSL_
4660: 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 SESSION_get0_tic
4670: 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 ket(session, &ti
4680: 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 cket, &len2);.
4690: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
46a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
46b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
46c0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 ewByteArrayObj(t
46d0: 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 icket, (Tcl_Size
46e0: 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f ) len2));.. /
46f0: 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d * Lifetime - num
4700: 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a ber of seconds *
4710: 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 /. Tcl_ListOb
4720: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4730: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
4740: 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 Tcl_NewLongObj((
4750: 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f long) SSL_SESSIO
4760: 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 N_get_ticket_lif
4770: 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 etime_hint(sessi
4780: 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 on)));.. /* E
4790: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
47a0: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mand */. Tcl_
47b0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
47c0: 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 Ptr);. EvalCa
47d0: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 llback(interp, s
47e0: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 tatePtr, cmdPtr)
47f0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 ;. Tcl_DecrRe
4800: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
4810: 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30 . /* Return 0
4820: 20 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73 for now until s
4830: 65 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 ession handling
4840: 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 is complete */.
4850: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c return 0;.}..
4860: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
48b0: 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f ALPN Callback fo
48c0: 72 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 r Servers and NP
48d0: 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 N Callback for C
48e0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 lients --. *. *.
48f0: 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c Perform protocol
4900: 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 (http/1.1, h2,
4910: 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 h3, etc.) select
4920: 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 ion for the. *.i
4930: 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 ncoming connecti
4940: 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 on. Called after
4950: 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 Hello and serve
4960: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 r callbacks.. *.
4970: 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 Where 'out' is s
4980: 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
4990: 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 and 'in' is the
49a0: 20 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 peer advertised
49b0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 list.. *. * Res
49c0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
49d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
49e0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
49f0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
4a00: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
4a10: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
4a20: 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 XT_ERR_OK: ALPN
4a30: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 protocol selecte
4a40: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f d. The connectio
4a50: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 n continues.. *.
4a60: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
4a70: 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 LERT_FATAL: Ther
4a80: 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 e was no overlap
4a90: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 between the cli
4aa0: 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 ent's. *. sup
4ab0: 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 plied list and t
4ac0: 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 he server config
4ad0: 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e uration. The con
4ae0: 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 nection will be
4af0: 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f aborted.. *.SSL_
4b00: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
4b10: 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 : ALPN protocol
4b20: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e not selected, e.
4b30: 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 g., because no A
4b40: 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f LPN. *. proto
4b50: 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 cols are configu
4b60: 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e red for this con
4b70: 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e nection. The con
4b80: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
4b90: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d s.. *. *--------
4ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
4be0: 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 static int.ALPNC
4bf0: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c allback(SSL *ssl
4c00: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 , const unsigned
4c10: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 char **out, uns
4c20: 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c igned char *outl
4c30: 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 en,..const unsig
4c40: 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e ned char *in, un
4c50: 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e signed int inlen
4c60: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 , void *arg) {.
4c70: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
4c80: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 tr = (State*)arg
4c90: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
4ca0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
4cb0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
4cc0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
4cd0: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 ;. int code,
4ce0: 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 res;.. dprint
4cf0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
4d00: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c if (ssl == NUL
4d10: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c L || arg == NULL
4d20: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
4d30: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
4d40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
4d50: 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 Select protocol
4d60: 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 */. if (SSL_s
4d70: 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f elect_next_proto
4d80: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ((unsigned char
4d90: 2a 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c **) out, outlen,
4da0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
4db0: 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f s, statePtr->pro
4dc0: 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e tos_len,..in, in
4dd0: 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f len) == OPENSSL_
4de0: 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 NPN_NEGOTIATED)
4df0: 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e {../* Match foun
4e00: 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f d */..res = SSL_
4e10: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
4e20: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 } else {../*
4e30: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f OPENSSL_NPN_NO_O
4e40: 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 VERLAP = No over
4e50: 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 lap, so use firs
4e60: 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 t item from clie
4e70: 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 nt protocol list
4e80: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 */..res = SSL_T
4e90: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4ea0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
4eb0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
4ec0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
4ed0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b ) {..return res;
4ee0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
4ef0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
4f00: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 eval with fn, c
4f10: 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 han, depth, cert
4f20: 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 info list, stat
4f30: 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 us, and error ar
4f40: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 gs */. cmdPtr
4f50: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
4f60: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 Obj(statePtr->vc
4f70: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 md);. Tcl_Lis
4f80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4f90: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4fa0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
4fb0: 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b bj("alpn", -1));
4fc0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4fd0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4fe0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
4ff0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
5000: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
5010: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
5020: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
5030: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
5040: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
5050: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
5060: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e ewStringObj((con
5070: 73 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c st char *) *out,
5080: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
5090: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
50a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
50b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 tr, Tcl_NewBoole
50c0: 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c anObj(res == SSL
50d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 _TLSEXT_ERR_OK))
50e0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
50f0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
5100: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
5110: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
5120: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d . if ((code =
5130: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
5140: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
5150: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a cmdPtr)) > 1) {.
5160: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 .res = SSL_TLSEX
5170: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
5180: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 } else if (code
5190: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 == 1) {..res =
51a0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
51b0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a K;. } else {.
51c0: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 .res = SSL_TLSEX
51d0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 T_ERR_ALERT_FATA
51e0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c L;. }. Tcl
51f0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
5200: 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 dPtr);. retur
5210: 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a n res;.}.../*. *
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5260: 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 ---. *. * Advert
5270: 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 ise Protocols Ca
5280: 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 llback for Next
5290: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 Protocol Negotia
52a0: 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 tion (NPN) in Se
52b0: 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a rverHello --. *.
52c0: 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 *.called when a
52d0: 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 TLS server need
52e0: 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 s a list of supp
52f0: 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 orted protocols
5300: 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 for Next. *.Prot
5310: 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e ocol Negotiation
5320: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
5330: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
5340: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a ide effects:. *.
5350: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
5360: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
5370: 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f RR_OK: NPN proto
5380: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 col selected. Th
5390: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
53a0: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 tinues.. *.SSL_T
53b0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
53c0: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f NPN protocol no
53d0: 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 t selected. The
53e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
53f0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nues.. *. *-----
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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5440: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 */.#ifdef USE_NP
5450: 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e N.static int.NPN
5460: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
5470: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 SL *ssl, const u
5480: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f nsigned char **o
5490: 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 ut, unsigned int
54a0: 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a *outlen, void *
54b0: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
54c0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
54d0: 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 ate*)arg;.. d
54e0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
54f0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d ;.. if (ssl =
5500: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d = NULL || arg ==
5510: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
5520: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5530: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
5540: 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f /* Set protoco
5550: 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 ls list */. i
5560: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f f (statePtr->pro
5570: 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 tos != NULL) {..
5580: 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d *out = statePtr-
5590: 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 >protos;..*outle
55a0: 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 n = statePtr->pr
55b0: 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 otos_len;. }
55c0: 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e else {..*out = N
55d0: 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 ULL;..*outlen =
55e0: 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 0;..return SSL_T
55f0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
5600: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
5610: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
5620: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a _OK;.}.#endif...
5630: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
5640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5670: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
5680: 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 NI Callback for
5690: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a Servers --. *. *
56a0: 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d .Perform server-
56b0: 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d side SNI hostnam
56c0: 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 e selection afte
56d0: 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 r receiving SNI
56e0: 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 extension. *.in
56f0: 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 Client Hello. Ca
5700: 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f lled after hello
5710: 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 callback but be
5720: 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 fore ALPN callba
5730: 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ck.. *. * Result
5740: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
5750: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
5760: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
5770: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
5780: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 . * Return codes
5790: 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f :. *.SSL_TLSEXT_
57a0: 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 ERR_OK: SNI host
57b0: 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 name is accepted
57c0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
57d0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
57e0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
57f0: 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 ERT_FATAL: SNI h
5800: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
5810: 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e ccepted. The con
5820: 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 nection. *. i
5830: 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 s aborted. Defau
5840: 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 lt for alert is
5850: 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 SSL_AD_UNRECOGNI
5860: 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c ZED_NAME.. *.SSL
5870: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 _TLSEXT_ERR_ALER
5880: 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 T_WARNING: SNI h
5890: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
58a0: 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 ccepted, warning
58b0: 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 alert. *. se
58c0: 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 nt (not supporte
58d0: 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 d in TLSv1.3). T
58e0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
58f0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f ntinues.. *.SSL_
5900: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
5910: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 : SNI hostname i
5920: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 s not accepted a
5930: 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 nd not acknowled
5940: 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e ged,. *. e.g.
5950: 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 if SNI has not
5960: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e been configured.
5970: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
5980: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a continues.. *. *
5990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59d0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
59e0: 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 nt.SNICallback(c
59f0: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 onst SSL *ssl, i
5a00: 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 nt *alert, void
5a10: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 *arg) {. Stat
5a20: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
5a30: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 tate*)arg;. T
5a40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
5a50: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
5a60: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
5a70: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
5a80: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 nt code, res;.
5a90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 const char *se
5aa0: 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b rvername = NULL;
5ab0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
5ac0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
5ad0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (ssl == NULL ||
5ae0: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a arg == NULL) {.
5af0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
5b00: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
5b10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 }.. /* Only
5b20: 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 works for TLS 1
5b30: 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a .2 and earlier *
5b40: 2f 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 /. servername
5b50: 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 = SSL_get_serve
5b60: 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 rname(ssl, TLSEX
5b70: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f T_NAMETYPE_host_
5b80: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 name);. if (!
5b90: 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 servername || se
5ba0: 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 rvername[0] == '
5bb0: 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 \0') {..return S
5bc0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
5bd0: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ACK;. }..
5be0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 if (statePtr->vc
5bf0: 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 md == (Tcl_Obj*)
5c00: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
5c10: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
5c20: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a K;. }.. /*
5c30: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
5c40: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c to eval with fn,
5c50: 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 chan, and serve
5c60: 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 r name args */.
5c70: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
5c80: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
5c90: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 tePtr->vcmd);.
5ca0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
5cb0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
5cc0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
5cd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 ewStringObj("sni
5ce0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
5cf0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
5d00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
5d10: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
5d20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
5d30: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
5d40: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
5d50: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
5d60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
5d70: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
5d80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
5d90: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c Obj(servername ,
5da0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 -1));.. /* E
5db0: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
5dc0: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mand */. Tcl_
5dd0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
5de0: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 Ptr);. if ((c
5df0: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 ode = EvalCallba
5e00: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ck(interp, state
5e10: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 Ptr, cmdPtr)) >
5e20: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 1) {..res = SSL_
5e30: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
5e40: 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 _WARNING;..*aler
5e50: 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 t = SSL_AD_UNREC
5e60: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a OGNIZED_NAME; /*
5e70: 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 Not supported b
5e80: 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 y TLS 1.3 */.
5e90: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 } else if (code
5ea0: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 == 1) {..res =
5eb0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
5ec0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a K;. } else {.
5ed0: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 .res = SSL_TLSEX
5ee0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 T_ERR_ALERT_FATA
5ef0: 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c L;..*alert = SSL
5f00: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 _AD_UNRECOGNIZED
5f10: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 _NAME; /* Not su
5f20: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 pported by TLS 1
5f30: 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 .3 */. }.
5f40: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
5f50: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 (cmdPtr);. re
5f60: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a turn res;.}.../*
5f70: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fb0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 ------. *. * Cli
5fc0: 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 entHello Handsha
5fd0: 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 ke Callback for
5fe0: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a Servers --. *. *
5ff0: 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 .Used by server
6000: 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 to examine the s
6010: 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 erver name indic
6020: 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 ation (SNI) exte
6030: 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 nsion. *.provide
6040: 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 d by the client
6050: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 in order to sele
6060: 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 ct an appropriat
6070: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f e certificate to
6080: 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 . *.present, and
6090: 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 make other conf
60a0: 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 iguration adjust
60b0: 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 ments relevant t
60c0: 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a o that server. *
60d0: 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f .name and its co
60e0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 nfiguration. Thi
60f0: 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 s includes swapp
6100: 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f ing out the asso
6110: 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 ciated. *.SSL_CT
6120: 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 X pointer, modif
6130: 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 ying the server'
6140: 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 s list of permit
6150: 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 ted TLS versions
6160: 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 ,. *.changing th
6170: 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 e server's ciphe
6180: 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e r list in respon
6190: 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 se to the client
61a0: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 's cipher list,
61b0: 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 etc.. *.Called b
61c0: 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c efore SNI and AL
61d0: 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a PN callbacks.. *
61e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
61f0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
6200: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
6210: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
6220: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 efined). *. * Re
6230: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 turn codes:. *.S
6240: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
6250: 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 RETRY: suspend t
6260: 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e he handshake, an
6270: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 d the handshake
6280: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 function will re
6290: 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 turn immediately
62a0: 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 . *.SSL_CLIENT_H
62b0: 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c ELLO_ERROR: fail
62c0: 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 ure, terminate c
62d0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 onnection. Set a
62e0: 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f lert to error co
62f0: 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e de.. *.SSL_CLIEN
6300: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a T_HELLO_SUCCESS:
6310: 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d success. *. *--
6320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6360: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
6370: 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 .HelloCallback(S
6380: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c SL *ssl, int *al
6390: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 ert, void *arg)
63a0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
63b0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
63c0: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 arg;. Tcl_Int
63d0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
63e0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
63f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
6400: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 Ptr;. int cod
6410: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 e, res;. cons
6420: 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 t char *serverna
6430: 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e me;. const un
6440: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a signed char *p;.
6450: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 size_t len,
6460: 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 remaining;..
6470: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
6480: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
6490: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 ePtr->vcmd == (T
64a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
64b0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
64c0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 NT_HELLO_SUCCESS
64d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
64e0: 28 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 (ssl == (const S
64f0: 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 SL *)NULL || arg
6500: 20 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c == (void *)NULL
6510: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
6520: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6530: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
6540: 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 * Get names */.
6550: 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 if (!SSL_clie
6560: 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 nt_hello_get0_ex
6570: 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 t(ssl, TLSEXT_TY
6580: 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 PE_server_name,
6590: 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 &p, &remaining)
65a0: 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 || remaining <=
65b0: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 2) {..*alert = S
65c0: 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 SL_R_SSLV3_ALERT
65d0: 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 _ILLEGAL_PARAMET
65e0: 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ER;..return SSL_
65f0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6600: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
6610: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 * Extract the le
6620: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 ngth of the supp
6630: 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d lied list of nam
6640: 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d es. */. len =
6650: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a (*(p++) << 8);.
6660: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b len += *(p++
6670: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b );. if (len +
6680: 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 2 != remaining)
6690: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
66a0: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 _R_SSLV3_ALERT_I
66b0: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 LLEGAL_PARAMETER
66c0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
66d0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
66e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 ;. }. rema
66f0: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 ining = len;..
6700: 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e /* The list in
6710: 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 practice only h
6720: 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d as a single elem
6730: 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 ent, so we only
6740: 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 consider the fir
6750: 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 st one. */. i
6760: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 f (remaining ==
6770: 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 0 || *p++ != TLS
6780: 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 EXT_NAMETYPE_hos
6790: 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 t_name) {..*aler
67a0: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f t = SSL_R_TLSV1_
67b0: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 ALERT_INTERNAL_E
67c0: 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 RROR;..return SS
67d0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
67e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
67f0: 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 remaining--;..
6800: 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 /* Now we can
6810: 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 finally pull out
6820: 20 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 the byte array
6830: 77 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 with the actual
6840: 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 hostname. */.
6850: 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c if (remaining <
6860: 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d = 2) {..*alert =
6870: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 SSL_R_TLSV1_ALE
6880: 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f RT_INTERNAL_ERRO
6890: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 R;..return SSL_C
68a0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
68b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e R;. }. len
68c0: 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 = (*(p++) << 8)
68d0: 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 ;. len += *(p
68e0: 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e ++);. if (len
68f0: 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 + 2 > remaining
6900: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
6910: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
6920: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a INTERNAL_ERROR;.
6930: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
6940: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
6950: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e }. remain
6960: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 ing = len;. s
6970: 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e ervername = (con
6980: 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 st char *)p;..
6990: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
69a0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 and to eval with
69b0: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 fn, chan, and s
69c0: 65 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 erver name args
69d0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
69e0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
69f0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
6a00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
6a10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
6a20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
6a30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
6a40: 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 "hello", -1));.
6a50: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
6a60: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
6a70: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
6a80: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
6a90: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
6aa0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
6ab0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
6ac0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
6ad0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
6ae0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
6af0: 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 StringObj(server
6b00: 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 name, (Tcl_Size)
6b10: 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 len));.. /*
6b20: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
6b30: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
6b40: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
6b50: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 dPtr);. if ((
6b60: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 code = EvalCallb
6b70: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
6b80: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e ePtr, cmdPtr)) >
6b90: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 1) {..res = SSL
6ba0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 _CLIENT_HELLO_RE
6bb0: 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 TRY;..*alert = S
6bc0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
6bd0: 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b _USER_CANCELLED;
6be0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
6bf0: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 code == 1) {..re
6c00: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 s = SSL_CLIENT_H
6c10: 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 ELLO_SUCCESS;.
6c20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 } else {..res
6c30: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c = SSL_CLIENT_HEL
6c40: 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 LO_ERROR;..*aler
6c50: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f t = SSL_R_TLSV1_
6c60: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 ALERT_INTERNAL_E
6c70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
6c80: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
6c90: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 (cmdPtr);. re
6ca0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a turn res;.}.../*
6cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6cc0: 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 ***/./* Commands
6cd0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a */./***
6ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6cf0: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d */../*. *-------
6d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
6d40: 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 * CiphersObjCmd
6d50: 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 -- list availab
6d60: 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a le ciphers. *. *
6d70: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
6d80: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 is invoked to pr
6d90: 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a ocess the "tls::
6da0: 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 ciphers" command
6db0: 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 . *.to list avai
6dc0: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 lable ciphers, b
6dd0: 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 ased upon protoc
6de0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a ol selected.. *.
6df0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
6e00: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
6e10: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a sult list.. *. *
6e20: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
6e30: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 *.constructs and
6e40: 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f destroys SSL co
6e50: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 ntext (CTX). *.
6e60: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
6e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ea0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
6eb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 const char *prot
6ec0: 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 ocols[] = {.
6ed0: 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 "ssl2", "ssl3",
6ee0: 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 "tls1", "tls1.1"
6ef0: 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 , "tls1.2", "tls
6f00: 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 1.3", NULL.};.en
6f10: 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 um protocol {.
6f20: 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f TLS_SSL2, TLS_
6f30: 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 SSL3, TLS_TLS1,
6f40: 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f TLS_TLS1_1, TLS_
6f50: 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 TLS1_2, TLS_TLS1
6f60: 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a _3, TLS_NONE.};.
6f70: 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 .static int.Ciph
6f80: 65 72 73 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 ersObjCmd(. T
6f90: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a CL_UNUSED(void *
6fa0: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 ),. Tcl_Inter
6fb0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 p *interp,. i
6fc0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c nt objc,. Tcl
6fd0: 5f 4f 62 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj.*const objv
6fe0: 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []).{. Tcl_Ob
6ff0: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c j *objPtr = NULL
7000: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 ;. SSL_CTX *c
7010: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 tx = NULL;. S
7020: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a SL *ssl = NULL;.
7030: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c STACK_OF(SSL
7040: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 _CIPHER) *sk;.
7050: 20 20 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 char buf[BUFSI
7060: 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 Z];. int inde
7070: 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 x, verbose = 0,
7080: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 use_supported =
7090: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 0;. const SSL
70a0: 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b _METHOD *method;
70b0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
70c0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
70d0: 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 ((objc < 2) ||
70e0: 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 (objc > 4)) {..T
70f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
7100: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
7110: 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 "protocol ?verb
7120: 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f ose? ?supported?
7130: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
7140: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
7150: 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 if (Tcl_GetInde
7160: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c xFromObj(interp,
7170: 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 objv[1], protoc
7180: 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c ols, "protocol",
7190: 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 0, &index) != T
71a0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
71b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
71c0: 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 }. if ((objc
71d0: 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 > 2) && Tcl_GetB
71e0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e ooleanFromObj(in
71f0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 terp, objv[2], &
7200: 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f verbose) != TCL_
7210: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
7220: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
7230: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 if ((objc > 3
7240: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c ) && Tcl_GetBool
7250: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 eanFromObj(inter
7260: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 p, objv[3], &use
7270: 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 _supported) != T
7280: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
7290: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
72a0: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
72b0: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 _error();.. s
72c0: 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f witch ((enum pro
72d0: 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 20 tocol)index) {.
72e0: 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 case TLS_SSL2
72f0: 3a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 :..Tcl_AppendRes
7300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
7310: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
7320: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7330: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
7340: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e *)NULL);..return
7350: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
7360: 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 09 case TLS_SSL3:..
7370: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7380: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
7390: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
73a0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
73b0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e rted", (char *)N
73c0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
73d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 63 61 73 L_ERROR;. cas
73e0: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 e TLS_TLS1:.#if
73f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
7400: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7410: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 SSL_NO_TLS1) ||
7420: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7430: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
7440: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
7450: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
7460: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
7470: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
7480: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
7490: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
74a0: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
74b0: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f .method = TLSv1_
74c0: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
74d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 .#endif. case
74e0: 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 TLS_TLS1_1:.#if
74f0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
7500: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
7510: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
7520: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
7530: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d NSSL_NO_TLS1_1_M
7540: 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 ETHOD)..Tcl_Appe
7550: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
7560: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 protocols[index
7570: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e ], ": protocol n
7580: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
7590: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
75a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
75b0: 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d .#else..method =
75c0: 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 TLSv1_1_method(
75d0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
75e0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c . case TLS_TL
75f0: 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 S1_2:.#if define
7600: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 d(NO_TLS1_2) ||
7610: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7620: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 NO_TLS1_2) || de
7630: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7640: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a _TLS1_2_METHOD).
7650: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
7660: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
7670: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
7680: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
7690: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
76a0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
76b0: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
76c0: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f .method = TLSv1_
76d0: 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 2_method(); brea
76e0: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 k;.#endif. ca
76f0: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 se TLS_TLS1_3:.#
7700: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
7710: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
7720: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
7730: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _3) || defined(O
7740: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
7750: 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 _METHOD)..Tcl_Ap
7760: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7770: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
7780: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
7790: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
77a0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
77b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
77c0: 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 R;.#else..method
77d0: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b = TLS_method();
77e0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 ..SSL_CTX_set_mi
77f0: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 n_proto_version(
7800: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
7810: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ION);..SSL_CTX_s
7820: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 et_max_proto_ver
7830: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
7840: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 62 72 65 61 _VERSION);..brea
7850: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 k;.#endif. de
7860: 66 61 75 6c 74 3a 0a 09 6d 65 74 68 6f 64 20 3d fault:..method =
7870: 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 TLS_method();..
7880: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 break;. }..
7890: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
78a0: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 new(method);.
78b0: 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c if (ctx == NULL
78c0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
78d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 esult(interp, GE
78e0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
78f0: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 (char *)NULL);..
7900: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7910: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c ;. }.. ssl
7920: 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b = SSL_new(ctx);
7930: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 . if (ssl ==
7940: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
7950: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7960: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
7970: 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c (), (char *)NULL
7980: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
7990: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 (ctx);..return T
79a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
79b0: 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 . /* Use list
79c0: 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f and order as wo
79d0: 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 uld be sent in a
79e0: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 ClientHello or
79f0: 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 all available ci
7a00: 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 phers */. if
7a10: 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 (use_supported)
7a20: 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 {..sk = SSL_get1
7a30: 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 _supported_ciphe
7a40: 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 rs(ssl);. } e
7a50: 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f lse {..sk = SSL_
7a60: 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 get_ciphers(ssl)
7a70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
7a80: 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 (sk != NULL) {..
7a90: 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a if (!verbose) {.
7aa0: 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
7ab0: 2a 63 70 3b 0a 09 20 20 20 20 6f 62 6a 50 74 72 *cp;.. objPtr
7ac0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
7ad0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 j(0, NULL);..
7ae0: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b for (int i = 0;
7af0: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 i < sk_SSL_CIPH
7b00: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 ER_num(sk); i++)
7b10: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 {...const SSL_C
7b20: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 IPHER *c = sk_SS
7b30: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 L_CIPHER_value(s
7b40: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d k, i);...if (c =
7b50: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 = NULL) continue
7b60: 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e ;..../* cipher n
7b70: 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f ame or (NONE) */
7b80: 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 ...cp = SSL_CIPH
7b90: 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a ER_get_name(c);.
7ba0: 09 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c ..if (cp == NULL
7bb0: 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c ) break;...Tcl_L
7bc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
7bd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
7be0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
7bf0: 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 gObj(cp, -1));..
7c00: 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b }...} else {
7c10: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
7c20: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
7c30: 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 "",0);.. for
7c40: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
7c50: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 sk_SSL_CIPHER_nu
7c60: 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 m(sk); i++) {...
7c70: 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 const SSL_CIPHER
7c80: 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 *c = sk_SSL_CIP
7c90: 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 HER_value(sk, i)
7ca0: 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c ;...if (c == NUL
7cb0: 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 L) continue;....
7cc0: 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 /* textual descr
7cd0: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 iption of the ci
7ce0: 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 pher */...if (SS
7cf0: 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 L_CIPHER_descrip
7d00: 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a tion(c, buf, siz
7d10: 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c eof(buf)) != NUL
7d20: 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 L) {... Tcl_A
7d30: 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 ppendToObj(objPt
7d40: 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a r, buf, (Tcl_Siz
7d50: 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b e) strlen(buf));
7d60: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
7d70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 Tcl_AppendToOb
7d80: 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f j(objPtr, "UNKNO
7d90: 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 WN\n", 8);...}..
7da0: 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 }..}..if (us
7db0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 e_supported) {..
7dc0: 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 sk_SSL_CIPHE
7dd0: 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 R_free(sk);..}.
7de0: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 }. SSL_fre
7df0: 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f e(ssl);. SSL_
7e00: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a CTX_free(ctx);..
7e10: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
7e20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
7e30: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
7e40: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
7e50: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e90: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 -----. *. * Prot
7ea0: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c ocolsObjCmd -- l
7eb0: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 ist available pr
7ec0: 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 otocols. *. *.Th
7ed0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
7ee0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
7ef0: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f ss the "tls::pro
7f00: 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a tocols" command.
7f10: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c *.to list avail
7f20: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a able protocols..
7f30: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
7f40: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
7f50: 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a result list.. *
7f60: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
7f70: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d :. *.none. *. *-
7f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fc0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
7fd0: 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 nt.ProtocolsObjC
7fe0: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 md(. TCL_UNUS
7ff0: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 ED(void *),.
8000: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
8010: 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 rp,. int objc
8020: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ,. Tcl_Obj *c
8030: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
8040: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
8050: 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 tr;.. dprintf
8060: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
8070: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 if (objc != 1)
8080: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
8090: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
80a0: 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 bjv, "");..retur
80b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
80c0: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
80d0: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 r_error();..
80e0: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
80f0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
8100: 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 ;..#if !defined(
8110: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
8120: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8130: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
8140: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
8150: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 1_METHOD). Tc
8160: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
8170: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
8180: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
8190: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
81a0: 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 s[TLS_TLS1], -1)
81b0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
81c0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
81d0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
81e0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 ENSSL_NO_TLS1_1)
81f0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
8200: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d NSSL_NO_TLS1_1_M
8210: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c ETHOD). Tcl_L
8220: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
8230: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
8240: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
8250: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
8260: 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 LS_TLS1_1], -1))
8270: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
8280: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
8290: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
82a0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 NSSL_NO_TLS1_2)
82b0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
82c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 SSL_NO_TLS1_2_ME
82d0: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 THOD). Tcl_Li
82e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
82f0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
8300: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
8310: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
8320: 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b S_TLS1_2], -1));
8330: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
8340: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
8350: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
8360: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
8370: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
8380: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
8390: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
83a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
83b0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f tocols[TLS_TLS1_
83c0: 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 3], -1));.#endif
83d0: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
83e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
83f0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
8400: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
8410: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
8420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 -------. *. * Ha
8460: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d ndshakeObjCmd --
8470: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d . *. *.This comm
8480: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 and is used to v
8490: 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68 erify whether th
84a0: 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 e handshake is c
84b0: 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f omplete. *.or no
84c0: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 t.. *. * Results
84d0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
84e0: 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 Tcl result. 1 me
84f0: 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f ans handshake co
8500: 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 mplete, 0 means
8510: 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 pending.. *. * S
8520: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
8530: 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 May force SSL ne
8540: 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b gotiation to tak
8550: 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d e place.. *. *--
8560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85a0: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
85b0: 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d t HandshakeObjCm
85c0: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 d(. TCL_UNUSE
85d0: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 D(void *),. T
85e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
85f0: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c p,. int objc,
8600: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f . Tcl_Obj *co
8610: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 nst objv[]).{.
8620: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
8630: 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 an; /* Th
8640: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
8650: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 a mode on. */.
8660: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
8670: 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c tr; /* cl
8680: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 ient state for s
8690: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 sl socket */.
86a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 const char *err
86b0: 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 Str = NULL;.
86c0: 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 int ret = 1;.
86d0: 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 int err = 0;..
86e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
86f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
8700: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
8710: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
8720: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
8730: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
8740: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
8750: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
8760: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
8770: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
8780: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
8790: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
87a0: 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 v[1]), NULL);.
87b0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
87c0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
87d0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
87e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
87f0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
8800: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
8810: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
8820: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
8830: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
8840: 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 (chan);. if (
8850: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
8860: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
8870: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
8880: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
8890: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 lt(interp, "bad
88a0: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c channel \"", Tcl
88b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
88c0: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f chan),..."\": no
88d0: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
88e0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
88f0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
8900: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
8910: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 , "HANDSHAKE", "
8920: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
8930: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c ID", (char *)NUL
8940: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
8950: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
8960: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
8970: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
8980: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
8990: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 chan);.. dpri
89a0: 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 ntf("Calling Tls
89b0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 _WaitForConnect"
89c0: 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 );. ret = Tls
89d0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 _WaitForConnect(
89e0: 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 statePtr, &err,
89f0: 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 1);. dprintf(
8a00: 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e "Tls_WaitForConn
8a10: 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 ect returned: %i
8a20: 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 ", ret);.. if
8a30: 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 (ret < 0 && ((s
8a40: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
8a50: 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 TLS_TCL_ASYNC)
8a60: 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 && (err == EAGAI
8a70: 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 N))) {..dprintf(
8a80: 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 "Async set and e
8a90: 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 rr = EAGAIN");..
8aa0: 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 ret = 0;. } e
8ab0: 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 lse if (ret < 0)
8ac0: 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 3b {..long result;
8ad0: 0a 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 ..errStr = state
8ae0: 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 Ptr->err;..Tcl_R
8af0: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 esetResult(inter
8b00: 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e p);..Tcl_SetErrn
8b10: 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 o(err);...if (!e
8b20: 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 rrStr || (*errSt
8b30: 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 r == 0)) {..
8b40: 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 errStr = Tcl_Pos
8b50: 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ixError(interp);
8b60: 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 ..}...Tcl_Append
8b70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
8b80: 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 handshake failed
8b90: 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68 : ", errStr, (ch
8ba0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 69 66 20 ar *)NULL);..if
8bb0: 28 28 72 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 ((result = SSL_g
8bc0: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 et_verify_result
8bd0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 (statePtr->ssl))
8be0: 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b != X509_V_OK) {
8bf0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
8c00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
8c10: 20 64 75 65 20 74 6f 20 5c 22 22 2c 20 58 35 30 due to \"", X50
8c20: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 9_verify_cert_er
8c30: 72 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 75 6c ror_string(resul
8c40: 74 29 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20 t), "\"", (char
8c50: 2a 29 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c *)NULL);..}..Tcl
8c60: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
8c70: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 terp, "TLS", "HA
8c80: 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45 NDSHAKE", "FAILE
8c90: 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c D", (char *)NULL
8ca0: 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74 );..dprintf("Ret
8cb0: 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 urning TCL_ERROR
8cc0: 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20 with handshake
8cd0: 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 failed: %s", err
8ce0: 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 Str);..return TC
8cf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 L_ERROR;. } e
8d00: 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21 lse {..if (err !
8d10: 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 = 0) {.. dpri
8d20: 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f ntf("Got an erro
8d30: 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 r with a complet
8d40: 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 ed handshake: er
8d50: 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 r = %i", err);..
8d60: 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 }..ret = 1;.
8d70: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 }.. dprintf("
8d80: 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b Returning TCL_OK
8d90: 20 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c with data \"%i\
8da0: 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63 "", ret);. Tc
8db0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
8dc0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e nterp, Tcl_NewIn
8dd0: 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 tObj(ret));.
8de0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
8df0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
8e40: 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d ImportObjCmd --
8e50: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
8e60: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
8e70: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 to process the
8e80: 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a "ssl" command. *
8e90: 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d . *.The ssl comm
8ea0: 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f and pushes SSL o
8eb0: 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e ver a (newly con
8ec0: 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b nected) tcp sock
8ed0: 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 et. *. * Results
8ee0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
8ef0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
8f00: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
8f10: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 *.May modify th
8f20: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e e behavior of an
8f30: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a IO channel.. *.
8f40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
8f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f80: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
8f90: 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 c int.ImportObjC
8fa0: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 md(. TCL_UNUS
8fb0: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 ED(void *),.
8fc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
8fd0: 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 rp,. int objc
8fe0: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ,. Tcl_Obj *c
8ff0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 onst objv[]).{.
9000: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
9010: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
9020: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
9030: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 de on. */. St
9040: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 ate *statePtr;..
9050: 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 /* client state
9060: 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a for ssl socket *
9070: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 /. SSL_CTX *c
9080: 74 78 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 tx..= NULL;.
9090: 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 Tcl_Obj *script.
90a0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c .= NULL;. Tcl
90b0: 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 _Obj *password..
90c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
90d0: 4f 62 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c Obj *vcmd..= NUL
90e0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 L;. Tcl_DStri
90f0: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 ng upperChannelT
9100: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 ranslation, uppe
9110: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
9120: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e , upperChannelEn
9130: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 coding, upperCha
9140: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 nnelEOFChar;.
9150: 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63 int idx;. Tc
9160: 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 l_Size len;.
9170: 69 6e 74 20 66 6c 61 67 73 09 09 09 3d 20 54 4c int flags...= TL
9180: 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 S_TCL_INIT;.
9190: 69 6e 74 20 73 65 72 76 65 72 09 09 09 3d 20 30 int server...= 0
91a0: 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 ;./* is connecti
91b0: 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f on incoming or o
91c0: 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 utgoing? */.
91d0: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d char *keyfile..=
91e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
91f0: 2a 63 65 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c *certfile..= NUL
9200: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 L;. unsigned
9210: 63 68 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c char *key..= NUL
9220: 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 L;. Tcl_Size
9230: 6b 65 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 key_len..= 0;.
9240: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
9250: 2a 63 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 *cert..= NULL;.
9260: 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 Tcl_Size cert
9270: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 _len..= 0;. c
9280: 68 61 72 20 2a 63 69 70 68 65 72 73 09 09 3d 20 har *ciphers..=
9290: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
92a0: 63 69 70 68 65 72 73 75 69 74 65 73 09 09 3d 20 ciphersuites..=
92b0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
92c0: 43 41 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a CAfile..= NULL;.
92d0: 20 20 20 20 63 68 61 72 20 2a 43 41 70 61 74 68 char *CApath
92e0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 ..= NULL;. ch
92f0: 61 72 20 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 ar *DHparams..=
9300: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
9310: 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a model...= NULL;.
9320: 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 char *server
9330: 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a name..= NULL;./*
9340: 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 hostname for Se
9350: 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 rver Name Indica
9360: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 tion */. char
9370: 20 2a 73 65 73 73 69 6f 6e 5f 69 64 09 09 3d 20 *session_id..=
9380: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
9390: 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b j *alpn..= NULL;
93a0: 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 . int ssl2 =
93b0: 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 0, ssl3 = 0;.
93c0: 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 int tls1 = 1, t
93d0: 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f ls1_1 = 1, tls1_
93e0: 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 2 = 1, tls1_3 =
93f0: 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 1;. int proto
9400: 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 = 0, level = -1
9410: 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 ;. int verify
9420: 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 = 0, require =
9430: 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20 0, request = 1,
9440: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d post_handshake =
9450: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 0;.. dprintf
9460: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 ("Called");..#if
9470: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
9480: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
9490: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c NSSL_NO_TLS1) ||
94a0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
94b0: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 _NO_TLS1_METHOD)
94c0: 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 . tls1 = 0;.#
94d0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
94e0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 d(NO_TLS1_1) ||
94f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
9500: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
9510: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
9520: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
9530: 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a tls1_1 = 0;.
9540: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
9550: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c ed(NO_TLS1_2) ||
9560: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
9570: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 _NO_TLS1_2) || d
9580: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
9590: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 O_TLS1_2_METHOD)
95a0: 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b . tls1_2 = 0;
95b0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
95c0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c ned(NO_TLS1_3) |
95d0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
95e0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
95f0: 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e tls1_3 = 0;.#en
9600: 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a dif.. if (obj
9610: 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 c < 2) {..Tcl_Wr
9620: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
9630: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
9640: 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 nnel ?options?")
9650: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
9660: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
9670: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
9680: 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 );.. chan = T
9690: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
96a0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
96b0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 ing(objv[1]), NU
96c0: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
96d0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
96e0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
96f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
9700: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
9710: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
9720: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
9730: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
9740: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
9750: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a Channel(chan);..
9760: 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 for (idx = 2
9770: 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 ; idx < objc; id
9780: 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 x++) {..char *op
9790: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e t = Tcl_GetStrin
97a0: 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a 0a 09 g(objv[idx]);...
97b0: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d if (opt[0] != '-
97c0: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a ').. break;..
97d0: 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c .OPTOBJ("-alpn",
97e0: 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 alpn);..OPTSTR(
97f0: 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61 74 68 "-cadir", CApath
9800: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 );..OPTSTR("-caf
9810: 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 ile", CAfile);..
9820: 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c OPTBYTE("-cert",
9830: 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 cert, cert_len)
9840: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 ;..OPTSTR("-cert
9850: 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 file", certfile)
9860: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 ;..OPTSTR("-ciph
9870: 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 er", ciphers);..
9880: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 OPTSTR("-ciphers
9890: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 ", ciphers);..OP
98a0: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 TSTR("-ciphersui
98b0: 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 tes", ciphersuit
98c0: 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 es);..OPTOBJ("-c
98d0: 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 ommand", script)
98e0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 ;..OPTSTR("-dhpa
98f0: 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 rams", DHparams)
9900: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 ;..OPTBYTE("-key
9910: 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 ", key, key_len)
9920: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 ;..OPTSTR("-keyf
9930: 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a ile", keyfile);.
9940: 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 .OPTSTR("-model"
9950: 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 , model);..OPTOB
9960: 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 J("-password", p
9970: 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f assword);..OPTBO
9980: 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 OL("-post_handsh
9990: 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 ake", post_hands
99a0: 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 hake);..OPTBOOL(
99b0: 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 "-request", requ
99c0: 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 est);..OPTBOOL("
99d0: 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 -require", requi
99e0: 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 re);..OPTINT("-s
99f0: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 ecurity_level",
9a00: 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c level);..OPTBOOL
9a10: 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 ("-server", serv
9a20: 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 er);..OPTSTR("-s
9a30: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 ervername", serv
9a40: 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 ername);..OPTSTR
9a50: 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 ("-session_id",
9a60: 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 session_id);..OP
9a70: 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 TBOOL("-ssl2", s
9a80: 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 sl2);..OPTBOOL("
9a90: 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 -ssl3", ssl3);..
9aa0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c OPTBOOL("-tls1",
9ab0: 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c tls1);..OPTBOOL
9ac0: 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 ("-tls1.1", tls1
9ad0: 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d _1);..OPTBOOL("-
9ae0: 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 tls1.2", tls1_2)
9af0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 ;..OPTBOOL("-tls
9b00: 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 1.3", tls1_3);..
9b10: 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 OPTOBJ("-validat
9b20: 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 ecommand", vcmd)
9b30: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 ;..OPTOBJ("-vcmd
9b40: 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 ", vcmd);...OPTB
9b50: 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 AD("option", "-a
9b60: 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 lpn, -cadir, -ca
9b70: 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 file, -cert, -ce
9b80: 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c rtfile, -cipher,
9b90: 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 -ciphersuites,
9ba0: 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 -command, -dhpar
9bb0: 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 ams, -key, -keyf
9bc0: 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 ile, -model, -pa
9bd0: 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 ssword, -post_ha
9be0: 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 ndshake, -reques
9bf0: 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 t, -require, -se
9c00: 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 2d 73 curity_level, -s
9c10: 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 erver, -serverna
9c20: 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c me, -session_id,
9c30: 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d -ssl2, -ssl3, -
9c40: 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d tls1, -tls1.1, -
9c50: 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c tls1.2, -tls1.3,
9c60: 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d or -validatecom
9c70: 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e mand");...return
9c80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
9c90: 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 }. if (reques
9ca0: 74 29 09 20 20 20 20 76 65 72 69 66 79 20 7c 3d t). verify |=
9cb0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 SSL_VERIFY_CLIE
9cc0: 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 NT_ONCE | SSL_VE
9cd0: 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 RIFY_PEER;. i
9ce0: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65 f (request && re
9cf0: 71 75 69 72 65 29 20 76 65 72 69 66 79 20 7c 3d quire) verify |=
9d00: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
9d10: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
9d20: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 ;. if (reques
9d30: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 t && post_handsh
9d40: 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 ake).verify |= S
9d50: 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 SL_VERIFY_POST_H
9d60: 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 ANDSHAKE;. if
9d70: 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 76 (verify == 0).v
9d80: 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 erify = SSL_VERI
9d90: 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 FY_NONE;.. pr
9da0: 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 oto |= (ssl2 ? T
9db0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 LS_PROTO_SSL2 :
9dc0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
9dd0: 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f (ssl3 ? TLS_PRO
9de0: 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 TO_SSL3 : 0);.
9df0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
9e00: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
9e10: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 1 : 0);. prot
9e20: 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 o |= (tls1_1 ? T
9e30: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 LS_PROTO_TLS1_1
9e40: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
9e50: 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 |= (tls1_2 ? TLS
9e60: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 _PROTO_TLS1_2 :
9e70: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
9e80: 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 (tls1_3 ? TLS_P
9e90: 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 ROTO_TLS1_3 : 0)
9ea0: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 ;.. /* reset
9eb0: 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b to NULL if blank
9ec0: 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 string provided
9ed0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 */. if (cert
9ee0: 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 && !*cert)..
9ef0: 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 cert.
9f00: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
9f10: 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 (key && !*key).
9f20: 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 . key.
9f30: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
9f40: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 if (certfile &&
9f50: 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 !*certfile)
9f60: 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 certfile.=
9f70: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 NULL;. if (ke
9f80: 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 yfile && !*keyfi
9f90: 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 le)..keyfile.
9fa0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
9fb0: 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 if (ciphers &&
9fc0: 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 !*ciphers).
9fd0: 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 ciphers.
9fe0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
9ff0: 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 f (ciphersuites
a000: 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 && !*ciphersuite
a010: 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 s) ciphersuites
a020: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
a030: 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 f (CAfile && !*C
a040: 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 Afile). C
a050: 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 Afile. =
a060: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 NULL;. if (CA
a070: 70 61 74 68 20 26 26 20 21 2a 43 41 70 61 74 68 path && !*CApath
a080: 29 09 20 20 20 20 20 20 20 20 43 41 70 61 74 68 ). CApath
a090: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a0a0: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d . if (DHparam
a0b0: 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 s && !*DHparams)
a0c0: 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d . DHparam
a0d0: 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b s = NULL;
a0e0: 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c .. /* new SSL
a0f0: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 state */. st
a100: 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 atePtr..= (State
a110: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 *) ckalloc((uns
a120: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 igned) sizeof(St
a130: 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 ate));. memse
a140: 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 t(statePtr, 0, s
a150: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a izeof(State));..
a160: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c statePtr->fl
a170: 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 ags.= flags;.
a180: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
a190: 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 p.= interp;.
a1a0: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 statePtr->vflags
a1b0: 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 .= verify;. s
a1c0: 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 tatePtr->err.= "
a1d0: 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 ";.. /* alloc
a1e0: 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 ate script */.
a1f0: 20 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a if (script) {.
a200: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 .(void) Tcl_GetS
a210: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 tringFromObj(scr
a220: 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 ipt, &len);..if
a230: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 (len) {.. sta
a240: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
a250: 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 = script;.. T
a260: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
a270: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
a280: 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ck);..}. }..
a290: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 /* allocate p
a2a0: 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 assword */. i
a2b0: 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 f (password) {..
a2c0: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 (void) Tcl_GetSt
a2d0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 ringFromObj(pass
a2e0: 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 word, &len);..if
a2f0: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 (len) {.. st
a300: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
a310: 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 = password;..
a320: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
a330: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 nt(statePtr->pas
a340: 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d sword);..}. }
a350: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 .. /* allocat
a360: 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 e validate comma
a370: 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 nd */. if (vc
a380: 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 md) {..(void) Tc
a390: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
a3a0: 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a bj(vcmd, &len);.
a3b0: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
a3c0: 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 statePtr->vcmd
a3d0: 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c = vcmd;.. Tcl
a3e0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
a3f0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 atePtr->vcmd);..
a400: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 }. }.. if
a410: 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 (model != NULL)
a420: 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a {..int mode;../*
a430: 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 Get the "model"
a440: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 context */..cha
a450: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
a460: 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c el(interp, model
a470: 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 , &mode);..if (c
a480: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
a490: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 nel) NULL) {..
a4a0: 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 Tls_Free((void
a4b0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *)statePtr);..
a4c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
a4d0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a ROR;..}.../*.. *
a4e0: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
a4f0: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
a500: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a most channel.. *
a510: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
a520: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
a530: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 );..if (Tcl_GetC
a540: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
a550: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
a560: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 ype()) {.. Tc
a570: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
a580: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
a590: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
a5a0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
a5b0: 29 2c 0a 09 09 20 20 20 20 22 5c 22 3a 20 6e 6f ),... "\": no
a5c0: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
a5d0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
a5e0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
a5f0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
a600: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
a610: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 "CHANNEL", "INVA
a620: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 LID", (char *)NU
a630: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
a640: 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65 ee((void *)state
a650: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
a660: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
a670: 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a .ctx = ((State *
a680: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 )Tcl_GetChannelI
a690: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
a6a0: 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 ))->ctx;. } e
a6b0: 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 lse {..if ((ctx
a6c0: 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 = CTX_Init(state
a6d0: 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f Ptr, server, pro
a6e0: 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 to, keyfile, cer
a6f0: 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 tfile, key, cert
a700: 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 09 63 65 72 , key_len,...cer
a710: 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 2c 20 43 t_len, CApath, C
a720: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 Afile, ciphers,
a730: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 ciphersuites, le
a740: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 vel, DHparams))
a750: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
a760: 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a Tls_Free((void *
a770: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 )statePtr);..
a780: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
a790: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 R;..}. }..
a7a0: 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d statePtr->ctx =
a7b0: 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ctx;.. /*.
a7c0: 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 * We need to
a7d0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 make sure that t
a7e0: 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 he channel works
a7f0: 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 in binary (for
a800: 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 the. * encry
a810: 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 ption not to get
a820: 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 goofed up)..
a830: 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 * We only want
a840: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 to adjust the b
a850: 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d uffering in pre-
a860: 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 v2 channels, whe
a870: 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 re. * each c
a880: 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 hannel in the st
a890: 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 ack maintained i
a8a0: 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a ts own buffers..
a8b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f */. Tcl_
a8c0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
a8d0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
a8e0: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 tion);. Tcl_D
a8f0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
a900: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
a910: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
a920: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
a930: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 nnelEOFChar);.
a940: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
a950: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 t(&upperChannelE
a960: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 ncoding);. Tc
a970: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_GetChannelOpti
a980: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
a990: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 "-eofchar", &up
a9a0: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
a9b0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 r);. Tcl_GetC
a9c0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
a9d0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 erp, chan, "-enc
a9e0: 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 oding", &upperCh
a9f0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a annelEncoding);.
aa00: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
aa10: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
aa20: 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 chan, "-transla
aa30: 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 tion", &upperCha
aa40: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
aa50: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
aa60: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
aa70: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b p, chan, "-block
aa80: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e ing", &upperChan
aa90: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 nelBlocking);.
aaa0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
aab0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
aac0: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 han, "-translati
aad0: 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a on", "binary");.
aae0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
aaf0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
ab00: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e chan, "-blockin
ab10: 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 g", "true");.
ab20: 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d dprintf("Consum
ab30: 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 ing Tcl channel
ab40: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e %s", Tcl_GetChan
ab50: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a nelName(chan));.
ab60: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 statePtr->se
ab70: 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 lf = Tcl_StackCh
ab80: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c annel(interp, Tl
ab90: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c s_ChannelType(),
aba0: 20 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f statePtr, (TCL_
abb0: 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 READABLE | TCL_W
abc0: 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b RITABLE), chan);
abd0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 . dprintf("Cr
abe0: 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 eated channel na
abf0: 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 med %s", Tcl_Get
ac00: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
ac10: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 ePtr->self));.
ac20: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
ac30: 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 self == (Tcl_Cha
ac40: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f nnel) NULL) {../
ac50: 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 *.. * No use of
ac60: 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 Tcl_EventuallyFr
ac70: 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f ee because no po
ac80: 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 ssible Tcl_Prese
ac90: 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 rve... */..Tls_F
aca0: 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 ree((void *)stat
acb0: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 ePtr);..return T
acc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
acd0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
ace0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
acf0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
ad00: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
ad10: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
ad20: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
ad30: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 Translation));.
ad40: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
ad50: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
ad60: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 statePtr->self,
ad70: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c "-encoding", Tcl
ad80: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
ad90: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
ada0: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 ing));. Tcl_S
adb0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
adc0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
add0: 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 ->self, "-eofcha
ade0: 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 r", Tcl_DStringV
adf0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
ae00: 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 elEOFChar));.
ae10: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
ae20: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
ae30: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
ae40: 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 blocking", Tcl_D
ae50: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 StringValue(&upp
ae60: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
ae70: 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 g));. Tcl_DSt
ae80: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 ringFree(&upperC
ae90: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
aea0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 n);. Tcl_DStr
aeb0: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 ingFree(&upperCh
aec0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a annelEncoding);.
aed0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
aee0: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 ree(&upperChanne
aef0: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 lEOFChar);. T
af00: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
af10: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
af20: 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 king);.. /*.
af30: 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 * SSL Initia
af40: 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f lization. */
af50: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 . statePtr->s
af60: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 sl = SSL_new(sta
af70: 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 tePtr->ctx);.
af80: 20 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e if (!statePtr->
af90: 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c ssl) {../* SSL l
afa0: 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a ibrary error */.
afb0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
afc0: 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 t(interp, "could
afd0: 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 n't construct ss
afe0: 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 l session: ", GE
aff0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
b000: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 (char *)NULL);..
b010: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
b020: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
b030: 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 "IMPORT", "INIT"
b040: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
b050: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f r *)NULL);..Tls_
b060: 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 Free((void *)sta
b070: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 tePtr);..return
b080: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
b090: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 .. /* Set hos
b0a0: 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f t server name */
b0b0: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e . if (servern
b0c0: 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 ame) {../* Sets
b0d0: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 the server name
b0e0: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 indication (SNI)
b0f0: 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 in ClientHello
b100: 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a extension */../*
b110: 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68 Per RFC 6066, h
b120: 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43 ostname is a ASC
b130: 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e II encoded strin
b140: 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 33 g, though RFC 43
b150: 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a 66 says UTF-8. *
b160: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f /..if (!SSL_set_
b170: 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 tlsext_host_name
b180: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
b190: 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 servername) && r
b1a0: 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 equire) {.. T
b1b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
b1c0: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 53 4e 49 interp, "Set SNI
b1d0: 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 extension faile
b1e0: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 d: ", GET_ERR_RE
b1f0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
b200: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
b210: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
b220: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
b230: 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 ORT", "SNI", "FA
b240: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 4e ILED", (char *)N
b250: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
b260: 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 ree((void *)stat
b270: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
b280: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
b290: 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 .../* Set hostna
b2a0: 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 me for peer cert
b2b0: 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 ificate hostname
b2c0: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e verification in
b2d0: 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f clients... Do
b2e0: 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31 n't use SSL_set1
b2f0: 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68 _host since it h
b300: 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 as limitations.
b310: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 */..if (!SSL_add
b320: 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 1_host(statePtr-
b330: 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 >ssl, servername
b340: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
b350: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
b360: 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74 p, "Set DNS host
b370: 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 name failed: ",
b380: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
b390: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
b3a0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
b3b0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b3c0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
b3d0: 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 "HOSTNAME", "FAI
b3e0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 LED", (char *)NU
b3f0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
b400: 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65 ee((void *)state
b410: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
b420: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
b430: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 }.. /* Re
b440: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 sume session id
b450: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 */. if (sessi
b460: 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 on_id && strlen(
b470: 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 session_id) <= S
b480: 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c SL_MAX_SID_CTX_L
b490: 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c ENGTH) {../* SSL
b4a0: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a _set_session() *
b4b0: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 /..if (!SSL_SESS
b4c0: 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 ION_set1_id_cont
b4d0: 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 ext(SSL_get_sess
b4e0: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ion(statePtr->ss
b4f0: 6c 29 2c 0a 09 09 28 63 6f 6e 73 74 20 75 6e 73 l),...(const uns
b500: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 65 igned char *) se
b510: 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 ssion_id, (unsig
b520: 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 ned int) strlen(
b530: 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a session_id))) {.
b540: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
b550: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 esult(interp, "R
b560: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 61 esume session fa
b570: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 iled: ", GET_ERR
b580: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
b590: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *)NULL);.. T
b5a0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
b5b0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
b5c0: 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f IMPORT", "SESSIO
b5d0: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 N", "FAILED", (c
b5e0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 har *)NULL);..
b5f0: 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 Tls_Free((void
b600: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *)statePtr);..
b610: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
b620: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ROR;..}. }..
b630: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70 /* Enable App
b640: 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50 lication-Layer P
b650: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 rotocol Negotiat
b660: 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 72 ion. Examples ar
b670: 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74 e: http/1.0,..ht
b680: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 tp/1.1, h2, h3,
b690: 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c ftp, imap, pop3,
b6a0: 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d xmpp-client, xm
b6b0: 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 2c pp-server, mqtt,
b6c0: 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 irc, etc. */.
b6d0: 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f if (alpn) {../
b6e0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 * Convert a TCL
b6f0: 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 list into a prot
b700: 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 ocol-list in wir
b710: 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 e-format */..uns
b720: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 igned char *prot
b730: 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 os, *p;..unsigne
b740: 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e d int protos_len
b750: 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 = 0;..Tcl_Size
b760: 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a cnt, i;..int j;.
b770: 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b .Tcl_Obj **list;
b780: 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f ...if (Tcl_ListO
b790: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e bjGetElements(in
b7a0: 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 terp, alpn, &cnt
b7b0: 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f , &list) != TCL_
b7c0: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 OK) {.. Tls_F
b7d0: 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 ree((void *)stat
b7e0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
b7f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
b800: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 .../* Determine
b810: 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 the memory requi
b820: 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 red for the prot
b830: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f ocol-list */..fo
b840: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e r (i = 0; i < cn
b850: 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 t; i++) {.. T
b860: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
b870: 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 Obj(list[i], &le
b880: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e n);.. if (len
b890: 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f > 255) {...Tcl_
b8a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
b8b0: 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f erp, "ALPN proto
b8c0: 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f col names too lo
b8d0: 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c ng", (char *)NUL
b8e0: 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 L);...Tcl_SetErr
b8f0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b900: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
b910: 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 "ALPN", "FAILED"
b920: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
b930: 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 ...Tls_Free((voi
b940: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 d *)statePtr);..
b950: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
b960: 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 R;.. }.. p
b970: 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b rotos_len += 1 +
b980: 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a (int) len;..}..
b990: 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f ./* Build the co
b9a0: 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d mplete protocol-
b9b0: 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 list */..protos
b9c0: 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 = ckalloc(protos
b9d0: 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f _len);../* proto
b9e0: 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 col-lists consis
b9f0: 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 t of 8-bit lengt
ba00: 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 h-prefixed, byte
ba10: 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 strings */..for
ba20: 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f (j = 0, p = pro
ba30: 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b tos; j < cnt; j+
ba40: 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a +) {.. char *
ba50: 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 str = Tcl_GetStr
ba60: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b ingFromObj(list[
ba70: 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 j], &len);..
ba80: 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 *p++ = (unsigned
ba90: 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 char) len;..
baa0: 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 memcpy(p, str,
bab0: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 (size_t) len);..
bac0: 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d p += len;..}
bad0: 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c .../* SSL_set_al
bae0: 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 pn_protos makes
baf0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 a copy of the pr
bb00: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 otocol-list */..
bb10: 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 /* Note: This fu
bb20: 6e 63 74 69 6f 6e 20 72 65 76 65 72 73 65 73 20 nction reverses
bb30: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 the return value
bb40: 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 convention */..
bb50: 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e if (SSL_set_alpn
bb60: 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 _protos(statePtr
bb70: 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 ->ssl, protos, p
bb80: 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 rotos_len)) {..
bb90: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
bba0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
bbb0: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 ALPN protocols
bbc0: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 failed: ", GET_E
bbd0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
bbe0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 ar *)NULL);..
bbf0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
bc00: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
bc10: 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e "IMPORT", "ALPN
bc20: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
bc30: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 ar *)NULL);..
bc40: 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 Tls_Free((void
bc50: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 *)statePtr);..
bc60: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 ckfree(protos)
bc70: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
bc80: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
bc90: 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 Store protocols
bca0: 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 list */..stateP
bcb0: 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f tr->protos = pro
bcc0: 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e tos;..statePtr->
bcd0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f protos_len = pro
bce0: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 tos_len;. } e
bcf0: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d lse {..statePtr-
bd00: 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a >protos = NULL;.
bd10: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
bd20: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d s_len = 0;. }
bd30: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
bd40: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 SSL Callbacks.
bd50: 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 */. SSL_se
bd60: 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 t_app_data(state
bd70: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 Ptr->ssl, (void
bd80: 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 *)statePtr);./*
bd90: 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 point back to us
bda0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f */. SSL_set_
bdb0: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d verify(statePtr-
bdc0: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 >ssl, verify, Ve
bdd0: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 rifyCallback);.
bde0: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f SSL_set_info_
bdf0: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
be00: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c r->ssl, InfoCall
be10: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 back);.. /* C
be20: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 allback for obse
be30: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d rving protocol m
be40: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 essages */.#ifnd
be50: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ef OPENSSL_NO_SS
be60: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 L_TRACE. /* v
be70: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f oid SSL_CTX_set_
be80: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 msg_callback_arg
be90: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
bea0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
beb0: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f );. void SSL_
bec0: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c CTX_set_msg_call
bed0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 back(statePtr->c
bee0: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 tx, MessageCallb
bef0: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c ack); */. SSL
bf00: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
bf10: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e k_arg(statePtr->
bf20: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ssl, (void *)sta
bf30: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f tePtr);. SSL_
bf40: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
bf50: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
bf60: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 MessageCallback)
bf70: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a ;.#endif.. /*
bf80: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e Create Tcl_Chan
bf90: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 nel BIO Handler
bfa0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
bfb0: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 >p_bio.= BIO_new
bfc0: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 _tcl(statePtr, B
bfd0: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 IO_NOCLOSE);.
bfe0: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d statePtr->bio.=
bff0: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 BIO_new(BIO_f_s
c000: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 sl());.. if (
c010: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 server) {../* Se
c020: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a rver callbacks *
c030: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 /..SSL_CTX_set_t
c040: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 lsext_servername
c050: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 _arg(statePtr->c
c060: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
c070: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f ePtr);..SSL_CTX_
c080: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 set_tlsext_serve
c090: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 rname_callback(s
c0a0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e tatePtr->ctx, SN
c0b0: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c ICallback);..SSL
c0c0: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f _CTX_set_client_
c0d0: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 hello_cb(statePt
c0e0: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c r->ctx, HelloCal
c0f0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 lback, (void *)s
c100: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 tatePtr);..if (s
c110: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
c120: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
c130: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e SSL_CTX_set_alpn
c140: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 _select_cb(state
c150: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 Ptr->ctx, ALPNCa
c160: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
c170: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 statePtr);.#ifde
c180: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 f USE_NPN.. i
c190: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 f (tls1_2 == 0 &
c1a0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b & tls1_3 == 0) {
c1b0: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e ...SSL_CTX_set_n
c1c0: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 ext_protos_adver
c1d0: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 tised_cb(statePt
c1e0: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 r->ctx, NPNCallb
c1f0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
c200: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 tePtr);.. }.#
c210: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e endif..}.../* En
c220: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 able server to s
c230: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 end cert request
c240: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 after handshake
c250: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 (TLS 1.3 only)
c260: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f */../* A write o
c270: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 peration must ta
c280: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 ke place for the
c290: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 Certificate Req
c2a0: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 uest to be.. s
c2b0: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e ent to the clien
c2c0: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 t, this can be d
c2d0: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f one with SSL_do_
c2e0: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a handshake(). */.
c2f0: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 .if (request &&
c300: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 post_handshake &
c310: 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 & tls1_3) {..
c320: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 SSL_verify_clie
c330: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b nt_post_handshak
c340: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
c350: 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 ;..}.../* set au
c360: 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 tomatic curve se
c370: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f lection */..SSL_
c380: 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 set_ecdh_auto(st
c390: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b atePtr->ssl, 1);
c3a0: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 .../* Set server
c3b0: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 mode */..stateP
c3c0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
c3d0: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 _TCL_SERVER;..SS
c3e0: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 L_set_accept_sta
c3f0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
c400: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
c410: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 ./* Client callb
c420: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 acks */.#ifdef U
c430: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 SE_NPN..if (stat
c440: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
c450: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d NULL && tls1_2 =
c460: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d = 0 && tls1_3 ==
c470: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 0) {.. SSL_C
c480: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 TX_set_next_prot
c490: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 o_select_cb(stat
c4a0: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 ePtr->ctx, ALPNC
c4b0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
c4c0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 )statePtr);..}.#
c4d0: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 endif.../* Sessi
c4e0: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 on caching */..S
c4f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 SL_CTX_set_sessi
c500: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 on_cache_mode(st
c510: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c atePtr->ctx, SSL
c520: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 _SESS_CACHE_CLIE
c530: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 NT | SSL_SESS_CA
c540: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f CHE_NO_INTERNAL_
c550: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 STORE);..SSL_CTX
c560: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 _sess_set_new_cb
c570: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c580: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 SessionCallback)
c590: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f ;.../* Enable po
c5a0: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 st handshake Aut
c5b0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 hentication exte
c5c0: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f nsion. TLS 1.3 o
c5d0: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e nly, not http/2.
c5e0: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 */..if (request
c5f0: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 && post_handsha
c600: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 ke) {.. SSL_s
c610: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b et_post_handshak
c620: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d e_auth(statePtr-
c630: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f >ssl, 1);..}.../
c640: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 * Set client mod
c650: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f e */..SSL_set_co
c660: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 nnect_state(stat
c670: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
c680: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 }. SSL_set_bi
c690: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c o(statePtr->ssl,
c6a0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
c6b0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 , statePtr->p_bi
c6c0: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f o);. BIO_set_
c6d0: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 ssl(statePtr->bi
c6e0: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c o, statePtr->ssl
c6f0: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a , BIO_NOCLOSE);.
c700: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 . /*. * E
c710: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 nd of SSL Init.
c720: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e */. dprin
c730: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 tf("Returning %s
c740: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
c750: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
c760: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f self));. Tcl_
c770: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
c780: 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 , (char *)Tcl_Ge
c790: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
c7a0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 tePtr->self), TC
c7b0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 L_VOLATILE);.
c7c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
c7d0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
c820: 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d * UnimportObjCm
c830: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
c840: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
c850: 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 oked to remove t
c860: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
c870: 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a el filter.. *. *
c880: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
c890: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
c8a0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
c8b0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d ffects:. *.May m
c8c0: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 odify the behavi
c8d0: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e or of an IO chan
c8e0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nel.. *. *------
c8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
c930: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e /..static int.Un
c940: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 0a 20 20 importObjCmd(.
c950: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 TCL_UNUSED(voi
c960: 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e d *),. Tcl_In
c970: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 terp *interp,.
c980: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 int objc,.
c990: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
c9a0: 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c bjv[]).{. Tcl
c9b0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 _Channel chan;..
c9c0: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 /* The channel t
c9d0: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e o set a mode on.
c9e0: 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 */.. dprintf
c9f0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
ca00: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 if (objc != 2)
ca10: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
ca20: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
ca30: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b bjv, "channel");
ca40: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
ca50: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 OR;. }.. c
ca60: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
ca70: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
ca80: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
ca90: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 1]), NULL);.
caa0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
cab0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
cac0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
cad0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
cae0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
caf0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
cb00: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
cb10: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
cb20: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
cb30: 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 han);.. if (T
cb40: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
cb50: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
cb60: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
cb70: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
cb80: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
cb90: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
cba0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
cbb0: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 han),..."\": not
cbc0: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
cbd0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
cbe0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
cbf0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
cc00: 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 "UNIMPORT", "CH
cc10: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 ANNEL", "INVALID
cc20: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
cc30: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
cc40: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
cc50: 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 if (Tcl_UnstackC
cc60: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 hannel(interp, c
cc70: 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f han) == TCL_ERRO
cc80: 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c R) {..return TCL
cc90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
cca0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
ccb0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
cd00: 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d *. * CTX_Init --
cd10: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c construct a SSL
cd20: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a _CTX instance. *
cd30: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
cd40: 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 A valid SSL_CTX
cd50: 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c instance or NULL
cd60: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
cd70: 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 ects:. *.constru
cd80: 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 cts SSL context
cd90: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d (CTX). *. *-----
cda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
cde0: 2a 2f 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 */..static SSL_C
cdf0: 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 0a 20 TX *.CTX_Init(.
ce00: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
ce10: 74 72 2c 0a 20 20 20 20 69 6e 74 20 69 73 53 65 tr,. int isSe
ce20: 72 76 65 72 2c 0a 20 20 20 20 69 6e 74 20 70 72 rver,. int pr
ce30: 6f 74 6f 2c 0a 20 20 20 20 63 68 61 72 20 2a 6b oto,. char *k
ce40: 65 79 66 69 6c 65 2c 0a 20 20 20 20 63 68 61 72 eyfile,. char
ce50: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 *certfile,.
ce60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
ce70: 65 79 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 ey,. unsigned
ce80: 20 63 68 61 72 20 2a 63 65 72 74 2c 0a 20 20 20 char *cert,.
ce90: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 0a 20 20 int key_len,.
cea0: 20 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 0a int cert_len,.
ceb0: 20 20 20 20 63 68 61 72 20 2a 43 41 70 61 74 68 char *CApath
cec0: 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 ,. char *CAfi
ced0: 6c 65 2c 0a 20 20 20 20 63 68 61 72 20 2a 63 69 le,. char *ci
cee0: 70 68 65 72 73 2c 0a 20 20 20 20 63 68 61 72 20 phers,. char
cef0: 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 0a 20 *ciphersuites,.
cf00: 20 20 20 69 6e 74 20 6c 65 76 65 6c 2c 0a 20 20 int level,.
cf10: 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 char *DHparams
cf20: 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 ).{. Tcl_Inte
cf30: 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 rp *interp = sta
cf40: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
cf50: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 SSL_CTX *ctx
cf60: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
cf70: 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 DString ds;.
cf80: 69 6e 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f int off = 0, abo
cf90: 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 rt = 0;. int
cfa0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 load_private_key
cfb0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
cfc0: 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a METHOD *method;.
cfd0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
cfe0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
cff0: 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f (!proto) {..Tcl_
d000: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d010: 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 erp, "no valid p
d020: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
d030: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
d040: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
d050: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 }.. /* cr
d060: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 eate SSL context
d070: 20 2a 2f 0a 20 20 20 20 69 66 20 28 45 4e 41 42 */. if (ENAB
d080: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d090: 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 ROTO_SSL2)) {..T
d0a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d0b0: 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 interp, "SSL2 pr
d0c0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d0d0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e rted", (char *)N
d0e0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
d0f0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
d100: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
d110: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 TLS_PROTO_SSL3)
d120: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
d130: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
d140: 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 SL3 protocol not
d150: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
d160: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 ar *)NULL);..ret
d170: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
d180: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
d190: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
d1a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
d1b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
d1c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 SSL_NO_TLS1_METH
d1d0: 4f 44 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 OD). if (ENAB
d1e0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d1f0: 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 ROTO_TLS1)) {..T
d200: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d210: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 interp, "TLS 1.0
d220: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
d230: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
d240: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e *)NULL);..return
d250: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
d260: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
d270: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
d280: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d290: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
d2a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d2b0: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 LS1_1_METHOD).
d2c0: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
d2d0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
d2e0: 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 LS1_1)) {..Tcl_A
d2f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
d300: 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f rp, "TLS 1.1 pro
d310: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
d320: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 ted", (char *)NU
d330: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
d340: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
d350: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
d360: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
d370: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d380: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
d390: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
d3a0: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 69 66 2_METHOD). if
d3b0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
d3c0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
d3d0: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 2)) {..Tcl_Appen
d3e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
d3f0: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f "TLS 1.2 protoco
d400: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
d410: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
d420: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
d430: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
d440: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
d450: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
d460: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
d470: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
d480: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d490: 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 O_TLS1_3)) {..Tc
d4a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d4b0: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 nterp, "TLS 1.3
d4c0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
d4d0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
d4e0: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 )NULL);..return
d4f0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
d500: 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f if. if (proto
d510: 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 == 0) {../* Use
d520: 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 full range */..
d530: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f SSL_CTX_set_min_
d540: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
d550: 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f x, 0);..SSL_CTX_
d560: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 set_max_proto_ve
d570: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 rsion(ctx, 0);.
d580: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 }.. switch
d590: 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 21 (proto) {.#if !
d5a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
d5b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d5c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 NSSL_NO_TLS1) &&
d5d0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
d5e0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 L_NO_TLS1_METHOD
d5f0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
d600: 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 ROTO_TLS1:..meth
d610: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
d620: 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 TLSv1_server_met
d630: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c hod() : TLSv1_cl
d640: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
d650: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
d660: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d670: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
d680: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d690: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
d6a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d6b0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _1_METHOD). c
d6c0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
d6d0: 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_1:..method =
d6e0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
d6f0: 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 _1_server_method
d700: 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 () : TLSv1_1_cli
d710: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
d720: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
d730: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
d740: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
d750: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d760: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
d770: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
d780: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 2_METHOD). ca
d790: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
d7a0: 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 1_2:..method = i
d7b0: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f sServer ? TLSv1_
d7c0: 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 2_server_method(
d7d0: 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 ) : TLSv1_2_clie
d7e0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
d7f0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
d800: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
d810: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
d820: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
d830: 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 3). case TLS_
d840: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f PROTO_TLS1_3:../
d850: 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 69 * Use the generi
d860: 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e c method and con
d870: 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66 straint range af
d880: 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63 ter context is c
d890: 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f reated */..metho
d8a0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
d8b0: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 LS_server_method
d8c0: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f () : TLS_client_
d8d0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
d8e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 ;.#endif. def
d8f0: 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 ault:../* Negoti
d900: 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61 69 ate highest avai
d910: 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 lable SSL/TLS ve
d920: 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 rsion */..method
d930: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
d940: 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 S_server_method(
d950: 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d ) : TLS_client_m
d960: 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 21 64 65 ethod();.#if !de
d970: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
d980: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d990: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 SL_NO_TLS1) && !
d9a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d9b0: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
d9c0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
d9d0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d9e0: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 O_TLS1) ? 0 :
d9f0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 SSL_OP_NO_TLSv1)
da00: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
da10: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
da20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
da30: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 NSSL_NO_TLS1_1)
da40: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
da50: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 SSL_NO_TLS1_1_ME
da60: 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 45 THOD)..off |= (E
da70: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
da80: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 S_PROTO_TLS1_1)
da90: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
daa0: 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 TLSv1_1);.#endif
dab0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
dac0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
dad0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
dae0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 TLS1_2) && !defi
daf0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
db00: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 6f LS1_2_METHOD)..o
db10: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
db20: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
db30: 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 TLS1_2) ? 0 : SS
db40: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 L_OP_NO_TLSv1_2)
db50: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
db60: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
db70: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
db80: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
db90: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
dba0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
dbb0: 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 O_TLS1_3) ? 0 :
dbc0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
dbd0: 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 3);.#endif..brea
dbe0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 k;. }.. ER
dbf0: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
dc00: 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
dc10: 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b CTX_new(method);
dc20: 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b . if (!ctx) {
dc30: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
dc40: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 }.. if (ge
dc50: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 tenv(SSLKEYLOGFI
dc60: 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f LE)) {..SSL_CTX_
dc70: 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 set_keylog_callb
dc80: 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 ack(ctx, KeyLogC
dc90: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a allback);. }.
dca0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
dcb0: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
dcc0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
dcd0: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 TLS1_3). if (
dce0: 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f proto == TLS_PRO
dcf0: 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 TO_TLS1_3) {..SS
dd00: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 L_CTX_set_min_pr
dd10: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
dd20: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 TLS1_3_VERSION)
dd30: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d ;..SSL_CTX_set_m
dd40: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e ax_proto_version
dd50: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 (ctx, TLS1_3_VER
dd60: 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e SION);. }.#en
dd70: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 dif.. /* Forc
dd80: 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 69 e cipher selecti
dd90: 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 76 on order by serv
dda0: 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 er */. if (!i
ddb0: 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f sServer) {..SSL_
ddc0: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
ddd0: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 ctx, SSL_OP_CIPH
dde0: 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52 ER_SERVER_PREFER
ddf0: 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 ENCE);. }..
de00: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 SSL_CTX_set_ap
de10: 70 5f 64 61 74 61 28 63 74 78 2c 20 69 6e 74 65 p_data(ctx, inte
de20: 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 rp);./* remember
de30: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 the interpreter
de40: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
de50: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c set_options(ctx,
de60: 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a SSL_OP_ALL);./*
de70: 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 all SSL bug wor
de80: 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 karounds */.
de90: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
dea0: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f ons(ctx, SSL_OP_
deb0: 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b NO_COMPRESSION);
dec0: 09 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 ./* disable comp
ded0: 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 ression even if
dee0: 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 supported */.
def0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 SSL_CTX_set_opt
df00: 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 ions(ctx, off);.
df10: 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 ./* disable prot
df20: 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f ocol versions */
df30: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 . SSL_CTX_ses
df40: 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 s_set_cache_size
df50: 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 (ctx, 128);..
df60: 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 /* Set user def
df70: 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 ined ciphers, ci
df80: 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 pher suites, and
df90: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 security level
dfa0: 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 */. if ((ciph
dfb0: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 ers != NULL) &&
dfc0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 !SSL_CTX_set_cip
dfd0: 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 her_list(ctx, ci
dfe0: 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 phers)) {..Tcl_A
dff0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
e000: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 rp, "Set ciphers
e010: 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 failed: No vali
e020: 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 d ciphers", (cha
e030: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f r *)NULL);..SSL_
e040: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
e050: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
e060: 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 }. if ((ciph
e070: 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c ersuites != NULL
e080: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 ) && !SSL_CTX_se
e090: 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63 t_ciphersuites(c
e0a0: 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 tx, ciphersuites
e0b0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
e0c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
e0d0: 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65 Set cipher suite
e0e0: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c s failed: No val
e0f0: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 id ciphers", (ch
e100: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c ar *)NULL);..SSL
e110: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
e120: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
e130: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
e140: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a security level *
e150: 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 /. if (level
e160: 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 > -1 && level <
e170: 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 6) {../* SSL_set
e180: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 _security_level
e190: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f */..SSL_CTX_set_
e1a0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 security_level(c
e1b0: 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 tx, level);.
e1c0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f }.. /* set so
e1d0: 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a me callbacks */.
e1e0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
e1f0: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 default_passwd_c
e200: 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 b(ctx, PasswordC
e210: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 allback);. SS
e220: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
e230: 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 t_passwd_cb_user
e240: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 data(ctx, (void
e250: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 *)statePtr);..
e260: 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 /* read a Diff
e270: 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d ie-Hellman param
e280: 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 eters file, or u
e290: 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 se the built-in
e2a0: 6f 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 one */. Tcl_D
e2b0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b StringInit(&ds);
e2c0: 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f .#ifdef OPENSSL_
e2d0: 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 NO_DH. if (DH
e2e0: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 params != NULL)
e2f0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
e300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 ult(interp, "DH
e310: 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 parameter suppor
e320: 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 t not available"
e330: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
e340: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e350: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
e360: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 L;. }.#else.
e370: 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 {..DH* dh;..i
e380: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e f (DHparams != N
e390: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 ULL) {.. BIO
e3a0: 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20 *bio;... bio
e3b0: 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 = BIO_new_file(F
e3c0: 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 2N(DHparams, &ds
e3d0: 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 ), "r");.. if
e3e0: 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f (!bio) {...Tcl_
e3f0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
e400: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 ;...Tcl_AppendRe
e410: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f sult(interp, "Co
e420: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 uld not find DH
e430: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 parameters file"
e440: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
e450: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
e460: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e ctx);...return N
e470: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ULL;.. }...
e480: 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f dh = PEM_read_
e490: 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f bio_DHparams(bio
e4a0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 , NULL, NULL, NU
e4b0: 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 LL);.. BIO_fr
e4c0: 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 ee(bio);.. Tc
e4d0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
e4e0: 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 s);.. if (!dh
e4f0: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
e500: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
e510: 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 Could not read D
e520: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f H parameters fro
e530: 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a m file", (char *
e540: 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 )NULL);...SSL_CT
e550: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
e560: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
e570: 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f }.. SSL_CTX_
e580: 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 set_tmp_dh(ctx,
e590: 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 dh);.. DH_fre
e5a0: 65 28 64 68 29 3b 0a 09 7d 20 65 6c 73 65 20 7b e(dh);..} else {
e5b0: 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c .. /* Use wel
e5c0: 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d l known DH param
e5d0: 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20 eters that have
e5e0: 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 built-in support
e5f0: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 in OpenSSL */..
e600: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 if (!SSL_CTX
e610: 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 _set_dh_auto(ctx
e620: 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 , 1)) {...Tcl_Ap
e630: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
e640: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e p, "Could not en
e650: 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f able set DH auto
e660: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
e670: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e SON(), (char *)N
e680: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
e690: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
e6a0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
e6b0: 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 ..}. }.#endif
e6c0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 .. /* set our
e6d0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
e6e0: 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 load_private
e6f0: 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 _key = 0;. if
e700: 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 (certfile != NU
e710: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 LL) {..load_priv
e720: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 69 ate_key = 1;...i
e730: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
e740: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
e750: 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c ctx, F2N(certfil
e760: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c e, &ds), SSL_FIL
e770: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 ETYPE_PEM) <= 0)
e780: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 {.. Tcl_DStr
e790: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
e7a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
e7b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
e7c0: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 ble to set certi
e7d0: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 ficate file ", c
e7e0: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 ertfile, ": ",..
e7f0: 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 . GET_ERR_REA
e800: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e SON(), (char *)N
e810: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
e820: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
e830: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
e840: 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 .}..Tcl_DStringF
e850: 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d ree(&ds);.. }
e860: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 else if (cert !
e870: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f = NULL) {..load_
e880: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b private_key = 1;
e890: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 ..if (SSL_CTX_us
e8a0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 e_certificate_AS
e8b0: 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e N1(ctx, cert_len
e8c0: 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a , cert) <= 0) {.
e8d0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
e8e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
e8f0: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 nable to set cer
e900: 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 20 tificate: ",...
e910: 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f GET_ERR_REASO
e920: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c N(), (char *)NUL
e930: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
e940: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
e950: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d return NULL;..}
e960: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 . } else {..c
e970: 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a ertfile = (char*
e980: 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c )X509_get_defaul
e990: 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a t_cert_file();..
e9a0: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
e9b0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c _certificate_fil
e9c0: 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c e(ctx, certfile,
e9d0: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 SSL_FILETYPE_PE
e9e0: 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 M) <= 0) {.#if 0
e9f0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
ea00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
ea10: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 unable to use de
ea20: 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 fault certificat
ea30: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 e file ", certfi
ea40: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 20 20 20 20 le, ": ",...
ea50: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
ea60: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
ea70: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
ea80: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
ea90: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 turn NULL;.#endi
eaa0: 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 f..}. }..
eab0: 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 /* set our priva
eac0: 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 te key */. if
ead0: 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b (load_private_k
eae0: 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 ey) {..if (keyfi
eaf0: 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 le == NULL && ke
eb00: 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 y == NULL) {..
eb10: 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 keyfile = cert
eb20: 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b file;..}...if (k
eb30: 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 eyfile != NULL)
eb40: 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 {.. /* get th
eb50: 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 e private key as
eb60: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 sociated with th
eb70: 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 2a is certificate *
eb80: 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 /.. if (keyfi
eb90: 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 le == NULL) {...
eba0: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 keyfile = certfi
ebb0: 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 le;.. }...
ebc0: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 if (SSL_CTX_use
ebd0: 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 _PrivateKey_file
ebe0: 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c (ctx, F2N(keyfil
ebf0: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c e, &ds), SSL_FIL
ec00: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 ETYPE_PEM) <= 0)
ec10: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 {...Tcl_DString
ec20: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 Free(&ds);.../*
ec30: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 flush the passph
ec40: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 rase which might
ec50: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 be left in the
ec60: 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f result */...Tcl_
ec70: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
ec80: 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 , NULL, TCL_STAT
ec90: 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e IC);...Tcl_Appen
eca0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
ecb0: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 "unable to set p
ecc0: 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 ublic key file "
ecd0: 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a , keyfile, " ",.
ece0: 09 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ...GET_ERR_REASO
ecf0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c N(), (char *)NUL
ed00: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
ed10: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
ed20: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 n NULL;.. }..
ed30: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
ed40: 72 65 65 28 26 64 73 29 3b 0a 09 7d 20 65 6c 73 ree(&ds);..} els
ed50: 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c e if (key != NUL
ed60: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 L) {.. if (SS
ed70: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 L_CTX_use_Privat
ed80: 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b eKey_ASN1(EVP_PK
ed90: 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 EY_RSA, ctx, key
eda0: 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 ,key_len) <= 0)
edb0: 7b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 {.../* flush the
edc0: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 passphrase whic
edd0: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 h might be left
ede0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f in the result */
edf0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
ee00: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 (interp, NULL, T
ee10: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 CL_STATIC);...Tc
ee20: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
ee30: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
ee40: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 o set public key
ee50: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
ee60: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e SON(), (char *)N
ee70: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
ee80: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
ee90: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
eea0: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b ..}../* Now we k
eeb0: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 now that a key a
eec0: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 nd cert have bee
eed0: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 n set against..
eee0: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 * the SSL contex
eef0: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 t */..if (!SSL_C
ef00: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 TX_check_private
ef10: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 _key(ctx)) {..
ef20: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
ef30: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 lt(interp, "priv
ef40: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 ate key does not
ef50: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 match the certi
ef60: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 ficate public ke
ef70: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 y",.... (cha
ef80: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
ef90: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
efa0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
efb0: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ULL;..}. }..
efc0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 /* Set to use
efd0: 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f default locatio
efe0: 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 n and file for C
eff0: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f ertificate Autho
f000: 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66 rity (CA) certif
f010: 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20 20 20 icates. The.
f020: 20 2a 20 76 65 72 69 66 79 20 70 61 74 68 20 61 * verify path a
f030: 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65 20 nd store can be
f040: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 overridden by th
f050: 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 e SSL_CERT_DIR e
f060: 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65 72 69 nv var. The veri
f070: 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 20 fy file can.
f080: 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e * be overridden
f090: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 by the SSL_CERT
f0a0: 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a _FILE env var. *
f0b0: 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 /. if (!SSL_C
f0c0: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 TX_set_default_v
f0d0: 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 erify_paths(ctx)
f0e0: 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 ) {..abort++;.
f0f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 }.. /* Over
f100: 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43 41 rides for the CA
f110: 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 verify path and
f120: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 file */. {.#
f130: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
f140: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
f150: 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70 000000L..if (CAp
f160: 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 ath != NULL || C
f170: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b Afile != NULL) {
f180: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
f190: 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f g ds1;.. Tcl_
f1a0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 DStringInit(&ds1
f1b0: 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53 53 );... if (!SS
f1c0: 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 L_CTX_load_verif
f1d0: 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c y_locations(ctx,
f1e0: 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 F2N(CAfile, &ds
f1f0: 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 ), F2N(CApath, &
f200: 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 ds1))) {...abort
f210: 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ++;.. }..
f220: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
f230: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 &ds);.. Tcl_D
f240: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 StringFree(&ds1)
f250: 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c ;... /* Set l
f260: 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65 ist of CAs to se
f270: 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 nd to client whe
f280: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63 n requesting a c
f290: 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74 lient certificat
f2a0: 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 e */.. /* htt
f2b0: 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 ps://sourceforge
f2c0: 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f .net/p/tls/bugs/
f2d0: 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 57/ */.. /* X
f2e0: 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 XX:TODO: Let the
f2f0: 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c user supply val
f300: 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 ues here instead
f310: 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 of something th
f320: 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 at exists on the
f330: 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 filesystem */..
f340: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 STACK_OF(X50
f350: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 9_NAME) *certNam
f360: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c es = SSL_load_cl
f370: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e ient_CA_file(F2N
f380: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a (CAfile, &ds));.
f390: 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d . if (certNam
f3a0: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 es != NULL) {...
f3b0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 SSL_CTX_set_clie
f3c0: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 nt_CA_list(ctx,
f3d0: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 certNames);..
f3e0: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 }.. Tcl_DStr
f3f0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d ingFree(&ds);..}
f400: 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 41 70 ..#else..if (CAp
f410: 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ath != NULL) {..
f420: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 if (!SSL_CTX
f430: 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72 _load_verify_dir
f440: 28 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68 (ctx, F2N(CApath
f450: 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f , &ds))) {...abo
f460: 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 rt++;.. }..
f470: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
f480: 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28 e(&ds);..}..if (
f490: 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 CAfile != NULL)
f4a0: 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f {.. if (!SSL_
f4b0: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f CTX_load_verify_
f4c0: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41 file(ctx, F2N(CA
f4d0: 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 file, &ds))) {..
f4e0: 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d .abort++;.. }
f4f0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
f500: 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 gFree(&ds);...
f510: 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 /* Set list of
f520: 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 CAs to send to
f530: 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 client when requ
f540: 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 esting a client
f550: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
f560: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 STACK_OF(X50
f570: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 9_NAME) *certNam
f580: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c es = SSL_load_cl
f590: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e ient_CA_file(F2N
f5a0: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a (CAfile, &ds));.
f5b0: 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d . if (certNam
f5c0: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 es != NULL) {...
f5d0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 SSL_CTX_set_clie
f5e0: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 nt_CA_list(ctx,
f5f0: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 certNames);..
f600: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 }.. Tcl_DStr
f610: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d ingFree(&ds);..}
f620: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 .#endif. }..
f630: 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d return ctx;.}
f640: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
f650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
f690: 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d * StatusObjCmd -
f6a0: 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 - return certifi
f6b0: 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 cate for connect
f6c0: 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 ed peer.. *. * R
f6d0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
f6e0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
f6f0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
f700: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
f710: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f750: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
f760: 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a ic int.StatusObj
f770: 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 Cmd(. TCL_UNU
f780: 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 SED(void *),.
f790: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
f7a0: 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a erp,. int obj
f7b0: 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a c,. Tcl_Obj.*
f7c0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a const objv[]).{.
f7d0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
f7e0: 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 Ptr;. X509 *p
f7f0: 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a eer;. Tcl_Obj
f800: 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 *objPtr;. Tc
f810: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a l_Channel chan;.
f820: 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 char *channe
f830: 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b lName, *ciphers;
f840: 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 . int mode;.
f850: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 const unsigne
f860: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 d char *proto;.
f870: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 unsigned int
f880: 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 len;. int nid
f890: 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 , res;.. dpri
f8a0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
f8b0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
f8c0: 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 || objc > 3 ||
f8d0: 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 (objc == 3 && !s
f8e0: 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 trcmp(Tcl_GetStr
f8f0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d ing(objv[1]), "-
f900: 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c local"))) {..Tcl
f910: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
f920: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
f930: 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c ?-local? channel
f940: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
f950: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
f960: 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c /* Get channel
f970: 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e Id */. chann
f980: 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 elName = Tcl_Get
f990: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28 6f 62 6a String(objv[(obj
f9a0: 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d c == 2 ? 1 : 2)]
f9b0: 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 );. chan = Tc
f9c0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
f9d0: 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 erp, channelName
f9e0: 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 , &mode);. if
f9f0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
fa00: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
fa10: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
fa20: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
fa30: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
fa40: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
fa50: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
fa60: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
fa70: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
fa80: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f n);. if (Tcl_
fa90: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
faa0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
fab0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
fac0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
fad0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
fae0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
faf0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
fb00: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
fb10: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 TLS channel", (c
fb20: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 63 har *)NULL);..Tc
fb30: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
fb40: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 nterp, "TLS", "S
fb50: 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c TATUS", "CHANNEL
fb60: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 ", "INVALID", (c
fb70: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 har *)NULL);..re
fb80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
fb90: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
fba0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 tr = (State *) T
fbb0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
fbc0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b tanceData(chan);
fbd0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 .. /* Get cer
fbe0: 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 tificate for pee
fbf0: 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 r or self */.
fc00: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
fc10: 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 {..peer = SSL_ge
fc20: 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 t_peer_certifica
fc30: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
fc40: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
fc50: 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f .peer = SSL_get_
fc60: 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 certificate(stat
fc70: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
fc80: 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 }. /* Get X50
fc90: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 9 certificate in
fca0: 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 fo */. if (pe
fcb0: 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 er) {..objPtr =
fcc0: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 Tls_NewX509Obj(i
fcd0: 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 nterp, peer);..i
fce0: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a f (objc == 2) {.
fcf0: 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 . X509_free(p
fd00: 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 eer);.. peer
fd10: 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d = NULL;..}. }
fd20: 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 else {..objPtr
fd30: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
fd40: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d (0, NULL);. }
fd50: 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 .. /* Peer na
fd60: 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e me */. LAPPEN
fd70: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
fd80: 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 jPtr, "peername"
fd90: 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e , SSL_get0_peern
fda0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ame(statePtr->ss
fdb0: 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 l), -1);. LAP
fdc0: 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
fdd0: 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 objPtr, "sbits"
fde0: 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 , SSL_get_cipher
fdf0: 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e _bits(statePtr->
fe00: 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 ssl, NULL));..
fe10: 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 ciphers = (cha
fe20: 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 r*)SSL_get_ciphe
fe30: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 r(statePtr->ssl)
fe40: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
fe50: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
fe60: 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 , "cipher", ciph
fe70: 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f ers, -1);.. /
fe80: 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 * Verify the X50
fe90: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 9 certificate pr
fea0: 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 esented by the p
feb0: 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 eer */. LAPPE
fec0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
fed0: 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 bjPtr, "verifyRe
fee0: 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 sult",..X509_ver
fef0: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 ify_cert_error_s
ff00: 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 tring(SSL_get_ve
ff10: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
ff20: 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 ePtr->ssl)), -1)
ff30: 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 ;.. /* Verify
ff40: 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 mode */. mod
ff50: 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 e = SSL_get_veri
ff60: 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 fy_mode(statePtr
ff70: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 ->ssl);. if (
ff80: 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
ff90: 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 FY_NONE) {..LAPP
ffa0: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
ffb0: 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d objPtr, "verifyM
ffc0: 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 ode", "none", -1
ffd0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
ffe0: 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 .Tcl_Obj *listOb
fff0: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
10000 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
10010 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c .if (mode && SSL
10020 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a _VERIFY_PEER) {.
10030 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
10040 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
10050 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 terp, listObjPtr
10060 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10070 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b bj("peer", -1));
10080 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 ..}..if (mode &&
10090 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
100a0 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
100b0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
100c0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
100d0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
100e0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
100f0 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 ingObj("fail if
10100 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d no peer cert", -
10110 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 1));..}..if (mod
10120 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
10130 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 CLIENT_ONCE) {..
10140 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
10150 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
10160 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c erp, listObjPtr,
10170 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
10180 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c j("client once",
10190 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d -1));..}..if (m
101a0 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
101b0 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 Y_POST_HANDSHAKE
101c0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
101d0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
101e0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
101f0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
10200 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e ingObj("post han
10210 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 dshake", -1));..
10220 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 }..LAPPEND_OBJ(i
10230 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10240 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 verifyMode", lis
10250 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a tObjPtr). }..
10260 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f /* Verify mo
10270 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 de depth */.
10280 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
10290 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 rp, objPtr, "ver
102a0 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 ifyDepth", SSL_g
102b0 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 et_verify_depth(
102c0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b statePtr->ssl));
102d0 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 .. /* Report
102e0 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
102f0 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
10300 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 t of the negotia
10310 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f tion */. SSL_
10320 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 get0_alpn_select
10330 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ed(statePtr->ssl
10340 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b , &proto, &len);
10350 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
10360 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10370 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a "alpn", (char *
10380 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a )proto, (Tcl_Siz
10390 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 e) len);. LAP
103a0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
103b0 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
103c0 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 ol", SSL_get_ver
103d0 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 sion(statePtr->s
103e0 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f sl), -1);.. /
103f0 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d * Valid for non-
10400 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e RSA signature an
10410 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 d TLS 1.3 */.
10420 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
10430 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
10440 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f _peer_signature_
10450 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
10460 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 l, &nid);. }
10470 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 else {..res = SS
10480 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f L_get_signature_
10490 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
104a0 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a l, &nid);. }.
104b0 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e if (!res) {n
104c0 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 id = 0;}. LAP
104d0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
104e0 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 objPtr, "signat
104f0 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d ureHashAlgorithm
10500 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 ", OBJ_nid2ln(ni
10510 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66 d), -1);.. if
10520 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
10530 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 res = SSL_get_pe
10540 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 er_signature_typ
10550 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
10560 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
10570 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
10580 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 SSL_get_signatur
10590 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 e_type_nid(state
105a0 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b Ptr->ssl, &nid);
105b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 . }. if (!
105c0 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a res) {nid = 0;}.
105d0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
105e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
105f0 22 73 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c "signatureType",
10600 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 OBJ_nid2ln(nid)
10610 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f , -1);.. Tcl_
10620 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
10630 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
10640 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
10650 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
10660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
106a0 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e . * ConnectionIn
106b0 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 foObjCmd -- retu
106c0 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e rn connection in
106d0 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e fo from OpenSSL.
106e0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
106f0 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e *.A list of con
10700 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a nection info. *
10710 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
10720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10750 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
10760 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f ic int Connectio
10770 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 0a 20 20 20 nInfoObjCmd(.
10780 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 TCL_UNUSED(void
10790 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 *),. Tcl_Int
107a0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 erp *interp,.
107b0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 int objc,. T
107c0 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
107d0 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f jv[]).{. Tcl_
107e0 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
107f0 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
10800 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a set a mode on *
10810 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
10820 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e tePtr;../* clien
10830 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
10840 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 socket */. Tc
10850 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a l_Obj *objPtr, *
10860 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e listPtr;. con
10870 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 st SSL *ssl;.
10880 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 const SSL_CIPHE
10890 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 R *cipher;. c
108a0 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e onst SSL_SESSION
108b0 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 *session;. c
108c0 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b onst EVP_MD *md;
108d0 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
108e0 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
108f0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
10900 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
10910 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 el");..return TC
10920 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
10930 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
10940 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
10950 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 , Tcl_GetString(
10960 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b objv[1]), NULL);
10970 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
10980 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
10990 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
109a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
109b0 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
109c0 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
109d0 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
109e0 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
109f0 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
10a00 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 nel(chan);. i
10a10 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
10a20 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
10a30 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
10a40 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
10a50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
10a60 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
10a70 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
10a80 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 me(chan),.. "
10a90 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
10aa0 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 annel", (char *)
10ab0 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 NULL);..Tcl_SetE
10ac0 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
10ad0 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 "TLS", "CONNECT
10ae0 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c ION", "CHANNEL",
10af0 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
10b00 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 r *)NULL);..retu
10b10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
10b20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 }.. objPtr
10b30 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
10b40 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 (0, NULL);..
10b50 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e /* Connection in
10b60 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 fo */. stateP
10b70 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
10b80 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
10b90 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
10ba0 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 ssl = stateP
10bb0 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 tr->ssl;. if
10bc0 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl != NULL) {.
10bd0 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 ./* connection s
10be0 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 tate */..LAPPEND
10bf0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
10c00 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 Ptr, "state", SS
10c10 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c L_state_string_l
10c20 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a ong(ssl), -1);..
10c30 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 ./* Get SNI requ
10c40 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d ested server nam
10c50 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 e */..LAPPEND_ST
10c60 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
10c70 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 , "servername",
10c80 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 SSL_get_serverna
10c90 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e me(ssl, TLSEXT_N
10ca0 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d AMETYPE_host_nam
10cb0 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 e), -1);.../* Ge
10cc0 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c t protocol */..L
10cd0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10ce0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 p, objPtr, "prot
10cf0 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 ocol", SSL_get_v
10d00 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 ersion(ssl), -1)
10d10 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 ;.../* Renegotia
10d20 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a tion allowed */.
10d30 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
10d40 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 terp, objPtr, "r
10d50 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c enegotiation_all
10d60 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 owed", SSL_get_s
10d70 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 ecure_renegotiat
10d80 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53 53 4c ion_support((SSL
10d90 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 *) ssl));.../*
10da0 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 Get security lev
10db0 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 el */..LAPPEND_I
10dc0 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
10dd0 72 2c 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76 r, "security_lev
10de0 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 el", SSL_get_sec
10df0 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 urity_level(ssl)
10e00 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
10e10 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 info */..LAPPEND
10e20 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
10e30 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 jPtr, "session_r
10e40 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 eused", SSL_sess
10e50 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 ion_reused(ssl))
10e60 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 ;.../* Is server
10e70 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e info */..LAPPEN
10e80 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
10e90 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 bjPtr, "is_serve
10ea0 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 r", SSL_is_serve
10eb0 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 r(ssl));.../* Is
10ec0 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e DTLS */..LAPPEN
10ed0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
10ee0 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 bjPtr, "is_dtls"
10ef0 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 , SSL_is_dtls(ss
10f00 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 l));. }..
10f10 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a /* Cipher info *
10f20 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 /. cipher = S
10f30 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 SL_get_current_c
10f40 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 ipher(ssl);.
10f50 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 if (cipher != NU
10f60 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b LL) {..char buf[
10f70 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 BUFSIZ] = {0};..
10f80 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 int bits, alg_bi
10f90 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 ts;.../* Cipher
10fa0 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 name */..LAPPEND
10fb0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
10fc0 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 Ptr, "cipher", S
10fd0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 SL_CIPHER_get_na
10fe0 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b me(cipher), -1);
10ff0 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f .../* RFC name o
11000 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 f cipher */..LAP
11010 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11020 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 objPtr, "standa
11030 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 rd_name", SSL_CI
11040 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 PHER_standard_na
11050 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b me(cipher), -1);
11060 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 .../* OpenSSL na
11070 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a me of cipher */.
11080 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11090 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 erp, objPtr, "op
110a0 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 enssl_name", OPE
110b0 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 NSSL_cipher_name
110c0 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e (SSL_CIPHER_stan
110d0 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 dard_name(cipher
110e0 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 )), -1);.../* nu
110f0 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 mber of secret b
11100 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 its used for cip
11110 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 her */..bits = S
11120 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 SL_CIPHER_get_bi
11130 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f ts(cipher, &alg_
11140 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f bits);..LAPPEND_
11150 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
11160 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 tr, "secret_bits
11170 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 ", bits);..LAPPE
11180 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
11190 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 bjPtr, "algorith
111a0 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 m_bits", alg_bit
111b0 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 s);../* alg_bits
111c0 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 is actual key s
111d0 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 ecret bits. If u
111e0 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 se bits and secr
111f0 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 et (algorithm) b
11200 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 its differ,..
11210 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 the rest of the
11220 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 bits are fixed,
11230 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 i.e. for limited
11240 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 export ciphers
11250 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a (bits < 56) */..
11260 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 ./* Indicates wh
11270 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 ich SSL/TLS prot
11280 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 ocol version fir
11290 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 st defined the c
112a0 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e ipher */..LAPPEN
112b0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
112c0 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 jPtr, "min_versi
112d0 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f on", SSL_CIPHER_
112e0 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 get_version(ciph
112f0 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 er), -1);.../* C
11300 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 ipher NID */..LA
11310 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11320 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
11330 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f rNID", (char *)O
11340 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
11350 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f PHER_get_cipher_
11360 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
11370 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
11380 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11390 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 "digestNID", (ch
113a0 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 ar *)OBJ_nid2ln(
113b0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 SSL_CIPHER_get_d
113c0 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 igest_nid(cipher
113d0 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e )), -1);..LAPPEN
113e0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
113f0 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e jPtr, "keyExchan
11400 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 geNID", (char *)
11410 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 OBJ_nid2ln(SSL_C
11420 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 IPHER_get_kx_nid
11430 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
11440 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11450 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 erp, objPtr, "au
11460 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 thenticationNID"
11470 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
11480 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
11490 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 get_auth_nid(cip
114a0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a her)), -1);.../*
114b0 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 message authent
114c0 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 ication code - C
114d0 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65 ipher is AEAD (e
114e0 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 .g. GCM or ChaCh
114f0 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 a20/Poly1305) or
11500 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 not */../* Auth
11510 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 enticated Encryp
11520 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 tion with associ
11530 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29 ated data (AEAD)
11540 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 check */..LAPPE
11550 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
11560 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f objPtr, "cipher_
11570 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 is_aead", SSL_CI
11580 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 PHER_is_aead(cip
11590 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 her));.../* Dige
115a0 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 st used during t
115b0 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 he SSL/TLS hands
115c0 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 hake when using
115d0 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 the cipher. */..
115e0 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f md = SSL_CIPHER_
115f0 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 get_handshake_di
11600 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c gest(cipher);..L
11610 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11620 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 p, objPtr, "hand
11630 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 shake_digest", (
11640 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 char *)EVP_MD_na
11650 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f me(md), -1);.../
11660 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 * Get OpenSSL-sp
11670 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 ecific ID, not I
11680 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 ANA ID */..LAPPE
11690 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
116a0 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 bjPtr, "cipher_i
116b0 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 d", (int) SSL_CI
116c0 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 PHER_get_id(ciph
116d0 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 er));.../* Two-b
116e0 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 yte ID used in t
116f0 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 he TLS protocol
11700 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 of the given cip
11710 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
11720 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
11730 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 tr, "protocol_id
11740 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 ", (int) SSL_CIP
11750 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c HER_get_protocol
11760 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 _id(cipher));...
11770 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 /* Textual descr
11780 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 iption of the ci
11790 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c pher */..if (SSL
117a0 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 _CIPHER_descript
117b0 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c ion(cipher, buf,
117c0 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d sizeof(buf)) !=
117d0 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 NULL) {.. LA
117e0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
117f0 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 , objPtr, "descr
11800 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 iption", buf, -1
11810 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
11820 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f /* Session info
11830 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 */. session
11840 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f = SSL_get_sessio
11850 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 n(ssl);. if (
11860 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 session != NULL)
11870 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e {..const unsign
11880 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
11890 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 ..size_t len2;..
118a0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 unsigned int ule
118b0 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n;..const unsign
118c0 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
118d0 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e _id, *proto;..un
118e0 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 signed char buff
118f0 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 er[SSL_MAX_MASTE
11900 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a R_KEY_LENGTH];..
11910 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 ./* Report the s
11920 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
11930 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
11940 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 the ALPN negotia
11950 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 tion */..SSL_SES
11960 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 SION_get0_alpn_s
11970 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c elected(session,
11980 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b &proto, &len2);
11990 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
119a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 terp, objPtr, "a
119b0 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 lpn", (char *) p
119c0 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 roto, (Tcl_Size)
119d0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 len2);.../* Rep
119e0 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 ort the selected
119f0 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 protocol as a r
11a00 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e esult of the NPN
11a10 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
11a20 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
11a30 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 SSL_get0_next_pr
11a40 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 oto_negotiated(s
11a50 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 sl, &proto, &ule
11a60 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 n);..LAPPEND_STR
11a70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11a80 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 "npn", (char *)
11a90 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a proto, (Tcl_Siz
11aa0 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 e) ulen);.#endif
11ab0 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 .../* Resumable
11ac0 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 session */..LAPP
11ad0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
11ae0 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 objPtr, "resuma
11af0 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f ble", SSL_SESSIO
11b00 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 N_is_resumable(s
11b10 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 ession));.../* S
11b20 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d ession start tim
11b30 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 e (seconds since
11b40 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 epoch) */..LAPP
11b50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 END_INT(interp,
11b60 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 objPtr, "start_t
11b70 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f ime", SSL_SESSIO
11b80 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 N_get_time(sessi
11b90 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f on));.../* Timeo
11ba0 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 ut value - SSL_C
11bb0 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 TX_get_timeout (
11bc0 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 in seconds) */..
11bd0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
11be0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d rp, objPtr, "tim
11bf0 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 eout", SSL_SESSI
11c00 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 ON_get_timeout(s
11c10 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 ession));.../* S
11c20 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 ession id - TLSv
11c30 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 1.2 and below on
11c40 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 ly */..session_i
11c50 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f d = SSL_SESSION_
11c60 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 get_id(session,
11c70 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 &ulen);..LAPPEND
11c80 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
11c90 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
11ca0 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 _id", session_id
11cb0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
11cc0 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e n);.../* Session
11cd0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 context */..ses
11ce0 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 sion_id = SSL_SE
11cf0 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f SSION_get0_id_co
11d00 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 ntext(session, &
11d10 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f ulen);..LAPPEND_
11d20 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f BARRAY(interp, o
11d30 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f bjPtr, "session_
11d40 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 6f context", sessio
11d50 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 n_id, (Tcl_Size)
11d60 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 ulen);.../* Ses
11d70 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c sion ticket - cl
11d80 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 ient only */..SS
11d90 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 L_SESSION_get0_t
11da0 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 icket(session, &
11db0 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a ticket, &len2);.
11dc0 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
11dd0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11de0 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 "session_ticket"
11df0 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 , ticket, (Tcl_S
11e00 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a ize) len2);.../*
11e10 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 Session ticket
11e20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69 lifetime hint (i
11e30 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c n seconds) */..L
11e40 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
11e50 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 p, objPtr, "life
11e60 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 time", SSL_SESSI
11e70 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 ON_get_ticket_li
11e80 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 fetime_hint(sess
11e90 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b ion));.../* Tick
11ea0 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 et app data */.#
11eb0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
11ec0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
11ed0 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 000000L..SSL_SES
11ee0 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
11ef0 5f 61 70 70 64 61 74 61 28 28 53 53 4c 5f 53 45 _appdata((SSL_SE
11f00 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e SSION *) session
11f10 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 , &ticket, &len2
11f20 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
11f30 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
11f40 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 r, "ticket_app_d
11f50 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 ata", ticket, (T
11f60 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a cl_Size) len2);.
11f70 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 #endif.../* Get
11f80 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c master key */..l
11f90 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f en2 = SSL_SESSIO
11fa0 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 N_get_master_key
11fb0 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 (session, buffer
11fc0 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 , SSL_MAX_MASTER
11fd0 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c _KEY_LENGTH);..L
11fe0 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e APPEND_BARRAY(in
11ff0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d terp, objPtr, "m
12000 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 aster_key", buff
12010 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c er, (Tcl_Size) l
12020 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 en2);.../* Compr
12030 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e ession id */..un
12040 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 signed int id =
12050 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
12060 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 73 73 compress_id(sess
12070 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 ion);..LAPPEND_S
12080 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12090 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f r, "compression_
120a0 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 id", id == 1 ? "
120b0 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 zlib" : "none",
120c0 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 -1);. }..
120d0 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 /* Compression i
120e0 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 nfo */. if (s
120f0 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 sl != NULL) {.#i
12100 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f fdef HAVE_SSL_CO
12110 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 MPRESSION..const
12120 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f COMP_METHOD *co
12130 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 mp, *expn;..comp
12140 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 = SSL_get_curre
12150 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 nt_compression(s
12160 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c sl);..expn = SSL
12170 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 _get_current_exp
12180 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c ansion(ssl);...L
12190 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
121a0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 p, objPtr, "comp
121b0 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f ression", comp ?
121c0 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 SSL_COMP_get_na
121d0 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 me(comp) : "none
121e0 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ", -1);..LAPPEND
121f0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12200 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 Ptr, "expansion"
12210 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d , expn ? SSL_COM
12220 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 P_get_name(expn)
12230 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a : "none", -1);.
12240 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 #else..LAPPEND_S
12250 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12260 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 r, "compression"
12270 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 , "none", -1);..
12280 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12290 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 rp, objPtr, "exp
122a0 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c ansion", "none",
122b0 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 -1);.#endif.
122c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 }.. /* Serve
122d0 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a r info */. {.
122e0 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c .long mode = SSL
122f0 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e _CTX_get_session
12300 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 _cache_mode(stat
12310 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 ePtr->ctx);..cha
12320 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f r *msg;...if (mo
12330 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
12340 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 CHE_OFF) {..
12350 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 msg = "off";..}
12360 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 else if (mode &
12370 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 SSL_SESS_CACHE_C
12380 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 LIENT) {.. ms
12390 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d g = "client";..}
123a0 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 else if (mode &
123b0 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
123c0 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 6d SERVER) {.. m
123d0 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 sg = "server";..
123e0 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 } else if (mode
123f0 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
12400 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 _BOTH) {.. ms
12410 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 g = "both";..} e
12420 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d lse {.. msg =
12430 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 "unknown";..}..
12440 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12450 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
12460 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 sion_cache_mode"
12470 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 , msg, -1);.
12480 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 }.. /* CA Lis
12490 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e t */. /* IF n
124a0 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 61 6d ot a server, sam
124b0 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 e as SSL_get0_pe
124c0 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 er_CA_list. If s
124d0 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 53 53 erver same as SS
124e0 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 L_CTX_get_client
124f0 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 _CA_list */.
12500 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 listPtr = Tcl_Ne
12510 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
12520 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 );. STACK_OF(
12530 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c X509_NAME) *ca_l
12540 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61 ist;. if ((ca
12550 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f _list = SSL_get_
12560 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 client_CA_list(s
12570 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a sl)) != NULL) {.
12580 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 55 46 .char buffer[BUF
12590 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 SIZ];..for (int
125a0 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 i = 0; i < sk_X5
125b0 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 09_NAME_num(ca_l
125c0 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 ist); i++) {..
125d0 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d X509_NAME *nam
125e0 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 e = sk_X509_NAME
125f0 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 _value(ca_list,
12600 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d i);.. if (nam
12610 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 e) {...X509_NAME
12620 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 _oneline(name, b
12630 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a uffer, BUFSIZ);.
12640 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
12650 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
12660 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f p, listPtr, Tcl_
12670 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 NewStringObj(buf
12680 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 fer, -1));..
12690 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c }..}. }. L
126a0 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
126b0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 p, objPtr, "caLi
126c0 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 st", listPtr);.
126d0 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 LAPPEND_INT(i
126e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
126f0 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b caListCount", sk
12700 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 _X509_NAME_num(c
12710 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 a_list));.. T
12720 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
12730 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
12740 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
12750 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
12760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
127a0 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 . *. * VersionOb
127b0 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 jCmd -- return v
127c0 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 ersion string fr
127d0 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 om OpenSSL.. *.
127e0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
127f0 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
12800 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
12810 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
12820 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
12830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
12870 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f tatic int.Versio
12880 6e 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c nObjCmd(. TCL
12890 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c _UNUSED(void *),
128a0 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
128b0 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 54 43 4c *interp,. TCL
128c0 5f 55 4e 55 53 45 44 28 69 6e 74 29 20 2f 2a 20 _UNUSED(int) /*
128d0 6f 62 6a 63 20 2a 2f 2c 0a 20 20 20 20 54 43 4c objc */,. TCL
128e0 5f 55 4e 55 53 45 44 28 54 63 6c 5f 4f 62 6a 20 _UNUSED(Tcl_Obj
128f0 2a 63 6f 6e 73 74 20 2a 29 20 2f 2a 20 6f 62 6a *const *) /* obj
12900 76 20 2a 2f 29 0a 7b 0a 20 20 20 20 54 63 6c 5f v */).{. Tcl_
12910 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 Obj *objPtr;..
12920 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
12930 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 d");.. objPtr
12940 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 = Tcl_NewString
12950 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 Obj(OPENSSL_VERS
12960 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 0a ION_TEXT, -1);..
12970 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
12980 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
12990 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
129a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
129b0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
129c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129f0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 -----. *. * Misc
12a00 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 ObjCmd -- misc c
12a10 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 ommands. *. * Re
12a20 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
12a30 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
12a40 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
12a50 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
12a60 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
12a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12aa0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
12ab0 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 c int.MiscObjCmd
12ac0 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 (. TCL_UNUSED
12ad0 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 (void *),. Tc
12ae0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
12af0 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a ,. int objc,.
12b00 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e Tcl_Obj.*con
12b10 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 st objv[]).{.
12b20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 static const ch
12b30 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 ar *commands []
12b40 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 = { "req", "strr
12b50 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 eq", NULL };.
12b60 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 enum command {
12b70 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c C_REQ, C_STRREQ,
12b80 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 C_DUMMY };.
12b90 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 Tcl_Size cmd;.
12ba0 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 int isStr;.
12bb0 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 char buffer[163
12bc0 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 84];.. dprint
12bd0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
12be0 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 if (objc < 2)
12bf0 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
12c00 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
12c10 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 bjv, "subcommand
12c20 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 ?args?");..retu
12c30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
12c40 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f }. if (Tcl_
12c50 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 GetIndexFromObj(
12c60 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c interp, objv[1],
12c70 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d commands, "comm
12c80 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 and", 0, &cmd) !
12c90 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
12ca0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
12cb0 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
12cc0 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
12cd0 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d isStr = (cmd =
12ce0 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 = C_STRREQ);.
12cf0 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 switch ((enum c
12d00 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 ommand) cmd) {..
12d10 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 case C_REQ:..cas
12d20 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 e C_STRREQ: {..
12d30 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 EVP_PKEY *pke
12d40 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 y=NULL;.. X50
12d50 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 9 *cert=NULL;..
12d60 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 X509_NAME *na
12d70 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 me=NULL;.. Tc
12d80 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 l_Obj **listv;..
12d90 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 Tcl_Size lis
12da0 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 tc,i;... BIO
12db0 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 *out=NULL;...
12dc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 5f 43 const char *k_C
12dd0 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f ="",*k_ST="",*k_
12de0 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f L="",*k_O="",*k_
12df0 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a OU="",*k_CN="",*
12e00 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 k_Email="";..
12e10 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 char *keyout,*p
12e20 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 emout,*str;..
12e30 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 int keysize,ser
12e40 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a ial=0,days=365;.
12e50 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
12e60 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
12e70 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 30000000L.. B
12e80 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c IGNUM *bne = NUL
12e90 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 L;.. RSA *rsa
12ea0 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 = NULL;.#else..
12eb0 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 EVP_PKEY_CTX
12ec0 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 *ctx = NULL;.#e
12ed0 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 ndif... if ((
12ee0 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 objc<5) || (objc
12ef0 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f >6)) {...Tcl_Wro
12f00 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
12f10 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 , 2, objv, "keys
12f20 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 ize keyfile cert
12f30 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 file ?info?");..
12f40 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
12f50 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 R;.. }...
12f60 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 if (Tcl_GetIntFr
12f70 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
12f80 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 jv[2], &keysize)
12f90 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 != TCL_OK) {...
12fa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
12fb0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 ;.. }.. ke
12fc0 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 yout=Tcl_GetStri
12fd0 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 ng(objv[3]);..
12fe0 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 pemout=Tcl_Get
12ff0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b String(objv[4]);
13000 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29 .. if (isStr)
13010 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 {...Tcl_SetVar(
13020 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 interp,keyout,""
13030 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 ,0);...Tcl_SetVa
13040 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c r(interp,pemout,
13050 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 "",0);.. }...
13060 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 if (objc>=6)
13070 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 {...if (Tcl_Lis
13080 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
13090 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c interp, objv[5],
130a0 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 &listc, &listv)
130b0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 != TCL_OK) {...
130c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
130d0 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 RROR;...}....if
130e0 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 ((listc%2) != 0)
130f0 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 {... Tcl_Set
13100 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 Result(interp,"I
13110 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 nformation list
13120 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e must have even n
13130 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e umber of argumen
13140 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ts",NULL);...
13150 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
13160 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d R;...}...for (i=
13170 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 0; i<listc; i+=2
13180 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 ) {... str=Tc
13190 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
131a0 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 v[i]);... if
131b0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 (strcmp(str,"day
131c0 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 s")==0) {....if
131d0 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
131e0 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b bj(interp,listv[
131f0 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c i+1],&days)!=TCL
13200 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 _OK).... retu
13210 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
13220 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
13230 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 trcmp(str,"seria
13240 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 l")==0) {....if
13250 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
13260 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b bj(interp,listv[
13270 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 i+1],&serial)!=T
13280 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 CL_OK).... re
13290 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
132a0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
132b0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 (strcmp(str,"C")
132c0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 ==0) {....k_C=Tc
132d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
132e0 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
132f0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
13300 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b (str,"ST")==0) {
13310 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 ....k_ST=Tcl_Get
13320 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
13330 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
13340 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
13350 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "L")==0) {....k_
13360 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 L=Tcl_GetString(
13370 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
13380 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13390 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 rcmp(str,"O")==0
133a0 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 ) {....k_O=Tcl_G
133b0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
133c0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
133d0 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
133e0 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"OU")==0) {...
133f0 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 .k_OU=Tcl_GetStr
13400 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
13410 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
13420 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e (strcmp(str,"CN
13430 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e ")==0) {....k_CN
13440 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
13450 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
13460 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
13470 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 cmp(str,"Email")
13480 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 ==0) {....k_Emai
13490 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 l=Tcl_GetString(
134a0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
134b0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 } else {....T
134c0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
134d0 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 erp,"Unknown par
134e0 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 ameter",NULL);..
134f0 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
13500 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a OR;... }...}.
13510 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e . }..#if OPEN
13520 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
13530 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
13540 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e .. bne = BN_n
13550 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d ew();.. rsa =
13560 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 RSA_new();..
13570 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 pkey = EVP_PKEY
13580 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 _new();.. if
13590 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 (bne == NULL ||
135a0 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 rsa == NULL || p
135b0 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 key == NULL || !
135c0 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c BN_set_word(bne,
135d0 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 RSA_F4) ||...!RS
135e0 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 A_generate_key_e
135f0 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 x(rsa, keysize,
13600 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 bne, NULL) || !E
13610 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 VP_PKEY_assign_R
13620 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b SA(pkey, rsa)) {
13630 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
13640 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 (pkey);.../* RSA
13650 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 _free(rsa); free
13660 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 d by EVP_PKEY_fr
13670 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 ee */...BN_free(
13680 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 bne);.#else..
13690 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f pkey = EVP_RSA_
136a0 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e gen((unsigned in
136b0 74 29 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 t)keysize);..
136c0 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f ctx = EVP_PKEY_
136d0 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c CTX_new(pkey,NUL
136e0 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 L);.. if (pke
136f0 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 y == NULL || ctx
13700 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 == NULL || !EVP
13710 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 _PKEY_keygen_ini
13720 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 t(ctx) ||...!EVP
13730 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 _PKEY_CTX_set_rs
13740 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 a_keygen_bits(ct
13750 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 x, keysize) || !
13760 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 EVP_PKEY_keygen(
13770 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 ctx, &pkey)) {..
13780 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 .EVP_PKEY_free(p
13790 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 key);...EVP_PKEY
137a0 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
137b0 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 #endif...Tcl_Set
137c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
137d0 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 rror generating
137e0 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c private key",NUL
137f0 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c L);...return TCL
13800 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 _ERROR;.. } e
13810 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 lse {...if (isSt
13820 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 r) {... out=B
13830 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d IO_new(BIO_s_mem
13840 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ());... PEM_w
13850 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 rite_bio_Private
13860 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c Key(out,pkey,NUL
13870 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 L,NULL,0,NULL,NU
13880 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f LL);... i=BIO
13890 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 _read(out,buffer
138a0 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d ,sizeof(buffer)-
138b0 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 1);... i=(i<0
138c0 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 ) ? 0 : i;...
138d0 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b buffer[i]='\0';
138e0 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 ... Tcl_SetVa
138f0 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c r(interp,keyout,
13900 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 buffer,0);...
13910 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b BIO_flush(out);
13920 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 ... BIO_free(
13930 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b out);...} else {
13940 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e ... out=BIO_n
13950 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 ew(BIO_s_file())
13960 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 ;... BIO_writ
13970 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b e_filename(out,k
13980 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 eyout);... PE
13990 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 M_write_bio_Priv
139a0 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c ateKey(out,pkey,
139b0 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c NULL,NULL,0,NULL
139c0 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a ,NULL);... /*
139d0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 PEM_write_bio_R
139e0 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 SAPrivateKey(out
139f0 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c , rsa, NULL, NUL
13a00 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c L, 0, NULL, NULL
13a10 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f ); */... BIO_
13a20 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 free_all(out);..
13a30 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 .}....if ((cert
13a40 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 =X509_new())==NU
13a50 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f LL) {... Tcl_
13a60 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
13a70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 ,"Error generati
13a80 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 ng certificate r
13a90 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 equest",NULL);..
13aa0 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 . EVP_PKEY_fr
13ab0 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 ee(pkey);.#if OP
13ac0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
13ad0 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
13ae0 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 0L... BN_free
13af0 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (bne);.#endif...
13b00 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
13b10 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 RROR;...}....X50
13b20 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 9_set_version(ce
13b30 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e rt,2);...ASN1_IN
13b40 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 TEGER_set(X509_g
13b50 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 et_serialNumber(
13b60 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 cert),serial);..
13b70 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a .X509_gmtime_adj
13b80 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 (X509_getm_notBe
13b90 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 fore(cert),0);..
13ba0 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a .X509_gmtime_adj
13bb0 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 (X509_getm_notAf
13bc0 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 ter(cert),(long)
13bd0 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 60*60*24*days);.
13be0 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 ..X509_set_pubke
13bf0 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 y(cert,pkey);...
13c00 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 .name=X509_get_s
13c10 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 ubject_name(cert
13c20 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f );....X509_NAME_
13c30 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
13c40 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 (name,"C", MBSTR
13c50 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
13c60 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
13c70 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_C, -1, -1, 0)
13c80 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
13c90 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
13ca0 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 ame,"ST", MBSTRI
13cb0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
13cc0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
13cd0 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_ST, -1, -1, 0)
13ce0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
13cf0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
13d00 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e ame,"L", MBSTRIN
13d10 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
13d20 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
13d30 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _L, -1, -1, 0);.
13d40 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
13d50 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
13d60 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f e,"O", MBSTRING_
13d70 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
13d80 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f gned char *) k_O
13d90 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
13da0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
13db0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
13dc0 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 "OU", MBSTRING_A
13dd0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
13de0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 ned char *) k_OU
13df0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
13e00 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
13e10 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
13e20 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 "CN", MBSTRING_A
13e30 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
13e40 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e ned char *) k_CN
13e50 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
13e60 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
13e70 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
13e80 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e "Email", MBSTRIN
13e90 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
13ea0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
13eb0 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 _Email, -1, -1,
13ec0 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 0);....X509_set_
13ed0 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 subject_name(cer
13ee0 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 t,name);....if (
13ef0 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c !X509_sign(cert,
13f00 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 pkey,EVP_sha256(
13f10 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 ))) {... X509
13f20 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 _free(cert);...
13f30 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 EVP_PKEY_free
13f40 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
13f50 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
13f60 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
13f70 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 ... BN_free(b
13f80 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 ne);.#endif...
13f90 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
13fa0 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 interp,"Error si
13fb0 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 gning certificat
13fc0 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 e",NULL);...
13fd0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
13fe0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 ;...}....if (isS
13ff0 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d tr) {... out=
14000 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 BIO_new(BIO_s_me
14010 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f m());... PEM_
14020 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f write_bio_X509(o
14030 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ut,cert);...
14040 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 i=BIO_read(out,b
14050 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 uffer,sizeof(buf
14060 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 fer)-1);... i
14070 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a =(i<0) ? 0 : i;.
14080 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d .. buffer[i]=
14090 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f '\0';... Tcl_
140a0 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 SetVar(interp,pe
140b0 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a mout,buffer,0);.
140c0 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 .. BIO_flush(
140d0 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f out);... BIO_
140e0 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 free(out);...} e
140f0 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d lse {... out=
14100 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 BIO_new(BIO_s_fi
14110 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f le());... BIO
14120 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 _write_filename(
14130 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 out,pemout);...
14140 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
14150 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b _X509(out,cert);
14160 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f ... BIO_free_
14170 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 all(out);...}...
14180 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 .X509_free(cert)
14190 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 ;...EVP_PKEY_fre
141a0 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 e(pkey);.#if OPE
141b0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
141c0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
141d0 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 L...BN_free(bne)
141e0 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a ;.#endif.. }.
141f0 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 .}..break;. d
14200 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a efault:..break;.
14210 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
14220 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
14230 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
14240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14270 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
14280 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Free --. *. *.Th
14290 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 is procedure cle
142a0 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 ans up when a SS
142b0 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
142c0 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f hannel. *.is clo
142d0 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 sed and its refe
142e0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c rence count fall
142f0 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 s below 1. *. *
14300 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 Results:. *.none
14310 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
14320 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c cts:. *.Frees al
14330 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 l the state. *.
14340 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
14350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14380 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 23 69 ----. */.void.#i
14390 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 f TCL_MAJOR_VERS
143a0 49 4f 4e 20 3e 20 38 0a 54 6c 73 5f 46 72 65 65 ION > 8.Tls_Free
143b0 28 20 76 6f 69 64 20 2a 62 6c 6f 63 6b 50 74 72 ( void *blockPtr
143c0 20 29 0a 23 65 6c 73 65 0a 54 6c 73 5f 46 72 65 ).#else.Tls_Fre
143d0 65 28 20 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 e( char *blockPt
143e0 72 20 29 0a 23 65 6e 64 69 66 0a 7b 0a 20 20 20 r ).#endif.{.
143f0 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
14400 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 = (State *)bloc
14410 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e kPtr;.. dprin
14420 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
14430 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 Tls_Clean(sta
14440 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 tePtr);. ckfr
14450 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a ee(blockPtr);.}.
14460 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
14470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
144b0 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a Tls_Clean --. *
144c0 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
144d0 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 re cleans up whe
144e0 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 n a SSL socket b
144f0 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 ased channel. *.
14500 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 is closed and it
14510 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e s reference coun
14520 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e t falls below 1.
14530 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a This should. *
14540 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 .be called synch
14550 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 ronously by the
14560 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 CloseProc, not i
14570 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 n the. *.Eventua
14580 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b llyFree callback
14590 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
145a0 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
145b0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
145c0 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
145d0 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
145e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
14620 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 .void Tls_Clean(
14630 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 State *statePtr)
14640 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 {. dprintf("
14650 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f Called");.. /
14660 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 *. * we're a
14670 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 ssuming here tha
14680 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 t we're single-t
14690 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a hreaded. */.
146a0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
146b0 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f ->timer != (Tcl_
146c0 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
146d0 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 ) {..Tcl_DeleteT
146e0 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 imerHandler(stat
146f0 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 ePtr->timer);..s
14700 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
14710 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
14720 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
14730 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 protos) {..ckfre
14740 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 e(statePtr->prot
14750 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e os);..statePtr->
14760 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 protos = NULL;.
14770 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
14780 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f tePtr->bio) {../
14790 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c * This will call
147a0 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 SSL_shutdown. B
147b0 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 ug 1414045 */..d
147c0 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 printf("BIO_free
147d0 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 _all(%p)", state
147e0 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f Ptr->bio);..BIO_
147f0 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 free_all(statePt
14800 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 r->bio);..stateP
14810 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a tr->bio = NULL;.
14820 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
14830 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 atePtr->ssl) {..
14840 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 dprintf("SSL_fre
14850 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 e(%p)", statePtr
14860 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 ->ssl);..SSL_fre
14870 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
14880 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ;..statePtr->ssl
14890 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
148a0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
148b0 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 >ctx) {..SSL_CTX
148c0 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e _free(statePtr->
148d0 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ctx);..statePtr-
148e0 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >ctx = NULL;.
148f0 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
14900 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b Ptr->callback) {
14910 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
14920 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c nt(statePtr->cal
14930 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 lback);..statePt
14940 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 r->callback = NU
14950 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
14960 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 (statePtr->pass
14970 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 word) {..Tcl_Dec
14980 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
14990 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
149a0 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
149b0 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d rd = NULL;. }
149c0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
149d0 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f r->vcmd) {..Tcl_
149e0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
149f0 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 tePtr->vcmd);..s
14a00 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 tatePtr->vcmd =
14a10 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
14a20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e dprintf("Return
14a30 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a ing");.}.../*. *
14a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a80 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e ---. *. * Tls_In
14a90 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 it --. *. *.This
14aa0 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e is a package in
14ab0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f itialization pro
14ac0 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 cedure, which is
14ad0 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 called. *.by Tc
14ae0 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b l when this pack
14af0 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 age is to be add
14b00 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 ed to an interpr
14b10 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 eter.. *. * Resu
14b20 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 lts: Ssl config
14b30 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a ured and loaded.
14b40 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
14b50 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 ts:. *. create t
14b60 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 he ssl command,
14b70 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 initialize ssl c
14b80 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d ontext. *. *----
14b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
14bd0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 54 52 */..#ifndef STR
14be0 49 4e 47 49 46 59 0a 23 20 20 64 65 66 69 6e 65 INGIFY.# define
14bf0 20 53 54 52 49 4e 47 49 46 59 28 78 29 20 53 54 STRINGIFY(x) ST
14c00 52 49 4e 47 49 46 59 31 28 78 29 0a 23 20 20 64 RINGIFY1(x).# d
14c10 65 66 69 6e 65 20 53 54 52 49 4e 47 49 46 59 31 efine STRINGIFY1
14c20 28 78 29 20 23 78 0a 23 65 6e 64 69 66 0a 0a 73 (x) #x.#endif..s
14c30 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
14c40 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 tlsTclInitScrip
14c50 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 t[] = {.#include
14c60 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 20 20 20 "tls.tcl.h".
14c70 20 30 78 30 30 0a 7d 3b 0a 0a 44 4c 4c 45 58 50 0x00.};..DLLEXP
14c80 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 ORT int Tls_Init
14c90 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 (. Tcl_Interp
14ca0 20 2a 69 6e 74 65 72 70 29 0a 7b 0a 20 20 20 20 *interp).{.
14cb0 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 69 6e 66 6f Tcl_CmdInfo info
14cc0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
14cd0 43 61 6c 6c 65 64 22 29 3b 0a 0a 09 2f 2a 0a 09 Called");.../*..
14ce0 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f * We only suppo
14cf0 72 74 20 54 63 6c 20 38 2e 36 20 6f 72 20 6e 65 rt Tcl 8.6 or ne
14d00 77 65 72 0a 09 20 2a 2f 0a 20 20 20 20 69 66 20 wer.. */. if
14d10 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 (Tcl_InitStubs(i
14d20 6e 74 65 72 70 2c 20 22 38 2e 36 2d 22 2c 20 30 nterp, "8.6-", 0
14d30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 ) == NULL) {..re
14d40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
14d50 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 }.. if (T
14d60 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 lsLibInit(0) !=
14d70 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 TCL_OK) {..Tcl_A
14d80 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
14d90 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 rp, "could not i
14da0 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 nitialize SSL li
14db0 62 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 brary", (char *)
14dc0 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
14dd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
14de0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
14df0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
14e00 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 , "tls::ciphers"
14e10 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c , CiphersObjCmd,
14e20 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 NULL, 0);. T
14e30 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
14e40 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
14e50 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 ::connection", C
14e60 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
14e70 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 Cmd, NULL, 0);.
14e80 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
14e90 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
14ea0 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 "tls::handshake"
14eb0 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d , HandshakeObjCm
14ec0 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 d, NULL, 0);.
14ed0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
14ee0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
14ef0 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 ls::import", Imp
14f00 6f 72 74 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c ortObjCmd, NULL,
14f10 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 0);. Tcl_Cre
14f20 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
14f30 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d terp, "tls::unim
14f40 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f port", UnimportO
14f50 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b bjCmd, NULL, 0);
14f60 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
14f70 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
14f80 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c , "tls::status",
14f90 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 4e StatusObjCmd, N
14fa0 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c ULL, 0);. Tcl
14fb0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
14fc0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
14fd0 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f version", Versio
14fe0 6e 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 nObjCmd, NULL, 0
14ff0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
15000 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
15010 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c rp, "tls::misc",
15020 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 4e 55 4c MiscObjCmd, NUL
15030 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 L, 0);. Tcl_C
15040 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
15050 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 interp, "tls::pr
15060 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 otocols", Protoc
15070 6f 6c 73 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c olsObjCmd, NULL,
15080 20 30 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 0);.. if (in
15090 74 65 72 70 29 20 7b 0a 09 69 66 20 28 54 63 6c terp) {..if (Tcl
150a0 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c _Eval(interp, tl
150b0 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 20 sTclInitScript)
150c0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
150d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
150e0 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
150f0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d if (Tcl_GetCom
15100 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c mandInfo(interp,
15110 20 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 "::tcl::build-i
15120 6e 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a nfo", &info)) {.
15130 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f .Tcl_CreateObjCo
15140 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
15150 3a 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f :tls::build-info
15160 22 2c 0a 09 09 69 6e 66 6f 2e 6f 62 6a 50 72 6f ",...info.objPro
15170 63 2c 20 28 76 6f 69 64 20 2a 29 28 0a 09 09 20 c, (void *)(...
15180 20 20 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 PACKAGE_VERSI
15190 4f 4e 20 22 2b 22 20 53 54 52 49 4e 47 49 46 59 ON "+" STRINGIFY
151a0 28 54 4c 53 5f 56 45 52 53 49 4f 4e 5f 55 55 49 (TLS_VERSION_UUI
151b0 44 29 0a 09 09 09 20 20 20 20 22 2e 62 6f 68 61 D).... ".boha
151c0 67 61 6e 22 0a 23 69 66 20 64 65 66 69 6e 65 64 gan".#if defined
151d0 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 64 (__clang__) && d
151e0 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 6d efined(__clang_m
151f0 61 6a 6f 72 5f 5f 29 0a 09 09 09 20 20 20 20 22 ajor__).... "
15200 2e 63 6c 61 6e 67 2d 22 20 53 54 52 49 4e 47 49 .clang-" STRINGI
15210 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 FY(__clang_major
15220 5f 5f 29 0a 23 69 66 20 5f 5f 63 6c 61 6e 67 5f __).#if __clang_
15230 6d 69 6e 6f 72 5f 5f 20 3c 20 31 30 0a 09 09 09 minor__ < 10....
15240 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 "0".#endif..
15250 09 09 20 20 20 20 53 54 52 49 4e 47 49 46 59 28 .. STRINGIFY(
15260 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 29 __clang_minor__)
15270 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
15280 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 ned(__cplusplus)
15290 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f && !defined(__O
152a0 42 4a 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e BJC__).... ".
152b0 63 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 cplusplus".#endi
152c0 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 f.#ifndef NDEBUG
152d0 0a 09 09 09 20 20 20 20 22 2e 64 65 62 75 67 22 .... ".debug"
152e0 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
152f0 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 ined(__clang__)
15300 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 49 4e && !defined(__IN
15310 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 20 26 26 TEL_COMPILER) &&
15320 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f defined(__GNUC_
15330 5f 29 0a 09 09 09 20 20 20 20 22 2e 67 63 63 2d _).... ".gcc-
15340 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e " STRINGIFY(__GN
15350 55 43 5f 5f 29 0a 23 69 66 20 5f 5f 47 4e 55 43 UC__).#if __GNUC
15360 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 31 30 0a 09 09 _MINOR__ < 10...
15370 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66 0a . "0".#endif.
15380 09 09 09 20 20 20 20 53 54 52 49 4e 47 49 46 59 ... STRINGIFY
15390 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 29 (__GNUC_MINOR__)
153a0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f .#endif.#ifdef _
153b0 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 0a _INTEL_COMPILER.
153c0 09 09 09 20 20 20 20 22 2e 69 63 63 2d 22 20 53 ... ".icc-" S
153d0 54 52 49 4e 47 49 46 59 28 5f 5f 49 4e 54 45 4c TRINGIFY(__INTEL
153e0 5f 43 4f 4d 50 49 4c 45 52 29 0a 23 65 6e 64 69 _COMPILER).#endi
153f0 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 4d 45 4d f.#ifdef TCL_MEM
15400 5f 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e _DEBUG.... ".
15410 6d 65 6d 64 65 62 75 67 22 0a 23 65 6e 64 69 66 memdebug".#endif
15420 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 .#if defined(_MS
15430 43 5f 56 45 52 29 0a 09 09 09 20 20 20 20 22 2e C_VER).... ".
15440 6d 73 76 63 2d 22 20 53 54 52 49 4e 47 49 46 59 msvc-" STRINGIFY
15450 28 5f 4d 53 43 5f 56 45 52 29 0a 23 65 6e 64 69 (_MSC_VER).#endi
15460 66 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 4d 41 f.#ifdef USE_NMA
15470 4b 45 0a 09 09 09 20 20 20 20 22 2e 6e 6d 61 6b KE.... ".nmak
15480 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 e".#endif.#ifnde
15490 66 20 54 43 4c 5f 43 46 47 5f 4f 50 54 49 4d 49 f TCL_CFG_OPTIMI
154a0 5a 45 44 0a 09 09 09 20 20 20 20 22 2e 6e 6f 2d ZED.... ".no-
154b0 6f 70 74 69 6d 69 7a 65 22 0a 23 65 6e 64 69 66 optimize".#endif
154c0 0a 23 69 66 64 65 66 20 5f 5f 4f 42 4a 43 5f 5f .#ifdef __OBJC__
154d0 0a 09 09 09 20 20 20 20 22 2e 6f 62 6a 65 63 74 .... ".object
154e0 69 76 65 2d 63 22 0a 23 69 66 20 64 65 66 69 6e ive-c".#if defin
154f0 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a ed(__cplusplus).
15500 09 09 09 20 20 20 20 22 70 6c 75 73 70 6c 75 73 ... "plusplus
15510 22 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a ".#endif.#endif.
15520 23 69 66 64 65 66 20 54 43 4c 5f 43 46 47 5f 50 #ifdef TCL_CFG_P
15530 52 4f 46 49 4c 45 44 0a 09 09 09 20 20 20 20 22 ROFILED.... "
15540 2e 70 72 6f 66 69 6c 65 22 0a 23 65 6e 64 69 66 .profile".#endif
15550 0a 23 69 66 64 65 66 20 50 55 52 49 46 59 0a 09 .#ifdef PURIFY..
15560 09 09 20 20 20 20 22 2e 70 75 72 69 66 79 22 0a .. ".purify".
15570 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 54 #endif.#ifdef ST
15580 41 54 49 43 5f 42 55 49 4c 44 0a 09 09 09 20 20 ATIC_BUILD....
15590 20 20 22 2e 73 74 61 74 69 63 22 0a 23 65 6e 64 ".static".#end
155a0 69 66 0a 09 09 29 2c 20 4e 55 4c 4c 29 3b 0a 20 if...), NULL);.
155b0 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e }.. return
155c0 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 45 Tcl_PkgProvideE
155d0 78 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 x(interp, PACKAG
155e0 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f E_NAME, PACKAGE_
155f0 56 45 52 53 49 4f 4e 2c 20 4e 55 4c 4c 29 3b 0a VERSION, NULL);.
15600 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
15640 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e *. *.Tls_SafeIn
15650 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d it --. *. *.----
15660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
15690 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 .Standard proced
156a0 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 ure required by
156b0 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 'load'.. *.Initi
156c0 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 alizes this exte
156d0 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 nsion for a safe
156e0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a interpreter.. *
156f0 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
15700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15720 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 -*. *. *.Side ef
15730 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 fects:. *..As of
15740 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 'Tls_Init'. *.
15750 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 *.Result:. *..A
15760 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 standard Tcl err
15770 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d or code.. *. *--
15780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157b0 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 44 4c 4c 45 58 ----*. */..DLLEX
157c0 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 PORT int Tls_Saf
157d0 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 eInit(Tcl_Interp
157e0 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
157f0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
15800 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c );. return Tl
15810 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a s_Init(interp);.
15820 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
15830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
15860 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 *. *.TlsLibInit
15870 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d --. *. *.------
15880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 ----------*. *.I
158b0 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c nitializes SSL l
158c0 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 ibrary once per
158d0 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d application. *.-
158e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
15910 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 . *. *.Side effe
15920 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c cts:. *..initial
15930 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 izes SSL library
15940 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 . *. *.Result:.
15950 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *..none. *. *---
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15990 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ---*. */.static
159a0 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 int TlsLibInit(i
159b0 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 nt uninitialize)
159c0 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e {. static in
159d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 t initialized =
159e0 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 0;. int statu
159f0 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 s = TCL_OK;.#if
15a00 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
15a10 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
15a20 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
15a30 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f . size_t num_
15a40 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 locks;.#endif..
15a50 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c if (uninitial
15a60 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 ize) {..if (!ini
15a70 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 tialized) {..
15a80 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 dprintf("Asked
15a90 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c to uninitialize,
15aa0 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 but we are not
15ab0 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a initialized");..
15ac0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
15ad0 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 OK;..}...dprintf
15ae0 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 ("Asked to unini
15af0 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 tialize");..#if
15b00 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
15b10 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
15b20 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
15b30 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 ..Tcl_MutexLock(
15b40 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 &init_mx);...if
15b50 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 (locks) {.. f
15b60 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 ree(locks);..
15b70 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 locks = NULL;..
15b80 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d locksCount =
15b90 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 0;..}.#endif..i
15ba0 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a nitialized = 0;.
15bb0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
15bc0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
15bd0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
15be0 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 EADS)..Tcl_Mutex
15bf0 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 Unlock(&init_mx)
15c00 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 ;.#endif...retur
15c10 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a n TCL_OK;. }.
15c20 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c . if (initial
15c30 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 ized) {..dprintf
15c40 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 ("Called, but us
15c50 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 ing cached value
15c60 22 29 3b 0a 09 72 65 74 75 72 6e 20 73 74 61 74 ");..return stat
15c70 75 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 us;. }.. d
15c80 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
15c90 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
15ca0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
15cb0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
15cc0 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f HREADS). Tcl_
15cd0 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f MutexLock(&init_
15ce0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 mx);.#endif.
15cf0 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b initialized = 1;
15d00 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
15d10 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
15d20 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
15d30 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c READS). num_l
15d40 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f ocks = 1;. lo
15d50 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 cksCount = (int)
15d60 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 num_locks;.
15d70 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 locks = malloc(s
15d80 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 izeof(*locks) *
15d90 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 num_locks);.
15da0 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c memset(locks, 0,
15db0 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 sizeof(*locks)
15dc0 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 * num_locks);.#e
15dd0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 ndif.. /* Ini
15de0 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 tialize BOTH lib
15df0 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 crypto and libss
15e00 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 l. */. OPENSS
15e10 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 L_init_ssl(OPENS
15e20 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c SL_INIT_LOAD_SSL
15e30 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 _STRINGS | OPENS
15e40 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 SL_INIT_LOAD_CRY
15e50 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f PTO_STRINGS..| O
15e60 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f PENSSL_INIT_ADD_
15e70 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 ALL_CIPHERS | OP
15e80 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 ENSSL_INIT_ADD_A
15e90 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c LL_DIGESTS, NULL
15ea0 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f );.. BIO_new_
15eb0 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 tcl(NULL, 0);..#
15ec0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
15ed0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
15ee0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
15ef0 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 DS). Tcl_Mute
15f00 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 xUnlock(&init_mx
15f10 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 );.#endif.. r
15f20 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a 7d 0a eturn status;.}.