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: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63 "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e include <stdlib.
0390: 68 3e 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 23 69 66 20 4f 50 ersion) {.#if OP
1a10: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
1a20: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
1a30: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
1a40: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
1a50: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
1a60: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 53 SL2). case SS
1a70: 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 L2_VERSION:..ver
1a80: 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65 = "SSLv2";..bre
1a90: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
1aa0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
1ab0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
1ac0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 NSSL_NO_SSL3).
1ad0: 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53 case SSL3_VERS
1ae0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c ION:..ver = "SSL
1af0: 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e v3";..break;.#en
1b00: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53 dif. case TLS
1b10: 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 1_VERSION:..ver
1b20: 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61 = "TLSv1";..brea
1b30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 k;. case TLS1
1b40: 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 _1_VERSION:..ver
1b50: 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62 = "TLSv1.1";..b
1b60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
1b70: 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 LS1_2_VERSION:..
1b80: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b ver = "TLSv1.2";
1b90: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1ba0: 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e e TLS1_3_VERSION
1bb0: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e :..ver = "TLSv1.
1bc0: 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 3";..break;.
1bd0: 63 61 73 65 20 30 3a 0a 09 76 65 72 20 3d 20 22 case 0:..ver = "
1be0: 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 none";..break;.
1bf0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 72 default:..ver
1c00: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 = "unknown";..b
1c10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
1c20: 20 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e 74 switch (content
1c30: 5f 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73 _type) {. cas
1c40: 65 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 52 e SSL3_RT_HEADER
1c50: 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64 65 :..type = "Heade
1c60: 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 r";..break;.
1c70: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e case SSL3_RT_INN
1c80: 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a ER_CONTENT_TYPE:
1c90: 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20 ..type = "Inner
1ca0: 43 6f 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 09 Content Type";..
1cb0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1cc0: 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47 45 5f 43 SSL3_RT_CHANGE_C
1cd0: 49 50 48 45 52 5f 53 50 45 43 3a 0a 09 74 79 70 IPHER_SPEC:..typ
1ce0: 65 20 3d 20 22 43 68 61 6e 67 65 20 43 69 70 68 e = "Change Ciph
1cf0: 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 er";..break;.
1d00: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 4c case SSL3_RT_AL
1d10: 45 52 54 3a 0a 09 74 79 70 65 20 3d 20 22 41 6c ERT:..type = "Al
1d20: 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 ert";..break;.
1d30: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 case SSL3_RT_H
1d40: 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 70 65 20 ANDSHAKE:..type
1d50: 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 3b 0a 09 = "Handshake";..
1d60: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1d70: 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43 41 54 SSL3_RT_APPLICAT
1d80: 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70 65 20 ION_DATA:..type
1d90: 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a 09 62 = "App Data";..b
1da0: 72 65 61 6b 3b 0a 23 69 66 20 4f 50 45 4e 53 53 reak;.#if OPENSS
1db0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
1dc0: 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 20 < 0x30000000L.
1dd0: 20 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54 case DTLS1_RT
1de0: 5f 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70 _HEARTBEAT:..typ
1df0: 65 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b e = "Heartbeat";
1e00: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
1e10: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79 default:..ty
1e20: 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a pe = "unknown";.
1e30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65 }.. /* Ne
1e40: 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 eds compile time
1e50: 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d option "enable-
1e60: 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20 ssl-trace". */.
1e70: 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49 if ((bio = BI
1e80: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 O_new(BIO_s_mem(
1e90: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ))) != NULL) {..
1ea0: 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63 int n;..SSL_trac
1eb0: 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69 e(write_p, versi
1ec0: 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 on, content_type
1ed0: 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c , buf, len, ssl,
1ee0: 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09 (void *)bio);..
1ef0: 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f n = BIO_read(bio
1f00: 2c 20 62 75 66 66 65 72 2c 20 42 49 4f 5f 70 65 , buffer, BIO_pe
1f10: 6e 64 69 6e 67 28 62 69 6f 29 20 3c 20 31 35 30 nding(bio) < 150
1f20: 30 30 20 3f 20 42 49 4f 5f 70 65 6e 64 69 6e 67 00 ? BIO_pending
1f30: 28 62 69 6f 29 20 3a 20 31 34 39 39 39 29 3b 0a (bio) : 14999);.
1f40: 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20 3a .n = (n<0) ? 0 :
1f50: 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20 3d n;..buffer[n] =
1f60: 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66 0;..(void)BIO_f
1f70: 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42 49 4f 5f lush(bio);..BIO_
1f80: 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 7d 0a free(bio);. }.
1f90: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
1fa0: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
1fb0: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 69 ith fn, chan, di
1fc0: 72 65 63 74 69 6f 6e 2c 20 76 65 72 73 69 6f 6e rection, version
1fd0: 2c 20 74 79 70 65 2c 20 61 6e 64 20 6d 65 73 73 , type, and mess
1fe0: 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 age args */.
1ff0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
2000: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
2010: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 tr->callback);.
2020: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2030: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2040: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
2050: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65 NewStringObj("me
2060: 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20 ssage", -1));.
2070: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2080: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2090: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
20a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
20b0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
20c0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
20d0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
20e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
20f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2100: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
2110: 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 5f 70 tringObj(write_p
2120: 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 65 63 ? "Sent" : "Rec
2130: 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20 eived", -1));.
2140: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2150: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2160: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2170: 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 72 2c ewStringObj(ver,
2180: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
2190: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
21a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
21b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
21c0: 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 29 3b gObj(type, -1));
21d0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
21e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
21f0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
2200: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 l_NewStringObj(b
2210: 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 uffer, -1));..
2220: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
2230: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
2240: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
2250: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
2260: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
2270: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
2280: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
2290: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
22a0: 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c Ptr);.}.#endif..
22b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2300: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d VerifyCallback -
2310: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 -. *. *.Monitors
2320: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65 SSL certificate
2330: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63 validation proc
2340: 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e ess. Used to con
2350: 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61 trol the. *.beha
2360: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53 vior when the SS
2370: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c L_VERIFY_PEER fl
2380: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 ag is set. This
2390: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65 is called. *.whe
23a0: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63 never a certific
23b0: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 ate is inspected
23c0: 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61 or decided inva
23d0: 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f 72 0a lid. Called for.
23e0: 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 69 63 *.each certific
23f0: 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 74 20 ate in the cert
2400: 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65 chain.. *. * Che
2410: 63 6b 73 3a 0a 20 2a 09 54 68 65 20 63 65 72 74 cks:. *.The cert
2420: 69 66 69 63 61 74 65 20 63 68 61 69 6e 20 69 73 ificate chain is
2430: 20 63 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e checked startin
2440: 67 20 77 69 74 68 20 74 68 65 20 64 65 65 70 65 g with the deepe
2450: 73 74 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c st nesting level
2460: 0a 20 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20 . *. (the root
2470: 43 41 20 63 65 72 74 69 66 69 63 61 74 65 29 20 CA certificate)
2480: 61 6e 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72 and worked upwar
2490: 64 20 74 6f 20 74 68 65 20 70 65 65 72 27 73 20 d to the peer's
24a0: 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 certificate.. *.
24b0: 41 6c 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61 All signatures a
24c0: 72 65 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e re valid, curren
24d0: 74 20 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e t time is within
24e0: 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 first and last
24f0: 76 61 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20 validity time..
2500: 2a 09 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 *.Check that the
2510: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 certificate is
2520: 69 73 73 75 65 64 20 62 79 20 74 68 65 20 69 73 issued by the is
2530: 73 75 65 72 20 63 65 72 74 69 66 69 63 61 74 65 suer certificate
2540: 20 69 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63 issuer.. *.Chec
2550: 6b 20 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e k the revocation
2560: 20 73 74 61 74 75 73 20 66 6f 72 20 65 61 63 68 status for each
2570: 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a certificate.. *
2580: 09 43 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64 .Check the valid
2590: 69 74 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e ity of the given
25a0: 20 43 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72 CRL and the cer
25b0: 74 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 t revocation sta
25c0: 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 tus.. *.Check th
25d0: 65 20 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c e policies of al
25e0: 6c 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 l the certificat
25f0: 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a es. *. * Args. *
2600: 09 70 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e .preverify_ok in
2610: 64 69 63 61 74 65 73 20 77 68 65 74 68 65 72 20 dicates whether
2620: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
2630: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73 verification pas
2640: 73 65 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28 sed (1) or not (
2650: 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 0). *. * Results
2660: 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 :. *.A callback
2670: 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 bound to the soc
2680: 6b 65 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f ket may return o
2690: 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 ne of:. *. 0.
26a0: 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 ..- the certific
26b0: 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e ate is deemed in
26c0: 76 61 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69 valid, send veri
26d0: 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20 fication. *....
26e0: 20 66 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74 failure alert t
26f0: 6f 20 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d o peer, and term
2700: 69 6e 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e inate handshake.
2710: 0a 20 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68 . *. 1...- th
2720: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 e certificate is
2730: 20 64 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63 deemed valid, c
2740: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e ontinue with han
2750: 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65 dshake.. *. e
2760: 6d 70 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f mpty string.- no
2770: 20 63 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 change to certi
2780: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f ficate validatio
2790: 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 n. *. * Side eff
27a0: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 ects:. *.The err
27b0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 field of the cu
27c0: 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 rrently operativ
27d0: 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 e State is set.
27e0: 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 *. to a string
27f0: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 describing the S
2800: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 SL negotiation f
2810: 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a ailure reason. *
2820: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2860: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
2870: 63 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c c int.VerifyCall
2880: 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 back(int ok, X50
2890: 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 9_STORE_CTX *ctx
28a0: 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ).{. Tcl_Obj
28b0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c *cmdPtr;. SSL
28c0: 20 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a *ssl..= (SSL*
28d0: 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f )X509_STORE_CTX_
28e0: 67 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c get_ex_data(ctx,
28f0: 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 SSL_get_ex_data
2900: 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f _X509_STORE_CTX_
2910: 69 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 idx());. X509
2920: 20 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f *cert..= X509_
2930: 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 STORE_CTX_get_cu
2940: 72 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b rrent_cert(ctx);
2950: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
2960: 65 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 ePtr.= (State*)S
2970: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_get_app_data(
2980: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e ssl);. Tcl_In
2990: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
29a0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
29b0: 0a 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 . int depth..
29c0: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 = X509_STORE_CTX
29d0: 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 _get_error_depth
29e0: 28 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 (ctx);. int e
29f0: 72 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 rr..= X509_STORE
2a00: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 _CTX_get_error(c
2a10: 74 78 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 tx);.. dprint
2a20: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 f("Called");.
2a30: 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 dprintf("Verify
2a40: 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 6f Callback: %d", o
2a50: 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 k);.. if (sta
2a60: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 tePtr->vcmd == (
2a70: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
2a80: 0a 09 2f 2a 20 55 73 65 20 6f 6b 20 76 61 6c 75 ../* Use ok valu
2a90: 65 20 69 66 20 76 65 72 69 66 69 63 61 74 69 6f e if verificatio
2aa0: 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f n is required */
2ab0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e ..if (statePtr->
2ac0: 76 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 vflags & SSL_VER
2ad0: 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 IFY_FAIL_IF_NO_P
2ae0: 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 EER_CERT) {..
2af0: 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 return ok;..} e
2b00: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 lse {.. retur
2b10: 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c n 1;..}. } el
2b20: 73 65 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e se if (cert == N
2b30: 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 ULL || ssl == NU
2b40: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b LL) {..return 0;
2b50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
2b60: 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 ntf("VerifyCallb
2b70: 61 63 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61 ack: eval callba
2b80: 63 6b 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 ck");.. /* Cr
2b90: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
2ba0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
2bb0: 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 an, depth, cert
2bc0: 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 info list, statu
2bd0: 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 s, and error arg
2be0: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
2bf0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
2c00: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d bj(statePtr->vcm
2c10: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
2c20: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2c30: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2c40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2c50: 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29 j("verify", -1))
2c60: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2c70: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2c80: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
2c90: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2ca0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
2cb0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
2cc0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
2cd0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2ce0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2cf0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 cmdPtr, Tcl_NewI
2d00: 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 ntObj(depth));.
2d10: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2d20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2d30: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f rp, cmdPtr, Tls_
2d40: 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 NewX509Obj(inter
2d50: 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 54 p, cert));. T
2d60: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2d70: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2d80: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 cmdPtr, Tcl_NewI
2d90: 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 ntObj(ok));.
2da0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2db0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2dc0: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 cmdPtr,..Tcl_Ne
2dd0: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 wStringObj((char
2de0: 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 *)X509_verify_ce
2df0: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
2e00: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 err), -1));..
2e10: 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20 /* Prevent I/O
2e20: 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69 while callback i
2e30: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f s in progress */
2e40: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 . /* statePtr
2e50: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 ->flags |= TLS_T
2e60: 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a CL_CALLBACK; */.
2e70: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
2e80: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
2e90: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
2ea0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
2eb0: 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c ok = EvalCall
2ec0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
2ed0: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
2ee0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2ef0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
2f00: 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 dprintf("Veri
2f10: 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63 6f 6d 6d fyCallback: comm
2f20: 61 6e 64 20 72 65 73 75 6c 74 20 3d 20 25 64 22 and result = %d"
2f30: 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 , ok);.. /* s
2f40: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
2f50: 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c = ~(TLS_TCL_CALL
2f60: 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 BACK); */. re
2f70: 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20 42 79 20 64 turn ok;./* By d
2f80: 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 efault, leave ve
2f90: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 rification uncha
2fa0: 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a nged. */.}.../*.
2fb0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
3000: 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 Error --. *. *.C
3010: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 alls callback wi
3020: 74 68 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 th error message
3030: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
3040: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 ects:. *.The err
3050: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 field of the cu
3060: 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 rrently operativ
3070: 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 e State is set.
3080: 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 *. to a string
3090: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 describing the S
30a0: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 SL negotiation f
30b0: 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a ailure reason. *
30c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3100: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a ------. */.void.
3110: 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 Tls_Error(State
3120: 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 *statePtr, char
3130: 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f *msg) {. Tcl_
3140: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
3150: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
3160: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
3170: 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 cmdPtr, *listPtr
3180: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c ;. unsigned l
3190: 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74 61 ong err;. sta
31a0: 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67 tePtr->err = msg
31b0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
31c0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
31d0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
31e0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
31f0: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e j*)NULL)..return
3200: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 ;.. /* Create
3210: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
3220: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 with fn, chan,
3230: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 and message args
3240: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
3250: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
3260: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c j(statePtr->call
3270: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c back);. Tcl_L
3280: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3290: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
32a0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
32b0: 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 gObj("error", -1
32c0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
32d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
32e0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
32f0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
3300: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
3310: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
3320: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
3330: 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d 20 . if (msg !=
3340: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 NULL) {..Tcl_Lis
3350: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3360: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3370: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
3380: 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 bj(msg, -1));..
3390: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 6d } else if ((m
33a0: 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 sg = Tcl_GetStri
33b0: 6e 67 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 ng(Tcl_GetObjRes
33c0: 75 6c 74 28 69 6e 74 65 72 70 29 29 29 20 21 3d ult(interp))) !=
33d0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 NULL) {..Tcl_Li
33e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
33f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
3400: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
3410: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a Obj(msg, -1));..
3420: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 } else {..li
3430: 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c stPtr = Tcl_NewL
3440: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
3450: 0a 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 ..while ((err =
3460: 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 ERR_get_error())
3470: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 != 0) {.. Tc
3480: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3490: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
34a0: 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 istPtr, Tcl_NewS
34b0: 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 tringObj(ERR_rea
34c0: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 son_error_string
34d0: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a (err), -1));..}.
34e0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
34f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3500: 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 , cmdPtr, listPt
3510: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f r);. }.. /
3520: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
3530: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
3540: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
3550: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 cmdPtr);. Eva
3560: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
3570: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
3580: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 tr);. Tcl_Dec
3590: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
35a0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
35f0: 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c *. * KeyLogCall
3600: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 back --. *. *.Wr
3610: 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 ite received key
3620: 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c data to log fil
3630: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
3640: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 fects:. *.none.
3650: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
36a0: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 KeyLogCallback(
36b0: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 const SSL *ssl,
36c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 const char *line
36d0: 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 ) {. char *st
36e0: 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 r = getenv(SSLKE
36f0: 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 YLOGFILE);. F
3700: 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 ILE *fd;.. dp
3710: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
3720: 0a 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b .. if (str) {
3730: 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 ..fd = fopen(str
3740: 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 , "a");..fprintf
3750: 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 (fd, "%s\n",line
3760: 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a );..fclose(fd);.
3770: 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d }.}.../*. *-
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 --. *. * Passwor
37d0: 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a d Callback --. *
37e0: 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 . *.Called when
37f0: 61 20 70 61 73 73 77 6f 72 64 20 69 73 20 6e 65 a password is ne
3800: 65 64 65 64 20 66 6f 72 20 61 20 70 72 69 76 61 eded for a priva
3810: 74 65 20 6b 65 79 20 77 68 65 6e 20 6c 6f 61 64 te key when load
3820: 69 6e 67 0a 20 2a 09 6f 72 20 73 74 6f 72 69 6e ing. *.or storin
3830: 67 20 61 20 50 45 4d 20 63 65 72 74 69 66 69 63 g a PEM certific
3840: 61 74 65 20 77 69 74 68 20 65 6e 63 72 79 70 74 ate with encrypt
3850: 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 ion. Evals callb
3860: 61 63 6b 0a 20 2a 09 73 63 72 69 70 74 20 61 6e ack. *.script an
3870: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 d returns the re
3880: 73 75 6c 74 20 61 73 20 74 68 65 20 70 61 73 73 sult as the pass
3890: 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20 62 word string in b
38a0: 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 uf.. *. * Result
38b0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
38c0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
38d0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
38e0: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
38f0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
3900: 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69 6e Password size in
3910: 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 bytes or -1 for
3920: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a an error.. *. *
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3970: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
3980: 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 nt.PasswordCallb
3990: 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 ack(char *buf, i
39a0: 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 nt size, int rwf
39b0: 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 lag, void *udata
39c0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
39d0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 tatePtr.= (State
39e0: 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54 *) udata;. T
39f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3a00: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
3a10: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
3a20: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
3a30: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 54 63 6c nt code;. Tcl
3a40: 5f 53 69 7a 65 20 6c 65 6e 3b 0a 0a 20 20 20 20 _Size len;..
3a50: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
3a60: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f );.. /* If no
3a70: 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 callback, use d
3a80: 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 efault callback
3a90: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
3aa0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d Ptr->password ==
3ab0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 NULL) {..if (Tc
3ac0: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c l_EvalEx(interp,
3ad0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 "tls::password"
3ae0: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 , -1, TCL_EVAL_G
3af0: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b LOBAL) == TCL_OK
3b00: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 ) {.. char *r
3b10: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 et = (char *) Tc
3b20: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
3b30: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 bj(Tcl_GetObjRes
3b40: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c 65 ult(interp), &le
3b50: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e n);.. if (len
3b60: 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 > (Tcl_Size) si
3b70: 7a 65 2d 31 29 20 7b 0a 09 09 6c 65 6e 20 3d 20 ze-1) {...len =
3b80: 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d (Tcl_Size) size-
3b90: 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 1;.. }.. s
3ba0: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c trncpy(buf, ret,
3bb0: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a (size_t) len);.
3bc0: 09 20 20 20 20 62 75 66 5b 6c 65 6e 5d 20 3d 20 . buf[len] =
3bd0: 27 5c 30 27 3b 0a 09 20 20 20 20 72 65 74 75 72 '\0';.. retur
3be0: 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 20 n (int) len;..}
3bf0: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 else {.. retu
3c00: 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a rn -1;..}. }.
3c10: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
3c20: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
3c30: 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20 ith fn, rwflag,
3c40: 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f and size args */
3c50: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
3c60: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
3c70: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
3c80: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
3c90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3ca0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3cb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3cc0: 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 j("password", -1
3cd0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
3ce0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3cf0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3d00: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 Tcl_NewIntObj(r
3d10: 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c wflag));. Tcl
3d20: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3d30: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3d40: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 dPtr, Tcl_NewInt
3d50: 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 Obj(size));..
3d60: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 76 Tcl_Preserve((v
3d70: 6f 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a oid *) interp);.
3d80: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3d90: 28 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 ((void *) stateP
3da0: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 tr);.. /* Eva
3db0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
3dc0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
3dd0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
3de0: 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 r);. code = T
3df0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 cl_EvalObjEx(int
3e00: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c erp, cmdPtr, TCL
3e10: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 _EVAL_GLOBAL);.
3e20: 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 if (code != T
3e30: 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 CL_OK) {.#if (TC
3e40: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
3e50: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 == 8) && (TCL_MI
3e60: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 NOR_VERSION < 6)
3e70: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
3e80: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 Error(interp);.#
3e90: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 else..Tcl_Backgr
3ea0: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e oundException(in
3eb0: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e terp, code);.#en
3ec0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 dif. }. Tc
3ed0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
3ee0: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c mdPtr);.. Tcl
3ef0: 5f 52 65 6c 65 61 73 65 28 28 76 6f 69 64 20 2a _Release((void *
3f00: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 ) statePtr);..
3f10: 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66 /* If successf
3f20: 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 61 ul, pass back pa
3f30: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 6e ssword string an
3f40: 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 6f d truncate if to
3f50: 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 o long */. if
3f60: 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b (code == TCL_OK
3f70: 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d ) {..char *ret =
3f80: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 (char *) Tcl_Ge
3f90: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 tStringFromObj(T
3fa0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
3fb0: 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a interp), &len);.
3fc0: 09 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f .if (len > (Tcl_
3fd0: 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a Size) size-1) {.
3fe0: 09 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f . len = (Tcl_
3ff0: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d Size) size-1;..}
4000: 0a 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 ..strncpy(buf, r
4010: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e et, (size_t) len
4020: 29 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 );..buf[len] = '
4030: 5c 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 \0';..Tcl_Releas
4040: 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 65 72 e((void *) inter
4050: 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e 74 p);..return (int
4060: 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 ) len;. }.
4070: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 76 6f Tcl_Release((vo
4080: 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a 20 id *) interp);.
4090: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a return -1;.}.
40a0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
40b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
40f0: 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 Session Callbac
4100: 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d k for Clients --
4110: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 . *. *.Called wh
4120: 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e en a new session
4130: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 is added to the
4140: 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 cache. In TLS 1
4150: 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 .3. *.this may b
4160: 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 e received multi
4170: 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 ple times after
4180: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 the handshake. F
4190: 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 or. *.earlier ve
41a0: 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c rsions, this wil
41b0: 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 l be received du
41c0: 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 ring the handsha
41d0: 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 ke.. *.This is t
41e0: 68 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 he preferred way
41f0: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 to obtain a res
4200: 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a umable session..
4210: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
4220: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
4230: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
4240: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
4250: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
4260: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
4270: 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 .0 = error where
4280: 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 session will be
4290: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d immediately rem
42a0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e oved from the in
42b0: 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a ternal cache.. *
42c0: 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 .1 = success whe
42d0: 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 re app retains s
42e0: 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f ession in sessio
42f0: 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 n cache, and mus
4300: 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 t call SSL_SESSI
4310: 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 ON_free() when d
4320: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
4330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4370: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 /.static int.Ses
4380: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c sionCallback(SSL
4390: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 *ssl, SSL_SESSI
43a0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 ON *session) {.
43b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
43c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
43d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
43e0: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
43f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4400: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
4410: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
4420: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
4430: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
4440: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 ar *ticket;.
4450: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
4460: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b har *session_id;
4470: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 . size_t len2
4480: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 ;. unsigned i
4490: 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 nt ulen;.. dp
44a0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
44b0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
44c0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 tr->callback ==
44d0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
44e0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
44f0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
4500: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 } else if (ssl
4510: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
4520: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
4530: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
4540: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f /* Create co
4550: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 mmand to eval wi
4560: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 th fn, chan, ses
4570: 73 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e sion id, session
4580: 20 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 ticket, and lif
4590: 65 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 etime args */.
45a0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
45b0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
45c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
45d0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
45e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
45f0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4600: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
4610: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a session", -1));.
4620: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4630: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4640: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
4650: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
4660: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
4670: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
4680: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 self), -1));..
4690: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 /* Session id
46a0: 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 */. session_i
46b0: 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f d = SSL_SESSION_
46c0: 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 get_id(session,
46d0: 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f &ulen);. Tcl_
46e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
46f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
4700: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
4710: 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e ArrayObj(session
4720: 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 _id, (Tcl_Size)
4730: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 ulen));.. /*
4740: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a Session ticket *
4750: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f /. SSL_SESSIO
4760: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
4770: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
4780: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f &len2);. Tcl_
4790: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
47a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
47b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
47c0: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c ArrayObj(ticket,
47d0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
47e0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 ));.. /* Life
47f0: 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 time - number of
4800: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 seconds */.
4810: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
4820: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
4830: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 cmdPtr,..Tcl_Ne
4840: 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 wLongObj((long)
4850: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
4860: 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f ticket_lifetime_
4870: 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b hint(session)));
4880: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
4890: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
48a0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
48b0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
48c0: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b EvalCallback
48d0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
48e0: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 r, cmdPtr);.
48f0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
4900: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f (cmdPtr);.. /
4910: 2a 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e * Return 0 for n
4920: 6f 77 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e ow until session
4930: 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d handling is com
4940: 70 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 plete */. ret
4950: 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a urn 0;.}.../*. *
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49a0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 ---. *. * ALPN C
49b0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 allback for Serv
49c0: 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c ers and NPN Call
49d0: 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 back for Clients
49e0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 --. *. *.Perfor
49f0: 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 m protocol (http
4a00: 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 /1.1, h2, h3, et
4a10: 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f c.) selection fo
4a20: 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e r the. *.incomin
4a30: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 g connection. Ca
4a40: 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f lled after Hello
4a50: 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c and server call
4a60: 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 backs.. *.Where
4a70: 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 'out' is selecte
4a80: 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 d protocol and '
4a90: 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20 in' is the peer
4aa0: 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e advertised list.
4ab0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
4ac0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
4ad0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
4ae0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
4af0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
4b00: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
4b10: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
4b20: 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 _OK: ALPN protoc
4b30: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 ol selected. The
4b40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
4b50: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
4b60: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 SEXT_ERR_ALERT_F
4b70: 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 ATAL: There was
4b80: 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 no overlap betwe
4b90: 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a en the client's.
4ba0: 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 *. supplied
4bb0: 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 list and the ser
4bc0: 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f ver configuratio
4bd0: 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f n. The connectio
4be0: 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 n will be aborte
4bf0: 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 d.. *.SSL_TLSEXT
4c00: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e _ERR_NOACK: ALPN
4c10: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 protocol not se
4c20: 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 lected, e.g., be
4c30: 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a cause no ALPN. *
4c40: 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 . protocols a
4c50: 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f re configured fo
4c60: 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f r this connectio
4c70: 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f n. The connectio
4c80: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a n continues.. *.
4c90: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cd0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
4ce0: 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 int.ALPNCallbac
4cf0: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 k(SSL *ssl, cons
4d00: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
4d10: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 **out, unsigned
4d20: 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 char *outlen,..c
4d30: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
4d40: 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 ar *in, unsigned
4d50: 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 int inlen, void
4d60: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
4d70: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
4d80: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
4d90: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
4da0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
4db0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
4dc0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
4dd0: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a int code, res;..
4de0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
4df0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
4e00: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 ssl == NULL || a
4e10: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 rg == NULL) {..r
4e20: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
4e30: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
4e40: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 }.. /* Select
4e50: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 protocol */.
4e60: 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f if (SSL_select_
4e70: 6e 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 next_proto((unsi
4e80: 67 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 gned char **) ou
4e90: 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 t, outlen, state
4ea0: 50 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 Ptr->protos, sta
4eb0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
4ec0: 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d n,..in, inlen) =
4ed0: 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 = OPENSSL_NPN_NE
4ee0: 47 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 GOTIATED) {../*
4ef0: 4d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 Match found */..
4f00: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
4f10: 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 _ERR_OK;. } e
4f20: 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 lse {../* OPENSS
4f30: 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 L_NPN_NO_OVERLAP
4f40: 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 = No overlap, s
4f50: 6f 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d o use first item
4f60: 20 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f from client pro
4f70: 74 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 tocol list */..r
4f80: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
4f90: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
4fa0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
4fb0: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c tr->vcmd == (Tcl
4fc0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 _Obj*)NULL) {..r
4fd0: 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d eturn res;. }
4fe0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
4ff0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
5000: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 with fn, chan, d
5010: 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 epth, cert info
5020: 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e list, status, an
5030: 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a d error args */.
5040: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
5050: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
5060: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 atePtr->vcmd);.
5070: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5080: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5090: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
50a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c NewStringObj("al
50b0: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 pn", -1));. T
50c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
50d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
50e0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
50f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
5100: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
5110: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
5120: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
5130: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5140: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5150: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
5160: 6e 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 ngObj((const cha
5170: 72 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b r *) *out, -1));
5180: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
5190: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
51a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
51b0: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 l_NewBooleanObj(
51c0: 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 res == SSL_TLSEX
51d0: 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 T_ERR_OK));..
51e0: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
51f0: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
5200: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
5210: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 t(cmdPtr);. i
5220: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 f ((code = EvalC
5230: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
5240: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
5250: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d )) > 1) {..res =
5260: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5270: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 NOACK;. } els
5280: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 e if (code == 1)
5290: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
52a0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
52b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
52c0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
52d0: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 ALERT_FATAL;.
52e0: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
52f0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
5300: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b . return res;
5310: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5360: 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 . * Advertise Pr
5370: 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b otocols Callback
5380: 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 for Next Protoc
5390: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 ol Negotiation (
53a0: 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 NPN) in ServerHe
53b0: 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c llo --. *. *.cal
53c0: 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 led when a TLS s
53d0: 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 erver needs a li
53e0: 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 st of supported
53f0: 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 protocols for Ne
5400: 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e xt. *.Protocol N
5410: 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 egotiation.. *.
5420: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
5430: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
5440: 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 fects:. *. * Ret
5450: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
5460: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
5470: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 NPN protocol se
5480: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e lected. The conn
5490: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
54a0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
54b0: 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 ERR_NOACK: NPN p
54c0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 rotocol not sele
54d0: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 cted. The connec
54e0: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a tion continues..
54f0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 --------. */.#if
5540: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 def USE_NPN.stat
5550: 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 ic int.NPNCallba
5560: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 ck(const SSL *ss
5570: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 l, const unsigne
5580: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e d char **out, un
5590: 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c signed int *outl
55a0: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b en, void *arg) {
55b0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
55c0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
55d0: 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 rg;.. dprintf
55e0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
55f0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
5600: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 || arg == NULL)
5610: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
5620: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
5630: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
5640: 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 et protocols lis
5650: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 t */. if (sta
5660: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d tePtr->protos !=
5670: 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d NULL) {..*out =
5680: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
5690: 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 s;..*outlen = st
56a0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
56b0: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b en;. } else {
56c0: 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 ..*out = NULL;..
56d0: 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 *outlen = 0;..re
56e0: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
56f0: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
5700: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f . return SSL_
5710: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d TLSEXT_ERR_OK;.}
5720: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d .#endif.../*. *-
5730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5770: 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c --. *. * SNI Cal
5780: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 lback for Server
5790: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f s --. *. *.Perfo
57a0: 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 rm server-side S
57b0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 NI hostname sele
57c0: 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 ction after rece
57d0: 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 iving SNI extens
57e0: 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 ion. *.in Client
57f0: 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 Hello. Called a
5800: 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 fter hello callb
5810: 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 ack but before A
5820: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a LPN callback.. *
5830: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
5840: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
5850: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
5860: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
5870: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 efined). *. * Re
5880: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 turn codes:. *.S
5890: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
58a0: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 : SNI hostname i
58b0: 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 s accepted. The
58c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
58d0: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
58e0: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 EXT_ERR_ALERT_FA
58f0: 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d TAL: SNI hostnam
5900: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 e is not accepte
5910: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f d. The connectio
5920: 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 n. *. is abor
5930: 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 ted. Default for
5940: 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 alert is SSL_AD
5950: 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 _UNRECOGNIZED_NA
5960: 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 ME.. *.SSL_TLSEX
5970: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e T_ERR_ALERT_WARN
5980: 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d ING: SNI hostnam
5990: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 e is not accepte
59a0: 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 d, warning alert
59b0: 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f . *. sent (no
59c0: 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 t supported in T
59d0: 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e LSv1.3). The con
59e0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
59f0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s.. *.SSL_TLSEXT
5a00: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 _ERR_NOACK: SNI
5a10: 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 hostname is not
5a20: 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 accepted and not
5a30: 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 acknowledged,.
5a40: 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e *. e.g. if SN
5a50: 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 I has not been c
5a60: 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 onfigured. The c
5a70: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
5a80: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ues.. *. *------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5ad0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 /.static int.SNI
5ae0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
5af0: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c SL *ssl, int *al
5b00: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 ert, void *arg)
5b10: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
5b20: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
5b30: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 arg;. Tcl_Int
5b40: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
5b50: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
5b60: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
5b70: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 Ptr;. int cod
5b80: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 e, res;. cons
5b90: 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 t char *serverna
5ba0: 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 me = NULL;..
5bb0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
5bc0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 );.. if (ssl
5bd0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d == NULL || arg =
5be0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
5bf0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
5c00: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
5c10: 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 /* Only works
5c20: 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 for TLS 1.2 and
5c30: 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 earlier */.
5c40: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c servername = SSL
5c50: 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 _get_servername(
5c60: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 ssl, TLSEXT_NAME
5c70: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b TYPE_host_name);
5c80: 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 . if (!server
5c90: 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 name || serverna
5ca0: 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b me[0] == '\0') {
5cb0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
5cc0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
5cd0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
5ce0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 atePtr->vcmd ==
5cf0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
5d00: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
5d10: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
5d20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
5d30: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
5d40: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c l with fn, chan,
5d50: 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 and server name
5d60: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 args */. cmd
5d70: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
5d80: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
5d90: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f >vcmd);. Tcl_
5da0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5db0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5dc0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
5dd0: 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 ngObj("sni", -1)
5de0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
5df0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
5e00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
5e10: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
5e20: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 ngObj(Tcl_GetCha
5e30: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
5e40: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a r->self), -1));.
5e50: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5e60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5e70: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
5e80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 _NewStringObj(se
5e90: 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b rvername , -1));
5ea0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
5eb0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
5ec0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
5ed0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5ee0: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 if ((code =
5ef0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
5f00: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
5f10: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 mdPtr)) > 1) {..
5f20: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
5f30: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 _ERR_ALERT_WARNI
5f40: 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 NG;..*alert = SS
5f50: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 L_AD_UNRECOGNIZE
5f60: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 D_NAME; /* Not s
5f70: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 upported by TLS
5f80: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 1.3 */. } els
5f90: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 e if (code == 1)
5fa0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
5fb0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
5fc0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
5fd0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5fe0: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 ALERT_FATAL;..*a
5ff0: 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e lert = SSL_AD_UN
6000: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b RECOGNIZED_NAME;
6010: 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 /* Not supporte
6020: 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a d by TLS 1.3 */.
6030: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
6040: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
6050: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 r);. return r
6060: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d es;.}.../*. *---
6070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60b0: 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c . *. * ClientHel
60c0: 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c lo Handshake Cal
60d0: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 lback for Server
60e0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 s --. *. *.Used
60f0: 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 by server to exa
6100: 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 mine the server
6110: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 name indication
6120: 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a (SNI) extension.
6130: 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 *.provided by t
6140: 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 he client in ord
6150: 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 er to select an
6160: 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 appropriate cert
6170: 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 ificate to. *.pr
6180: 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 esent, and make
6190: 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 other configurat
61a0: 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 ion adjustments
61b0: 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 relevant to that
61c0: 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 server. *.name
61d0: 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 and its configur
61e0: 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c ation. This incl
61f0: 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 udes swapping ou
6200: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 t the associated
6210: 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e . *.SSL_CTX poin
6220: 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 ter, modifying t
6230: 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 he server's list
6240: 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c of permitted TL
6250: 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 S versions,. *.c
6260: 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 hanging the serv
6270: 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 er's cipher list
6280: 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 in response to
6290: 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 the client's cip
62a0: 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 her list, etc..
62b0: 2a 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 *.Called before
62c0: 53 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c SNI and ALPN cal
62d0: 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 lbacks.. *. * Re
62e0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
62f0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
6300: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
6310: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
6320: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 ). *. * Return c
6330: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 odes:. *.SSL_CLI
6340: 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a ENT_HELLO_RETRY:
6350: 20 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e suspend the han
6360: 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 dshake, and the
6370: 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 handshake functi
6380: 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 on will return i
6390: 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 mmediately. *.SS
63a0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
63b0: 52 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 RROR: failure, t
63c0: 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 erminate connect
63d0: 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 ion. Set alert t
63e0: 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a o error code.. *
63f0: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c .SSL_CLIENT_HELL
6400: 4f 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 O_SUCCESS: succe
6410: 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ss. *. *--------
6420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
6460: 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f static int.Hello
6470: 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 Callback(SSL *ss
6480: 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 l, int *alert, v
6490: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 oid *arg) {.
64a0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
64b0: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 = (State*)arg;.
64c0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
64d0: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
64e0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
64f0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
6500: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 int code, res
6510: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
6520: 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 *servername;.
6530: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
6540: 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 char *p;. si
6550: 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e ze_t len, remain
6560: 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ing;.. dprint
6570: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
6580: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
6590: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a vcmd == (Tcl_Obj
65a0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
65b0: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
65c0: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 LO_SUCCESS;.
65d0: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d } else if (ssl =
65e0: 3d 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e = (const SSL *)N
65f0: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 ULL || arg == (v
6600: 6f 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 oid *)NULL) {..r
6610: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6620: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
6630: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
6640: 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 names */. if
6650: 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c (!SSL_client_hel
6660: 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c lo_get0_ext(ssl,
6670: 20 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 TLSEXT_TYPE_ser
6680: 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 ver_name, &p, &r
6690: 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d emaining) || rem
66a0: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 aining <= 2) {..
66b0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 *alert = SSL_R_S
66c0: 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 SLV3_ALERT_ILLEG
66d0: 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 AL_PARAMETER;..r
66e0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
66f0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
6700: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 }.. /* Extr
6710: 61 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f act the length o
6720: 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c f the supplied l
6730: 69 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f ist of names. */
6740: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b . len = (*(p+
6750: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 +) << 8);. le
6760: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 n += *(p++);.
6770: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 if (len + 2 !=
6780: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 remaining) {..*a
6790: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c lert = SSL_R_SSL
67a0: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c V3_ALERT_ILLEGAL
67b0: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 _PARAMETER;..ret
67c0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
67d0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
67e0: 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 }. remaining
67f0: 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 = len;.. /* T
6800: 68 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 he list in pract
6810: 69 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 ice only has a s
6820: 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 ingle element, s
6830: 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 o we only consid
6840: 65 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 er the first one
6850: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d . */. if (rem
6860: 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a aining == 0 || *
6870: 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 p++ != TLSEXT_NA
6880: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 METYPE_host_name
6890: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
68a0: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
68b0: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a INTERNAL_ERROR;.
68c0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
68d0: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
68e0: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e }. remain
68f0: 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e ing--;.. /* N
6900: 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c ow we can finall
6910: 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 y pull out the b
6920: 79 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 yte array with t
6930: 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 he actual hostna
6940: 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 me. */. if (r
6950: 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b emaining <= 2) {
6960: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
6970: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 _TLSV1_ALERT_INT
6980: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 ERNAL_ERROR;..re
6990: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
69a0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
69b0: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 }. len = (*(
69c0: 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 p++) << 8);.
69d0: 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 len += *(p++);.
69e0: 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e if (len + 2 >
69f0: 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a remaining) {..*
6a00: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
6a10: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e SV1_ALERT_INTERN
6a20: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 AL_ERROR;..retur
6a30: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
6a40: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
6a50: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 remaining =
6a60: 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e len;. servern
6a70: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 ame = (const cha
6a80: 72 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 r *)p;.. /* C
6a90: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
6aa0: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 eval with fn, c
6ab0: 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 han, and server
6ac0: 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 name args */.
6ad0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
6ae0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
6af0: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
6b00: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
6b10: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
6b20: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
6b30: 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f StringObj("hello
6b40: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
6b50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
6b60: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
6b70: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
6b80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
6b90: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
6ba0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
6bb0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
6bc0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6bd0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
6be0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
6bf0: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 Obj(servername,
6c00: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 (Tcl_Size) len))
6c10: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
6c20: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
6c30: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
6c40: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
6c50: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d . if ((code =
6c60: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
6c70: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
6c80: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a cmdPtr)) > 1) {.
6c90: 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e .res = SSL_CLIEN
6ca0: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 T_HELLO_RETRY;..
6cb0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 *alert = SSL_R_T
6cc0: 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f LSV1_ALERT_USER_
6cd0: 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d CANCELLED;. }
6ce0: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d else if (code =
6cf0: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 1) {..res = SS
6d00: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 L_CLIENT_HELLO_S
6d10: 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c UCCESS;. } el
6d20: 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f se {..res = SSL_
6d30: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6d40: 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 OR;..*alert = SS
6d50: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
6d60: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a INTERNAL_ERROR;.
6d70: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
6d80: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
6d90: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 r);. return r
6da0: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a es;.}.../*******
6db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f *************/./
6dc0: 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 * Commands
6dd0: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a */./*********
6de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a ***********/../*
6df0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e30: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 ------. *. * Cip
6e40: 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 hersObjCmd -- li
6e50: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 st available cip
6e60: 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 hers. *. *.This
6e70: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
6e80: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
6e90: 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 the "tls::cipher
6ea0: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f s" command. *.to
6eb0: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
6ec0: 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 ciphers, based u
6ed0: 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c pon protocol sel
6ee0: 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 ected.. *. * Res
6ef0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
6f00: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c ard Tcl result l
6f10: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ist.. *. * Side
6f20: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 effects:. *.cons
6f30: 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 tructs and destr
6f40: 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 oys SSL context
6f50: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d (CTX). *. *-----
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
6fa0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 */.static const
6fb0: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b char *protocols[
6fc0: 5d 20 3d 20 7b 0a 20 20 20 20 22 73 73 6c 32 22 ] = {. "ssl2"
6fd0: 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 , "ssl3", "tls1"
6fe0: 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 , "tls1.1", "tls
6ff0: 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 1.2", "tls1.3",
7000: 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f NULL.};.enum pro
7010: 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f tocol {. TLS_
7020: 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 SSL2, TLS_SSL3,
7030: 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c TLS_TLS1, TLS_TL
7040: 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 S1_1, TLS_TLS1_2
7050: 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c , TLS_TLS1_3, TL
7060: 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 S_NONE.};..stati
7070: 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a c int.CiphersObj
7080: 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 Cmd(. TCL_UNU
7090: 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 SED(void *),.
70a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
70b0: 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a erp,. int obj
70c0: 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a c,. Tcl_Obj.*
70d0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a const objv[]).{.
70e0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
70f0: 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 Ptr = NULL;.
7100: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e SSL_CTX *ctx = N
7110: 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 ULL;. SSL *ss
7120: 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 l = NULL;. ST
7130: 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 ACK_OF(SSL_CIPHE
7140: 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 R) *sk;. char
7150: 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 buf[BUFSIZ];.
7160: 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 int index, ver
7170: 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 bose = 0, use_su
7180: 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 pported = 0;.
7190: 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f const SSL_METHO
71a0: 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 D *method;..
71b0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
71c0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a );.. if ((obj
71d0: 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 c < 2) || (objc
71e0: 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f > 4)) {..Tcl_Wro
71f0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
7200: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 , 1, objv, "prot
7210: 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f ocol ?verbose? ?
7220: 73 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 supported?");..r
7230: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7240: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 . }. if (T
7250: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f cl_GetIndexFromO
7260: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
7270: 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 1], protocols, "
7280: 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 protocol", 0, &i
7290: 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 ndex) != TCL_OK)
72a0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
72b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
72c0: 69 66 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 if ((objc > 2) &
72d0: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e & Tcl_GetBoolean
72e0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
72f0: 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 objv[2], &verbos
7300: 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a e) != TCL_OK) {.
7310: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7320: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
7330: 28 28 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 ((objc > 3) && T
7340: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f cl_GetBooleanFro
7350: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
7360: 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f v[3], &use_suppo
7370: 72 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 rted) != TCL_OK)
7380: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
7390: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
73a0: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
73b0: 28 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 ();.. switch
73c0: 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 ((enum protocol)
73d0: 69 6e 64 65 78 29 20 7b 0a 20 20 20 20 63 61 73 index) {. cas
73e0: 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 e TLS_SSL2:.#if
73f0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
7400: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 NUMBER >= 0x1010
7410: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 0000L || defined
7420: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 (NO_SSL2) || def
7430: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7440: 53 53 4c 32 29 0a 09 54 63 6c 5f 41 70 70 65 6e SSL2)..Tcl_Appen
7450: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
7460: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
7470: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
7480: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 t supported", (c
7490: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 har *)NULL);..re
74a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
74b0: 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 #else..method =
74c0: 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 SSLv2_method();
74d0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 break;.#endif.
74e0: 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a case TLS_SSL3:
74f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
7500: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
7510: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
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 53 53 4c 33 5f 4d 45 54 NSSL_NO_SSL3_MET
7540: 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 HOD)..Tcl_Append
7550: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
7560: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
7570: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
7580: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
7590: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 ar *)NULL);..ret
75a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
75b0: 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 53 else..method = S
75c0: 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 SLv3_method(); b
75d0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 reak;.#endif.
75e0: 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a case TLS_TLS1:.
75f0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
7600: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
7610: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
7620: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7630: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 SSL_NO_TLS1_METH
7640: 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 OD)..Tcl_AppendR
7650: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
7660: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
7670: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
7680: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
7690: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 r *)NULL);..retu
76a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
76b0: 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c lse..method = TL
76c0: 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 Sv1_method(); br
76d0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
76e0: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a case TLS_TLS1_1:
76f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
7700: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
7710: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7720: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
7730: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
7740: 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f _1_METHOD)..Tcl_
7750: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7760: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
7770: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
7780: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
7790: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
77a0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
77b0: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68 ROR;.#else..meth
77c0: 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 od = TLSv1_1_met
77d0: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
77e0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c ndif. case TL
77f0: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 S_TLS1_2:.#if de
7800: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
7810: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7820: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c SSL_NO_TLS1_2) |
7830: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7840: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 L_NO_TLS1_2_METH
7850: 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 OD)..Tcl_AppendR
7860: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
7870: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
7880: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
7890: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
78a0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 r *)NULL);..retu
78b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
78c0: 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c lse..method = TL
78d0: 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 Sv1_2_method();
78e0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 break;.#endif.
78f0: 20 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f case TLS_TLS1_
7900: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 3:.#if defined(N
7910: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
7920: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7930: 54 4c 53 31 5f 33 29 0a 09 54 63 6c 5f 41 70 70 TLS1_3)..Tcl_App
7940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7950: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
7960: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
7970: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
7980: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 (char *)NULL);..
7990: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
79a0: 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 ;.#else..method
79b0: 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a = TLS_method();.
79c0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e .SSL_CTX_set_min
79d0: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
79e0: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
79f0: 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ON);..SSL_CTX_se
7a00: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 t_max_proto_vers
7a10: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
7a20: 56 45 52 53 49 4f 4e 29 3b 0a 09 62 72 65 61 6b VERSION);..break
7a30: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 ;.#endif. def
7a40: 61 75 6c 74 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 ault:..method =
7a50: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 TLS_method();..b
7a60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
7a70: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e ctx = SSL_CTX_n
7a80: 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 ew(method);.
7a90: 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 if (ctx == NULL)
7aa0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
7ab0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54 sult(interp, GET
7ac0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
7ad0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
7ae0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7af0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 . }.. ssl
7b00: 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a = SSL_new(ctx);.
7b10: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e if (ssl == N
7b20: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
7b30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
7b40: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
7b50: 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ), (char *)NULL)
7b60: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
7b70: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ctx);..return TC
7b80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
7b90: 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 /* Use list
7ba0: 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 and order as wou
7bb0: 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 ld be sent in a
7bc0: 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 ClientHello or a
7bd0: 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 ll available cip
7be0: 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 hers */. if (
7bf0: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b use_supported) {
7c00: 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f ..sk = SSL_get1_
7c10: 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 supported_cipher
7c20: 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c s(ssl);. } el
7c30: 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 se {..sk = SSL_g
7c40: 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b et_ciphers(ssl);
7c50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
7c60: 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 sk != NULL) {..i
7c70: 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 f (!verbose) {..
7c80: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
7c90: 63 70 3b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 cp;.. objPtr
7ca0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
7cb0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 (0, NULL);..
7cc0: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 for (int i = 0;
7cd0: 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 i < sk_SSL_CIPHE
7ce0: 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 R_num(sk); i++)
7cf0: 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 {...const SSL_CI
7d00: 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c PHER *c = sk_SSL
7d10: 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b _CIPHER_value(sk
7d20: 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d , i);...if (c ==
7d30: 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b NULL) continue;
7d40: 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 ..../* cipher na
7d50: 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a me or (NONE) */.
7d60: 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 ..cp = SSL_CIPHE
7d70: 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 R_get_name(c);..
7d80: 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 .if (cp == NULL)
7d90: 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 break;...Tcl_Li
7da0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
7db0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
7dc0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
7dd0: 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 Obj(cp, -1));..
7de0: 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a }...} else {.
7df0: 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
7e00: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
7e10: 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 ",0);.. for (
7e20: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 int i = 0; i < s
7e30: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d k_SSL_CIPHER_num
7e40: 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 (sk); i++) {...c
7e50: 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 onst SSL_CIPHER
7e60: 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 *c = sk_SSL_CIPH
7e70: 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b ER_value(sk, i);
7e80: 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c ...if (c == NULL
7e90: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f ) continue;..../
7ea0: 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 * textual descri
7eb0: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 ption of the cip
7ec0: 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c her */...if (SSL
7ed0: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 _CIPHER_descript
7ee0: 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 ion(c, buf, size
7ef0: 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c of(buf)) != NULL
7f00: 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 ) {... Tcl_Ap
7f10: 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 pendToObj(objPtr
7f20: 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 , buf, (Tcl_Size
7f30: 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a ) strlen(buf));.
7f40: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 ..} else {...
7f50: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a Tcl_AppendToObj
7f60: 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 (objPtr, "UNKNOW
7f70: 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 N\n", 8);...}..
7f80: 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 }..}..if (use
7f90: 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 _supported) {..
7fa0: 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 sk_SSL_CIPHER
7fb0: 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 _free(sk);..}.
7fc0: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 }. SSL_free
7fd0: 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 (ssl);. SSL_C
7fe0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 TX_free(ctx);..
7ff0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
8000: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
8010: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
8020: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
8030: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
8040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8070: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f ----. *. * Proto
8080: 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 colsObjCmd -- li
8090: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f st available pro
80a0: 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 tocols. *. *.Thi
80b0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
80c0: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
80d0: 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 s the "tls::prot
80e0: 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 ocols" command.
80f0: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 *.to list availa
8100: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 ble protocols..
8110: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
8120: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
8130: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a result list.. *.
8140: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
8150: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d . *.none. *. *--
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
81a0: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
81b0: 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d t.ProtocolsObjCm
81c0: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 d(. TCL_UNUSE
81d0: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 D(void *),. T
81e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
81f0: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c p,. int objc,
8200: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f . Tcl_Obj *co
8210: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
8220: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
8230: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 r;.. dprintf(
8240: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
8250: 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b if (objc != 1) {
8260: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
8270: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
8280: 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e jv, "");..return
8290: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
82a0: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
82b0: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f _error();.. o
82c0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
82d0: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
82e0: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
82f0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
8300: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
8310: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
8320: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
8330: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
8340: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
8350: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
8360: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
8370: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
8380: 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 cols[TLS_SSL2],
8390: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
83a0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
83b0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
83c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 PENSSL_NO_SSL3)
83d0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
83e0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 SSL_NO_SSL3_METH
83f0: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 OD). Tcl_List
8400: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
8410: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
8420: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
8430: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
8440: 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e SSL3], -1));.#en
8450: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
8460: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 (NO_TLS1) && !de
8470: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8480: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
8490: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
84a0: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 S1_METHOD). T
84b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
84c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
84d0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
84e0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
84f0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 ls[TLS_TLS1], -1
8500: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
8510: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
8520: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
8530: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
8540: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8550: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f ENSSL_NO_TLS1_1_
8560: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f METHOD). Tcl_
8570: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
8580: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
8590: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
85a0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
85b0: 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 TLS_TLS1_1], -1)
85c0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
85d0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
85e0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
85f0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
8600: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
8610: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d NSSL_NO_TLS1_2_M
8620: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c ETHOD). Tcl_L
8630: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
8640: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
8650: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
8660: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
8670: 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 LS_TLS1_2], -1))
8680: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
8690: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
86a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
86b0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
86c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
86d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
86e0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
86f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
8700: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
8710: 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 _3], -1));.#endi
8720: 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 f.. Tcl_SetOb
8730: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
8740: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
8750: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
8760: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
8770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
87a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 --------. *. * H
87b0: 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d andshakeObjCmd -
87c0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d -. *. *.This com
87d0: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 mand is used to
87e0: 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74 verify whether t
87f0: 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 he handshake is
8800: 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e complete. *.or n
8810: 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ot.. *. * Result
8820: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
8830: 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d Tcl result. 1 m
8840: 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 eans handshake c
8850: 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 omplete, 0 means
8860: 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 pending.. *. *
8870: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
8880: 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e .May force SSL n
8890: 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 egotiation to ta
88a0: 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d ke place.. *. *-
88b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88f0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
8900: 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 nt HandshakeObjC
8910: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 md(. TCL_UNUS
8920: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 ED(void *),.
8930: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
8940: 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 rp,. int objc
8950: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ,. Tcl_Obj *c
8960: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 onst objv[]).{.
8970: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
8980: 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 han; /* T
8990: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
89a0: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
89b0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
89c0: 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 Ptr; /* c
89d0: 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 lient state for
89e0: 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 ssl socket */.
89f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 const char *er
8a00: 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 rStr = NULL;.
8a10: 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 int ret = 1;.
8a20: 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a int err = 0;..
8a30: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
8a40: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
8a50: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
8a60: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
8a70: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
8a80: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 "channel");..ret
8a90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
8aa0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
8ab0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
8ac0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
8ad0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
8ae0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
8af0: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 jv[1]), NULL);.
8b00: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
8b10: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
8b20: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
8b30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
8b40: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
8b50: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
8b60: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
8b70: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
8b80: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
8b90: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 l(chan);. if
8ba0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
8bb0: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
8bc0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
8bd0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
8be0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
8bf0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
8c00: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
8c10: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
8c20: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
8c30: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
8c40: 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 ;..Tcl_SetErrorC
8c50: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
8c60: 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 ", "HANDSHAKE",
8c70: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 "CHANNEL", "INVA
8c80: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 LID", (char *)NU
8c90: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
8ca0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
8cb0: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 statePtr = (St
8cc0: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
8cd0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
8ce0: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 (chan);.. dpr
8cf0: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c intf("Calling Tl
8d00: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
8d10: 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c ");. ret = Tl
8d20: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
8d30: 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c (statePtr, &err,
8d40: 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 1);. dprintf
8d50: 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e ("Tls_WaitForCon
8d60: 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 nect returned: %
8d70: 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 i", ret);.. i
8d80: 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 f (ret < 0 && ((
8d90: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
8da0: 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 & TLS_TCL_ASYNC)
8db0: 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 && (err == EAGA
8dc0: 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 IN))) {..dprintf
8dd0: 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 ("Async set and
8de0: 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a err = EAGAIN");.
8df0: 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 .ret = 0;. }
8e00: 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 else if (ret < 0
8e10: 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 ) {..long result
8e20: 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 ;..errStr = stat
8e30: 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f ePtr->err;..Tcl_
8e40: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 ResetResult(inte
8e50: 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 rp);..Tcl_SetErr
8e60: 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 no(err);...if (!
8e70: 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 errStr || (*errS
8e80: 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 tr == 0)) {..
8e90: 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f errStr = Tcl_Po
8ea0: 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 sixError(interp)
8eb0: 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e ;..}...Tcl_Appen
8ec0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
8ed0: 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 "handshake faile
8ee0: 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 d: ", errStr, (c
8ef0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 69 66 har *)NULL);..if
8f00: 20 28 28 72 65 73 75 6c 74 20 3d 20 53 53 4c 5f ((result = SSL_
8f10: 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c get_verify_resul
8f20: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 t(statePtr->ssl)
8f30: 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 ) != X509_V_OK)
8f40: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
8f50: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
8f60: 22 20 64 75 65 20 74 6f 20 5c 22 22 2c 20 58 35 " due to \"", X5
8f70: 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 09_verify_cert_e
8f80: 72 72 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 75 rror_string(resu
8f90: 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 lt), "\"", (char
8fa0: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 *)NULL);..}..Tc
8fb0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
8fc0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 nterp, "TLS", "H
8fd0: 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c ANDSHAKE", "FAIL
8fe0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c ED", (char *)NUL
8ff0: 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 L);..dprintf("Re
9000: 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f turning TCL_ERRO
9010: 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 R with handshake
9020: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 failed: %s", er
9030: 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 rStr);..return T
9040: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 CL_ERROR;. }
9050: 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 else {..if (err
9060: 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 != 0) {.. dpr
9070: 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 intf("Got an err
9080: 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 or with a comple
9090: 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 ted handshake: e
90a0: 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a rr = %i", err);.
90b0: 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 .}..ret = 1;.
90c0: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
90d0: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f "Returning TCL_O
90e0: 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 K with data \"%i
90f0: 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 \"", ret);. T
9100: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
9110: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 interp, Tcl_NewI
9120: 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 ntObj(ret));.
9130: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
9140: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
9150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
9190: 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d * ImportObjCmd -
91a0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
91b0: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
91c0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 d to process the
91d0: 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 "ssl" command.
91e0: 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d *. *.The ssl com
91f0: 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 mand pushes SSL
9200: 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f over a (newly co
9210: 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 nnected) tcp soc
9220: 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ket. *. * Result
9230: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
9240: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
9250: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
9260: 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 . *.May modify t
9270: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 he behavior of a
9280: 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a n IO channel.. *
9290: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
92a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
92e0: 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a ic int.ImportObj
92f0: 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 Cmd(. TCL_UNU
9300: 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 SED(void *),.
9310: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
9320: 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a erp,. int obj
9330: 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a c,. Tcl_Obj *
9340: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a const objv[]).{.
9350: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
9360: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
9370: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
9380: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
9390: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 tate *statePtr;.
93a0: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 ./* client state
93b0: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 for ssl socket
93c0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a */. SSL_CTX *
93d0: 63 74 78 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ctx..= NULL;.
93e0: 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 Tcl_Obj *script
93f0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 ..= NULL;. Tc
9400: 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 l_Obj *password.
9410: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c .= NULL;. Tcl
9420: 5f 4f 62 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 _Obj *vcmd..= NU
9430: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 LL;. Tcl_DStr
9440: 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c ing upperChannel
9450: 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 Translation, upp
9460: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
9470: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 g, upperChannelE
9480: 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 ncoding, upperCh
9490: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 annelEOFChar;.
94a0: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 int idx;. T
94b0: 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 cl_Size len;.
94c0: 20 69 6e 74 20 66 6c 61 67 73 09 09 09 3d 20 54 int flags...= T
94d0: 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 LS_TCL_INIT;.
94e0: 20 69 6e 74 20 73 65 72 76 65 72 09 09 09 3d 20 int server...=
94f0: 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 0;./* is connect
9500: 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 ion incoming or
9510: 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 outgoing? */.
9520: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 09 char *keyfile..
9530: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
9540: 20 2a 63 65 72 74 66 69 6c 65 09 09 3d 20 4e 55 *certfile..= NU
9550: 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 LL;. unsigned
9560: 20 63 68 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 char *key..= NU
9570: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 LL;. Tcl_Size
9580: 20 6b 65 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 key_len..= 0;.
9590: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
95a0: 20 2a 63 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a *cert..= NULL;.
95b0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 Tcl_Size cer
95c0: 74 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 t_len..= 0;.
95d0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 09 3d char *ciphers..=
95e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
95f0: 2a 63 69 70 68 65 72 73 75 69 74 65 73 09 09 3d *ciphersuites..=
9600: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
9610: 2a 43 41 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b *CAfile..= NULL;
9620: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 70 61 74 . char *CApat
9630: 68 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 h..= NULL;. c
9640: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 09 3d har *DHparams..=
9650: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
9660: 2a 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b *model...= NULL;
9670: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 . char *serve
9680: 72 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f rname..= NULL;./
9690: 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 * hostname for S
96a0: 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 erver Name Indic
96b0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 68 61 ation */. cha
96c0: 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 09 09 3d r *session_id..=
96d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
96e0: 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c bj *alpn..= NULL
96f0: 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d ;. int ssl2 =
9700: 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 0, ssl3 = 0;.
9710: 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 int tls1 = 1,
9720: 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 tls1_1 = 1, tls1
9730: 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d _2 = 1, tls1_3 =
9740: 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 1;. int prot
9750: 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d o = 0, level = -
9760: 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 1;. int verif
9770: 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d y = 0, require =
9780: 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 0, request = 1,
9790: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 post_handshake
97a0: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 = 0;.. dprint
97b0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 f("Called");..#i
97c0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
97d0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
97e0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 ENSSL_NO_TLS1).
97f0: 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e tls1 = 0;.#en
9800: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
9810: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
9820: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
9830: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 _TLS1_1). tls
9840: 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 1_1 = 0;.#endif.
9850: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
9860: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
9870: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
9880: 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 1_2). tls1_2
9890: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 0;.#endif.#if
98a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
98b0: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
98c0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
98d0: 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b . tls1_3 = 0;
98e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 .#endif.. if
98f0: 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 (objc < 2) {..Tc
9900: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
9910: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
9920: 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e "channel ?option
9930: 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 s?");..return TC
9940: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
9950: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
9960: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e ror();.. chan
9970: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
9980: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
9990: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
99a0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
99b0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
99c0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
99d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
99e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
99f0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
9a00: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
9a10: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
9a20: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
9a30: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
9a40: 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 );.. for (idx
9a50: 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 = 2; idx < objc
9a60: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 ; idx++) {..char
9a70: 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 *opt = Tcl_GetS
9a80: 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 tring(objv[idx])
9a90: 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 ;...if (opt[0] !
9aa0: 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 = '-').. brea
9ab0: 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c k;...OPTOBJ("-al
9ac0: 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 pn", alpn);..OPT
9ad0: 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 STR("-cadir", CA
9ae0: 70 61 74 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 path);..OPTSTR("
9af0: 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 -cafile", CAfile
9b00: 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 );..OPTBYTE("-ce
9b10: 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f rt", cert, cert_
9b20: 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d len);..OPTSTR("-
9b30: 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 certfile", certf
9b40: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
9b50: 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 cipher", ciphers
9b60: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
9b70: 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b hers", ciphers);
9b80: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 ..OPTSTR("-ciphe
9b90: 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 rsuites", cipher
9ba0: 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a suites);..OPTOBJ
9bb0: 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 ("-command", scr
9bc0: 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ipt);..OPTSTR("-
9bd0: 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 dhparams", DHpar
9be0: 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 ams);..OPTBYTE("
9bf0: 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f -key", key, key_
9c00: 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d len);..OPTSTR("-
9c10: 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c keyfile", keyfil
9c20: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f e);..OPTSTR("-mo
9c30: 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f del", model);..O
9c40: 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 PTOBJ("-password
9c50: 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f ", password);..O
9c60: 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 PTBOOL("-post_ha
9c70: 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 ndshake", post_h
9c80: 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 andshake);..OPTB
9c90: 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 OOL("-request",
9ca0: 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f request);..OPTBO
9cb0: 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 OL("-require", r
9cc0: 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 equire);..OPTINT
9cd0: 28 22 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 ("-security_leve
9ce0: 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 l", level);..OPT
9cf0: 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 BOOL("-server",
9d00: 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 server);..OPTSTR
9d10: 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 ("-servername",
9d20: 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 servername);..OP
9d30: 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 TSTR("-session_i
9d40: 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b d", session_id);
9d50: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 ..OPTBOOL("-ssl2
9d60: 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f ", ssl2);..OPTBO
9d70: 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 OL("-ssl3", ssl3
9d80: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
9d90: 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 s1", tls1);..OPT
9da0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 BOOL("-tls1.1",
9db0: 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f tls1_1);..OPTBOO
9dc0: 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 L("-tls1.2", tls
9dd0: 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 1_2);..OPTBOOL("
9de0: 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 -tls1.3", tls1_3
9df0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c );..OPTOBJ("-val
9e00: 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 idatecommand", v
9e10: 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d cmd);..OPTOBJ("-
9e20: 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 vcmd", vcmd);...
9e30: 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c OPTBAD("option",
9e40: 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c "-alpn, -cadir,
9e50: 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c -cafile, -cert,
9e60: 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 -certfile, -cip
9e70: 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 her, -ciphersuit
9e80: 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 es, -command, -d
9e90: 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d hparams, -key, -
9ea0: 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c keyfile, -model,
9eb0: 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 -password, -pos
9ec0: 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 t_handshake, -re
9ed0: 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c quest, -require,
9ee0: 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c -security_level
9ef0: 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 , -server, -serv
9f00: 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e ername, -session
9f10: 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c _id, -ssl2, -ssl
9f20: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 3, -tls1, -tls1.
9f30: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 1, -tls1.2, -tls
9f40: 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 1.3, or -validat
9f50: 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 ecommand");...re
9f60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9f70: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 }. if (re
9f80: 71 75 65 73 74 29 09 20 20 20 20 76 65 72 69 66 quest). verif
9f90: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
9fa0: 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 CLIENT_ONCE | SS
9fb0: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 L_VERIFY_PEER;.
9fc0: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 if (request &
9fd0: 26 20 72 65 71 75 69 72 65 29 20 76 65 72 69 66 & require) verif
9fe0: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
9ff0: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f FAIL_IF_NO_PEER_
a000: 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 CERT;. if (re
a010: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 quest && post_ha
a020: 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 ndshake).verify
a030: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f |= SSL_VERIFY_PO
a040: 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 ST_HANDSHAKE;.
a050: 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 if (verify ==
a060: 30 29 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 0).verify = SSL_
a070: 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 VERIFY_NONE;..
a080: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 proto |= (ssl2
a090: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ? TLS_PROTO_SSL
a0a0: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 2 : 0);. prot
a0b0: 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 o |= (ssl3 ? TLS
a0c0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 _PROTO_SSL3 : 0)
a0d0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
a0e0: 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f tls1 ? TLS_PROTO
a0f0: 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 _TLS1 : 0);.
a100: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 proto |= (tls1_1
a110: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
a120: 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 1_1 : 0);. pr
a130: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f oto |= (tls1_2 ?
a140: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
a150: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 2 : 0);. prot
a160: 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 o |= (tls1_3 ? T
a170: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 LS_PROTO_TLS1_3
a180: 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 : 0);.. /* re
a190: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 set to NULL if b
a1a0: 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 lank string prov
a1b0: 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 ided */. if (
a1c0: 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 cert && !*cert).
a1d0: 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 20 . cert.
a1e0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
a1f0: 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b if (key && !*k
a200: 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 ey).. key
a210: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a220: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c . if (certfil
a230: 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 e && !*certfile)
a240: 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 6c certfil
a250: 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 e.= NULL;. if
a260: 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b (keyfile && !*k
a270: 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 eyfile)..keyfile
a280: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a290: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 . if (ciphers
a2a0: 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 && !*ciphers).
a2b0: 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 20 ciphers.
a2c0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a2d0: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 69 if (ciphersui
a2e0: 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 tes && !*ciphers
a2f0: 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 69 uites) ciphersui
a300: 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 tes = NULL;.
a310: 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 if (CAfile &&
a320: 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 !*CAfile).
a330: 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 CAfile.
a340: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
a350: 20 28 43 41 70 61 74 68 20 26 26 20 21 2a 43 41 (CApath && !*CA
a360: 70 61 74 68 29 09 20 20 20 20 20 20 20 20 43 41 path). CA
a370: 70 61 74 68 09 20 20 20 20 20 20 20 20 3d 20 4e path. = N
a380: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 ULL;. if (DHp
a390: 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 arams && !*DHpar
a3a0: 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 ams). DHp
a3b0: 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e arams = N
a3c0: 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 ULL;.. /* new
a3d0: 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 SSL state */.
a3e0: 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 statePtr..= (S
a3f0: 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 tate *) ckalloc(
a400: 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f (unsigned) sizeo
a410: 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d f(State));. m
a420: 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 emset(statePtr,
a430: 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 0, sizeof(State)
a440: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 );.. statePtr
a450: 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b ->flags.= flags;
a460: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 . statePtr->i
a470: 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a nterp.= interp;.
a480: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 statePtr->vf
a490: 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 lags.= verify;.
a4a0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 statePtr->err
a4b0: 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 .= "";.. /* a
a4c0: 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a llocate script *
a4d0: 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 /. if (script
a4e0: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
a4f0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
a500: 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a (script, &len);.
a510: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
a520: 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 statePtr->callb
a530: 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 ack = script;..
a540: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
a550: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 unt(statePtr->ca
a560: 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 llback);..}.
a570: 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 }.. /* alloca
a580: 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 te password */.
a590: 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 if (password)
a5a0: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 {..(void) Tcl_G
a5b0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
a5c0: 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b password, &len);
a5d0: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 ..if (len) {..
a5e0: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 statePtr->pass
a5f0: 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b word = password;
a600: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
a610: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
a620: 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 >password);..}.
a630: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
a640: 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 ocate validate c
a650: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 ommand */. if
a660: 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 (vcmd) {..(void
a670: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
a680: 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 romObj(vcmd, &le
a690: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
a6a0: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 . statePtr->v
a6b0: 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 cmd = vcmd;..
a6c0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
a6d0: 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 t(statePtr->vcmd
a6e0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
a6f0: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 if (model != NU
a700: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b LL) {..int mode;
a710: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f ../* Get the "mo
a720: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a del" context */.
a730: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 .chan = Tcl_GetC
a740: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d hannel(interp, m
a750: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 odel, &mode);..i
a760: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
a770: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
a780: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
a790: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 tls_free_type *)
a7a0: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
a7b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a7c0: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 ;..}.../*.. * Ma
a7d0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
a7e0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
a7f0: 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 t channel.. */..
a800: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
a810: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
a820: 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e .if (Tcl_GetChan
a830: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
a840: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
a850: 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 ()) {.. Tcl_A
a860: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
a870: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
a880: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
a890: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
a8a0: 09 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 .. "\": not a
a8b0: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 TLS channel", (
a8c0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 char *)NULL);..
a8d0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
a8e0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
a8f0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 ", "IMPORT", "CH
a900: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 ANNEL", "INVALID
a910: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
a920: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
a930: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a (tls_free_type *
a940: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 )statePtr);..
a950: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
a960: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 R;..}..ctx = ((S
a970: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
a980: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
a990: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 a(chan))->ctx;.
a9a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
a9b0: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 ((ctx = CTX_Init
a9c0: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 (statePtr, serve
a9d0: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c r, proto, keyfil
a9e0: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 e, certfile, key
a9f0: 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c , cert, key_len,
aa00: 0a 09 09 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 ...cert_len, CAp
aa10: 61 74 68 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 ath, CAfile, cip
aa20: 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 hers, ciphersuit
aa30: 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 es, level, DHpar
aa40: 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b ams)) == NULL) {
aa50: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
aa60: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 tls_free_type *)
aa70: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
aa80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
aa90: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
aaa0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 statePtr->ctx =
aab0: 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 ctx;.. /*.
aac0: 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d * We need to m
aad0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 ake sure that th
aae0: 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 e channel works
aaf0: 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 in binary (for t
ab00: 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 he. * encryp
ab10: 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 tion not to get
ab20: 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 goofed up)..
ab30: 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 * We only want
ab40: 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 to adjust the bu
ab50: 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 ffering in pre-v
ab60: 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 2 channels, wher
ab70: 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 e. * each ch
ab80: 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 annel in the sta
ab90: 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 ck maintained it
aba0: 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 s own buffers..
abb0: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 */. Tcl_D
abc0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
abd0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
abe0: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ion);. Tcl_DS
abf0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
ac00: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 ChannelBlocking)
ac10: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
ac20: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
ac30: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
ac40: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
ac50: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
ac60: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c coding);. Tcl
ac70: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
ac80: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
ac90: 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 "-eofchar", &upp
aca0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
acb0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
acc0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
acd0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f rp, chan, "-enco
ace0: 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 ding", &upperCha
acf0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 nnelEncoding);.
ad00: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
ad10: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
ad20: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 chan, "-translat
ad30: 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e ion", &upperChan
ad40: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b nelTranslation);
ad50: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
ad60: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
ad70: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 , chan, "-blocki
ad80: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ng", &upperChann
ad90: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 elBlocking);.
ada0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
adb0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
adc0: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f an, "-translatio
add0: 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 n", "binary");.
ade0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
adf0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
ae00: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 chan, "-blocking
ae10: 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 ", "true");.
ae20: 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 dprintf("Consumi
ae30: 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 ng Tcl channel %
ae40: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e s", Tcl_GetChann
ae50: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 elName(chan));.
ae60: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c statePtr->sel
ae70: 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 f = Tcl_StackCha
ae80: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 nnel(interp, Tls
ae90: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 _ChannelType(),
aea0: 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 statePtr, (TCL_R
aeb0: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 EADABLE | TCL_WR
aec0: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a ITABLE), chan);.
aed0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 dprintf("Cre
aee0: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d ated channel nam
aef0: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 ed %s", Tcl_GetC
af00: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
af10: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 Ptr->self));.
af20: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
af30: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e elf == (Tcl_Chan
af40: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a nel) NULL) {../*
af50: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 .. * No use of T
af60: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 cl_EventuallyFre
af70: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 e because no pos
af80: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 sible Tcl_Preser
af90: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 ve... */..Tls_Fr
afa0: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 ee((tls_free_typ
afb0: 65 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 e *)statePtr);..
afc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
afd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c ;. }.. Tcl
afe0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
aff0: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
b000: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e tr->self, "-tran
b010: 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 slation", Tcl_DS
b020: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 tringValue(&uppe
b030: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
b040: 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 ion));. Tcl_S
b050: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
b060: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
b070: 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 ->self, "-encodi
b080: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 ng", Tcl_DString
b090: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
b0a0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 nelEncoding));.
b0b0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
b0c0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
b0d0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 statePtr->self,
b0e0: 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f "-eofchar", Tcl_
b0f0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
b100: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
b110: 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 r));. Tcl_Set
b120: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
b130: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e terp, statePtr->
b140: 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 self, "-blocking
b150: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
b160: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
b170: 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 lBlocking));.
b180: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
b190: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 (&upperChannelTr
b1a0: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 anslation);.
b1b0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
b1c0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
b1d0: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f oding);. Tcl_
b1e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 DStringFree(&upp
b1f0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
b200: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
b210: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 ngFree(&upperCha
b220: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a nnelBlocking);..
b230: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 /*. * SS
b240: 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e L Initialization
b250: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 . */. sta
b260: 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c tePtr->ssl = SSL
b270: 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 _new(statePtr->c
b280: 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 tx);. if (!st
b290: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 atePtr->ssl) {..
b2a0: 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 /* SSL library e
b2b0: 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 rror */..Tcl_App
b2c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
b2d0: 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 , "couldn't cons
b2e0: 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f truct ssl sessio
b2f0: 6e 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 n: ", GET_ERR_RE
b300: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
b310: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 NULL);..Tcl_SetE
b320: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
b330: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
b340: 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 , "INIT", "FAILE
b350: 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c D", (char *)NULL
b360: 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 74 6c );..Tls_Free((tl
b370: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 73 74 s_free_type *)st
b380: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e atePtr);..return
b390: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
b3a0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f }.. /* Set ho
b3b0: 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a st server name *
b3c0: 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 /. if (server
b3d0: 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 name) {../* Sets
b3e0: 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 the server name
b3f0: 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 indication (SNI
b400: 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f ) in ClientHello
b410: 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f extension */../
b420: 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 * Per RFC 6066,
b430: 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 hostname is a AS
b440: 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 CII encoded stri
b450: 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 ng, though RFC 4
b460: 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 366 says UTF-8.
b470: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 */..if (!SSL_set
b480: 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d _tlsext_host_nam
b490: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c e(statePtr->ssl,
b4a0: 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 servername) &&
b4b0: 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 require) {..
b4c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
b4d0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 53 4e (interp, "Set SN
b4e0: 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c I extension fail
b4f0: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 ed: ", GET_ERR_R
b500: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
b510: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c )NULL);.. Tcl
b520: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
b530: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
b540: 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 PORT", "SNI", "F
b550: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
b560: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
b570: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 Free((tls_free_t
b580: 79 70 65 20 2a 29 73 74 61 74 65 50 74 72 29 3b ype *)statePtr);
b590: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b5a0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
b5b0: 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 Set hostname for
b5c0: 20 70 65 65 72 20 63 65 72 74 69 66 69 63 61 74 peer certificat
b5d0: 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 e hostname verif
b5e0: 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e ication in clien
b5f0: 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 ts... Don't us
b600: 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 e SSL_set1_host
b610: 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d since it has lim
b620: 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 itations. */..if
b630: 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 (!SSL_add1_host
b640: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
b650: 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 servername)) {..
b660: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
b670: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 sult(interp, "Se
b680: 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 66 t DNS hostname f
b690: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 ailed: ", GET_ER
b6a0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
b6b0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
b6c0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
b6d0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
b6e0: 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e "IMPORT", "HOSTN
b6f0: 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 AME", "FAILED",
b700: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 (char *)NULL);..
b710: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c Tls_Free((tl
b720: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 73 74 s_free_type *)st
b730: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
b740: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
b750: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
b760: 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 Resume session
b770: 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 id */. if (se
b780: 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c ssion_id && strl
b790: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c en(session_id) <
b7a0: 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 = SSL_MAX_SID_CT
b7b0: 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 X_LENGTH) {../*
b7c0: 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_set_session(
b7d0: 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 ) */..if (!SSL_S
b7e0: 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 ESSION_set1_id_c
b7f0: 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 ontext(SSL_get_s
b800: 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d ession(statePtr-
b810: 3e 73 73 6c 29 2c 0a 09 09 28 63 6f 6e 73 74 20 >ssl),...(const
b820: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
b830: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e session_id, (un
b840: 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c signed int) strl
b850: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 en(session_id)))
b860: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
b870: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b880: 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e "Resume session
b890: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f failed: ", GET_
b8a0: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
b8b0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 har *)NULL);..
b8c0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
b8d0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b8e0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 , "IMPORT", "SES
b8f0: 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c SION", "FAILED",
b900: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
b910: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 . Tls_Free((t
b920: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 73 ls_free_type *)s
b930: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
b940: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b950: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
b960: 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 * Enable Applica
b970: 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f tion-Layer Proto
b980: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e col Negotiation.
b990: 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 Examples are: h
b9a0: 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 ttp/1.0,..http/1
b9b0: 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c .1, h2, h3, ftp,
b9c0: 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 imap, pop3, xmp
b9d0: 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 p-client, xmpp-s
b9e0: 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 erver, mqtt, irc
b9f0: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 , etc. */. if
ba00: 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f (alpn) {../* Co
ba10: 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 nvert a TCL list
ba20: 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c into a protocol
ba30: 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f -list in wire-fo
ba40: 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 rmat */..unsigne
ba50: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 d char *protos,
ba60: 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e *p;..unsigned in
ba70: 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 t protos_len = 0
ba80: 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c ;..Tcl_Size cnt,
ba90: 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c i;..int j;..Tcl
baa0: 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 _Obj **list;...i
bab0: 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 f (Tcl_ListObjGe
bac0: 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 tElements(interp
bad0: 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c , alpn, &cnt, &l
bae0: 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ist) != TCL_OK)
baf0: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 {.. Tls_Free(
bb00: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a (tls_free_type *
bb10: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 )statePtr);..
bb20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
bb30: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 R;..}.../* Deter
bb40: 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 mine the memory
bb50: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 required for the
bb60: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a protocol-list *
bb70: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 /..for (i = 0; i
bb80: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 < cnt; i++) {..
bb90: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e Tcl_GetStrin
bba0: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d gFromObj(list[i]
bbb0: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 , &len);.. if
bbc0: 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 (len > 255) {..
bbd0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
bbe0: 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 t(interp, "ALPN
bbf0: 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 protocol names t
bc00: 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 oo long", (char
bc10: 2a 29 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 *)NULL);...Tcl_S
bc20: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
bc30: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
bc40: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 RT", "ALPN", "FA
bc50: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 4e ILED", (char *)N
bc60: 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 ULL);...Tls_Free
bc70: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 ((tls_free_type
bc80: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 *)statePtr);...r
bc90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
bca0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f .. }.. pro
bcb0: 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 tos_len += 1 + (
bcc0: 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f int) len;..}.../
bcd0: 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 * Build the comp
bce0: 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 lete protocol-li
bcf0: 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 st */..protos =
bd00: 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c ckalloc(protos_l
bd10: 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f en);../* protoco
bd20: 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 l-lists consist
bd30: 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d of 8-bit length-
bd40: 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 prefixed, byte s
bd50: 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 trings */..for (
bd60: 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f j = 0, p = proto
bd70: 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 s; j < cnt; j++)
bd80: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 {.. char *st
bd90: 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e r = Tcl_GetStrin
bda0: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d gFromObj(list[j]
bdb0: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 , &len);.. *p
bdc0: 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 ++ = (unsigned c
bdd0: 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d har) len;.. m
bde0: 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 emcpy(p, str, (s
bdf0: 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 ize_t) len);..
be00: 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a p += len;..}..
be10: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e ./* SSL_set_alpn
be20: 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 _protos makes a
be30: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 copy of the prot
be40: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a ocol-list */../*
be50: 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 Note: This func
be60: 74 69 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68 tion reverses th
be70: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 e return value c
be80: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 onvention */..if
be90: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 (SSL_set_alpn_p
bea0: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e rotos(statePtr->
beb0: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f ssl, protos, pro
bec0: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 tos_len)) {..
bed0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
bee0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 t(interp, "Set A
bef0: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 LPN protocols fa
bf00: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 iled: ", GET_ERR
bf10: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
bf20: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *)NULL);.. T
bf30: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
bf40: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
bf50: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c IMPORT", "ALPN",
bf60: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
bf70: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *)NULL);.. T
bf80: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 ls_Free((tls_fre
bf90: 65 5f 74 79 70 65 20 2a 29 73 74 61 74 65 50 74 e_type *)statePt
bfa0: 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 r);.. ckfree(
bfb0: 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 protos);.. re
bfc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
bfd0: 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 .}.../* Store pr
bfe0: 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a otocols list */.
bff0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
c000: 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 s = protos;..sta
c010: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
c020: 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a n = protos_len;.
c030: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 } else {..st
c040: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d atePtr->protos =
c050: 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 NULL;..statePtr
c060: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 ->protos_len = 0
c070: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
c080: 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 * SSL Callb
c090: 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 acks. */.
c0a0: 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 SSL_set_app_dat
c0b0: 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c a(statePtr->ssl,
c0c0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c0d0: 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 r);./* point bac
c0e0: 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 k to us */. S
c0f0: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 SL_set_verify(st
c100: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 atePtr->ssl, ver
c110: 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 ify, VerifyCallb
c120: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 ack);. SSL_se
c130: 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 t_info_callback(
c140: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 statePtr->ssl, I
c150: 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 nfoCallback);..
c160: 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 /* Callback f
c170: 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f or observing pro
c180: 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a tocol messages *
c190: 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 /.#ifndef OPENSS
c1a0: 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 L_NO_SSL_TRACE.
c1b0: 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 /* void SSL_C
c1c0: 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 TX_set_msg_callb
c1d0: 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 ack_arg(statePtr
c1e0: 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 ->ctx, (void *)s
c1f0: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f tatePtr);. vo
c200: 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d id SSL_CTX_set_m
c210: 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 sg_callback(stat
c220: 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 ePtr->ctx, Messa
c230: 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a geCallback); */.
c240: 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f SSL_set_msg_
c250: 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 callback_arg(sta
c260: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 tePtr->ssl, (voi
c270: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 d *)statePtr);.
c280: 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 SSL_set_msg_c
c290: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 allback(statePtr
c2a0: 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 ->ssl, MessageCa
c2b0: 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a llback);.#endif.
c2c0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 . /* Create T
c2d0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 cl_Channel BIO H
c2e0: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 andler */. st
c2f0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 atePtr->p_bio.=
c300: 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 BIO_new_tcl(stat
c310: 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 ePtr, BIO_NOCLOS
c320: 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 E);. statePtr
c330: 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 ->bio.= BIO_new(
c340: 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 BIO_f_ssl());..
c350: 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20 7b if (server) {
c360: 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c ../* Server call
c370: 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 backs */..SSL_CT
c380: 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 X_set_tlsext_ser
c390: 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 vername_arg(stat
c3a0: 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 ePtr->ctx, (void
c3b0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 *)statePtr);..S
c3c0: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 SL_CTX_set_tlsex
c3d0: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c t_servername_cal
c3e0: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e lback(statePtr->
c3f0: 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b ctx, SNICallback
c400: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
c410: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 client_hello_cb(
c420: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 statePtr->ctx, H
c430: 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 elloCallback, (v
c440: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
c450: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e ..if (statePtr->
c460: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 protos != NULL)
c470: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 {.. SSL_CTX_s
c480: 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 et_alpn_select_c
c490: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c b(statePtr->ctx,
c4a0: 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 ALPNCallback, (
c4b0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
c4c0: 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e ;.#ifdef USE_NPN
c4d0: 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 .. if (tls1_2
c4e0: 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 == 0 && tls1_3
c4f0: 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 == 0) {...SSL_CT
c500: 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f X_set_next_proto
c510: 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 s_advertised_cb(
c520: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e statePtr->ctx, N
c530: 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 PNCallback, (voi
c540: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 d *)statePtr);..
c550: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a }.#endif..}.
c560: 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 ../* Enable serv
c570: 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 er to send cert
c580: 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68 61 request after ha
c590: 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 ndshake (TLS 1.3
c5a0: 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 only) */../* A
c5b0: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 write operation
c5c0: 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 must take place
c5d0: 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 69 63 for the Certific
c5e0: 61 74 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 ate Request to b
c5f0: 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 e.. sent to th
c600: 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 e client, this c
c610: 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 an be done with
c620: 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 SSL_do_handshake
c630: 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 (). */..if (requ
c640: 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 est && post_hand
c650: 73 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 shake && tls1_3)
c660: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 {.. SSL_veri
c670: 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 fy_client_post_h
c680: 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 andshake(statePt
c690: 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a r->ssl);..}.../*
c6a0: 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63 set automatic c
c6b0: 75 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a urve selection *
c6c0: 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f /..SSL_set_ecdh_
c6d0: 61 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 auto(statePtr->s
c6e0: 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 sl, 1);.../* Set
c6f0: 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a server mode */.
c700: 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 .statePtr->flags
c710: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 |= TLS_TCL_SERV
c720: 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 ER;..SSL_set_acc
c730: 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 ept_state(stateP
c740: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 tr->ssl);. }
c750: 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e else {../* Clien
c760: 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 t callbacks */.#
c770: 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 ifdef USE_NPN..i
c780: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f f (statePtr->pro
c790: 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 tos != NULL && t
c7a0: 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c ls1_2 == 0 && tl
c7b0: 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 s1_3 == 0) {..
c7c0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 SSL_CTX_set_ne
c7d0: 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f xt_proto_select_
c7e0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 cb(statePtr->ctx
c7f0: 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 , ALPNCallback,
c800: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c810: 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f );..}.#endif.../
c820: 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e * Session cachin
c830: 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 g */..SSL_CTX_se
c840: 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f t_session_cache_
c850: 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 mode(statePtr->c
c860: 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 tx, SSL_SESS_CAC
c870: 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f HE_CLIENT | SSL_
c880: 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e SESS_CACHE_NO_IN
c890: 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 TERNAL_STORE);..
c8a0: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 SSL_CTX_sess_set
c8b0: 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 _new_cb(statePtr
c8c0: 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 ->ctx, SessionCa
c8d0: 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e llback);.../* En
c8e0: 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 able post handsh
c8f0: 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 ake Authenticati
c900: 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c on extension. TL
c910: 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 S 1.3 only, not
c920: 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 http/2. */..if (
c930: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f request && post_
c940: 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 handshake) {..
c950: 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 SSL_set_post_h
c960: 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 andshake_auth(st
c970: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b atePtr->ssl, 1);
c980: 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 ..}.../* Set cli
c990: 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c ent mode */..SSL
c9a0: 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 _set_connect_sta
c9b0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
c9c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c );. }. SSL
c9d0: 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 _set_bio(statePt
c9e0: 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 r->ssl, statePtr
c9f0: 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 ->p_bio, statePt
ca00: 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 r->p_bio);. B
ca10: 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 IO_set_ssl(state
ca20: 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 Ptr->bio, stateP
ca30: 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 tr->ssl, BIO_NOC
ca40: 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 LOSE);.. /*.
ca50: 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c * End of SSL
ca60: 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 Init. */.
ca70: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 dprintf("Retur
ca80: 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 ning %s", Tcl_Ge
ca90: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
caa0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 tePtr->self));.
cab0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
cac0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a (interp, (char *
cad0: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e )Tcl_GetChannelN
cae0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
caf0: 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c lf), TCL_VOLATIL
cb00: 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 E);. return T
cb10: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
cb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb60: 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f ---. *. * Unimpo
cb70: 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 rtObjCmd --. *.
cb80: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
cb90: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 is invoked to r
cba0: 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 emove the topmos
cbb0: 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 t channel filter
cbc0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
cbd0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
cbe0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
cbf0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
cc00: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 *.May modify the
cc10: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 behavior of an
cc20: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 IO channel.. *.
cc30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
cc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc70: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
cc80: 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a int.UnimportObj
cc90: 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 Cmd(. TCL_UNU
cca0: 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 SED(void *),.
ccb0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
ccc0: 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a erp,. int obj
ccd0: 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a c,. Tcl_Obj *
cce0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a const objv[]).{.
ccf0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
cd00: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
cd10: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
cd20: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 ode on. */..
cd30: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
cd40: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
cd50: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 != 2) {..Tcl_Wr
cd60: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
cd70: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
cd80: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 nnel");..return
cd90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
cda0: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
cdb0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
cdc0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
cdd0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c g(objv[1]), NULL
cde0: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
cdf0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
ce00: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
ce10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
ce20: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 }.. /* Make s
ce30: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
ce40: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
ce50: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
ce60: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
ce70: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 annel(chan);..
ce80: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
ce90: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
cea0: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
ceb0: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 e()) {..Tcl_Appe
cec0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ced0: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
cee0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
cef0: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 lName(chan),..."
cf00: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
cf10: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 annel", (char *)
cf20: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 NULL);..Tcl_SetE
cf30: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
cf40: 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 "TLS", "UNIMPOR
cf50: 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 T", "CHANNEL", "
cf60: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
cf70: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e *)NULL);..return
cf80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
cf90: 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 }.. if (Tcl_U
cfa0: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e nstackChannel(in
cfb0: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 terp, chan) == T
cfc0: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 CL_ERROR) {..ret
cfd0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
cfe0: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e }.. return
cff0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
d000: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
d010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d040: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f -----. *. * CTX_
d050: 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 Init -- construc
d060: 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 t a SSL_CTX inst
d070: 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ance. *. * Resul
d080: 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 ts:. *.A valid S
d090: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 SL_CTX instance
d0a0: 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 or NULL.. *. * S
d0b0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
d0c0: 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 constructs SSL c
d0d0: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a ontext (CTX). *.
d0e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
d0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d120: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
d130: 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f c SSL_CTX *.CTX_
d140: 49 6e 69 74 28 0a 20 20 20 20 53 74 61 74 65 20 Init(. State
d150: 2a 73 74 61 74 65 50 74 72 2c 0a 20 20 20 20 69 *statePtr,. i
d160: 6e 74 20 69 73 53 65 72 76 65 72 2c 0a 20 20 20 nt isServer,.
d170: 20 69 6e 74 20 70 72 6f 74 6f 2c 0a 20 20 20 20 int proto,.
d180: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 0a 20 char *keyfile,.
d190: 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c char *certfil
d1a0: 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 e,. unsigned
d1b0: 63 68 61 72 20 2a 6b 65 79 2c 0a 20 20 20 20 75 char *key,. u
d1c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
d1d0: 72 74 2c 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f rt,. int key_
d1e0: 6c 65 6e 2c 0a 20 20 20 20 69 6e 74 20 63 65 72 len,. int cer
d1f0: 74 5f 6c 65 6e 2c 0a 20 20 20 20 63 68 61 72 20 t_len,. char
d200: 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 63 68 61 *CApath,. cha
d210: 72 20 2a 43 41 66 69 6c 65 2c 0a 20 20 20 20 63 r *CAfile,. c
d220: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 0a 20 20 har *ciphers,.
d230: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 char *ciphersu
d240: 69 74 65 73 2c 0a 20 20 20 20 69 6e 74 20 6c 65 ites,. int le
d250: 76 65 6c 2c 0a 20 20 20 20 63 68 61 72 20 2a 44 vel,. char *D
d260: 48 70 61 72 61 6d 73 29 0a 7b 0a 20 20 20 20 54 Hparams).{. T
d270: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
d280: 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p = statePtr->in
d290: 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 terp;. SSL_CT
d2a0: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 X *ctx = NULL;.
d2b0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 Tcl_DString d
d2c0: 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d s;. int off =
d2d0: 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20 0, abort = 0;.
d2e0: 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 int load_priv
d2f0: 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e ate_key;. con
d300: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d st SSL_METHOD *m
d310: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 ethod;.. dpri
d320: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
d330: 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 if (!proto)
d340: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
d350: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 ult(interp, "no
d360: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 valid protocol s
d370: 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20 elected", (char
d380: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e *)NULL);..return
d390: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
d3a0: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 /* create SSL
d3b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f context */.#if O
d3c0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
d3d0: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 UMBER >= 0x10100
d3e0: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 000L || defined(
d3f0: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 NO_SSL2) || defi
d400: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
d410: 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 SL2). if (ENA
d420: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
d430: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 PROTO_SSL2)) {..
d440: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d450: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 (interp, "SSL2 p
d460: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
d470: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
d480: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d490: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
d4a0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
d4b0: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
d4c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
d4d0: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 3). if (ENABL
d4e0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d4f0: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 OTO_SSL3)) {..Tc
d500: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d510: 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f nterp, "SSL3 pro
d520: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
d530: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 ted", (char *)NU
d540: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
d550: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
d560: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
d570: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
d580: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
d590: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
d5a0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d5b0: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f O_TLS1)) {..Tcl_
d5c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d5d0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 erp, "TLS 1.0 pr
d5e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d5f0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e rted", (char *)N
d600: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
d610: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
d620: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
d630: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
d640: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d650: 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e S1_1). if (EN
d660: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
d670: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 _PROTO_TLS1_1))
d680: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
d690: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
d6a0: 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.1 protocol no
d6b0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 t supported", (c
d6c0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 har *)NULL);..re
d6d0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
d6e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
d6f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c ned(NO_TLS1_2) |
d700: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
d710: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 L_NO_TLS1_2).
d720: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
d730: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
d740: 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 S1_2)) {..Tcl_Ap
d750: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
d760: 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 p, "TLS 1.2 prot
d770: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
d780: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c ed", (char *)NUL
d790: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
d7a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
d7b0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
d7c0: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
d7d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d7e0: 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _3). if (ENAB
d7f0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
d800: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a ROTO_TLS1_3)) {.
d810: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
d820: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
d830: 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .3 protocol not
d840: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
d850: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 r *)NULL);..retu
d860: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
d870: 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72 endif. if (pr
d880: 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 oto == 0) {../*
d890: 55 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a Use full range *
d8a0: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d /..SSL_CTX_set_m
d8b0: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e in_proto_version
d8c0: 28 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 (ctx, 0);..SSL_C
d8d0: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f TX_set_max_proto
d8e0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 _version(ctx, 0)
d8f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 ;. }.. swi
d900: 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 tch (proto) {.#i
d910: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
d920: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 N_NUMBER < 0x101
d930: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 00000L && !defin
d940: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
d950: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d960: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 NO_SSL2). cas
d970: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 e TLS_PROTO_SSL2
d980: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 :..method = isSe
d990: 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 rver ? SSLv2_ser
d9a0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 ver_method() : S
d9b0: 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 SLv2_client_meth
d9c0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
d9d0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
d9e0: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 d(NO_SSL3) && !d
d9f0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
da00: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
da10: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
da20: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 SL3_METHOD).
da30: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 case TLS_PROTO_S
da40: 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 SL3:..method = i
da50: 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f sServer ? SSLv3_
da60: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
da70: 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d : SSLv3_client_m
da80: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
da90: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
daa0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 ined(NO_TLS1) &&
dab0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
dac0: 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 L_NO_TLS1) && !d
dad0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
dae0: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 O_TLS1_METHOD).
daf0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
db00: 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 O_TLS1:..method
db10: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
db20: 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 v1_server_method
db30: 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e () : TLSv1_clien
db40: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
db50: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
db60: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
db70: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
db80: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
db90: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dba0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f ENSSL_NO_TLS1_1_
dbb0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
dbc0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
dbd0: 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 1:..method = isS
dbe0: 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f erver ? TLSv1_1_
dbf0: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
dc00: 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 : TLSv1_1_client
dc10: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
dc20: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
dc30: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
dc40: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dc50: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
dc60: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
dc70: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d NSSL_NO_TLS1_2_M
dc80: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 ETHOD). case
dc90: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 TLS_PROTO_TLS1_2
dca0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 :..method = isSe
dcb0: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 rver ? TLSv1_2_s
dcc0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
dcd0: 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f TLSv1_2_client_
dce0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
dcf0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
dd00: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
dd10: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
dd20: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
dd30: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
dd40: 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 TO_TLS1_3:../* U
dd50: 73 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d se the generic m
dd60: 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 ethod and constr
dd70: 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 aint range after
dd80: 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 context is crea
dd90: 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d ted */..method =
dda0: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f isServer ? TLS_
ddb0: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
ddc0: 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 : TLS_client_met
ddd0: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
dde0: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c endif. defaul
ddf0: 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 t:../* Negotiate
de00: 20 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 highest availab
de10: 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 le SSL/TLS versi
de20: 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 on */..method =
de30: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 isServer ? TLS_s
de40: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
de50: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 TLS_client_meth
de60: 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 od();.#if OPENSS
de70: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
de80: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 < 0x10100000L &
de90: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 & !defined(NO_SS
dea0: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L2) && !defined(
deb0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
dec0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
ded0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
dee0: 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a TO_SSL2) ? 0 :
def0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 SSL_OP_NO_SSLv2
df00: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
df10: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
df20: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
df30: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 SSL_NO_SSL3)..of
df40: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
df50: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 oto, TLS_PROTO_S
df60: 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c SL3) ? 0 : SSL
df70: 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 _OP_NO_SSLv3);.#
df80: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
df90: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 ed(NO_TLS1) && !
dfa0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
dfb0: 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d NO_TLS1)..off |=
dfc0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
dfd0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 TLS_PROTO_TLS1)
dfe0: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f ? 0 : SSL_OP_
dff0: 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 NO_TLSv1);.#endi
e000: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
e010: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 O_TLS1_1) && !de
e020: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e030: 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d _TLS1_1)..off |=
e040: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
e050: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
e060: 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 1) ? 0 : SSL_OP_
e070: 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e NO_TLSv1_1);.#en
e080: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e090: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 (NO_TLS1_2) && !
e0a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e0b0: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 NO_TLS1_2)..off
e0c0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
e0d0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
e0e0: 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 1_2) ? 0 : SSL_O
e0f0: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 P_NO_TLSv1_2);.#
e100: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
e110: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 ed(NO_TLS1_3) &&
e120: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
e130: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 L_NO_TLS1_3)..of
e140: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
e150: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
e160: 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c LS1_3) ? 0 : SSL
e170: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b _OP_NO_TLSv1_3);
e180: 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a .#endif..break;.
e190: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 }.. ERR_c
e1a0: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 lear_error();..
e1b0: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
e1c0: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 _new(method);.
e1d0: 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 if (!ctx) {..r
e1e0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
e1f0: 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e }.. if (geten
e200: 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 v(SSLKEYLOGFILE)
e210: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 ) {..SSL_CTX_set
e220: 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b _keylog_callback
e230: 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c (ctx, KeyLogCall
e240: 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 back);. }..#i
e250: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
e260: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
e270: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e280: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 1_3). if (pro
e290: 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f to == TLS_PROTO_
e2a0: 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 TLS1_3) {..SSL_C
e2b0: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f TX_set_min_proto
e2c0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
e2d0: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 S1_3_VERSION);..
e2e0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f SSL_CTX_set_max_
e2f0: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
e300: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f x, TLS1_3_VERSIO
e310: 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 N);. }.#endif
e320: 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 .. /* Force c
e330: 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 ipher selection
e340: 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20 order by server
e350: 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 */. if (!isSe
e360: 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 rver) {..SSL_CTX
e370: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 _set_options(ctx
e380: 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f , SSL_OP_CIPHER_
e390: 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 SERVER_PREFERENC
e3a0: 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f E);. }..#if O
e3b0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
e3c0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
e3d0: 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 00L. OpenSSL_
e3e0: 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 add_all_algorith
e3f0: 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 ms(); /* Load ci
e400: 70 68 65 72 73 20 61 6e 64 20 64 69 67 65 73 74 phers and digest
e410: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 s */.#endif..
e420: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 SSL_CTX_set_app
e430: 5f 64 61 74 61 28 63 74 78 2c 20 69 6e 74 65 72 _data(ctx, inter
e440: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 p);./* remember
e450: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
e460: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
e470: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
e480: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 SSL_OP_ALL);./*
e490: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b all SSL bug work
e4a0: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 arounds */. S
e4b0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
e4c0: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e ns(ctx, SSL_OP_N
e4d0: 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 O_COMPRESSION);.
e4e0: 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 /* disable compr
e4f0: 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 ession even if s
e500: 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 upported */.
e510: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
e520: 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 ons(ctx, off);..
e530: 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f /* disable proto
e540: 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a col versions */.
e550: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
e560: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
e570: 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 0101000L. SSL
e580: 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 _CTX_set_mode(ct
e590: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f x, SSL_MODE_AUTO
e5a0: 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 _RETRY);./* hand
e5b0: 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 le new handshake
e5c0: 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e s in background.
e5d0: 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 On by default i
e5e0: 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e n OpenSSL 1.1.1.
e5f0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 */.#endif. S
e600: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f SL_CTX_sess_set_
e610: 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 cache_size(ctx,
e620: 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 128);.. /* Se
e630: 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 t user defined c
e640: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 iphers, cipher s
e650: 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 uites, and secur
e660: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 ity level */.
e670: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d if ((ciphers !=
e680: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 NULL) && !SSL_C
e690: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 TX_set_cipher_li
e6a0: 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 st(ctx, ciphers)
e6b0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
e6c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
e6d0: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 et ciphers faile
e6e0: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 d: No valid ciph
e6f0: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 ers", (char *)NU
e700: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
e710: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
e720: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
e730: 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74 if ((ciphersuit
e740: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 es != NULL) && !
e750: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 SSL_CTX_set_ciph
e760: 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 ersuites(ctx, ci
e770: 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 phersuites)) {..
e780: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
e790: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 (interp, "Set ci
e7a0: 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c pher suites fail
e7b0: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 ed: No valid cip
e7c0: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 4e hers", (char *)N
e7d0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
e7e0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
e7f0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 n NULL;. }..
e800: 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 /* Set securi
e810: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 ty level */.
e820: 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 if (level > -1 &
e830: 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 & level < 6) {..
e840: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 /* SSL_set_secur
e850: 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 ity_level */..SS
e860: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 L_CTX_set_securi
e870: 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 ty_level(ctx, le
e880: 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 vel);. }..
e890: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c /* set some cal
e8a0: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 lbacks */. SS
e8b0: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
e8c0: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c t_passwd_cb(ctx,
e8d0: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 PasswordCallbac
e8e0: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f k);. SSL_CTX_
e8f0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 set_default_pass
e900: 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 wd_cb_userdata(c
e910: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
e920: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 ePtr);.. /* r
e930: 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c ead a Diffie-Hel
e940: 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 lman parameters
e950: 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 file, or use the
e960: 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f built-in one */
e970: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
e980: 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 66 64 65 Init(&ds);.#ifde
e990: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a f OPENSSL_NO_DH.
e9a0: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 if (DHparams
e9b0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c != NULL) {..Tcl
e9c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e9d0: 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65 terp, "DH parame
e9e0: 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 ter support not
e9f0: 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 available", (cha
ea00: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f r *)NULL);..SSL_
ea10: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
ea20: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
ea30: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 }.#else. {..
ea40: 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 DH* dh;..if (DHp
ea50: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b arams != NULL) {
ea60: 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a .. BIO *bio;.
ea70: 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f .. bio = BIO_
ea80: 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 new_file(F2N(DHp
ea90: 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 arams, &ds), "r"
eaa0: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f );.. if (!bio
eab0: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
eac0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 gFree(&ds);...Tc
ead0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
eae0: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f nterp, "Could no
eaf0: 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 t find DH parame
eb00: 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 ters file", (cha
eb10: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c r *)NULL);...SSL
eb20: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
eb30: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
eb40: 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d }... dh =
eb50: 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 PEM_read_bio_DH
eb60: 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c params(bio, NULL
eb70: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 , NULL, NULL);..
eb80: 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f BIO_free(bio
eb90: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 );.. Tcl_DStr
eba0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
ebb0: 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 if (!dh) {...
ebc0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
ebd0: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 (interp, "Could
ebe0: 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 not read DH para
ebf0: 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 meters from file
ec00: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
ec10: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
ec20: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
ec30: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 NULL;.. }..
ec40: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d SSL_CTX_set_tm
ec50: 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 p_dh(ctx, dh);..
ec60: 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 29 3b DH_free(dh);
ec70: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
ec80: 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 /* Use well know
ec90: 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 n DH parameters
eca0: 74 68 61 74 20 68 61 76 65 20 62 75 69 6c 74 2d that have built-
ecb0: 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 4f 70 in support in Op
ecc0: 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66 enSSL */.. if
ecd0: 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 (!SSL_CTX_set_d
ece0: 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 29 20 h_auto(ctx, 1))
ecf0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
ed00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f sult(interp, "Co
ed10: 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73 uld not enable s
ed20: 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c 20 47 et DH auto: ", G
ed30: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
ed40: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
ed50: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
ed60: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
ed70: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 LL;.. }..}.
ed80: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
ed90: 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 /* set our certi
eda0: 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f ficate */. lo
edb0: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
edc0: 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 0;. if (cert
edd0: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
ede0: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 .load_private_ke
edf0: 79 20 3d 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c y = 1;...if (SSL
ee00: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 _CTX_use_certifi
ee10: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 cate_file(ctx, F
ee20: 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 2N(certfile, &ds
ee30: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ), SSL_FILETYPE_
ee40: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 PEM) <= 0) {..
ee50: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
ee60: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c e(&ds);.. Tcl
ee70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
ee80: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
ee90: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 set certificate
eea0: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c file ", certfil
eeb0: 65 2c 20 22 3a 20 22 2c 0a 09 09 20 20 20 20 47 e, ": ",... G
eec0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
eed0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
eee0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
eef0: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
ef00: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 urn NULL;..}..Tc
ef10: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
ef20: 73 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 s);.. } else
ef30: 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c if (cert != NULL
ef40: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 ) {..load_privat
ef50: 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 e_key = 1;..if (
ef60: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 SSL_CTX_use_cert
ef70: 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 ificate_ASN1(ctx
ef80: 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 , cert_len, cert
ef90: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) <= 0) {.. T
efa0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
efb0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
efc0: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 to set certifica
efd0: 74 65 3a 20 22 2c 0a 09 09 20 20 20 20 47 45 54 te: ",... GET
efe0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
eff0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 char *)NULL);..
f000: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
f010: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ctx);.. retur
f020: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d n NULL;..}. }
f030: 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c else {..certfil
f040: 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f e = (char*)X509_
f050: 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 get_default_cert
f060: 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 _file();...if (S
f070: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 SL_CTX_use_certi
f080: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c ficate_file(ctx,
f090: 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 certfile, SSL_F
f0a0: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 ILETYPE_PEM) <=
f0b0: 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 0) {.#if 0..
f0c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
f0d0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
f0e0: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 to use default
f0f0: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 certificate file
f100: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a ", certfile, ":
f110: 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 ",... GET_ER
f120: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
f130: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
f140: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
f150: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
f160: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 ULL;.#endif..}.
f170: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 }.. /* set
f180: 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 our private key
f190: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 */. if (load
f1a0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a _private_key) {.
f1b0: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 .if (keyfile ==
f1c0: 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e NULL && key == N
f1d0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 ULL) {.. keyf
f1e0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
f1f0: 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 .}...if (keyfile
f200: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
f210: 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 /* get the priv
f220: 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 ate key associat
f230: 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 ed with this cer
f240: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
f250: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 if (keyfile ==
f260: 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c NULL) {...keyfil
f270: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 e = certfile;..
f280: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 }... if (S
f290: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 SL_CTX_use_Priva
f2a0: 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 teKey_file(ctx,
f2b0: 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 F2N(keyfile, &ds
f2c0: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ), SSL_FILETYPE_
f2d0: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 PEM) <= 0) {...T
f2e0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
f2f0: 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 ds);.../* flush
f300: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 the passphrase w
f310: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 hich might be le
f320: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 ft in the result
f330: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 */...Tcl_SetRes
f340: 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c ult(interp, NULL
f350: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 , TCL_STATIC);..
f360: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
f370: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
f380: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 e to set public
f390: 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 key file ", keyf
f3a0: 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 47 45 54 ile, " ",....GET
f3b0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
f3c0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 char *)NULL);...
f3d0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
f3e0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
f3f0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
f400: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
f410: 73 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 s);..} else if (
f420: 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 key != NULL) {..
f430: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f if (SSL_CTX_
f440: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 use_PrivateKey_A
f450: 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 SN1(EVP_PKEY_RSA
f460: 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c , ctx, key,key_l
f470: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a en) <= 0) {.../*
f480: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
f490: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
f4a0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
f4b0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
f4c0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
f4d0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
f4e0: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
f4f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
f500: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
f510: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 public key: ", G
f520: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
f530: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
f540: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
f550: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
f560: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f LL;.. }..}../
f570: 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 * Now we know th
f580: 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 at a key and cer
f590: 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 t have been set
f5a0: 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 against.. * the
f5b0: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 SSL context */..
f5c0: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 if (!SSL_CTX_che
f5d0: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 ck_private_key(c
f5e0: 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f tx)) {.. Tcl_
f5f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f600: 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 erp, "private ke
f610: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 y does not match
f620: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
f630: 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 public key",...
f640: 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 4e 55 . (char *)NU
f650: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
f660: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
f670: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 return NULL;..
f680: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
f690: 53 65 74 20 74 6f 20 75 73 65 20 64 65 66 61 75 Set to use defau
f6a0: 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 lt location and
f6b0: 66 69 6c 65 20 66 6f 72 20 43 65 72 74 69 66 69 file for Certifi
f6c0: 63 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 cate Authority (
f6d0: 43 41 29 20 63 65 72 74 69 66 69 63 61 74 65 73 CA) certificates
f6e0: 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 76 65 72 . The. * ver
f6f0: 69 66 79 20 70 61 74 68 20 61 6e 64 20 73 74 6f ify path and sto
f700: 72 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 re can be overri
f710: 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f dden by the SSL_
f720: 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 CERT_DIR env var
f730: 2e 20 54 68 65 20 76 65 72 69 66 79 20 66 69 6c . The verify fil
f740: 65 20 63 61 6e 0a 20 20 20 20 20 2a 20 62 65 20 e can. * be
f750: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 overridden by th
f760: 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 e SSL_CERT_FILE
f770: 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20 20 20 20 env var. */.
f780: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 if (!SSL_CTX_set
f790: 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f _default_verify_
f7a0: 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 09 61 paths(ctx)) {..a
f7b0: 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 bort++;. }..
f7c0: 20 20 20 2f 2a 20 4f 76 65 72 72 69 64 65 73 20 /* Overrides
f7d0: 66 6f 72 20 74 68 65 20 43 41 20 76 65 72 69 66 for the CA verif
f7e0: 79 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 y path and file
f7f0: 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 20 4f 50 45 */. {.#if OPE
f800: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
f810: 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
f820: 4c 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 3d L..if (CApath !=
f830: 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69 6c 65 20 NULL || CAfile
f840: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
f850: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b Tcl_DString ds1;
f860: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
f870: 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 0a 09 20 gInit(&ds1);...
f880: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f if (!SSL_CTX_
f890: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 load_verify_loca
f8a0: 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 tions(ctx, F2N(C
f8b0: 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e Afile, &ds), F2N
f8c0: 28 43 41 70 61 74 68 2c 20 26 64 73 31 29 29 29 (CApath, &ds1)))
f8d0: 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 {...abort++;..
f8e0: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
f8f0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
f900: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
f910: 46 72 65 65 28 26 64 73 31 29 3b 0a 0a 09 20 20 Free(&ds1);...
f920: 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 /* Set list of
f930: 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 CAs to send to
f940: 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 client when requ
f950: 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 esting a client
f960: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
f970: 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 /* https://s
f980: 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 ourceforge.net/p
f990: 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f /tls/bugs/57/ */
f9a0: 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 .. /* XXX:TOD
f9b0: 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 O: Let the user
f9c0: 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 supply values he
f9d0: 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f re instead of so
f9e0: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 mething that exi
f9f0: 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 sts on the files
fa00: 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20 20 53 54 ystem */.. ST
fa10: 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 ACK_OF(X509_NAME
fa20: 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 ) *certNames = S
fa30: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 SL_load_client_C
fa40: 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c A_file(F2N(CAfil
fa50: 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69 e, &ds));.. i
fa60: 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 f (certNames !=
fa70: 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 NULL) {...SSL_CT
fa80: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f X_set_client_CA_
fa90: 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 list(ctx, certNa
faa0: 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 mes);.. }..
fab0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
fac0: 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73 e(&ds);..}..#els
fad0: 65 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 3d e..if (CApath !=
fae0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 NULL) {.. if
faf0: 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f (!SSL_CTX_load_
fb00: 76 65 72 69 66 79 5f 64 69 72 28 63 74 78 2c 20 verify_dir(ctx,
fb10: 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 29 F2N(CApath, &ds)
fb20: 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a )) {...abort++;.
fb30: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f . }.. Tcl_
fb40: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
fb50: 3b 0a 09 7d 0a 09 69 66 20 28 43 41 66 69 6c 65 ;..}..if (CAfile
fb60: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
fb70: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f if (!SSL_CTX_lo
fb80: 61 64 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 63 ad_verify_file(c
fb90: 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 tx, F2N(CAfile,
fba0: 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 &ds))) {...abort
fbb0: 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ++;.. }..
fbc0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
fbd0: 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 &ds);... /* S
fbe0: 65 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 et list of CAs t
fbf0: 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 o send to client
fc00: 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 when requesting
fc10: 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 a client certif
fc20: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 53 54 icate */.. ST
fc30: 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 ACK_OF(X509_NAME
fc40: 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 ) *certNames = S
fc50: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 SL_load_client_C
fc60: 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c A_file(F2N(CAfil
fc70: 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69 e, &ds));.. i
fc80: 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 f (certNames !=
fc90: 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 NULL) {...SSL_CT
fca0: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f X_set_client_CA_
fcb0: 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 list(ctx, certNa
fcc0: 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 mes);.. }..
fcd0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
fce0: 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65 6e 64 69 e(&ds);..}.#endi
fcf0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 f. }.. ret
fd00: 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a urn ctx;.}.../*.
fd10: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
fd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd50: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 -----. *. * Stat
fd60: 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 usObjCmd -- retu
fd70: 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66 rn certificate f
fd80: 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 or connected pee
fd90: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
fda0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
fdb0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
fdc0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
fdd0: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
fde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe20: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
fe30: 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 0a 20 .StatusObjCmd(.
fe40: 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f TCL_UNUSED(vo
fe50: 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 id *),. Tcl_I
fe60: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 nterp *interp,.
fe70: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 int objc,.
fe80: 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e 73 74 20 Tcl_Obj.*const
fe90: 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 53 74 objv[]).{. St
fea0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 ate *statePtr;.
feb0: 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 X509 *peer;.
fec0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
fed0: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e tr;. Tcl_Chan
fee0: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 nel chan;. ch
fef0: 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c ar *channelName,
ff00: 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 *ciphers;. i
ff10: 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e nt mode;. con
ff20: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
ff30: 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 *proto;. uns
ff40: 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 igned int len;.
ff50: 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b int nid, res;
ff60: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
ff70: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
ff80: 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 (objc < 2 || ob
ff90: 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 jc > 3 || (objc
ffa0: 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 == 3 && !strcmp(
ffb0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
ffc0: 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 jv[1]), "-local"
ffd0: 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 ))) {..Tcl_Wrong
ffe0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
fff0: 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 1, objv, "?-loca
10000 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 l? channel");..r
10010 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
10020 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 . }.. /* G
10030 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f et channel Id */
10040 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 . channelName
10050 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
10060 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 (objv[(objc == 2
10070 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20 ? 1 : 2)]);.
10080 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
10090 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 hannel(interp, c
100a0 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 hannelName, &mod
100b0 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e e);. if (chan
100c0 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
100d0 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
100e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
100f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
10100 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
10110 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
10120 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
10130 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
10140 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 hannel(chan);.
10150 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
10160 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
10170 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
10180 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 e()) {..Tcl_Appe
10190 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
101a0 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
101b0 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
101c0 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 lName(chan),..."
101d0 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
101e0 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 annel", (char *)
101f0 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 NULL);..Tcl_SetE
10200 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
10210 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 "TLS", "STATUS"
10220 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e , "CHANNEL", "IN
10230 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 VALID", (char *)
10240 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
10250 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
10260 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
10270 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 State *) Tcl_Get
10280 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
10290 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 ata(chan);..
102a0 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61 /* Get certifica
102b0 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 te for peer or s
102c0 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f elf */. if (o
102d0 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 bjc == 2) {..pee
102e0 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 r = SSL_get_peer
102f0 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 _certificate(sta
10300 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
10310 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 } else {..peer
10320 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 = SSL_get_certif
10330 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e icate(statePtr->
10340 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ssl);. }.
10350 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74 /* Get X509 cert
10360 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a ificate info */.
10370 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a if (peer) {.
10380 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 .objPtr = Tls_Ne
10390 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c wX509Obj(interp,
103a0 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a peer);..if (obj
103b0 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 c == 2) {.. X
103c0 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 509_free(peer);.
103d0 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c . peer = NULL
103e0 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
103f0 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f {..objPtr = Tcl_
10400 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
10410 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 LL);. }..
10420 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a /* Peer name */.
10430 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
10440 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10450 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f "peername", SSL_
10460 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 get0_peername(st
10470 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 atePtr->ssl), -1
10480 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 );. LAPPEND_I
10490 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
104a0 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f r, "sbits", SSL_
104b0 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 get_cipher_bits(
104c0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e statePtr->ssl, N
104d0 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 ULL));.. ciph
104e0 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c ers = (char*)SSL
104f0 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 _get_cipher(stat
10500 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
10510 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
10520 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
10530 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d her", ciphers, -
10540 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 1);.. /* Veri
10550 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 fy the X509 cert
10560 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 ificate presente
10570 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f d by the peer */
10580 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
10590 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
105a0 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c "verifyResult",
105b0 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 ..X509_verify_ce
105c0 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
105d0 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
105e0 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
105f0 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 ssl)), -1);..
10600 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 /* Verify mode
10610 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 */. mode = SS
10620 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 L_get_verify_mod
10630 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
10640 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 ;. if (mode &
10650 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e & SSL_VERIFY_NON
10660 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 E) {..LAPPEND_ST
10670 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
10680 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 , "verifyMode",
10690 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 "none", -1);.
106a0 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f } else {..Tcl_O
106b0 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d bj *listObjPtr =
106c0 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
106d0 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 0, NULL);..if (m
106e0 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
106f0 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 Y_PEER) {.. T
10700 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
10710 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
10720 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f listObjPtr, Tcl_
10730 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 NewStringObj("pe
10740 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 er", -1));..}..i
10750 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 f (mode && SSL_V
10760 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f ERIFY_FAIL_IF_NO
10770 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 _PEER_CERT) {..
10780 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
10790 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
107a0 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
107b0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
107c0 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 ("fail if no pee
107d0 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 r cert", -1));..
107e0 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 }..if (mode && S
107f0 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 SL_VERIFY_CLIENT
10800 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 _ONCE) {.. Tc
10810 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10820 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
10830 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e istObjPtr, Tcl_N
10840 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 ewStringObj("cli
10850 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b ent once", -1));
10860 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 ..}..if (mode &&
10870 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 SSL_VERIFY_POST
10880 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 _HANDSHAKE) {..
10890 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
108a0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
108b0 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
108c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
108d0 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 ("post handshake
108e0 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 ", -1));..}..LAP
108f0 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c PEND_OBJ(interp,
10900 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 objPtr, "verify
10910 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 Mode", listObjPt
10920 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a r). }.. /*
10930 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 Verify mode dep
10940 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e th */. LAPPEN
10950 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
10960 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 jPtr, "verifyDep
10970 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 th", SSL_get_ver
10980 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 ify_depth(stateP
10990 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 tr->ssl));..
109a0 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
109b0 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
109c0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
109d0 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a he negotiation *
109e0 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 /. SSL_get0_a
109f0 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 lpn_selected(sta
10a00 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f tePtr->ssl, &pro
10a10 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c to, &len);. L
10a20 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10a30 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e p, objPtr, "alpn
10a40 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f ", (char *)proto
10a50 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
10a60 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 );. LAPPEND_S
10a70 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10a80 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 r, "protocol", S
10a90 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 SL_get_version(s
10aa0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d tatePtr->ssl), -
10ab0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 1);.. /* Vali
10ac0 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 d for non-RSA si
10ad0 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 gnature and TLS
10ae0 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 1.3 */. if (o
10af0 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 bjc == 2) {..res
10b00 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f = SSL_get_peer_
10b10 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 signature_nid(st
10b20 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
10b30 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b d);. } else {
10b40 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
10b50 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 signature_nid(st
10b60 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
10b70 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 d);. }. if
10b80 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 (!res) {nid = 0
10b90 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 ;}. LAPPEND_S
10ba0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10bb0 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 r, "signatureHas
10bc0 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a hAlgorithm", OBJ
10bd0 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 _nid2ln(nid), -1
10be0 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
10bf0 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 == 2) {..res =
10c00 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 SSL_get_peer_sig
10c10 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 nature_type_nid(
10c20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
10c30 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 nid);. } else
10c40 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 {..res = SSL_ge
10c50 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 t_signature_type
10c60 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 _nid(statePtr->s
10c70 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d sl, &nid);. }
10c80 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b . if (!res) {
10c90 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 nid = 0;}. LA
10ca0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
10cb0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 , objPtr, "signa
10cc0 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e tureType", OBJ_n
10cd0 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b id2ln(nid), -1);
10ce0 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
10cf0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
10d00 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
10d10 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
10d20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
10d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d60 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f -------. *. * Co
10d70 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
10d80 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e md -- return con
10d90 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f nection info fro
10da0 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a m OpenSSL.. *. *
10db0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c Results:. *.A l
10dc0 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f ist of connectio
10dd0 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d n info. *. *---
10de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e20 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
10e30 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f ConnectionInfoO
10e40 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 bjCmd(. TCL_U
10e50 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 NUSED(void *),.
10e60 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
10e70 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f nterp,. int o
10e80 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a bjc,. Tcl_Obj
10e90 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a *const objv[]).
10ea0 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
10eb0 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
10ec0 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
10ed0 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 mode on */.
10ee0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
10ef0 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 ../* client stat
10f00 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 e for ssl socket
10f10 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
10f20 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 *objPtr, *listPt
10f30 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c r;. const SSL
10f40 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 *ssl;. const
10f50 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 SSL_CIPHER *cip
10f60 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 her;. const S
10f70 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 SL_SESSION *sess
10f80 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 ion;. const E
10f90 56 50 5f 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 VP_MD *md;..
10fa0 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b if (objc != 2) {
10fb0 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
10fc0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
10fd0 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a jv, "channel");.
10fe0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
10ff0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 R;. }.. ch
11000 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
11010 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
11020 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 GetString(objv[1
11030 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 ]), NULL);. i
11040 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
11050 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
11060 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
11070 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
11080 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
11090 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
110a0 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
110b0 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
110c0 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
110d0 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
110e0 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
110f0 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
11100 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
11110 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
11120 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
11130 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
11140 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
11150 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f n),.. "\": no
11160 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
11170 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
11180 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
11190 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
111a0 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 , "CONNECTION",
111b0 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 "CHANNEL", "INVA
111c0 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 LID", (char *)NU
111d0 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
111e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
111f0 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
11200 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
11210 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e LL);.. /* Con
11220 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a nection info */.
11230 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
11240 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
11250 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
11260 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 ta(chan);. ss
11270 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 l = statePtr->ss
11280 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 l;. if (ssl !
11290 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f = NULL) {../* co
112a0 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a nnection state *
112b0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
112c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
112d0 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 state", SSL_stat
112e0 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 e_string_long(ss
112f0 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 l), -1);.../* Ge
11300 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 t SNI requested
11310 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 server name */..
11320 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11330 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 rp, objPtr, "ser
11340 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 vername", SSL_ge
11350 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c t_servername(ssl
11360 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 , TLSEXT_NAMETYP
11370 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 E_host_name), -1
11380 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 );.../* Get prot
11390 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 ocol */..LAPPEND
113a0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
113b0 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c Ptr, "protocol",
113c0 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e SSL_get_version
113d0 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a (ssl), -1);.../*
113e0 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 Renegotiation a
113f0 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 llowed */..LAPPE
11400 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
11410 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 objPtr, "renegot
11420 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c iation_allowed",
11430 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f SSL_get_secure_
11440 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 renegotiation_su
11450 70 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 pport((SSL *) ss
11460 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 l));.../* Get se
11470 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a curity level */.
11480 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 .LAPPEND_INT(int
11490 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
114a0 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 curity_level", S
114b0 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f SL_get_security_
114c0 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f level(ssl));.../
114d0 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a * Session info *
114e0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
114f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11500 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 "session_reused"
11510 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 , SSL_session_re
11520 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a used(ssl));.../*
11530 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 Is server info
11540 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
11550 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11560 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 "is_server", SS
11570 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 L_is_server(ssl)
11580 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 );.../* Is DTLS
11590 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
115a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
115b0 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f "is_dtls", SSL_
115c0 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 is_dtls(ssl));.
115d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 }.. /* Cip
115e0 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 her info */.
115f0 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 cipher = SSL_get
11600 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 _current_cipher(
11610 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 ssl);. if (ci
11620 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a pher != NULL) {.
11630 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a .char buf[BUFSIZ
11640 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 ] = {0};..int bi
11650 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 ts, alg_bits;...
11660 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a /* Cipher name *
11670 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
11680 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11690 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 cipher", SSL_CIP
116a0 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 HER_get_name(cip
116b0 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 her), -1);.../*
116c0 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 RFC name of ciph
116d0 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 er */..LAPPEND_S
116e0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
116f0 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d r, "standard_nam
11700 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 e", SSL_CIPHER_s
11710 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 tandard_name(cip
11720 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 her), -1);.../*
11730 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 OpenSSL name of
11740 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 cipher */..LAPPE
11750 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11760 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f bjPtr, "openssl_
11770 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 name", OPENSSL_c
11780 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 ipher_name(SSL_C
11790 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e IPHER_standard_n
117a0 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 ame(cipher)), -1
117b0 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f );.../* number o
117c0 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73 f secret bits us
117d0 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f ed for cipher */
117e0 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 ..bits = SSL_CIP
117f0 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 HER_get_bits(cip
11800 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b her, &alg_bits);
11810 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
11820 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11830 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 ecret_bits", bit
11840 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 s);..LAPPEND_INT
11850 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11860 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 "algorithm_bits
11870 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f ", alg_bits);../
11880 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 * alg_bits is ac
11890 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 tual key secret
118a0 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 bits. If use bit
118b0 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c s and secret (al
118c0 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 gorithm) bits di
118d0 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 ffer,.. the re
118e0 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 st of the bits a
118f0 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 re fixed, i.e. f
11900 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 or limited expor
11910 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20 t ciphers (bits
11920 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e < 56) */.../* In
11930 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53 dicates which SS
11940 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 L/TLS protocol v
11950 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 ersion first def
11960 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20 ined the cipher
11970 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
11980 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11990 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 "min_version", S
119a0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 SL_CIPHER_get_ve
119b0 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d rsion(cipher), -
119c0 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 1);.../* Cipher
119d0 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f NID */..LAPPEND_
119e0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
119f0 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c tr, "cipherNID",
11a00 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 (char *)OBJ_nid
11a10 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 2ln(SSL_CIPHER_g
11a20 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69 et_cipher_nid(ci
11a30 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 pher)), -1);..LA
11a40 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11a50 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73 , objPtr, "diges
11a60 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f tNID", (char *)O
11a70 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
11a80 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f PHER_get_digest_
11a90 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
11aa0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
11ab0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11ac0 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22 "keyExchangeNID"
11ad0 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
11ae0 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
11af0 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 get_kx_nid(ciphe
11b00 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 r)), -1);..LAPPE
11b10 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11b20 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69 bjPtr, "authenti
11b30 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 cationNID", (cha
11b40 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
11b50 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75 SL_CIPHER_get_au
11b60 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c th_nid(cipher)),
11b70 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 -1);.../* messa
11b80 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f ge authenticatio
11b90 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20 n code - Cipher
11ba0 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43 is AEAD (e.g. GC
11bb0 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f M or ChaCha20/Po
11bc0 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a ly1305) or not *
11bd0 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 /../* Authentica
11be0 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 ted Encryption w
11bf0 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64 ith associated d
11c00 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b ata (AEAD) check
11c10 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
11c20 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
11c30 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61 , "cipher_is_aea
11c40 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 d", SSL_CIPHER_i
11c50 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b s_aead(cipher));
11c60 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 .../* Digest use
11c70 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c d during the SSL
11c80 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 /TLS handshake w
11c90 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 hen using the ci
11ca0 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 pher. */..md = S
11cb0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 SL_CIPHER_get_ha
11cc0 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 ndshake_digest(c
11cd0 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 ipher);..LAPPEND
11ce0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11cf0 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f Ptr, "handshake_
11d00 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a digest", (char *
11d10 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 )EVP_MD_name(md)
11d20 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
11d30 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 OpenSSL-specific
11d40 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 ID, not IANA ID
11d50 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
11d60 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11d70 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69 "cipher_id", (i
11d80 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 nt) SSL_CIPHER_g
11d90 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a et_id(cipher));.
11da0 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 ../* Two-byte ID
11db0 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53 used in the TLS
11dc0 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 protocol of the
11dd0 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f given cipher */
11de0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
11df0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 terp, objPtr, "p
11e00 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e rotocol_id", (in
11e10 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 t) SSL_CIPHER_ge
11e20 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 t_protocol_id(ci
11e30 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 pher));.../* Tex
11e40 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e tual description
11e50 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a of the cipher *
11e60 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 /..if (SSL_CIPHE
11e70 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 R_description(ci
11e80 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f pher, buf, sizeo
11e90 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 f(buf)) != NULL)
11ea0 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f {.. LAPPEND_
11eb0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11ec0 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e tr, "description
11ed0 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a ", buf, -1);..}.
11ee0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
11ef0 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ssion info */.
11f00 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f session = SSL_
11f10 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 get_session(ssl)
11f20 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f ;. if (sessio
11f30 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f n != NULL) {..co
11f40 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
11f50 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 r *ticket;..size
11f60 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e _t len2;..unsign
11f70 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f ed int ulen;..co
11f80 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
11f90 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a r *session_id, *
11fa0 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 proto;..unsigned
11fb0 20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c char buffer[SSL
11fc0 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f _MAX_MASTER_KEY_
11fd0 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 LENGTH];.../* Re
11fe0 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 port the selecte
11ff0 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 d protocol as a
12000 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c result of the AL
12010 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a PN negotiation *
12020 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 /..SSL_SESSION_g
12030 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 et0_alpn_selecte
12040 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 d(session, &prot
12050 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 o, &len2);..LAPP
12060 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12070 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 objPtr, "alpn",
12080 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 (char *) proto,
12090 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
120a0 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 ;.../* Report th
120b0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
120c0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
120d0 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 of the NPN negot
120e0 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 iation */.#ifdef
120f0 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 USE_NPN..SSL_ge
12100 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 t0_next_proto_ne
12110 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 gotiated(ssl, &p
12120 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c roto, &ulen);..L
12130 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
12140 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 p, objPtr, "npn"
12150 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f , (char *) proto
12160 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
12170 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 n);.#endif.../*
12180 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f Resumable sessio
12190 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f n */..LAPPEND_BO
121a0 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
121b0 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 r, "resumable",
121c0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 SSL_SESSION_is_r
121d0 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e esumable(session
121e0 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e ));.../* Session
121f0 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 start time (sec
12200 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 onds since epoch
12210 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f ) */..LAPPEND_LO
12220 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NG(interp, objPt
12230 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c r, "start_time",
12240 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
12250 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b _time(session));
12260 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 .../* Timeout va
12270 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 lue - SSL_CTX_ge
12280 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 t_timeout (in se
12290 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 conds) */..LAPPE
122a0 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
122b0 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 objPtr, "timeout
122c0 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 ", SSL_SESSION_g
122d0 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 et_timeout(sessi
122e0 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 on));.../* Sessi
122f0 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 on id - TLSv1.2
12300 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a and below only *
12310 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 /..session_id =
12320 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
12330 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 id(session, &ule
12340 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 n);..LAPPEND_BAR
12350 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 RAY(interp, objP
12360 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 tr, "session_id"
12370 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 , session_id, (T
12380 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a cl_Size) ulen);.
12390 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e ../* Session con
123a0 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e text */..session
123b0 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f _id = SSL_SESSIO
123c0 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 N_get0_id_contex
123d0 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e t(session, &ulen
123e0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
123f0 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
12400 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 r, "session_cont
12410 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 ext", session_id
12420 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
12430 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e n);.../* Session
12440 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 ticket - client
12450 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 only */..SSL_SE
12460 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 SSION_get0_ticke
12470 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b t(session, &tick
12480 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 et, &len2);..LAP
12490 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
124a0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
124b0 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 sion_ticket", ti
124c0 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 cket, (Tcl_Size)
124d0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 len2);.../* Ses
124e0 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 sion ticket life
124f0 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 time hint (in se
12500 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 conds) */..LAPPE
12510 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
12520 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d objPtr, "lifetim
12530 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f e", SSL_SESSION_
12540 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 get_ticket_lifet
12550 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e ime_hint(session
12560 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 ));.../* Ticket
12570 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 app data */.#if
12580 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
12590 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
125a0 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 000L..SSL_SESSIO
125b0 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 N_get0_ticket_ap
125c0 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49 pdata((SSL_SESSI
125d0 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 ON *) session, &
125e0 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a ticket, &len2);.
125f0 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
12600 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12610 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 "ticket_app_data
12620 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f ", ticket, (Tcl_
12630 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e Size) len2);.#en
12640 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 dif.../* Get mas
12650 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 ter key */..len2
12660 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
12670 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 et_master_key(se
12680 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 ssion, buffer, S
12690 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 SL_MAX_MASTER_KE
126a0 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 Y_LENGTH);..LAPP
126b0 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 END_BARRAY(inter
126c0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 p, objPtr, "mast
126d0 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c er_key", buffer,
126e0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
126f0 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 );.../* Compress
12700 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 ion id */..unsig
12710 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c ned int id = SSL
12720 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d _SESSION_get_com
12730 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e press_id(session
12740 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
12750 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12760 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 "compression_id"
12770 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 , id == 1 ? "zli
12780 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 b" : "none", -1)
12790 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
127a0 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f Compression info
127b0 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 */. if (ssl
127c0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 != NULL) {.#ifde
127d0 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 f HAVE_SSL_COMPR
127e0 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f ESSION..const CO
127f0 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c MP_METHOD *comp,
12800 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 *expn;..comp =
12810 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
12820 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 compression(ssl)
12830 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 ;..expn = SSL_ge
12840 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 t_current_expans
12850 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 ion(ssl);...LAPP
12860 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12870 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 objPtr, "compres
12880 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 sion", comp ? SS
12890 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 L_COMP_get_name(
128a0 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 comp) : "none",
128b0 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 -1);..LAPPEND_ST
128c0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
128d0 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 , "expansion", e
128e0 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 xpn ? SSL_COMP_g
128f0 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 et_name(expn) :
12900 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c "none", -1);.#el
12910 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 se..LAPPEND_STR(
12920 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12930 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 "compression", "
12940 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 none", -1);..LAP
12950 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12960 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 objPtr, "expans
12970 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 ion", "none", -1
12980 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
12990 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 . /* Server i
129a0 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f nfo */. {..lo
129b0 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 ng mode = SSL_CT
129c0 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 X_get_session_ca
129d0 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 che_mode(statePt
129e0 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a r->ctx);..char *
129f0 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 msg;...if (mode
12a00 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
12a10 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 _OFF) {.. msg
12a20 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 = "off";..} els
12a30 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c e if (mode & SSL
12a40 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 _SESS_CACHE_CLIE
12a50 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d NT) {.. msg =
12a60 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c "client";..} el
12a70 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
12a80 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 L_SESS_CACHE_SER
12a90 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 VER) {.. msg
12aa0 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 = "server";..} e
12ab0 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 lse if (mode & S
12ac0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f SL_SESS_CACHE_BO
12ad0 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d TH) {.. msg =
12ae0 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 "both";..} else
12af0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 {.. msg = "u
12b00 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 nknown";..}..LAP
12b10 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12b20 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
12b30 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d n_cache_mode", m
12b40 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a sg, -1);. }..
12b50 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a /* CA List *
12b60 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 /. /* IF not
12b70 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 a server, same a
12b80 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f s SSL_get0_peer_
12b90 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 CA_list. If serv
12ba0 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 er same as SSL_C
12bb0 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 TX_get_client_CA
12bc0 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 _list */. lis
12bd0 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tPtr = Tcl_NewLi
12be0 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
12bf0 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 STACK_OF(X50
12c00 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 9_NAME) *ca_list
12c10 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 ;. if ((ca_li
12c20 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 st = SSL_get_cli
12c30 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 ent_CA_list(ssl)
12c40 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 ) != NULL) {..ch
12c50 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a ar buffer[BUFSIZ
12c60 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d ];..for (int i =
12c70 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 0; i < sk_X509_
12c80 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 NAME_num(ca_list
12c90 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 ); i++) {.. X
12ca0 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 509_NAME *name =
12cb0 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 sk_X509_NAME_va
12cc0 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b lue(ca_list, i);
12cd0 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 .. if (name)
12ce0 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e {...X509_NAME_on
12cf0 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 eline(name, buff
12d00 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 er, BUFSIZ);...T
12d10 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
12d20 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
12d30 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 listPtr, Tcl_New
12d40 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 StringObj(buffer
12d50 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 , -1));.. }..
12d60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 }. }. LAPP
12d70 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
12d80 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 objPtr, "caList"
12d90 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 , listPtr);.
12da0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
12db0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c rp, objPtr, "caL
12dc0 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 istCount", sk_X5
12dd0 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 09_NAME_num(ca_l
12de0 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ist));.. Tcl_
12df0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
12e00 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
12e10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
12e20 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
12e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
12e70 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d . * VersionObjCm
12e80 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 d -- return vers
12e90 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 ion string from
12ea0 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 OpenSSL.. *. * R
12eb0 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
12ec0 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
12ed0 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
12ee0 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
12ef0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
12f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f30 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
12f40 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 ic int.VersionOb
12f50 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e jCmd(. TCL_UN
12f60 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 USED(void *),.
12f70 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
12f80 74 65 72 70 2c 0a 20 20 20 20 54 43 4c 5f 55 4e terp,. TCL_UN
12f90 55 53 45 44 28 69 6e 74 29 20 2f 2a 20 6f 62 6a USED(int) /* obj
12fa0 63 20 2a 2f 2c 0a 20 20 20 20 54 43 4c 5f 55 4e c */,. TCL_UN
12fb0 55 53 45 44 28 54 63 6c 5f 4f 62 6a 20 2a 63 6f USED(Tcl_Obj *co
12fc0 6e 73 74 20 2a 29 20 2f 2a 20 6f 62 6a 76 20 2a nst *) /* objv *
12fd0 2f 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a /).{. Tcl_Obj
12fe0 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 *objPtr;.. d
12ff0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
13000 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 ;.. objPtr =
13010 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
13020 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e (OPENSSL_VERSION
13030 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 0a 20 20 20 _TEXT, -1);..
13040 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
13050 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
13060 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
13070 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
13080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
130c0 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a --. *. * MiscObj
130d0 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d Cmd -- misc comm
130e0 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ands. *. * Resul
130f0 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
13100 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
13110 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
13120 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
13130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13170 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
13180 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 0a 20 nt.MiscObjCmd(.
13190 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f TCL_UNUSED(vo
131a0 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 id *),. Tcl_I
131b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 nterp *interp,.
131c0 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 int objc,.
131d0 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
131e0 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 73 74 objv[]).{. st
131f0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
13200 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b *commands [] = {
13210 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 "req", "strreq"
13220 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e , NULL };. en
13230 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 um command { C_R
13240 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f EQ, C_STRREQ, C_
13250 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c DUMMY };. Tcl
13260 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 _Size cmd;. i
13270 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 nt isStr;. ch
13280 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d ar buffer[16384]
13290 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
132a0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
132b0 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 f (objc < 2) {..
132c0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
132d0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
132e0 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 , "subcommand ?a
132f0 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 rgs?");..return
13300 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
13310 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
13320 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 IndexFromObj(int
13330 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f erp, objv[1], co
13340 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 mmands, "command
13350 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 ", 0, &cmd) != T
13360 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
13370 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
13380 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
13390 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 _error();.. i
133a0 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 sStr = (cmd == C
133b0 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 _STRREQ);. sw
133c0 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d itch ((enum comm
133d0 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 and) cmd) {..cas
133e0 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 e C_REQ:..case C
133f0 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 _STRREQ: {..
13400 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e EVP_PKEY *pkey=N
13410 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a ULL;.. X509 *
13420 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 cert=NULL;..
13430 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d X509_NAME *name=
13440 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f NULL;.. Tcl_O
13450 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 bj **listv;..
13460 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 2c Tcl_Size listc,
13470 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 i;... BIO *ou
13480 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 6f t=NULL;... co
13490 6e 73 74 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 nst char *k_C=""
134a0 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 ,*k_ST="",*k_L="
134b0 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d ",*k_O="",*k_OU=
134c0 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 "",*k_CN="",*k_E
134d0 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 mail="";.. ch
134e0 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f ar *keyout,*pemo
134f0 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e ut,*str;.. in
13500 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c t keysize,serial
13510 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 =0,days=365;..#i
13520 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
13530 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
13540 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 00000L.. BIGN
13550 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a UM *bne = NULL;.
13560 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 . RSA *rsa =
13570 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 NULL;.#else..
13580 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 EVP_PKEY_CTX *c
13590 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 tx = NULL;.#endi
135a0 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a f... if ((obj
135b0 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 c<5) || (objc>6)
135c0 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e ) {...Tcl_WrongN
135d0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 umArgs(interp, 2
135e0 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 , objv, "keysize
135f0 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c keyfile certfil
13600 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 e ?info?");...re
13610 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13620 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
13630 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
13640 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
13650 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 2], &keysize) !=
13660 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 TCL_OK) {...ret
13670 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
13680 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 }.. keyou
13690 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 t=Tcl_GetString(
136a0 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 objv[3]);.. p
136b0 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 emout=Tcl_GetStr
136c0 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 ing(objv[4]);..
136d0 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a if (isStr) {.
136e0 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 ..Tcl_SetVar(int
136f0 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 erp,keyout,"",0)
13700 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 ;...Tcl_SetVar(i
13710 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c nterp,pemout,"",
13720 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 0);.. }...
13730 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a if (objc>=6) {.
13740 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 ..if (Tcl_ListOb
13750 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 jGetElements(int
13760 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c erp, objv[5], &l
13770 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d istc, &listv) !=
13780 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 TCL_OK) {...
13790 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
137a0 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c R;...}....if ((l
137b0 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a istc%2) != 0) {.
137c0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 .. Tcl_SetRes
137d0 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f ult(interp,"Info
137e0 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 rmation list mus
137f0 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 t have even numb
13800 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 er of arguments"
13810 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 ,NULL);... re
13820 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13830 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 ..}...for (i=0;
13840 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b i<listc; i+=2) {
13850 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 ... str=Tcl_G
13860 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
13870 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 ]);... if (st
13880 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 rcmp(str,"days")
13890 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 ==0) {....if (Tc
138a0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
138b0 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 interp,listv[i+1
138c0 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b ],&days)!=TCL_OK
138d0 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 ).... return
138e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
138f0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
13900 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 mp(str,"serial")
13910 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 ==0) {....if (Tc
13920 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
13930 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 interp,listv[i+1
13940 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f ],&serial)!=TCL_
13950 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 OK).... retur
13960 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 n TCL_ERROR;...
13970 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13980 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 rcmp(str,"C")==0
13990 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 ) {....k_C=Tcl_G
139a0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
139b0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
139c0 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
139d0 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"ST")==0) {...
139e0 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 .k_ST=Tcl_GetStr
139f0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
13a00 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
13a10 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 (strcmp(str,"L"
13a20 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 )==0) {....k_L=T
13a30 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
13a40 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
13a50 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
13a60 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b p(str,"O")==0) {
13a70 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 ....k_O=Tcl_GetS
13a80 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13a90 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
13aa0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
13ab0 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f OU")==0) {....k_
13ac0 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 OU=Tcl_GetString
13ad0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
13ae0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
13af0 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d trcmp(str,"CN")=
13b00 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 =0) {....k_CN=Tc
13b10 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
13b20 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
13b30 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
13b40 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 (str,"Email")==0
13b50 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 ) {....k_Email=T
13b60 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
13b70 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
13b80 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f } else {....Tcl_
13b90 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
13ba0 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 ,"Unknown parame
13bb0 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 ter",NULL);....r
13bc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
13bd0 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 ... }...}..
13be0 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c }..#if OPENSSL
13bf0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
13c00 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 < 0x30000000L..
13c10 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 bne = BN_new(
13c20 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 );.. rsa = RS
13c30 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b A_new();.. pk
13c40 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 ey = EVP_PKEY_ne
13c50 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e w();.. if (bn
13c60 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 e == NULL || rsa
13c70 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 == NULL || pkey
13c80 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f == NULL || !BN_
13c90 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 set_word(bne,RSA
13ca0 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 _F4) ||...!RSA_g
13cb0 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 enerate_key_ex(r
13cc0 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 sa, keysize, bne
13cd0 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f , NULL) || !EVP_
13ce0 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 PKEY_assign_RSA(
13cf0 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 pkey, rsa)) {...
13d00 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
13d10 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 ey);.../* RSA_fr
13d20 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 ee(rsa); freed b
13d30 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 y EVP_PKEY_free
13d40 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 */...BN_free(bne
13d50 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b );.#else.. pk
13d60 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e ey = EVP_RSA_gen
13d70 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 6b ((unsigned int)k
13d80 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 eysize);.. ct
13d90 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 x = EVP_PKEY_CTX
13da0 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b _new(pkey,NULL);
13db0 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d .. if (pkey =
13dc0 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d = NULL || ctx ==
13dd0 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b NULL || !EVP_PK
13de0 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 EY_keygen_init(c
13df0 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b tx) ||...!EVP_PK
13e00 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b EY_CTX_set_rsa_k
13e10 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 eygen_bits(ctx,
13e20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 keysize) || !EVP
13e30 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 _PKEY_keygen(ctx
13e40 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 , &pkey)) {...EV
13e50 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
13e60 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 );...EVP_PKEY_CT
13e70 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e X_free(ctx);.#en
13e80 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 dif...Tcl_SetRes
13e90 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f ult(interp,"Erro
13ea0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 r generating pri
13eb0 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b vate key",NULL);
13ec0 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
13ed0 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 ROR;.. } else
13ee0 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 {...if (isStr)
13ef0 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f {... out=BIO_
13f00 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 new(BIO_s_mem())
13f10 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 ;... PEM_writ
13f20 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 e_bio_PrivateKey
13f30 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e (out,pkey,NULL,N
13f40 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 ULL,0,NULL,NULL)
13f50 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 ;... i=BIO_re
13f60 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 ad(out,buffer,si
13f70 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b zeof(buffer)-1);
13f80 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f ... i=(i<0) ?
13f90 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 0 : i;... bu
13fa0 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 ffer[i]='\0';...
13fb0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 Tcl_SetVar(i
13fc0 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 nterp,keyout,buf
13fd0 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 fer,0);... BI
13fe0 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 O_flush(out);...
13ff0 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 BIO_free(out
14000 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
14010 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
14020 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 BIO_s_file());..
14030 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 . BIO_write_f
14040 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f ilename(out,keyo
14050 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ut);... PEM_w
14060 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 rite_bio_Private
14070 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c Key(out,pkey,NUL
14080 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 L,NULL,0,NULL,NU
14090 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 LL);... /* PE
140a0 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 M_write_bio_RSAP
140b0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 rivateKey(out, r
140c0 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 sa, NULL, NULL,
140d0 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 0, NULL, NULL);
140e0 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 */... BIO_fre
140f0 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d e_all(out);.. .}
14100 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 ....if ((cert=X5
14110 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 09_new())==NULL)
14120 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 {... Tcl_Set
14130 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
14140 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 rror generating
14150 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75 certificate requ
14160 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 est",NULL);...
14170 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 EVP_PKEY_free(
14180 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 pkey);.#if OPENS
14190 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
141a0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
141b0 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e .. BN_free(bn
141c0 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 e);.#endif...
141d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
141e0 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 R;...}....X509_s
141f0 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c et_version(cert,
14200 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 2);...ASN1_INTEG
14210 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f ER_set(X509_get_
14220 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 serialNumber(cer
14230 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 t),serial);...X5
14240 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 09_gmtime_adj(X5
14250 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 09_getm_notBefor
14260 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 e(cert),0);...X5
14270 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 09_gmtime_adj(X5
14280 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 09_getm_notAfter
14290 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a (cert),(long)60*
142a0 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 60*24*days);...X
142b0 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 509_set_pubkey(c
142c0 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 ert,pkey);....na
142d0 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a me=X509_get_subj
142e0 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a ect_name(cert);.
142f0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
14300 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
14310 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 me,"C", MBSTRING
14320 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
14330 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
14340 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 C, -1, -1, 0);..
14350 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
14360 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
14370 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f ,"ST", MBSTRING_
14380 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
14390 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 gned char *) k_S
143a0 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 T, -1, -1, 0);..
143b0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
143c0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
143d0 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ,"L", MBSTRING_A
143e0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
143f0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c ned char *) k_L,
14400 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
14410 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
14420 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
14430 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 O", MBSTRING_ASC
14440 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
14450 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d d char *) k_O, -
14460 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
14470 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
14480 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 _by_txt(name,"OU
14490 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
144a0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
144b0 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d char *) k_OU, -
144c0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
144d0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
144e0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e _by_txt(name,"CN
144f0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
14500 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
14510 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d char *) k_CN, -
14520 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
14530 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
14540 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d _by_txt(name,"Em
14550 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ail", MBSTRING_A
14560 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
14570 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d ned char *) k_Em
14580 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b ail, -1, -1, 0);
14590 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 ....X509_set_sub
145a0 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e ject_name(cert,n
145b0 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 ame);....if (!X5
145c0 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 09_sign(cert,pke
145d0 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 y,EVP_sha256()))
145e0 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 {... X509_fr
145f0 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ee(cert);...
14600 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
14610 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c ey);.#if OPENSSL
14620 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
14630 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 < 0x30000000L...
14640 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 BN_free(bne)
14650 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 ;.#endif... T
14660 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
14670 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 erp,"Error signi
14680 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c ng certificate",
14690 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 NULL);... ret
146a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
146b0 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 .}....if (isStr)
146c0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
146d0 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 _new(BIO_s_mem()
146e0 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
146f0 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c te_bio_X509(out,
14700 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 cert);... i=B
14710 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 IO_read(out,buff
14720 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 er,sizeof(buffer
14730 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 )-1);... i=(i
14740 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 <0) ? 0 : i;...
14750 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 buffer[i]='\0
14760 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 ';... Tcl_Set
14770 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 Var(interp,pemou
14780 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 t,buffer,0);...
14790 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 BIO_flush(out
147a0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
147b0 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 e(out);...} else
147c0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
147d0 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 _new(BIO_s_file(
147e0 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 ));... BIO_wr
147f0 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 ite_filename(out
14800 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 ,pemout);...
14810 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 PEM_write_bio_X5
14820 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 09(out,cert);...
14830 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c BIO_free_all
14840 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 (out);...}....X5
14850 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09_free(cert);..
14860 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 .EVP_PKEY_free(p
14870 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 key);.#if OPENSS
14880 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
14890 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
148a0 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 .BN_free(bne);.#
148b0 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a endif.. }..}.
148c0 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 .break;. defa
148d0 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 ult:..break;.
148e0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }. return TC
148f0 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a L_OK;.}.../*****
14900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
14910 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 ./* Init
14920 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a */./*******
14930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
14940 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
14950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14980 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
14990 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a ls_Free --. *. *
149a0 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
149b0 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 cleans up when a
149c0 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
149d0 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 d channel. *.is
149e0 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 closed and its r
149f0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 eference count f
14a00 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a alls below 1. *.
14a10 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e * Results:. *.n
14a20 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
14a30 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 ffects:. *.Frees
14a40 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 all the state.
14a50 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a90 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
14aa0 0a 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f 66 72 .Tls_Free(tls_fr
14ab0 65 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b 50 74 ee_type *blockPt
14ac0 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a r) {. State *
14ad0 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
14ae0 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 e *)blockPtr;..
14af0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
14b00 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 ed");.. Tls_C
14b10 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a lean(statePtr);.
14b20 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b ckfree(block
14b30 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Ptr);.}.../*. *-
14b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b80 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 --. *. * Tls_Cle
14b90 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 an --. *. *.This
14ba0 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e procedure clean
14bb0 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 s up when a SSL
14bc0 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
14bd0 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 nnel. *.is close
14be0 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 d and its refere
14bf0 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 nce count falls
14c00 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 below 1. This s
14c10 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c hould. *.be call
14c20 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 ed synchronously
14c30 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f by the ClosePro
14c40 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a c, not in the. *
14c50 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 .EventuallyFree
14c60 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 callback.. *. *
14c70 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 Results:. *.none
14c80 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
14c90 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c cts:. *.Frees al
14ca0 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 l the state. *.
14cb0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
14cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14cf0 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c ----. */.void Tl
14d00 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 s_Clean(State *s
14d10 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 tatePtr) {. d
14d20 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
14d30 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
14d40 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 we're assuming
14d50 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 here that we're
14d60 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a single-threaded.
14d70 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 */. if (
14d80 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
14d90 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b != (Tcl_TimerTok
14da0 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c en) NULL) {..Tcl
14db0 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 _DeleteTimerHand
14dc0 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 ler(statePtr->ti
14dd0 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d mer);..statePtr-
14de0 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 >timer = NULL;.
14df0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
14e00 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 atePtr->protos)
14e10 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 {..ckfree(stateP
14e20 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 tr->protos);..st
14e30 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d atePtr->protos =
14e40 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
14e50 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 if (statePtr->b
14e60 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 io) {../* This w
14e70 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 ill call SSL_shu
14e80 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 tdown. Bug 14140
14e90 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 45 */..dprintf("
14ea0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 BIO_free_all(%p)
14eb0 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ", statePtr->bio
14ec0 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c );..BIO_free_all
14ed0 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b (statePtr->bio);
14ee0 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 ..statePtr->bio
14ef0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
14f00 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
14f10 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 ssl) {..dprintf(
14f20 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 "SSL_free(%p)",
14f30 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
14f40 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 .SSL_free(stateP
14f50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 tr->ssl);..state
14f60 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b Ptr->ssl = NULL;
14f70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
14f80 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a tatePtr->ctx) {.
14f90 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 .SSL_CTX_free(st
14fa0 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 atePtr->ctx);..s
14fb0 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e tatePtr->ctx = N
14fc0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
14fd0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
14fe0 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 lback) {..Tcl_De
14ff0 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
15000 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
15010 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 .statePtr->callb
15020 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ack = NULL;.
15030 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
15040 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a tr->password) {.
15050 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
15060 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 t(statePtr->pass
15070 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 word);..statePtr
15080 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c ->password = NUL
15090 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
150a0 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
150b0 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {..Tcl_DecrRefC
150c0 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 ount(statePtr->v
150d0 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d cmd);..statePtr-
150e0 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 >vcmd = NULL;.
150f0 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
15100 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d ("Returning");.}
15110 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
15120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
15160 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66 6f 20 *. * Build Info
15170 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a Command --. *. *
15180 09 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 .Create command
15190 74 6f 20 72 65 74 75 72 6e 20 62 75 69 6c 64 20 to return build
151a0 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61 67 65 info for package
151b0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
151c0 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
151d0 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 cl result. *. *
151e0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
151f0 09 43 72 65 61 74 65 64 20 62 75 69 6c 64 2d 69 .Created build-i
15200 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a nfo command.. *.
15210 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
15220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15250 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 --------. */..#i
15260 66 6e 64 65 66 20 53 54 52 49 4e 47 49 46 59 0a fndef STRINGIFY.
15270 23 20 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 # define STRING
15280 49 46 59 28 78 29 20 53 54 52 49 4e 47 49 46 59 IFY(x) STRINGIFY
15290 31 28 78 29 0a 23 20 20 64 65 66 69 6e 65 20 53 1(x).# define S
152a0 54 52 49 4e 47 49 46 59 31 28 78 29 20 23 78 0a TRINGIFY1(x) #x.
152b0 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75 69 6c #endif..int.Buil
152c0 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54 63 6c dInfoCommand(Tcl
152d0 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 72 70 29 _Interp* interp)
152e0 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64 49 6e {. Tcl_CmdIn
152f0 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 69 66 fo info;.. if
15300 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 (Tcl_GetCommand
15310 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22 3a 3a Info(interp, "::
15320 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 tcl::build-info"
15330 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54 63 6c , &info)) {..Tcl
15340 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
15350 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
15360 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 69 ::build-info", i
15370 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f nfo.objProc, (vo
15380 69 64 20 2a 29 28 0a 09 09 50 41 43 4b 41 47 45 id *)(...PACKAGE
15390 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 53 54 52 _VERSION "+" STR
153a0 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 52 53 49 INGIFY(TLS_VERSI
153b0 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20 64 65 66 ON_UUID).#if def
153c0 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 ined(__clang__)
153d0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 && defined(__cla
153e0 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09 09 20 ng_major__)....
153f0 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53 54 52 ".clang-" STR
15400 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d INGIFY(__clang_m
15410 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f 63 6c ajor__).#if __cl
15420 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 31 30 ang_minor__ < 10
15430 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64 .... "0".#end
15440 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47 if.... STRING
15450 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f IFY(__clang_mino
15460 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 r__).#endif.#if
15470 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 defined(__cplusp
15480 6c 75 73 29 20 26 26 20 21 64 65 66 69 6e 65 64 lus) && !defined
15490 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09 20 20 (__OBJC__)....
154a0 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 22 0a 23 ".cplusplus".#
154b0 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 endif.#ifndef ND
154c0 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e 64 65 EBUG.... ".de
154d0 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 bug".#endif.#if
154e0 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 !defined(__clang
154f0 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 __) && !defined(
15500 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 __INTEL_COMPILER
15510 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 ) && defined(__G
15520 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e NUC__).... ".
15530 67 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 gcc-" STRINGIFY(
15540 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20 5f 5f __GNUC__).#if __
15550 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 31 GNUC_MINOR__ < 1
15560 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e 0.... "0".#en
15570 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e dif.... STRIN
15580 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f GIFY(__GNUC_MINO
15590 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 R__).#endif.#ifd
155a0 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 ef __INTEL_COMPI
155b0 4c 45 52 0a 09 09 09 20 20 20 20 22 2e 69 63 63 LER.... ".icc
155c0 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 49 -" STRINGIFY(__I
155d0 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a 23 NTEL_COMPILER).#
155e0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c endif.#ifdef TCL
155f0 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09 20 20 _MEM_DEBUG....
15600 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a 23 65 ".memdebug".#e
15610 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
15620 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09 20 20 (_MSC_VER)....
15630 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 52 49 4e ".msvc-" STRIN
15640 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 29 0a 23 GIFY(_MSC_VER).#
15650 65 6e 64 69 66 0a 23 69 66 64 65 66 20 55 53 45 endif.#ifdef USE
15660 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20 22 2e _NMAKE.... ".
15670 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a 23 69 nmake".#endif.#i
15680 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f 4f 50 fndef TCL_CFG_OP
15690 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 20 20 22 TIMIZED.... "
156a0 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a 23 65 .no-optimize".#e
156b0 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 4f 42 ndif.#ifdef __OB
156c0 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e 6f 62 JC__.... ".ob
156d0 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 66 20 64 jective-c".#if d
156e0 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c efined(__cpluspl
156f0 75 73 29 0a 09 09 09 20 20 20 20 22 70 6c 75 73 us).... "plus
15700 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 65 6e plus".#endif.#en
15710 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 dif.#ifdef TCL_C
15720 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09 09 20 FG_PROFILED....
15730 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a 23 65 ".profile".#e
15740 6e 64 69 66 0a 23 69 66 64 65 66 20 50 55 52 49 ndif.#ifdef PURI
15750 46 59 0a 09 09 09 20 20 20 20 22 2e 70 75 72 69 FY.... ".puri
15760 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 fy".#endif.#ifde
15770 66 20 53 54 41 54 49 43 5f 42 55 49 4c 44 0a 09 f STATIC_BUILD..
15780 09 09 20 20 20 20 22 2e 73 74 61 74 69 63 22 0a .. ".static".
15790 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55 4c 4c #endif...), NULL
157a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 );. }. ret
157b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
157c0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
157d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15800 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
15810 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a ls_Init --. *. *
15820 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 .This is a packa
15830 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f ge initializatio
15840 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 n procedure, whi
15850 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 ch is called. *.
15860 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 by Tcl when this
15870 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 package is to b
15880 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e e added to an in
15890 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a terpreter.. *. *
158a0 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 Results: Ssl c
158b0 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f onfigured and lo
158c0 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 aded. *. * Side
158d0 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 effects:. *. cre
158e0 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d ate the ssl comm
158f0 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 and, initialize
15900 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 ssl context. *.
15910 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
15920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15950 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20 54 43 ----. */..#if TC
15960 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
15970 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f > 8.#define MIN_
15980 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65 VERSION "9.0".#e
15990 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f lse.#define MIN_
159a0 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65 VERSION "8.5".#e
159b0 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e ndif..static con
159c0 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e st char tlsTclIn
159d0 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 itScript[] = {.#
159e0 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c include "tls.tcl
159f0 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b .h"..0x00. };
15a00 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 ..DLLEXPORT int
15a10 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 Tls_Init(Tcl_Int
15a20 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 0a erp *interp) {..
15a30 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
15a40 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65 66 20 55 led");..#ifdef U
15a50 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 SE_TCL_STUBS.
15a60 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 if (Tcl_InitStu
15a70 62 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 bs(interp, MIN_V
15a80 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 ERSION, 0) == NU
15a90 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
15aa0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 L_ERROR;. }.#
15ab0 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 63 endif. if (Tc
15ac0 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 l_PkgRequire(int
15ad0 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f erp, "Tcl", MIN_
15ae0 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e VERSION, 0) == N
15af0 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
15b00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
15b10 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 . if (TlsLibI
15b20 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b nit(0) != TCL_OK
15b30 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
15b40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 esult(interp, "c
15b50 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c ould not initial
15b60 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 ize SSL library"
15b70 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
15b80 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
15b90 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
15ba0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
15bb0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
15bc0 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 ls::ciphers", Ci
15bd0 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 76 6f phersObjCmd, (vo
15be0 69 64 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c id *) NULL, (Tcl
15bf0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
15c00 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
15c10 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
15c20 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
15c30 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 ::connection", C
15c40 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
15c50 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55 Cmd, (void *) NU
15c60 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
15c70 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
15c80 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
15c90 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
15ca0 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61 6e 64 73 68 , "::tls::handsh
15cb0 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f ake", HandshakeO
15cc0 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20 bjCmd, (void *)
15cd0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
15ce0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
15cf0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
15d00 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
15d10 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f rp, "::tls::impo
15d20 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d rt", ImportObjCm
15d30 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c d, (void *) NULL
15d40 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15d50 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15d60 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15d70 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15d80 22 3a 3a 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 "::tls::unimport
15d90 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d ", UnimportObjCm
15da0 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c d, (void *) NULL
15db0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15dc0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15dd0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15de0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15df0 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c "::tls::status",
15e00 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 StatusObjCmd, (
15e10 76 6f 69 64 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 void *) NULL, (T
15e20 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
15e30 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
15e40 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
15e50 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
15e60 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 ls::version", Ve
15e70 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 76 6f rsionObjCmd, (vo
15e80 69 64 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c id *) NULL, (Tcl
15e90 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
15ea0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
15eb0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
15ec0 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
15ed0 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a ::misc", MiscObj
15ee0 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55 Cmd, (void *) NU
15ef0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
15f00 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
15f10 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
15f20 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
15f30 2c 20 22 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f 63 , "::tls::protoc
15f40 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f ols", ProtocolsO
15f50 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20 bjCmd, (void *)
15f60 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
15f70 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
15f80 29 3b 0a 0a 20 20 20 20 42 75 69 6c 64 49 6e 66 );.. BuildInf
15f90 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 29 oCommand(interp)
15fa0 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 ;.. if (inter
15fb0 70 20 26 26 20 54 63 6c 5f 45 76 61 6c 28 69 6e p && Tcl_Eval(in
15fc0 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 terp, tlsTclInit
15fd0 53 63 72 69 70 74 29 20 21 3d 20 54 43 4c 5f 4f Script) != TCL_O
15fe0 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
15ff0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
16000 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b return Tcl_Pk
16010 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c gProvide(interp,
16020 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 PACKAGE_NAME, P
16030 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b ACKAGE_VERSION);
16040 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
16050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
16080 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 . *. *.Tls_SafeI
16090 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d nit --. *. *.---
160a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
160b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
160c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
160d0 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 *.Standard proce
160e0 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 dure required by
160f0 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 'load'.. *.Init
16100 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 ializes this ext
16110 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 ension for a saf
16120 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 e interpreter..
16130 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
16140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16160 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 --*. *. *.Side e
16170 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f ffects:. *..As o
16180 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a f 'Tls_Init'. *.
16190 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 *.Result:. *..A
161a0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 standard Tcl er
161b0 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d ror code.. *. *-
161c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
161d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
161e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
161f0 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 44 4c 4c 45 -----*. */..DLLE
16200 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 XPORT int Tls_Sa
16210 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 feInit(Tcl_Inter
16220 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 p *interp) {.
16230 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
16240 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 ");. return T
16250 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b ls_Init(interp);
16260 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
16270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
162a0 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 . *. *.TlsLibIni
162b0 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d t --. *. *.-----
162c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
162d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
162e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 -----------*. *.
162f0 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 Initializes SSL
16300 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 library once per
16310 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 application. *.
16320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16350 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 *. *. *.Side eff
16360 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 ects:. *..initia
16370 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 lizes SSL librar
16380 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a y. *. *.Result:.
16390 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d *..none. *. *--
163a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163d0 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ----*. */.static
163e0 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 int TlsLibInit(
163f0 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 int uninitialize
16400 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 ) {. static i
16410 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d nt initialized =
16420 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 0;. int stat
16430 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 us = TCL_OK;.#if
16440 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
16450 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
16460 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
16470 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d ). size_t num
16480 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a _locks;.#endif..
16490 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 if (uninitia
164a0 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e lize) {..if (!in
164b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 itialized) {..
164c0 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 dprintf("Asked
164d0 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 to uninitialize
164e0 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 , but we are not
164f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a initialized");.
16500 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
16510 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 _OK;..}...dprint
16520 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e f("Asked to unin
16530 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 itialize");..#if
16540 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
16550 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
16560 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
16570 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b )..Tcl_MutexLock
16580 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 (&init_mx);...if
16590 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 (locks) {..
165a0 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 free(locks);..
165b0 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a locks = NULL;.
165c0 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 . locksCount
165d0 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 = 0;..}.#endif..
165e0 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b initialized = 0;
165f0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
16600 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
16610 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
16620 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 READS)..Tcl_Mute
16630 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 xUnlock(&init_mx
16640 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 );.#endif...retu
16650 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d rn TCL_OK;. }
16660 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 .. if (initia
16670 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 lized) {..dprint
16680 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 f("Called, but u
16690 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 sing cached valu
166a0 65 22 29 3b 0a 09 72 65 74 75 72 6e 20 73 74 61 e");..return sta
166b0 74 75 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 tus;. }..
166c0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
166d0 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
166e0 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
166f0 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
16700 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c THREADS). Tcl
16710 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 _MutexLock(&init
16720 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 _mx);.#endif.
16730 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 initialized = 1
16740 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
16750 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
16760 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
16770 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f HREADS). num_
16780 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c locks = 1;. l
16790 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 ocksCount = (int
167a0 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 ) num_locks;.
167b0 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 locks = malloc(
167c0 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a sizeof(*locks) *
167d0 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 num_locks);.
167e0 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 memset(locks, 0
167f0 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 , sizeof(*locks)
16800 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 * num_locks);.#
16810 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e endif.. /* In
16820 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 itialize BOTH li
16830 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 bcrypto and libs
16840 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 sl. */. OPENS
16850 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e SL_init_ssl(OPEN
16860 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 SSL_INIT_LOAD_SS
16870 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e L_STRINGS | OPEN
16880 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 SSL_INIT_LOAD_CR
16890 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 YPTO_STRINGS..|
168a0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 OPENSSL_INIT_ADD
168b0 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f _ALL_CIPHERS | O
168c0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f PENSSL_INIT_ADD_
168d0 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c ALL_DIGESTS, NUL
168e0 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 L);.. BIO_new
168f0 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a _tcl(NULL, 0);..
16900 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 #if 0. /*.
16910 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 * XXX:TODO: Re
16920 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 move this code a
16930 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 nd replace it wi
16940 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 th a check.
16950 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 * for enough ent
16960 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 ropy and do not
16970 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 try to create ou
16980 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 r own. * ter
16990 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 rible entropy.
169a0 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 */. /*.
169b0 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e * Seed the ran
169c0 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 dom number gener
169d0 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 ator in the SSL
169e0 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 library,. *
169f0 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 using the do/whi
16a00 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 le construct bec
16a10 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 ause of the bug
16a20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 note in the.
16a30 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 * OpenSSL FAQ a
16a40 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 t http://www.ope
16a50 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 nssl.org/support
16a60 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a /faq.html#USER1.
16a70 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 *. * Th
16a80 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 e crux of the pr
16a90 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f oblem is that So
16aa0 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 laris 7 does not
16ab0 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f have a. * /
16ac0 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 dev/random or /d
16ad0 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 ev/urandom devic
16ae0 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 e so it cannot g
16af0 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 ather enough.
16b00 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d * entropy from
16b10 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 the RAND_seed()
16b20 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 when TLS initia
16b30 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 lizes and refuse
16b40 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 s. * to go f
16b50 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 urther. Earlier
16b60 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e versions of Open
16b70 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 SSL carried on r
16b80 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 egardless..
16b90 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e */. srand((un
16ba0 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 signed int) time
16bb0 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c ((time_t *) NULL
16bc0 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f ));. do {..fo
16bd0 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 r (i = 0; i < 16
16be0 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e ; i++) {.. rn
16bf0 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 d_seed[i] = 1 +
16c00 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 (char) (255.0 *
16c10 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 rand()/(RAND_MAX
16c20 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 +1.0));..}..RAND
16c30 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 _seed(rnd_seed,
16c40 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 sizeof(rnd_seed)
16c50 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 );. } while (
16c60 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d RAND_status() !=
16c70 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 1);.#endif..#if
16c80 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
16c90 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
16ca0 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
16cb0 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 ). Tcl_MutexU
16cc0 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b nlock(&init_mx);
16cd0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 .#endif.. ret
16ce0 75 72 6e 20 73 74 61 74 75 73 3b 0a 7d 0a urn status;.}.