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 6f 6e 73 74 *statePtr, const
3130: 20 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 char *msg) {.
3140: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
3150: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
3160: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
3170: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c _Obj *cmdPtr, *l
3180: 69 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 istPtr;. unsi
3190: 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 gned long err;.
31a0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 statePtr->err
31b0: 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 = msg;.. dpr
31c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
31d0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
31e0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 r->callback == (
31f0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 Tcl_Obj*)NULL)..
3200: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 return;.. /*
3210: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
3220: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
3230: 63 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67 chan, and messag
3240: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d e args */. cm
3250: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
3260: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
3270: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ->callback);.
3280: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3290: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
32a0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
32b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f wStringObj("erro
32c0: 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 r", -1));. Tc
32d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
32e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
32f0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
3300: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
3310: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
3320: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
3330: 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d -1));. if (m
3340: 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 sg != NULL) {..T
3350: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3360: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3370: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
3380: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 tringObj(msg, -1
3390: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 ));.. } else
33a0: 69 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 if ((msg = Tcl_G
33b0: 65 74 53 74 72 69 6e 67 28 54 63 6c 5f 47 65 74 etString(Tcl_Get
33c0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
33d0: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ))) != NULL) {..
33e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
33f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
3400: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
3410: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d StringObj(msg, -
3420: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 1));.. } else
3430: 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 {..listPtr = Tc
3440: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
3450: 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 NULL);..while ((
3460: 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 err = ERR_get_er
3470: 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 ror()) != 0) {..
3480: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3490: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
34a0: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 erp, listPtr, Tc
34b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 l_NewStringObj(E
34c0: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f RR_reason_error_
34d0: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 string(err), -1)
34e0: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f );..}..Tcl_ListO
34f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3500: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3510: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a listPtr);. }.
3520: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
3530: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
3540: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
3550: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
3560: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 EvalCallback(
3570: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
3580: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
3590: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
35a0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a cmdPtr);.}.../*.
35b0: 20 2a 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 2d ----------------
35f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c -----. *. * KeyL
3600: 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a ogCallback --. *
3610: 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 . *.Write receiv
3620: 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c ed key data to l
3630: 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 og file.. *. * S
3640: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
3650: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d none. *. *------
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 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
36a0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c /.void KeyLogCal
36b0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 lback(const SSL
36c0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 *ssl, const char
36d0: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 *line) {. ch
36e0: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 ar *str = getenv
36f0: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b (SSLKEYLOGFILE);
3700: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a . FILE *fd;..
3710: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
3720: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
3730: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 str) {..fd = fop
3740: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 en(str, "a");..f
3750: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e printf(fd, "%s\n
3760: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 ",line);..fclose
3770: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a (fd);. }.}...
3780: 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 --------. *. * P
37d0: 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b assword Callback
37e0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 --. *. *.Called
37f0: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 when a password
3800: 20 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 61 is needed for a
3810: 20 70 72 69 76 61 74 65 20 6b 65 79 20 77 68 65 private key whe
3820: 6e 20 6c 6f 61 64 69 6e 67 0a 20 2a 09 6f 72 20 n loading. *.or
3830: 73 74 6f 72 69 6e 67 20 61 20 50 45 4d 20 63 65 storing a PEM ce
3840: 72 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 rtificate with e
3850: 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 ncryption. Evals
3860: 20 63 61 6c 6c 62 61 63 6b 0a 20 2a 09 73 63 72 callback. *.scr
3870: 69 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 ipt and returns
3880: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 the result as th
3890: 65 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e e password strin
38a0: 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 g in buf.. *. *
38b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 Results:. *.None
38c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
38d0: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 cts:. *.Calls ca
38e0: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e llback (if defin
38f0: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e ed). *. * Return
3900: 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 s:. *.Password s
3910: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 ize in bytes or
3920: 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e -1 for an error.
3930: 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
3980: 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 atic int.Passwor
3990: 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a dCallback(char *
39a0: 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 buf, int size, i
39b0: 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 nt rwflag, void
39c0: 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 *udata) {. St
39d0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 ate *statePtr.=
39e0: 28 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b (State *) udata;
39f0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
3a00: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
3a10: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
3a20: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
3a30: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 . int code;.
3a40: 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b Tcl_Size len;
3a50: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
3a60: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
3a70: 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c If no callback,
3a80: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c use default cal
3a90: 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 lback */. if
3aa0: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
3ab0: 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ord == NULL) {..
3ac0: 69 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 if (Tcl_EvalEx(i
3ad0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 nterp, "tls::pas
3ae0: 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f sword", -1, TCL_
3af0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 EVAL_GLOBAL) ==
3b00: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 TCL_OK) {.. c
3b10: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 har *ret = (char
3b20: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e *) Tcl_GetStrin
3b30: 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 gFromObj(Tcl_Get
3b40: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
3b50: 29 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 ), &len);.. i
3b60: 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 f (len > (Tcl_Si
3b70: 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 09 ze) size-1) {...
3b80: 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 len = (Tcl_Size)
3b90: 20 73 69 7a 65 2d 31 3b 0a 09 20 20 20 20 7d 0a size-1;.. }.
3ba0: 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 . strncpy(buf
3bb0: 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 , ret, (size_t)
3bc0: 6c 65 6e 29 3b 0a 09 20 20 20 20 62 75 66 5b 6c len);.. buf[l
3bd0: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20 en] = '\0';..
3be0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 return (int) le
3bf0: 6e 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 n;..} else {..
3c00: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a return -1;..}.
3c10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
3c20: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
3c30: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 72 77 eval with fn, rw
3c40: 66 6c 61 67 2c 20 61 6e 64 20 73 69 7a 65 20 61 flag, and size a
3c50: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
3c60: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
3c70: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 eObj(statePtr->p
3c80: 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 assword);. Tc
3c90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3ca0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3cb0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
3cc0: 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 ringObj("passwor
3cd0: 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 d", -1));. Tc
3ce0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3cf0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3d00: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e mdPtr, Tcl_NewIn
3d10: 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 tObj(rwflag));.
3d20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3d30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3d40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3d50: 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 NewIntObj(size))
3d60: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 ;.. Tcl_Prese
3d70: 72 76 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 rve((void *) int
3d80: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 erp);. Tcl_Pr
3d90: 65 73 65 72 76 65 28 28 76 6f 69 64 20 2a 29 20 eserve((void *)
3da0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
3db0: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
3dc0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
3dd0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
3de0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f (cmdPtr);. co
3df0: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a de = Tcl_EvalObj
3e00: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 Ex(interp, cmdPt
3e10: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 r, TCL_EVAL_GLOB
3e20: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 AL);. if (cod
3e30: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 e != TCL_OK) {.#
3e40: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 if (TCL_MAJOR_VE
3e50: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 RSION == 8) && (
3e60: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f TCL_MINOR_VERSIO
3e70: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b N < 6)..Tcl_Back
3e80: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 groundError(inte
3e90: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f rp);.#else..Tcl_
3ea0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 BackgroundExcept
3eb0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 ion(interp, code
3ec0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
3ed0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
3ee0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
3ef0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
3f00: 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 void *) statePtr
3f10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 );.. /* If su
3f20: 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62 ccessful, pass b
3f30: 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72 ack password str
3f40: 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65 ing and truncate
3f50: 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a if too long */.
3f60: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 if (code ==
3f70: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20 TCL_OK) {..char
3f80: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 *ret = (char *)
3f90: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
3fa0: 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 mObj(Tcl_GetObjR
3fb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 esult(interp), &
3fc0: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e len);..if (len >
3fd0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 (Tcl_Size) size
3fe0: 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d -1) {.. len =
3ff0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 (Tcl_Size) size
4000: 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28 -1;..}..strncpy(
4010: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f buf, ret, (size_
4020: 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65 t) len);..buf[le
4030: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f n] = '\0';..Tcl_
4040: 52 65 6c 65 61 73 65 28 28 76 6f 69 64 20 2a 29 Release((void *)
4050: 20 69 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 interp);..retur
4060: 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20 n (int) len;.
4070: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 }. Tcl_Relea
4080: 73 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 65 se((void *) inte
4090: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 rp);. return
40a0: 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d -1;.}.../*. *---
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 2d 2d 2d 2d 2d 2d ----------------
40f0: 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 . *. * Session C
4100: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 allback for Clie
4110: 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c nts --. *. *.Cal
4120: 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73 led when a new s
4130: 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20 ession is added
4140: 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e to the cache. In
4150: 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 TLS 1.3. *.this
4160: 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64 may be received
4170: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 multiple times
4180: 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 after the handsh
4190: 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c ake. For. *.earl
41a0: 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 ier versions, th
41b0: 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 is will be recei
41c0: 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 ved during the h
41d0: 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 andshake.. *.Thi
41e0: 73 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72 s is the preferr
41f0: 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e ed way to obtain
4200: 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73 a resumable ses
4210: 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 sion.. *. * Resu
4220: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
4230: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4240: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
4250: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
4260: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
4270: 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 es:. *.0 = error
4280: 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77 where session w
4290: 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65 ill be immediate
42a0: 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 ly removed from
42b0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 the internal cac
42c0: 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 he.. *.1 = succe
42d0: 73 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74 ss where app ret
42e0: 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 ains session in
42f0: 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 session cache, a
4300: 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c nd must call SSL
4310: 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 _SESSION_free()
4320: 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a when done.. *. *
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 2d 2d 2d ----------------
4370: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
4380: 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 nt.SessionCallba
4390: 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c ck(SSL *ssl, SSL
43a0: 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f _SESSION *sessio
43b0: 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a n) {. State *
43c0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
43d0: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 e*)SSL_get_app_d
43e0: 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b ata((SSL *)ssl);
43f0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
4400: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
4410: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
4420: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
4430: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
4440: 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 ned char *ticket
4450: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
4460: 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 gned char *sessi
4470: 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f on_id;. size_
4480: 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 t len2;. unsi
4490: 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a gned int ulen;..
44a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
44b0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
44c0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
44d0: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
44e0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
44f0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
4500: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 K;. } else if
4510: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b (ssl == NULL) {
4520: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
4530: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4540: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
4550: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
4560: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 val with fn, cha
4570: 6e 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 n, session id, s
4580: 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 ession ticket, a
4590: 6e 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73 nd lifetime args
45a0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
45b0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
45c0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c j(statePtr->call
45d0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c back);. Tcl_L
45e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
45f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4600: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
4610: 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 gObj("session",
4620: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
4630: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4640: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4650: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
4660: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
4670: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
4680: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
4690: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 );.. /* Sessi
46a0: 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 on id */. ses
46b0: 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 sion_id = SSL_SE
46c0: 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 SSION_get_id(ses
46d0: 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 sion, &ulen);.
46e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
46f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4700: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
4710: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 ewByteArrayObj(s
4720: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f ession_id, (Tcl_
4730: 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 Size) ulen));..
4740: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 /* Session ti
4750: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f cket */. SSL_
4760: 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 SESSION_get0_tic
4770: 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 ket(session, &ti
4780: 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 cket, &len2);.
4790: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
47a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
47b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
47c0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 ewByteArrayObj(t
47d0: 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 icket, (Tcl_Size
47e0: 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f ) len2));.. /
47f0: 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d * Lifetime - num
4800: 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a ber of seconds *
4810: 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 /. Tcl_ListOb
4820: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
4830: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
4840: 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 Tcl_NewLongObj((
4850: 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f long) SSL_SESSIO
4860: 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 N_get_ticket_lif
4870: 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 etime_hint(sessi
4880: 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 on)));.. /* E
4890: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
48a0: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mand */. Tcl_
48b0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
48c0: 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 Ptr);. EvalCa
48d0: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 llback(interp, s
48e0: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 tatePtr, cmdPtr)
48f0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 ;. Tcl_DecrRe
4900: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
4910: 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30 . /* Return 0
4920: 20 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73 for now until s
4930: 65 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 ession handling
4940: 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 is complete */.
4950: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c return 0;.}..
4960: 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
49b0: 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f ALPN Callback fo
49c0: 72 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 r Servers and NP
49d0: 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 N Callback for C
49e0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 lients --. *. *.
49f0: 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c Perform protocol
4a00: 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 (http/1.1, h2,
4a10: 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 h3, etc.) select
4a20: 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 ion for the. *.i
4a30: 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 ncoming connecti
4a40: 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 on. Called after
4a50: 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 Hello and serve
4a60: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 r callbacks.. *.
4a70: 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 Where 'out' is s
4a80: 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
4a90: 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 and 'in' is the
4aa0: 20 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 peer advertised
4ab0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 list.. *. * Res
4ac0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
4ad0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
4ae0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
4af0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
4b00: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
4b10: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
4b20: 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 XT_ERR_OK: ALPN
4b30: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 protocol selecte
4b40: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f d. The connectio
4b50: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 n continues.. *.
4b60: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
4b70: 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 LERT_FATAL: Ther
4b80: 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 e was no overlap
4b90: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 between the cli
4ba0: 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 ent's. *. sup
4bb0: 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 plied list and t
4bc0: 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 he server config
4bd0: 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e uration. The con
4be0: 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 nection will be
4bf0: 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f aborted.. *.SSL_
4c00: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
4c10: 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 : ALPN protocol
4c20: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e not selected, e.
4c30: 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 g., because no A
4c40: 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f LPN. *. proto
4c50: 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 cols are configu
4c60: 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e red for this con
4c70: 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e nection. The con
4c80: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
4c90: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d s.. *. *--------
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
4ce0: 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 static int.ALPNC
4cf0: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c allback(SSL *ssl
4d00: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 , const unsigned
4d10: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 char **out, uns
4d20: 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c igned char *outl
4d30: 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 en,..const unsig
4d40: 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e ned char *in, un
4d50: 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e signed int inlen
4d60: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 , void *arg) {.
4d70: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
4d80: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 tr = (State*)arg
4d90: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ;. Tcl_Interp
4da0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
4db0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
4dc0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
4dd0: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 ;. int code,
4de0: 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 res;.. dprint
4df0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
4e00: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c if (ssl == NUL
4e10: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c L || arg == NULL
4e20: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
4e30: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
4e40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
4e50: 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 Select protocol
4e60: 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 */. if (SSL_s
4e70: 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f elect_next_proto
4e80: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ((unsigned char
4e90: 2a 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c **) out, outlen,
4ea0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
4eb0: 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f s, statePtr->pro
4ec0: 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e tos_len,..in, in
4ed0: 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f len) == OPENSSL_
4ee0: 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 NPN_NEGOTIATED)
4ef0: 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e {../* Match foun
4f00: 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f d */..res = SSL_
4f10: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 TLSEXT_ERR_OK;.
4f20: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 } else {../*
4f30: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f OPENSSL_NPN_NO_O
4f40: 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 VERLAP = No over
4f50: 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 lap, so use firs
4f60: 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 t item from clie
4f70: 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 nt protocol list
4f80: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 */..res = SSL_T
4f90: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4fa0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
4fb0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
4fc0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
4fd0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b ) {..return res;
4fe0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
4ff0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
5000: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 eval with fn, c
5010: 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 han, depth, cert
5020: 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 info list, stat
5030: 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 us, and error ar
5040: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 gs */. cmdPtr
5050: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
5060: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 Obj(statePtr->vc
5070: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 md);. Tcl_Lis
5080: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
5090: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
50a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
50b0: 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b bj("alpn", -1));
50c0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
50d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
50e0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
50f0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
5100: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
5110: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
5120: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
5130: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
5140: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
5150: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
5160: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e ewStringObj((con
5170: 73 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c st char *) *out,
5180: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
5190: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
51a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
51b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 tr, Tcl_NewBoole
51c0: 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c anObj(res == SSL
51d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 _TLSEXT_ERR_OK))
51e0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
51f0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
5200: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
5210: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
5220: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d . if ((code =
5230: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
5240: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
5250: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a cmdPtr)) > 1) {.
5260: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 .res = SSL_TLSEX
5270: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
5280: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 } else if (code
5290: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 == 1) {..res =
52a0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
52b0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a K;. } else {.
52c0: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 .res = SSL_TLSEX
52d0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 T_ERR_ALERT_FATA
52e0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c L;. }. Tcl
52f0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
5300: 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 dPtr);. retur
5310: 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a n res;.}.../*. *
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 2d 2d 2d ----------------
5360: 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 ---. *. * Advert
5370: 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 ise Protocols Ca
5380: 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 llback for Next
5390: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 Protocol Negotia
53a0: 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 tion (NPN) in Se
53b0: 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a rverHello --. *.
53c0: 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 *.called when a
53d0: 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 TLS server need
53e0: 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 s a list of supp
53f0: 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 orted protocols
5400: 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 for Next. *.Prot
5410: 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e ocol Negotiation
5420: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
5430: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
5440: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a ide effects:. *.
5450: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
5460: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
5470: 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f RR_OK: NPN proto
5480: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 col selected. Th
5490: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
54a0: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 tinues.. *.SSL_T
54b0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
54c0: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f NPN protocol no
54d0: 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 t selected. The
54e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
54f0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nues.. *. *-----
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 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5540: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 */.#ifdef USE_NP
5550: 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e N.static int.NPN
5560: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
5570: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 SL *ssl, const u
5580: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f nsigned char **o
5590: 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 ut, unsigned int
55a0: 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a *outlen, void *
55b0: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
55c0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
55d0: 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 ate*)arg;.. d
55e0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
55f0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d ;.. if (ssl =
5600: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d = NULL || arg ==
5610: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
5620: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5630: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
5640: 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f /* Set protoco
5650: 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 ls list */. i
5660: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f f (statePtr->pro
5670: 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 tos != NULL) {..
5680: 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d *out = statePtr-
5690: 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 >protos;..*outle
56a0: 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 n = statePtr->pr
56b0: 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 otos_len;. }
56c0: 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e else {..*out = N
56d0: 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 ULL;..*outlen =
56e0: 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 0;..return SSL_T
56f0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
5700: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
5710: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
5720: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a _OK;.}.#endif...
5730: 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
5780: 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 NI Callback for
5790: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a Servers --. *. *
57a0: 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d .Perform server-
57b0: 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d side SNI hostnam
57c0: 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 e selection afte
57d0: 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 r receiving SNI
57e0: 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 extension. *.in
57f0: 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 Client Hello. Ca
5800: 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f lled after hello
5810: 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 callback but be
5820: 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 fore ALPN callba
5830: 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ck.. *. * Result
5840: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
5850: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
5860: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
5870: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
5880: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 . * Return codes
5890: 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f :. *.SSL_TLSEXT_
58a0: 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 ERR_OK: SNI host
58b0: 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 name is accepted
58c0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
58d0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
58e0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
58f0: 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 ERT_FATAL: SNI h
5900: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
5910: 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e ccepted. The con
5920: 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 nection. *. i
5930: 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 s aborted. Defau
5940: 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 lt for alert is
5950: 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 SSL_AD_UNRECOGNI
5960: 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c ZED_NAME.. *.SSL
5970: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 _TLSEXT_ERR_ALER
5980: 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 T_WARNING: SNI h
5990: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
59a0: 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 ccepted, warning
59b0: 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 alert. *. se
59c0: 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 nt (not supporte
59d0: 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 d in TLSv1.3). T
59e0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
59f0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f ntinues.. *.SSL_
5a00: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
5a10: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 : SNI hostname i
5a20: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 s not accepted a
5a30: 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 nd not acknowled
5a40: 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e ged,. *. e.g.
5a50: 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 if SNI has not
5a60: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e been configured.
5a70: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
5a80: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a continues.. *. *
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 2d 2d 2d ----------------
5ad0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
5ae0: 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 nt.SNICallback(c
5af0: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 onst SSL *ssl, i
5b00: 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 nt *alert, void
5b10: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 *arg) {. Stat
5b20: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
5b30: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 tate*)arg;. T
5b40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
5b50: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
5b60: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
5b70: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
5b80: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 nt code, res;.
5b90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 const char *se
5ba0: 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b rvername = NULL;
5bb0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
5bc0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
5bd0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (ssl == NULL ||
5be0: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a arg == NULL) {.
5bf0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
5c00: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
5c10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 }.. /* Only
5c20: 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 works for TLS 1
5c30: 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a .2 and earlier *
5c40: 2f 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 /. servername
5c50: 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 = SSL_get_serve
5c60: 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 rname(ssl, TLSEX
5c70: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f T_NAMETYPE_host_
5c80: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 name);. if (!
5c90: 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 servername || se
5ca0: 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 rvername[0] == '
5cb0: 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 \0') {..return S
5cc0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
5cd0: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ACK;. }..
5ce0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 if (statePtr->vc
5cf0: 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 md == (Tcl_Obj*)
5d00: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
5d10: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
5d20: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a K;. }.. /*
5d30: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
5d40: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c to eval with fn,
5d50: 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 chan, and serve
5d60: 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 r name args */.
5d70: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
5d80: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
5d90: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 tePtr->vcmd);.
5da0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
5db0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
5dc0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
5dd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 ewStringObj("sni
5de0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
5df0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
5e00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
5e10: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
5e20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
5e30: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
5e40: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
5e50: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
5e60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
5e70: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
5e80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
5e90: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c Obj(servername ,
5ea0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 -1));.. /* E
5eb0: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
5ec0: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mand */. Tcl_
5ed0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
5ee0: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 Ptr);. if ((c
5ef0: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 ode = EvalCallba
5f00: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ck(interp, state
5f10: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 Ptr, cmdPtr)) >
5f20: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 1) {..res = SSL_
5f30: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
5f40: 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 _WARNING;..*aler
5f50: 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 t = SSL_AD_UNREC
5f60: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a OGNIZED_NAME; /*
5f70: 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 Not supported b
5f80: 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 y TLS 1.3 */.
5f90: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 } else if (code
5fa0: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 == 1) {..res =
5fb0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
5fc0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a K;. } else {.
5fd0: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 .res = SSL_TLSEX
5fe0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 T_ERR_ALERT_FATA
5ff0: 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c L;..*alert = SSL
6000: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 _AD_UNRECOGNIZED
6010: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 _NAME; /* Not su
6020: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 pported by TLS 1
6030: 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 .3 */. }.
6040: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
6050: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 (cmdPtr);. re
6060: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a turn res;.}.../*
6070: 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 ------. *. * Cli
60c0: 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 entHello Handsha
60d0: 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 ke Callback for
60e0: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a Servers --. *. *
60f0: 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 .Used by server
6100: 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 to examine the s
6110: 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 erver name indic
6120: 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 ation (SNI) exte
6130: 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 nsion. *.provide
6140: 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 d by the client
6150: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 in order to sele
6160: 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 ct an appropriat
6170: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f e certificate to
6180: 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 . *.present, and
6190: 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 make other conf
61a0: 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 iguration adjust
61b0: 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 ments relevant t
61c0: 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a o that server. *
61d0: 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f .name and its co
61e0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 nfiguration. Thi
61f0: 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 s includes swapp
6200: 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f ing out the asso
6210: 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 ciated. *.SSL_CT
6220: 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 X pointer, modif
6230: 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 ying the server'
6240: 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 s list of permit
6250: 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 ted TLS versions
6260: 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 ,. *.changing th
6270: 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 e server's ciphe
6280: 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e r list in respon
6290: 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 se to the client
62a0: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 's cipher list,
62b0: 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 etc.. *.Called b
62c0: 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c efore SNI and AL
62d0: 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a PN callbacks.. *
62e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
62f0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
6300: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
6310: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
6320: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 efined). *. * Re
6330: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 turn codes:. *.S
6340: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
6350: 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 RETRY: suspend t
6360: 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e he handshake, an
6370: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 d the handshake
6380: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 function will re
6390: 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 turn immediately
63a0: 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 . *.SSL_CLIENT_H
63b0: 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c ELLO_ERROR: fail
63c0: 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 ure, terminate c
63d0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 onnection. Set a
63e0: 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f lert to error co
63f0: 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e de.. *.SSL_CLIEN
6400: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a T_HELLO_SUCCESS:
6410: 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d success. *. *--
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 2d 2d 2d 2d 2d ----------------
6460: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
6470: 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 .HelloCallback(S
6480: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c SL *ssl, int *al
6490: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 ert, void *arg)
64a0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
64b0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
64c0: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 arg;. Tcl_Int
64d0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
64e0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
64f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
6500: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 Ptr;. int cod
6510: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 e, res;. cons
6520: 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 t char *serverna
6530: 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e me;. const un
6540: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a signed char *p;.
6550: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 size_t len,
6560: 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 remaining;..
6570: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
6580: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
6590: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 ePtr->vcmd == (T
65a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
65b0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
65c0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 NT_HELLO_SUCCESS
65d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
65e0: 28 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 (ssl == (const S
65f0: 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 SL *)NULL || arg
6600: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
6610: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
6620: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
6630: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 }.. /* Get na
6640: 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 mes */. if (!
6650: 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f SSL_client_hello
6660: 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 _get0_ext(ssl, T
6670: 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65 LSEXT_TYPE_serve
6680: 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d r_name, &p, &rem
6690: 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 aining) || remai
66a0: 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 ning <= 2) {..*a
66b0: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c lert = SSL_R_SSL
66c0: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c V3_ALERT_ILLEGAL
66d0: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 _PARAMETER;..ret
66e0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
66f0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
6700: 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 }.. /* Extrac
6710: 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 t the length of
6720: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 the supplied lis
6730: 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 t of names. */.
6740: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 len = (*(p++)
6750: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 << 8);. len
6760: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 += *(p++);. i
6770: 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 f (len + 2 != re
6780: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 maining) {..*ale
6790: 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 rt = SSL_R_SSLV3
67a0: 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 _ALERT_ILLEGAL_P
67b0: 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 ARAMETER;..retur
67c0: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
67d0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
67e0: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 remaining =
67f0: 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 len;.. /* The
6800: 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 list in practic
6810: 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e e only has a sin
6820: 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 gle element, so
6830: 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 we only consider
6840: 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 the first one.
6850: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 */. if (remai
6860: 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b ning == 0 || *p+
6870: 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 + != TLSEXT_NAME
6880: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 TYPE_host_name)
6890: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
68a0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e R_TLSV1_ALERT_IN
68b0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 TERNAL_ERROR;..r
68c0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
68d0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
68e0: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
68f0: 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 g--;.. /* Now
6900: 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 we can finally
6910: 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 pull out the byt
6920: 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 e array with the
6930: 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 actual hostname
6940: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d . */. if (rem
6950: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 aining <= 2) {..
6960: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 *alert = SSL_R_T
6970: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 LSV1_ALERT_INTER
6980: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 NAL_ERROR;..retu
6990: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
69a0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
69b0: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b . len = (*(p+
69c0: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 +) << 8);. le
69d0: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 n += *(p++);.
69e0: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 if (len + 2 > r
69f0: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c emaining) {..*al
6a00: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 ert = SSL_R_TLSV
6a10: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 1_ALERT_INTERNAL
6a20: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 _ERROR;..return
6a30: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6a40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
6a50: 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 remaining = le
6a60: 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d n;. servernam
6a70: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 e = (const char
6a80: 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 *)p;.. /* Cre
6a90: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
6aa0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 val with fn, cha
6ab0: 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61 n, and server na
6ac0: 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 me args */. c
6ad0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
6ae0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
6af0: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 r->vcmd);. Tc
6b00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
6b10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
6b20: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
6b30: 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c ringObj("hello",
6b40: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
6b50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6b60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
6b70: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
6b80: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 StringObj(Tcl_Ge
6b90: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
6ba0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
6bb0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
6bc0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
6bd0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
6be0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
6bf0: 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 54 j(servername, (T
6c00: 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b 0a cl_Size) len));.
6c10: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
6c20: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
6c30: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
6c40: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
6c50: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
6c60: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
6c70: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
6c80: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
6c90: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f es = SSL_CLIENT_
6ca0: 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 HELLO_RETRY;..*a
6cb0: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 lert = SSL_R_TLS
6cc0: 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 41 V1_ALERT_USER_CA
6cd0: 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65 NCELLED;. } e
6ce0: 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 lse if (code ==
6cf0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 1) {..res = SSL_
6d00: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 CLIENT_HELLO_SUC
6d10: 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 CESS;. } else
6d20: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c {..res = SSL_CL
6d30: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
6d40: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
6d50: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e R_TLSV1_ALERT_IN
6d60: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 TERNAL_ERROR;.
6d70: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 }. Tcl_Decr
6d80: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
6d90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 ;. return res
6da0: 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a ;.}.../*********
6db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 ***********/./*
6dc0: 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20 Commands
6dd0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./***********
6de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 *********/../*.
6df0: 2a 2d 2d 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 0a 20 2a 0a 20 2a 20 43 69 70 68 65 ----. *. * Ciphe
6e40: 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 rsObjCmd -- list
6e50: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
6e60: 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 rs. *. *.This pr
6e70: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
6e80: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ed to process th
6e90: 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 e "tls::ciphers"
6ea0: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c command. *.to l
6eb0: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 ist available ci
6ec0: 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f phers, based upo
6ed0: 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 n protocol selec
6ee0: 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ted.. *. * Resul
6ef0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
6f00: 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 d Tcl result lis
6f10: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
6f20: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 fects:. *.constr
6f30: 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79 ucts and destroy
6f40: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 s SSL context (C
6f50: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d TX). *. *-------
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 0a 20 2a 2f ------------. */
6fa0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 .static const ch
6fb0: 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 ar *protocols[]
6fc0: 3d 20 7b 0a 20 20 20 20 22 73 73 6c 32 22 2c 20 = {. "ssl2",
6fd0: 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 "ssl3", "tls1",
6fe0: 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e "tls1.1", "tls1.
6ff0: 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 2", "tls1.3", NU
7000: 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f LL.};.enum proto
7010: 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 col {. TLS_SS
7020: 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c L2, TLS_SSL3, TL
7030: 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 S_TLS1, TLS_TLS1
7040: 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 _1, TLS_TLS1_2,
7050: 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f TLS_TLS1_3, TLS_
7060: 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 NONE.};..static
7070: 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d int.CiphersObjCm
7080: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 d(. TCL_UNUSE
7090: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 D(void *),. T
70a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
70b0: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c p,. int objc,
70c0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f . Tcl_Obj.*co
70d0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 nst objv[]).{.
70e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
70f0: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 r = NULL;. SS
7100: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c L_CTX *ctx = NUL
7110: 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 L;. SSL *ssl
7120: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 = NULL;. STAC
7130: 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 K_OF(SSL_CIPHER)
7140: 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 62 *sk;. char b
7150: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 uf[BUFSIZ];.
7160: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f int index, verbo
7170: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 se = 0, use_supp
7180: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 orted = 0;. c
7190: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
71a0: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 *method;.. dp
71b0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
71c0: 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 .. if ((objc
71d0: 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 < 2) || (objc >
71e0: 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4)) {..Tcl_Wrong
71f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
7200: 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 1, objv, "protoc
7210: 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 ol ?verbose? ?su
7220: 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 pported?");..ret
7230: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
7240: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c }. if (Tcl
7250: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a _GetIndexFromObj
7260: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d (interp, objv[1]
7270: 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 , protocols, "pr
7280: 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 otocol", 0, &ind
7290: 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ex) != TCL_OK) {
72a0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
72b0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
72c0: 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 ((objc > 2) &&
72d0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 Tcl_GetBooleanFr
72e0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
72f0: 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 jv[2], &verbose)
7300: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
7310: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7320: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
7330: 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c objc > 3) && Tcl
7340: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f _GetBooleanFromO
7350: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
7360: 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 3], &use_support
7370: 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ed) != TCL_OK) {
7380: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7390: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 OR;. }.. E
73a0: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
73b0: 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 ;.. switch ((
73c0: 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e enum protocol)in
73d0: 64 65 78 29 20 7b 0a 20 20 20 20 63 61 73 65 20 dex) {. case
73e0: 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 TLS_SSL2:.#if OP
73f0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
7400: 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 MBER >= 0x101000
7410: 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 00L || defined(N
7420: 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e O_SSL2) || defin
7430: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
7440: 4c 32 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 L2)..Tcl_AppendR
7450: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
7460: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
7470: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
7480: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
7490: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 r *)NULL);..retu
74a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
74b0: 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53 lse..method = SS
74c0: 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 Lv2_method(); br
74d0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
74e0: 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 case TLS_SSL3:.#
74f0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 if defined(NO_SS
7500: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L3) || defined(O
7510: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 PENSSL_NO_SSL3)
7520: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
7530: 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f SL_NO_SSL3_METHO
7540: 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 D)..Tcl_AppendRe
7550: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
7560: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
7570: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
7580: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
7590: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *)NULL);..retur
75a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
75b0: 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c se..method = SSL
75c0: 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 v3_method(); bre
75d0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 ak;.#endif. c
75e0: 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 ase TLS_TLS1:.#i
75f0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
7600: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
7610: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c ENSSL_NO_TLS1) |
7620: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7630: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 L_NO_TLS1_METHOD
7640: 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 )..Tcl_AppendRes
7650: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
7660: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
7670: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7680: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
7690: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e *)NULL);..return
76a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
76b0: 65 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 e..method = TLSv
76c0: 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 1_method(); brea
76d0: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 k;.#endif. ca
76e0: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 se TLS_TLS1_1:.#
76f0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
7700: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
7710: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
7720: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
7730: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
7740: 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 _METHOD)..Tcl_Ap
7750: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7760: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
7770: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
7780: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
7790: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
77a0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
77b0: 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 R;.#else..method
77c0: 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f = TLSv1_1_metho
77d0: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
77e0: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f if. case TLS_
77f0: 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 TLS1_2:.#if defi
7800: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c ned(NO_TLS1_2) |
7810: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7820: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 L_NO_TLS1_2) ||
7830: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7840: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 NO_TLS1_2_METHOD
7850: 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 )..Tcl_AppendRes
7860: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
7870: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
7880: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
7890: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
78a0: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e *)NULL);..return
78b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
78c0: 65 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 e..method = TLSv
78d0: 31 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 1_2_method(); br
78e0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
78f0: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a case TLS_TLS1_3:
7900: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
7910: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e TLS1_3) || defin
7920: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7930: 53 31 5f 33 29 0a 09 54 63 6c 5f 41 70 70 65 6e S1_3)..Tcl_Appen
7940: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
7950: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
7960: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
7970: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 t supported", (c
7980: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 har *)NULL);..re
7990: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
79a0: 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 #else..method =
79b0: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 53 TLS_method();..S
79c0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 SL_CTX_set_min_p
79d0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
79e0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
79f0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
7a00: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f max_proto_versio
7a10: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
7a20: 52 53 49 4f 4e 29 3b 0a 09 62 72 65 61 6b 3b 0a RSION);..break;.
7a30: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 #endif. defau
7a40: 6c 74 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c lt:..method = TL
7a50: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 S_method();..bre
7a60: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 ak;. }.. c
7a70: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
7a80: 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 (method);. if
7a90: 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b (ctx == NULL) {
7aa0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
7ab0: 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 lt(interp, GET_E
7ac0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
7ad0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 ar *)NULL);..ret
7ae0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
7af0: 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 }.. ssl =
7b00: 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 SSL_new(ctx);.
7b10: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c if (ssl == NUL
7b20: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
7b30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 Result(interp, G
7b40: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
7b50: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
7b60: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
7b70: 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f x);..return TCL_
7b80: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
7b90: 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e /* Use list an
7ba0: 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 d order as would
7bb0: 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c be sent in a Cl
7bc0: 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c ientHello or all
7bd0: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
7be0: 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 rs */. if (us
7bf0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 e_supported) {..
7c00: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 sk = SSL_get1_su
7c10: 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 pported_ciphers(
7c20: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ssl);. } else
7c30: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 {..sk = SSL_get
7c40: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 _ciphers(ssl);.
7c50: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b }.. if (sk
7c60: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 != NULL) {..if
7c70: 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 (!verbose) {..
7c80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 70 const char *cp
7c90: 3b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 ;.. objPtr =
7ca0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
7cb0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f , NULL);.. fo
7cc0: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
7cd0: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f < sk_SSL_CIPHER_
7ce0: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a num(sk); i++) {.
7cf0: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 ..const SSL_CIPH
7d00: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 ER *c = sk_SSL_C
7d10: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 IPHER_value(sk,
7d20: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e i);...if (c == N
7d30: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a ULL) continue;..
7d40: 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 ../* cipher name
7d50: 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 or (NONE) */...
7d60: 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f cp = SSL_CIPHER_
7d70: 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 get_name(c);...i
7d80: 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 f (cp == NULL) b
7d90: 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 reak;...Tcl_List
7da0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
7db0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
7dc0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
7dd0: 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 j(cp, -1));..
7de0: 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 }...} else {..
7df0: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
7e00: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c NewStringObj("",
7e10: 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 0);.. for (in
7e20: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
7e30: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 SSL_CIPHER_num(s
7e40: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e k); i++) {...con
7e50: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
7e60: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 = sk_SSL_CIPHER
7e70: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 _value(sk, i);..
7e80: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 .if (c == NULL)
7e90: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 continue;..../*
7ea0: 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 textual descript
7eb0: 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 ion of the ciphe
7ec0: 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 r */...if (SSL_C
7ed0: 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f IPHER_descriptio
7ee0: 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 n(c, buf, sizeof
7ef0: 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 (buf)) != NULL)
7f00: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {... Tcl_Appe
7f10: 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 ndToObj(objPtr,
7f20: 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 buf, (Tcl_Size)
7f30: 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 strlen(buf));...
7f40: 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 } else {... T
7f50: 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f cl_AppendToObj(o
7f60: 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c bjPtr, "UNKNOWN\
7f70: 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 n", 8);...}..
7f80: 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 }..}..if (use_s
7f90: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 upported) {..
7fa0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 sk_SSL_CIPHER_f
7fb0: 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 ree(sk);..}.
7fc0: 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 }. SSL_free(s
7fd0: 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 sl);. SSL_CTX
7fe0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 _free(ctx);..
7ff0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
8000: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8010: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
8020: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
8030: 2d 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 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f --. *. * Protoco
8080: 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 lsObjCmd -- list
8090: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f available proto
80a0: 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 cols. *. *.This
80b0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
80c0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
80d0: 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 the "tls::protoc
80e0: 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ols" command. *.
80f0: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c to list availabl
8100: 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a e protocols.. *.
8110: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
8120: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
8130: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a sult list.. *. *
8140: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
8150: 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 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 0a ---------------.
81a0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a */..static int.
81b0: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 ProtocolsObjCmd(
81c0: 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 . TCL_UNUSED(
81d0: 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c void *),. Tcl
81e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
81f0: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 . int objc,.
8200: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 Tcl_Obj *cons
8210: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
8220: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
8230: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
8240: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
8250: 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 (objc != 1) {..
8260: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
8270: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
8280: 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 , "");..return T
8290: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
82a0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
82b0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a rror();.. obj
82c0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
82d0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
82e0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
82f0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
8300: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
8310: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
8320: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
8330: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 L_NO_SSL2). T
8340: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
8350: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
8360: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
8370: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
8380: 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 ls[TLS_SSL2], -1
8390: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
83a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
83b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
83c0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 NSSL_NO_SSL3) &&
83d0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
83e0: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
83f0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
8400: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
8410: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
8420: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8430: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 protocols[TLS_SS
8440: 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 L3], -1));.#endi
8450: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
8460: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
8470: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
8480: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
8490: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
84a0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
84b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
84c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
84d0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
84e0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
84f0: 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 [TLS_TLS1], -1))
8500: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
8510: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
8520: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
8530: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 NSSL_NO_TLS1_1)
8540: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
8550: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 SSL_NO_TLS1_1_ME
8560: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 THOD). Tcl_Li
8570: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
8580: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
8590: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
85a0: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
85b0: 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b S_TLS1_1], -1));
85c0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
85d0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
85e0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
85f0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 SSL_NO_TLS1_2) &
8600: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
8610: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 SL_NO_TLS1_2_MET
8620: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 HOD). Tcl_Lis
8630: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8640: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8650: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
8660: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
8670: 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a _TLS1_2], -1));.
8680: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
8690: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
86a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
86b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
86c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
86d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
86e0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
86f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
8700: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 ocols[TLS_TLS1_3
8710: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
8720: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
8730: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
8740: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
8750: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
8760: 0a 20 2a 2d 2d 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 0a 20 2a 0a 20 2a 20 48 61 6e ------. *. * Han
87b0: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a dshakeObjCmd --.
87c0: 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 *. *.This comma
87d0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 nd is used to ve
87e0: 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68 65 rify whether the
87f0: 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f handshake is co
8800: 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 mplete. *.or not
8810: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
8820: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
8830: 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 cl result. 1 mea
8840: 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d ns handshake com
8850: 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 plete, 0 means p
8860: 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 ending.. *. * Si
8870: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
8880: 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 ay force SSL neg
8890: 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 otiation to take
88a0: 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 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: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
8900: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 HandshakeObjCmd
8910: 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 (. TCL_UNUSED
8920: 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 (void *),. Tc
8930: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
8940: 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a ,. int objc,.
8950: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e Tcl_Obj *con
8960: 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 st objv[]).{.
8970: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
8980: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 n; /* The
8990: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 channel to set
89a0: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 a mode on. */.
89b0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
89c0: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 r; /* cli
89d0: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 ent state for ss
89e0: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 l socket */.
89f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 const char *errS
8a00: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 tr = NULL;. i
8a10: 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 nt ret = 1;.
8a20: 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 int err = 0;..
8a30: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
8a40: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
8a50: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
8a60: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
8a70: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
8a80: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 hannel");..retur
8a90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
8aa0: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
8ab0: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 r_error();..
8ac0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
8ad0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
8ae0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
8af0: 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 [1]), NULL);.
8b00: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
8b10: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
8b20: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
8b30: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
8b40: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
8b50: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
8b60: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
8b70: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
8b80: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
8b90: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
8ba0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
8bb0: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
8bc0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
8bd0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
8be0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
8bf0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
8c00: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
8c10: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 han),..."\": not
8c20: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
8c30: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
8c40: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
8c50: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
8c60: 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 43 "HANDSHAKE", "C
8c70: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
8c80: 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c D", (char *)NULL
8c90: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
8ca0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
8cb0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
8cc0: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e e *)Tcl_GetChann
8cd0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
8ce0: 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e han);.. dprin
8cf0: 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f tf("Calling Tls_
8d00: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 WaitForConnect")
8d10: 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f ;. ret = Tls_
8d20: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 WaitForConnect(s
8d30: 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31 tatePtr, &err, 1
8d40: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 );. dprintf("
8d50: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
8d60: 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22 ct returned: %i"
8d70: 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 , ret);.. if
8d80: 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 74 (ret < 0 && ((st
8d90: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 atePtr->flags &
8da0: 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 TLS_TCL_ASYNC) &
8db0: 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e & (err == EAGAIN
8dc0: 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 ))) {..dprintf("
8dd0: 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 Async set and er
8de0: 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 r = EAGAIN");..r
8df0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c et = 0;. } el
8e00: 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 se if (ret < 0)
8e10: 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a {..long result;.
8e20: 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 .errStr = stateP
8e30: 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 tr->err;..Tcl_Re
8e40: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 setResult(interp
8e50: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f );..Tcl_SetErrno
8e60: 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 (err);...if (!er
8e70: 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 rStr || (*errStr
8e80: 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65 == 0)) {.. e
8e90: 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 rrStr = Tcl_Posi
8ea0: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a xError(interp);.
8eb0: 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 .}...Tcl_AppendR
8ec0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 esult(interp, "h
8ed0: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a andshake failed:
8ee0: 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61 ", errStr, (cha
8ef0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 r *)NULL);..if (
8f00: 28 72 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65 (result = SSL_ge
8f10: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 t_verify_result(
8f20: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 statePtr->ssl))
8f30: 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a != X509_V_OK) {.
8f40: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
8f50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 esult(interp, "
8f60: 64 75 65 20 74 6f 20 5c 22 22 2c 20 58 35 30 39 due to \"", X509
8f70: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 _verify_cert_err
8f80: 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 75 6c 74 or_string(result
8f90: 29 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20 2a ), "\"", (char *
8fa0: 29 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f )NULL);..}..Tcl_
8fb0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
8fc0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e erp, "TLS", "HAN
8fd0: 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45 44 DSHAKE", "FAILED
8fe0: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
8ff0: 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 ;..dprintf("Retu
9000: 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 rning TCL_ERROR
9010: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20 66 with handshake f
9020: 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 53 ailed: %s", errS
9030: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c tr);..return TCL
9040: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c _ERROR;. } el
9050: 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d se {..if (err !=
9060: 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 0) {.. dprin
9070: 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 tf("Got an error
9080: 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 with a complete
9090: 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 d handshake: err
90a0: 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d = %i", err);..}
90b0: 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d ..ret = 1;. }
90c0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
90d0: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 eturning TCL_OK
90e0: 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 with data \"%i\"
90f0: 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c ", ret);. Tcl
9100: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
9110: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 terp, Tcl_NewInt
9120: 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 Obj(ret));. r
9130: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
9140: 0a 2f 2a 0a 20 2a 2d 2d 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 0a 20 2a 0a 20 2a 20 ---------. *. *
9190: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a ImportObjCmd --.
91a0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
91b0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
91c0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
91d0: 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a ssl" command. *.
91e0: 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 *.The ssl comma
91f0: 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 nd pushes SSL ov
9200: 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e er a (newly conn
9210: 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 ected) tcp socke
9220: 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a t. *. * Results:
9230: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
9240: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
9250: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
9260: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 *.May modify the
9270: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 behavior of an
9280: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 IO channel.. *.
9290: 2a 2d 2d 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 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
92e0: 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d int.ImportObjCm
92f0: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 d(. TCL_UNUSE
9300: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 D(void *),. T
9310: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
9320: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c p,. int objc,
9330: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f . Tcl_Obj *co
9340: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 nst objv[]).{.
9350: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
9360: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
9370: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
9380: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 e on. */. Sta
9390: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f te *statePtr;../
93a0: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
93b0: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
93c0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
93d0: 78 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 x..= NULL;. T
93e0: 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 cl_Obj *script..
93f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
9400: 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 3d Obj *password..=
9410: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
9420: 62 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c bj *vcmd..= NULL
9430: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
9440: 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 g upperChannelTr
9450: 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 anslation, upper
9460: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c ChannelBlocking,
9470: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 upperChannelEnc
9480: 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e oding, upperChan
9490: 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 nelEOFChar;.
94a0: 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c int idx;. Tcl
94b0: 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 _Size len;. i
94c0: 6e 74 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 nt flags...= TLS
94d0: 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 _TCL_INIT;. i
94e0: 6e 74 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b nt server...= 0;
94f0: 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f ./* is connectio
9500: 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 n incoming or ou
9510: 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 tgoing? */. c
9520: 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 har *keyfile..=
9530: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
9540: 63 65 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c certfile..= NULL
9550: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ;. unsigned c
9560: 68 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c har *key..= NULL
9570: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b ;. Tcl_Size k
9580: 65 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 ey_len..= 0;.
9590: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
95a0: 63 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 cert..= NULL;.
95b0: 20 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f Tcl_Size cert_
95c0: 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 len..= 0;. ch
95d0: 61 72 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e ar *ciphers..= N
95e0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 ULL;. char *c
95f0: 69 70 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e iphersuites..= N
9600: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 ULL;. char *C
9610: 41 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 Afile..= NULL;.
9620: 20 20 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 char *CApath.
9630: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 .= NULL;. cha
9640: 72 20 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 4e r *DHparams..= N
9650: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d ULL;. char *m
9660: 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 20 odel...= NULL;.
9670: 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e char *servern
9680: 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 ame..= NULL;./*
9690: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 hostname for Ser
96a0: 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 ver Name Indicat
96b0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 ion */. char
96c0: 2a 73 65 73 73 69 6f 6e 5f 69 64 09 09 3d 20 4e *session_id..= N
96d0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
96e0: 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a *alpn..= NULL;.
96f0: 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 int ssl2 = 0
9700: 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 , ssl3 = 0;.
9710: 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c int tls1 = 1, tl
9720: 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 s1_1 = 1, tls1_2
9730: 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 = 1, tls1_3 = 1
9740: 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 ;. int proto
9750: 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b = 0, level = -1;
9760: 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 . int verify
9770: 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 = 0, require = 0
9780: 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 , request = 1, p
9790: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 ost_handshake =
97a0: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
97b0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 "Called");..#if
97c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
97d0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
97e0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 SSL_NO_TLS1).
97f0: 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 tls1 = 0;.#endi
9800: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
9810: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
9820: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
9830: 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f LS1_1). tls1_
9840: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
9850: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
9860: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_2) || defined(
9870: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
9880: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 2). tls1_2 =
9890: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
98a0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
98b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
98c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 SSL_NO_TLS1_3).
98d0: 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 tls1_3 = 0;.#
98e0: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f endif.. if (o
98f0: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f bjc < 2) {..Tcl_
9900: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
9910: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
9920: 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f hannel ?options?
9930: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
9940: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
9950: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
9960: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d r();.. chan =
9970: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
9980: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
9990: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 tring(objv[1]),
99a0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
99b0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
99c0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
99d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
99e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
99f0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
9a00: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
9a10: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
9a20: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
9a30: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
9a40: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d .. for (idx =
9a50: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 2; idx < objc;
9a60: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a idx++) {..char *
9a70: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 opt = Tcl_GetStr
9a80: 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a ing(objv[idx]);.
9a90: 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 ..if (opt[0] !=
9aa0: 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b '-').. break;
9ab0: 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e ...OPTOBJ("-alpn
9ac0: 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 ", alpn);..OPTST
9ad0: 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61 R("-cadir", CApa
9ae0: 74 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 th);..OPTSTR("-c
9af0: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b afile", CAfile);
9b00: 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 ..OPTBYTE("-cert
9b10: 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 ", cert, cert_le
9b20: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 n);..OPTSTR("-ce
9b30: 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c rtfile", certfil
9b40: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 e);..OPTSTR("-ci
9b50: 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b pher", ciphers);
9b60: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 ..OPTSTR("-ciphe
9b70: 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 rs", ciphers);..
9b80: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 OPTSTR("-ciphers
9b90: 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 uites", ciphersu
9ba0: 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 ites);..OPTOBJ("
9bb0: 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 -command", scrip
9bc0: 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 t);..OPTSTR("-dh
9bd0: 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d params", DHparam
9be0: 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b s);..OPTBYTE("-k
9bf0: 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 ey", key, key_le
9c00: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 n);..OPTSTR("-ke
9c10: 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 yfile", keyfile)
9c20: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 ;..OPTSTR("-mode
9c30: 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 l", model);..OPT
9c40: 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c OBJ("-password",
9c50: 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 password);..OPT
9c60: 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 BOOL("-post_hand
9c70: 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e shake", post_han
9c80: 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f dshake);..OPTBOO
9c90: 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 L("-request", re
9ca0: 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c quest);..OPTBOOL
9cb0: 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 ("-require", req
9cc0: 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 uire);..OPTINT("
9cd0: 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 -security_level"
9ce0: 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f , level);..OPTBO
9cf0: 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 OL("-server", se
9d00: 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 rver);..OPTSTR("
9d10: 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 -servername", se
9d20: 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 rvername);..OPTS
9d30: 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 TR("-session_id"
9d40: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 , session_id);..
9d50: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c OPTBOOL("-ssl2",
9d60: 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c ssl2);..OPTBOOL
9d70: 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b ("-ssl3", ssl3);
9d80: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
9d90: 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f ", tls1);..OPTBO
9da0: 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c OL("-tls1.1", tl
9db0: 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 s1_1);..OPTBOOL(
9dc0: 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f "-tls1.2", tls1_
9dd0: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 2);..OPTBOOL("-t
9de0: 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b ls1.3", tls1_3);
9df0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 ..OPTOBJ("-valid
9e00: 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d atecommand", vcm
9e10: 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 d);..OPTOBJ("-vc
9e20: 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 md", vcmd);...OP
9e30: 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 TBAD("option", "
9e40: 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d -alpn, -cadir, -
9e50: 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d cafile, -cert, -
9e60: 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 certfile, -ciphe
9e70: 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 r, -ciphersuites
9e80: 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 , -command, -dhp
9e90: 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 arams, -key, -ke
9ea0: 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d yfile, -model, -
9eb0: 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f password, -post_
9ec0: 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 handshake, -requ
9ed0: 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d est, -require, -
9ee0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 security_level,
9ef0: 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 -server, -server
9f00: 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 name, -session_i
9f10: 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c d, -ssl2, -ssl3,
9f20: 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c -tls1, -tls1.1,
9f30: 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e -tls1.2, -tls1.
9f40: 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 3, or -validatec
9f50: 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 ommand");...retu
9f60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
9f70: 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 }. if (requ
9f80: 65 73 74 29 09 20 20 20 20 76 65 72 69 66 79 20 est). verify
9f90: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c |= SSL_VERIFY_CL
9fa0: 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f IENT_ONCE | SSL_
9fb0: 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 VERIFY_PEER;.
9fc0: 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 if (request &&
9fd0: 72 65 71 75 69 72 65 29 20 76 65 72 69 66 79 20 require) verify
9fe0: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 |= SSL_VERIFY_FA
9ff0: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 IL_IF_NO_PEER_CE
a000: 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 RT;. if (requ
a010: 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 est && post_hand
a020: 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d shake).verify |=
a030: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 SSL_VERIFY_POST
a040: 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 _HANDSHAKE;.
a050: 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 if (verify == 0)
a060: 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 .verify = SSL_VE
a070: 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 RIFY_NONE;..
a080: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f proto |= (ssl2 ?
a090: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 TLS_PROTO_SSL2
a0a0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
a0b0: 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 |= (ssl3 ? TLS_P
a0c0: 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a ROTO_SSL3 : 0);.
a0d0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
a0e0: 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 s1 ? TLS_PROTO_T
a0f0: 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 LS1 : 0);. pr
a100: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f oto |= (tls1_1 ?
a110: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
a120: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 1 : 0);. prot
a130: 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 o |= (tls1_2 ? T
a140: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 LS_PROTO_TLS1_2
a150: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
a160: 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 |= (tls1_3 ? TLS
a170: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 _PROTO_TLS1_3 :
a180: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 0);.. /* rese
a190: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 t to NULL if bla
a1a0: 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 nk string provid
a1b0: 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 ed */. if (ce
a1c0: 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 rt && !*cert)..
a1d0: 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20 cert.
a1e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a1f0: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 if (key && !*key
a200: 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 ).. key.
a210: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a220: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 if (certfile
a230: 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 && !*certfile)
a240: 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 certfile.
a250: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a260: 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 keyfile && !*key
a270: 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 file)..keyfile.
a280: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a290: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 if (ciphers &
a2a0: 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 & !*ciphers).
a2b0: 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20 ciphers.
a2c0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
a2d0: 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65 if (ciphersuite
a2e0: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 s && !*ciphersui
a2f0: 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65 tes) ciphersuite
a300: 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 s = NULL;.
a310: 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 if (CAfile && !
a320: 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 *CAfile).
a330: 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 CAfile.
a340: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
a350: 43 41 70 61 74 68 20 26 26 20 21 2a 43 41 70 61 CApath && !*CApa
a360: 74 68 29 09 20 20 20 20 20 20 20 20 43 41 70 61 th). CApa
a370: 74 68 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c th. = NUL
a380: 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 L;. if (DHpar
a390: 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d ams && !*DHparam
a3a0: 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61 72 s). DHpar
a3b0: 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ams = NUL
a3c0: 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 L;.. /* new S
a3d0: 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 SL state */.
a3e0: 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 statePtr..= (Sta
a3f0: 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 te *) ckalloc((u
a400: 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 nsigned) sizeof(
a410: 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d State));. mem
a420: 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c set(statePtr, 0,
a430: 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b sizeof(State));
a440: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
a450: 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 flags.= flags;.
a460: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 statePtr->int
a470: 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 erp.= interp;.
a480: 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 statePtr->vfla
a490: 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 gs.= verify;.
a4a0: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d statePtr->err.=
a4b0: 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c "";.. /* all
a4c0: 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a ocate script */.
a4d0: 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29 20 if (script)
a4e0: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 {..(void) Tcl_Ge
a4f0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 tStringFromObj(s
a500: 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 cript, &len);..i
a510: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 f (len) {.. s
a520: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
a530: 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 k = script;..
a540: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
a550: 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c t(statePtr->call
a560: 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a back);..}. }.
a570: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 . /* allocate
a580: 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 password */.
a590: 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b if (password) {
a5a0: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 ..(void) Tcl_Get
a5b0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 StringFromObj(pa
a5c0: 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 ssword, &len);..
a5d0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 if (len) {..
a5e0: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
a5f0: 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 rd = password;..
a600: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
a610: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 ount(statePtr->p
a620: 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 assword);..}.
a630: 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 }.. /* alloc
a640: 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d ate validate com
a650: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 mand */. if (
a660: 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 vcmd) {..(void)
a670: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
a680: 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 mObj(vcmd, &len)
a690: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 ;..if (len) {..
a6a0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d statePtr->vcm
a6b0: 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 d = vcmd;.. T
a6c0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
a6d0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
a6e0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 ..}. }.. i
a6f0: 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c f (model != NULL
a700: 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 ) {..int mode;..
a710: 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 /* Get the "mode
a720: 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 l" context */..c
a730: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
a740: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 nnel(interp, mod
a750: 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 el, &mode);..if
a760: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
a770: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
a780: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 73 74 61 Tls_Free(sta
a790: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
a7a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
a7b0: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 }.../*.. * Make
a7c0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
a7d0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
a7e0: 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 hannel.. */..cha
a7f0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
a800: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 annel(chan);..if
a810: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
a820: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
a830: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
a840: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
a850: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
a860: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
a870: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
a880: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 20 lName(chan),...
a890: 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c "\": not a TL
a8a0: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 S channel", (cha
a8b0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
a8c0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
a8d0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
a8e0: 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e "IMPORT", "CHANN
a8f0: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
a900: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 (char *)NULL);..
a910: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 73 74 61 Tls_Free(sta
a920: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
a930: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
a940: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 }..ctx = ((State
a950: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
a960: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
a970: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d an))->ctx;. }
a980: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 else {..if ((ct
a990: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 x = CTX_Init(sta
a9a0: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 tePtr, server, p
a9b0: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 roto, keyfile, c
a9c0: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 ertfile, key, ce
a9d0: 72 74 2c 20 28 69 6e 74 29 6b 65 79 5f 6c 65 6e rt, (int)key_len
a9e0: 2c 0a 09 09 28 69 6e 74 29 63 65 72 74 5f 6c 65 ,...(int)cert_le
a9f0: 6e 2c 20 43 41 70 61 74 68 2c 20 43 41 66 69 6c n, CApath, CAfil
aa00: 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 e, ciphers, ciph
aa10: 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c ersuites, level,
aa20: 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e DHparams)) == N
aa30: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f ULL) {.. Tls_
aa40: 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a Free(statePtr);.
aa50: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
aa60: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
aa70: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 . statePtr->c
aa80: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f tx = ctx;.. /
aa90: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 *. * We need
aaa0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 to make sure th
aab0: 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 at the channel w
aac0: 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 orks in binary (
aad0: 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 for the. * e
aae0: 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f ncryption not to
aaf0: 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e get goofed up).
ab00: 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 . * We only
ab10: 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 want to adjust t
ab20: 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 he buffering in
ab30: 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c pre-v2 channels,
ab40: 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 where. * ea
ab50: 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 ch channel in th
ab60: 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e e stack maintain
ab70: 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 ed its own buffe
ab80: 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 rs.. */.
ab90: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
aba0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
abb0: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
abc0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
abd0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
abe0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 king);. Tcl_D
abf0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
ac00: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
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 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 nelEncoding);.
ac40: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
ac50: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
ac60: 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c han, "-eofchar",
ac70: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f &upperChannelEO
ac80: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f FChar);. Tcl_
ac90: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
aca0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
acb0: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 -encoding", &upp
acc0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
acd0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 g);. Tcl_GetC
ace0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
acf0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 erp, chan, "-tra
ad00: 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 nslation", &uppe
ad10: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
ad20: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ion);. Tcl_Ge
ad30: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
ad40: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 nterp, chan, "-b
ad50: 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 locking", &upper
ad60: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 ChannelBlocking)
ad70: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
ad80: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
ad90: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 p, chan, "-trans
ada0: 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 lation", "binary
adb0: 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ");. Tcl_SetC
adc0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
add0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f erp, chan, "-blo
ade0: 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b cking", "true");
adf0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f . dprintf("Co
ae00: 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e nsuming Tcl chan
ae10: 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 nel %s", Tcl_Get
ae20: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
ae30: 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 ));. statePtr
ae40: 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 ->self = Tcl_Sta
ae50: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 ckChannel(interp
ae60: 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 , Tls_ChannelTyp
ae70: 65 28 29 2c 20 73 74 61 74 65 50 74 72 2c 20 28 e(), statePtr, (
ae80: 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 TCL_READABLE | T
ae90: 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 CL_WRITABLE), ch
aea0: 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 an);. dprintf
aeb0: 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 ("Created channe
aec0: 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c l named %s", Tcl
aed0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
aee0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 statePtr->self))
aef0: 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 ;. if (stateP
af00: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c tr->self == (Tcl
af10: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
af20: 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 {../*.. * No use
af30: 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c of Tcl_Eventual
af40: 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e lyFree because n
af50: 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 o possible Tcl_P
af60: 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 reserve... */..T
af70: 6c 73 5f 46 72 65 65 28 73 74 61 74 65 50 74 72 ls_Free(statePtr
af80: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
af90: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
afa0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
afb0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
afc0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
afd0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 translation", Tc
afe0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
aff0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
b000: 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 slation));. T
b010: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
b020: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
b030: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e ePtr->self, "-en
b040: 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 coding", Tcl_DSt
b050: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
b060: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
b070: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
b080: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
b090: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
b0a0: 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 lf, "-eofchar",
b0b0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
b0c0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f (&upperChannelEO
b0d0: 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c FChar));. Tcl
b0e0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
b0f0: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
b100: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 tr->self, "-bloc
b110: 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 king", Tcl_DStri
b120: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
b130: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b annelBlocking));
b140: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
b150: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
b160: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
b170: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
b180: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 ree(&upperChanne
b190: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 lEncoding);.
b1a0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
b1b0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
b1c0: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 Char);. Tcl_D
b1d0: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
b1e0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
b1f0: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 );.. /*.
b200: 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 * SSL Initializa
b210: 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 tion. */.
b220: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d statePtr->ssl =
b230: 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 SSL_new(statePt
b240: 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 r->ctx);. if
b250: 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 (!statePtr->ssl)
b260: 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 {../* SSL libra
b270: 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c ry error */..Tcl
b280: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
b290: 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 terp, "couldn't
b2a0: 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 construct ssl se
b2b0: 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f 45 52 ssion: ", GET_ER
b2c0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
b2d0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f r *)NULL);..Tcl_
b2e0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
b2f0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
b300: 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 ORT", "INIT", "F
b310: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
b320: 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 NULL);..Tls_Free
b330: 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 (statePtr);..ret
b340: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
b350: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
b360: 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d host server nam
b370: 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 e */. if (ser
b380: 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 vername) {../* S
b390: 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e ets the server n
b3a0: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 ame indication (
b3b0: 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 SNI) in ClientHe
b3c0: 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f llo extension */
b3d0: 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 ../* Per RFC 606
b3e0: 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 6, hostname is a
b3f0: 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 ASCII encoded s
b400: 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 tring, though RF
b410: 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d C 4366 says UTF-
b420: 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 8. */..if (!SSL_
b430: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f set_tlsext_host_
b440: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 name(statePtr->s
b450: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 sl, servername)
b460: 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 && require) {..
b470: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
b480: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
b490: 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 SNI extension f
b4a0: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 ailed: ", GET_ER
b4b0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
b4c0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
b4d0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
b4e0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
b4f0: 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c "IMPORT", "SNI",
b500: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
b510: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *)NULL);.. T
b520: 6c 73 5f 46 72 65 65 28 73 74 61 74 65 50 74 72 ls_Free(statePtr
b530: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
b540: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
b550: 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 * Set hostname f
b560: 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63 or peer certific
b570: 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 ate hostname ver
b580: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 ification in cli
b590: 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 ents... Don't
b5a0: 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 use SSL_set1_hos
b5b0: 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c t since it has l
b5c0: 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 imitations. */..
b5d0: 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f if (!SSL_add1_ho
b5e0: 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c st(statePtr->ssl
b5f0: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b , servername)) {
b600: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
b610: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b620: 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 Set DNS hostname
b630: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f failed: ", GET_
b640: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
b650: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 har *)NULL);..
b660: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
b670: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b680: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 , "IMPORT", "HOS
b690: 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 TNAME", "FAILED"
b6a0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
b6b0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 73 .. Tls_Free(s
b6c0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
b6d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b6e0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
b6f0: 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e * Resume session
b700: 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 id */. if (s
b710: 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 ession_id && str
b720: 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 len(session_id)
b730: 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 <= SSL_MAX_SID_C
b740: 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a TX_LENGTH) {../*
b750: 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e SSL_set_session
b760: 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f () */..if (!SSL_
b770: 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f SESSION_set1_id_
b780: 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f context(SSL_get_
b790: 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 session(statePtr
b7a0: 2d 3e 73 73 6c 29 2c 0a 09 09 28 63 6f 6e 73 74 ->ssl),...(const
b7b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
b7c0: 29 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 ) session_id, (u
b7d0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 nsigned int) str
b7e0: 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 len(session_id))
b7f0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
b800: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
b810: 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f , "Resume sessio
b820: 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 n failed: ", GET
b830: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
b840: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 char *)NULL);..
b850: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
b860: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
b870: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 ", "IMPORT", "SE
b880: 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 SSION", "FAILED"
b890: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
b8a0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 73 .. Tls_Free(s
b8b0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
b8c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b8d0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
b8e0: 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 * Enable Applica
b8f0: 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f tion-Layer Proto
b900: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e col Negotiation.
b910: 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 Examples are: h
b920: 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 ttp/1.0,..http/1
b930: 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c .1, h2, h3, ftp,
b940: 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 imap, pop3, xmp
b950: 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 p-client, xmpp-s
b960: 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 erver, mqtt, irc
b970: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 , etc. */. if
b980: 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f (alpn) {../* Co
b990: 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 nvert a TCL list
b9a0: 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c into a protocol
b9b0: 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f -list in wire-fo
b9c0: 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 rmat */..unsigne
b9d0: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 d char *protos,
b9e0: 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e *p;..unsigned in
b9f0: 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 t protos_len = 0
ba00: 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c ;..Tcl_Size cnt,
ba10: 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c i;..int j;..Tcl
ba20: 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 _Obj **list;...i
ba30: 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 f (Tcl_ListObjGe
ba40: 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 tElements(interp
ba50: 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c , alpn, &cnt, &l
ba60: 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ist) != TCL_OK)
ba70: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 {.. Tls_Free(
ba80: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
ba90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
baa0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d ;..}.../* Determ
bab0: 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 ine the memory r
bac0: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 equired for the
bad0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f protocol-list */
bae0: 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 ..for (i = 0; i
baf0: 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 < cnt; i++) {..
bb00: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 Tcl_GetString
bb10: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c FromObj(list[i],
bb20: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 &len);.. if
bb30: 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 (len > 255) {...
bb40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
bb50: 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 (interp, "ALPN p
bb60: 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f rotocol names to
bb70: 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a o long", (char *
bb80: 29 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 )NULL);...Tcl_Se
bb90: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
bba0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
bbb0: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 T", "ALPN", "FAI
bbc0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 LED", (char *)NU
bbd0: 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 LL);...Tls_Free(
bbe0: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 statePtr);...ret
bbf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
bc00: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f }.. proto
bc10: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e s_len += 1 + (in
bc20: 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 t) len;..}.../*
bc30: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 Build the comple
bc40: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 te protocol-list
bc50: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b */..protos = ck
bc60: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e alloc(protos_len
bc70: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d );../* protocol-
bc80: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 lists consist of
bc90: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 8-bit length-pr
bca0: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 efixed, byte str
bcb0: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 ings */..for (j
bcc0: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b = 0, p = protos;
bcd0: 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b j < cnt; j++) {
bce0: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 .. char *str
bcf0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
bd00: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 romObj(list[j],
bd10: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b &len);.. *p++
bd20: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 = (unsigned cha
bd30: 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d r) len;.. mem
bd40: 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a cpy(p, str, (siz
bd50: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 e_t) len);..
bd60: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f p += len;..}.../
bd70: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 * SSL_set_alpn_p
bd80: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f rotos makes a co
bd90: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 py of the protoc
bda0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e ol-list */../* N
bdb0: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 ote: This functi
bdc0: 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68 65 20 on reverses the
bdd0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e return value con
bde0: 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 vention */..if (
bdf0: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f SSL_set_alpn_pro
be00: 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 tos(statePtr->ss
be10: 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f l, protos, proto
be20: 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 s_len)) {.. T
be30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
be40: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c 50 interp, "Set ALP
be50: 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c N protocols fail
be60: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 ed: ", GET_ERR_R
be70: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
be80: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c )NULL);.. Tcl
be90: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
bea0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
beb0: 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 PORT", "ALPN", "
bec0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
bed0: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 )NULL);.. Tls
bee0: 5f 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b _Free(statePtr);
bef0: 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f .. ckfree(pro
bf00: 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72 tos);.. retur
bf10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
bf20: 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f ../* Store proto
bf30: 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 cols list */..st
bf40: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d atePtr->protos =
bf50: 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 protos;..stateP
bf60: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d tr->protos_len =
bf70: 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 protos_len;.
bf80: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 } else {..state
bf90: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 Ptr->protos = NU
bfa0: 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 LL;..statePtr->p
bfb0: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 rotos_len = 0;.
bfc0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
bfd0: 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b * SSL Callback
bfe0: 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 s. */. SS
bff0: 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73 L_set_app_data(s
c000: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 tatePtr->ssl, (v
c010: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
c020: 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 ./* point back t
c030: 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f o us */. SSL_
c040: 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 65 set_verify(state
c050: 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 Ptr->ssl, verify
c060: 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b , VerifyCallback
c070: 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 );. SSL_set_i
c080: 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 nfo_callback(sta
c090: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f tePtr->ssl, Info
c0a0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 Callback);..
c0b0: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 /* Callback for
c0c0: 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 observing protoc
c0d0: 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 ol messages */.#
c0e0: 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e ifndef OPENSSL_N
c0f0: 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 O_SSL_TRACE.
c100: 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f /* void SSL_CTX_
c110: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
c120: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 _arg(statePtr->c
c130: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 tx, (void *)stat
c140: 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 ePtr);. void
c150: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f SSL_CTX_set_msg_
c160: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
c170: 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 43 r->ctx, MessageC
c180: 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 allback); */.
c190: 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c SSL_set_msg_cal
c1a0: 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 lback_arg(stateP
c1b0: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a tr->ssl, (void *
c1c0: 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 )statePtr);.
c1d0: 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c SSL_set_msg_call
c1e0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 back(statePtr->s
c1f0: 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 sl, MessageCallb
c200: 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 ack);.#endif..
c210: 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f /* Create Tcl_
c220: 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 Channel BIO Hand
c230: 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 ler */. state
c240: 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f Ptr->p_bio.= BIO
c250: 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 _new_tcl(statePt
c260: 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b r, BIO_NOCLOSE);
c270: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 . statePtr->b
c280: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f io.= BIO_new(BIO
c290: 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 _f_ssl());..
c2a0: 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f if (server) {../
c2b0: 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 * Server callbac
c2c0: 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ks */..SSL_CTX_s
c2d0: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 et_tlsext_server
c2e0: 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74 name_arg(statePt
c2f0: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 r->ctx, (void *)
c300: 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f statePtr);..SSL_
c310: 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 CTX_set_tlsext_s
c320: 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 ervername_callba
c330: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ck(statePtr->ctx
c340: 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a , SNICallback);.
c350: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 .SSL_CTX_set_cli
c360: 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 ent_hello_cb(sta
c370: 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c tePtr->ctx, Hell
c380: 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 oCallback, (void
c390: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 69 *)statePtr);..i
c3a0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f f (statePtr->pro
c3b0: 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 tos != NULL) {..
c3c0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
c3d0: 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 alpn_select_cb(s
c3e0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c tatePtr->ctx, AL
c3f0: 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 PNCallback, (voi
c400: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23 d *)statePtr);.#
c410: 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 ifdef USE_NPN..
c420: 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d if (tls1_2 ==
c430: 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 0 && tls1_3 ==
c440: 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 0) {...SSL_CTX_s
c450: 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 et_next_protos_a
c460: 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 74 61 dvertised_cb(sta
c470: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 tePtr->ctx, NPNC
c480: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
c490: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 )statePtr);..
c4a0: 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f }.#endif..}.../
c4b0: 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72 20 * Enable server
c4c0: 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65 71 to send cert req
c4d0: 75 65 73 74 20 61 66 74 65 72 20 68 61 6e 64 73 uest after hands
c4e0: 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e hake (TLS 1.3 on
c4f0: 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 ly) */../* A wri
c500: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 te operation mus
c510: 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 t take place for
c520: 20 74 68 65 20 43 65 72 74 69 66 69 63 61 74 65 the Certificate
c530: 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a 09 Request to be..
c540: 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20 63 sent to the c
c550: 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 lient, this can
c560: 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53 4c be done with SSL
c570: 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e _do_handshake().
c580: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 */..if (request
c590: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 && post_handsha
c5a0: 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a ke && tls1_3) {.
c5b0: 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79 5f . SSL_verify_
c5c0: 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 client_post_hand
c5d0: 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d 3e shake(statePtr->
c5e0: 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 ssl);..}.../* se
c5f0: 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75 72 76 t automatic curv
c600: 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 e selection */..
c610: 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75 74 SSL_set_ecdh_aut
c620: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c o(statePtr->ssl,
c630: 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 65 1);.../* Set se
c640: 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 rver mode */..st
c650: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d atePtr->flags |=
c660: 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b TLS_TCL_SERVER;
c670: 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 ..SSL_set_accept
c680: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d _state(statePtr-
c690: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 >ssl);. } els
c6a0: 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 e {../* Client c
c6b0: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 allbacks */.#ifd
c6c0: 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 ef USE_NPN..if (
c6d0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
c6e0: 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 != NULL && tls1
c6f0: 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f _2 == 0 && tls1_
c700: 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 3 == 0) {.. S
c710: 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f SL_CTX_set_next_
c720: 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 proto_select_cb(
c730: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 statePtr->ctx, A
c740: 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f LPNCallback, (vo
c750: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
c760: 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 .}.#endif.../* S
c770: 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a ession caching *
c780: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 /..SSL_CTX_set_s
c790: 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 ession_cache_mod
c7a0: 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c e(statePtr->ctx,
c7b0: 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
c7c0: 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 CLIENT | SSL_SES
c7d0: 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 S_CACHE_NO_INTER
c7e0: 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c NAL_STORE);..SSL
c7f0: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 _CTX_sess_set_ne
c800: 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 w_cb(statePtr->c
c810: 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 tx, SessionCallb
c820: 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c ack);.../* Enabl
c830: 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 e post handshake
c840: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 Authentication
c850: 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 extension. TLS 1
c860: 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 .3 only, not htt
c870: 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 p/2. */..if (req
c880: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e uest && post_han
c890: 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 dshake) {.. S
c8a0: 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 SL_set_post_hand
c8b0: 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74 65 shake_auth(state
c8c0: 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d Ptr->ssl, 1);..}
c8d0: 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 .../* Set client
c8e0: 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 mode */..SSL_se
c8f0: 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 t_connect_state(
c900: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
c910: 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 }. SSL_se
c920: 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e t_bio(statePtr->
c930: 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 ssl, statePtr->p
c940: 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e _bio, statePtr->
c950: 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f p_bio);. BIO_
c960: 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72 set_ssl(statePtr
c970: 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d ->bio, statePtr-
c980: 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 >ssl, BIO_NOCLOS
c990: 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 E);.. /*.
c9a0: 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e * End of SSL In
c9b0: 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 it. */. d
c9c0: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
c9d0: 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 g %s", Tcl_GetCh
c9e0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
c9f0: 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 tr->self));.
ca00: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
ca10: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 54 63 terp, (char *)Tc
ca20: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
ca30: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
ca40: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b , TCL_VOLATILE);
ca50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
ca60: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
ca70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
caa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cab0: 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f . *. * UnimportO
cac0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 bjCmd --. *. *.T
cad0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
cae0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f invoked to remo
caf0: 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 ve the topmost c
cb00: 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 hannel filter..
cb10: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
cb20: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
cb30: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
cb40: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
cb50: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 ay modify the be
cb60: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 havior of an IO
cb70: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d channel.. *. *--
cb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbc0: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
cbd0: 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 t.UnimportObjCmd
cbe0: 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 (. TCL_UNUSED
cbf0: 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 (void *),. Tc
cc00: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
cc10: 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a ,. int objc,.
cc20: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e Tcl_Obj *con
cc30: 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 st objv[]).{.
cc40: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
cc50: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
cc60: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
cc70: 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 on. */.. dpr
cc80: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
cc90: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
cca0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
ccb0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
ccc0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
ccd0: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
cce0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
ccf0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
cd00: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
cd10: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
cd20: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a bjv[1]), NULL);.
cd30: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
cd40: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
cd50: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
cd60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
cd70: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
cd80: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
cd90: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
cda0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
cdb0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
cdc0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 el(chan);.. i
cdd0: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
cde0: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
cdf0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
ce00: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
ce10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
ce20: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
ce30: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
ce40: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a me(chan),..."\":
ce50: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
ce60: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c el", (char *)NUL
ce70: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f L);..Tcl_SetErro
ce80: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
ce90: 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c LS", "UNIMPORT",
cea0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
ceb0: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e ALID", (char *)N
cec0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
ced0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
cee0: 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 if (Tcl_Unst
cef0: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 ackChannel(inter
cf00: 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f p, chan) == TCL_
cf10: 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e ERROR) {..return
cf20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
cf30: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }.. return TC
cf40: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
cf50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf90: 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 --. *. * CTX_Ini
cfa0: 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 t -- construct a
cfb0: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 SSL_CTX instanc
cfc0: 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a e. *. * Results:
cfd0: 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f . *.A valid SSL_
cfe0: 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 CTX instance or
cff0: 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 NULL.. *. * Side
d000: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e effects:. *.con
d010: 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 structs SSL cont
d020: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d ext (CTX). *. *-
d030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d070: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 53 --. */..static S
d080: 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 SL_CTX *.CTX_Ini
d090: 74 28 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 t(. State *st
d0a0: 61 74 65 50 74 72 2c 0a 20 20 20 20 69 6e 74 20 atePtr,. int
d0b0: 69 73 53 65 72 76 65 72 2c 0a 20 20 20 20 69 6e isServer,. in
d0c0: 74 20 70 72 6f 74 6f 2c 0a 20 20 20 20 63 68 61 t proto,. cha
d0d0: 72 20 2a 6b 65 79 66 69 6c 65 2c 0a 20 20 20 20 r *keyfile,.
d0e0: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a char *certfile,.
d0f0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
d100: 72 20 2a 6b 65 79 2c 0a 20 20 20 20 75 6e 73 69 r *key,. unsi
d110: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c gned char *cert,
d120: 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e . int key_len
d130: 2c 0a 20 20 20 20 69 6e 74 20 63 65 72 74 5f 6c ,. int cert_l
d140: 65 6e 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 en,. char *CA
d150: 70 61 74 68 2c 0a 20 20 20 20 63 68 61 72 20 2a path,. char *
d160: 43 41 66 69 6c 65 2c 0a 20 20 20 20 63 68 61 72 CAfile,. char
d170: 20 2a 63 69 70 68 65 72 73 2c 0a 20 20 20 20 63 *ciphers,. c
d180: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 har *ciphersuite
d190: 73 2c 0a 20 20 20 20 69 6e 74 20 6c 65 76 65 6c s,. int level
d1a0: 2c 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 ,. char *DHpa
d1b0: 72 61 6d 73 29 0a 7b 0a 20 20 20 20 54 63 6c 5f rams).{. Tcl_
d1c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d Interp *interp =
d1d0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
d1e0: 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a p;. SSL_CTX *
d1f0: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
d200: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a Tcl_DString ds;.
d210: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 2c int off = 0,
d220: 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 abort = 0;.
d230: 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 int load_private
d240: 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 _key;. const
d250: 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 SSL_METHOD *meth
d260: 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 od;.. dprintf
d270: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
d280: 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 if (!proto) {..
d290: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d2a0: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c (interp, "no val
d2b0: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 id protocol sele
d2c0: 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e cted", (char *)N
d2d0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
d2e0: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f LL;. }.. /
d2f0: 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e * create SSL con
d300: 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e text */.#if OPEN
d310: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
d320: 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 ER >= 0x10100000
d330: 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f L || defined(NO_
d340: 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL2) || defined
d350: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
d360: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
d370: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d380: 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c TO_SSL2)) {..Tcl
d390: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d3a0: 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 terp, "SSL2 prot
d3b0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
d3c0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c ed", (char *)NUL
d3d0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
d3e0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
d3f0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 if defined(NO_SS
d400: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L3) || defined(O
d410: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a PENSSL_NO_SSL3).
d420: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
d430: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
d440: 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 _SSL3)) {..Tcl_A
d450: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
d460: 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 rp, "SSL3 protoc
d470: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
d480: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
d490: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
d4a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
d4b0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
d4c0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
d4d0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 NSSL_NO_TLS1).
d4e0: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
d4f0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
d500: 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 LS1)) {..Tcl_App
d510: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
d520: 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f , "TLS 1.0 proto
d530: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
d540: 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c d", (char *)NULL
d550: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
d560: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
d570: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
d580: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_1) || defined(
d590: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
d5a0: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 1). if (ENABL
d5b0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d5c0: 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 OTO_TLS1_1)) {..
d5d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d5e0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
d5f0: 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 1 protocol not s
d600: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
d610: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *)NULL);..retur
d620: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
d630: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
d640: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 (NO_TLS1_2) || d
d650: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d660: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 O_TLS1_2). if
d670: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
d680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
d690: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 2)) {..Tcl_Appen
d6a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
d6b0: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f "TLS 1.2 protoco
d6c0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
d6d0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
d6e0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
d6f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
d700: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
d710: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
d720: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
d730: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
d740: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d750: 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 O_TLS1_3)) {..Tc
d760: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d770: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 nterp, "TLS 1.3
d780: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
d790: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
d7a0: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 )NULL);..return
d7b0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
d7c0: 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f if. if (proto
d7d0: 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 == 0) {../* Use
d7e0: 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 full range */..
d7f0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f SSL_CTX_set_min_
d800: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
d810: 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f x, 0);..SSL_CTX_
d820: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 set_max_proto_ve
d830: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 rsion(ctx, 0);.
d840: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 }.. switch
d850: 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f (proto) {.#if O
d860: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
d870: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
d880: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
d890: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
d8a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d8b0: 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54 SSL2). case T
d8c0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 LS_PROTO_SSL2:..
d8d0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
d8e0: 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72 r ? SSLv2_server
d8f0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 _method() : SSLv
d900: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 2_client_method(
d910: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
d920: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
d930: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
d940: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
d950: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
d960: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
d970: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 _METHOD). cas
d980: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 e TLS_PROTO_SSL3
d990: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 :..method = isSe
d9a0: 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 rver ? SSLv3_ser
d9b0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 ver_method() : S
d9c0: 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 SLv3_client_meth
d9d0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
d9e0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
d9f0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 d(NO_TLS1) && !d
da00: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
da10: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
da20: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
da30: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 LS1_METHOD).
da40: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
da50: 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 LS1:..method = i
da60: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f sServer ? TLSv1_
da70: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
da80: 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d : TLSv1_client_m
da90: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
daa0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
dab0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
dac0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
dad0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 SSL_NO_TLS1_1) &
dae0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
daf0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 SL_NO_TLS1_1_MET
db00: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c HOD). case TL
db10: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a S_PROTO_TLS1_1:.
db20: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
db30: 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 er ? TLSv1_1_ser
db40: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 ver_method() : T
db50: 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 LSv1_1_client_me
db60: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
db70: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
db80: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 ned(NO_TLS1_2) &
db90: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
dba0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 SL_NO_TLS1_2) &&
dbb0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
dbc0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 L_NO_TLS1_2_METH
dbd0: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
dbe0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 _PROTO_TLS1_2:..
dbf0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 method = isServe
dc00: 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 r ? TLSv1_2_serv
dc10: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
dc20: 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 Sv1_2_client_met
dc30: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
dc40: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
dc50: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 ed(NO_TLS1_3) &&
dc60: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
dc70: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
dc80: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
dc90: 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 TLS1_3:../* Use
dca0: 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68 the generic meth
dcb0: 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e od and constrain
dcc0: 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f t range after co
dcd0: 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65 64 ntext is created
dce0: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 */..method = is
dcf0: 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 Server ? TLS_ser
dd00: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 ver_method() : T
dd10: 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 LS_client_method
dd20: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
dd30: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a if. default:.
dd40: 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69 ./* Negotiate hi
dd50: 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20 ghest available
dd60: 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 SSL/TLS version
dd70: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 */..method = isS
dd80: 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 erver ? TLS_serv
dd90: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c er_method() : TL
dda0: 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 S_client_method(
ddb0: 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 );.#if OPENSSL_V
ddc0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
ddd0: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 0x10100000L && !
dde0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
ddf0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
de00: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f NSSL_NO_SSL2)..o
de10: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
de20: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
de30: 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53 SSL2) ? 0 : SS
de40: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a L_OP_NO_SSLv2);.
de50: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
de60: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
de70: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
de80: 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c _NO_SSL3)..off |
de90: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
dea0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 , TLS_PROTO_SSL3
deb0: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 ) ? 0 : SSL_OP
dec0: 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 _NO_SSLv3);.#end
ded0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
dee0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
def0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
df00: 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 TLS1)..off |= (E
df10: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
df20: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 S_PROTO_TLS1)
df30: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
df40: 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 TLSv1);.#endif.#
df50: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
df60: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
df70: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
df80: 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 S1_1)..off |= (E
df90: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
dfa0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 S_PROTO_TLS1_1)
dfb0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
dfc0: 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 TLSv1_1);.#endif
dfd0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
dfe0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 _TLS1_2) && !def
dff0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e000: 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 TLS1_2)..off |=
e010: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
e020: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 TLS_PROTO_TLS1_2
e030: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ) ? 0 : SSL_OP_N
e040: 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 O_TLSv1_2);.#end
e050: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
e060: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
e070: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e080: 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c O_TLS1_3)..off |
e090: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
e0a0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
e0b0: 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 _3) ? 0 : SSL_OP
e0c0: 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 _NO_TLSv1_3);.#e
e0d0: 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 ndif..break;.
e0e0: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
e0f0: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 r_error();..
e100: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
e110: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 w(method);. i
e120: 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75 f (!ctx) {..retu
e130: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a rn NULL;. }..
e140: 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 if (getenv(S
e150: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b SLKEYLOGFILE)) {
e160: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 ..SSL_CTX_set_ke
e170: 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 ylog_callback(ct
e180: 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 x, KeyLogCallbac
e190: 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 k);. }..#if !
e1a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
e1b0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
e1c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
e1d0: 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 ). if (proto
e1e0: 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 == TLS_PROTO_TLS
e1f0: 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 1_3) {..SSL_CTX_
e200: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 set_min_proto_ve
e210: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f rsion(ctx, TLS1_
e220: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 3_VERSION);..SSL
e230: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f _CTX_set_max_pro
e240: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
e250: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b TLS1_3_VERSION);
e260: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
e270: 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 /* Force ciph
e280: 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 er selection ord
e290: 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a er by server */.
e2a0: 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76 65 if (!isServe
e2b0: 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 r) {..SSL_CTX_se
e2c0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 t_options(ctx, S
e2d0: 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 SL_OP_CIPHER_SER
e2e0: 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b VER_PREFERENCE);
e2f0: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e . }..#if OPEN
e300: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
e310: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
e320: 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 . OpenSSL_add
e330: 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 _all_algorithms(
e340: 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65 ); /* Load ciphe
e350: 72 73 20 61 6e 64 20 64 69 67 65 73 74 73 20 2a rs and digests *
e360: 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 53 /.#endif.. SS
e370: 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 L_CTX_set_app_da
e380: 74 61 28 63 74 78 2c 20 69 6e 74 65 72 70 29 3b ta(ctx, interp);
e390: 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 ./* remember the
e3a0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a interpreter */.
e3b0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
e3c0: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c options(ctx, SSL
e3d0: 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c _OP_ALL);./* all
e3e0: 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f SSL bug workaro
e3f0: 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f unds */. SSL_
e400: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
e410: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 ctx, SSL_OP_NO_C
e420: 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 OMPRESSION);./*
e430: 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 disable compress
e440: 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 ion even if supp
e450: 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c orted */. SSL
e460: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
e470: 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 (ctx, off);../*
e480: 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c disable protocol
e490: 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 versions */.#if
e4a0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
e4b0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
e4c0: 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 1000L. SSL_CT
e4d0: 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 X_set_mode(ctx,
e4e0: 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 SSL_MODE_AUTO_RE
e4f0: 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 TRY);./* handle
e500: 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 new handshakes i
e510: 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e n background. On
e520: 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f by default in O
e530: 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f penSSL 1.1.1. */
e540: 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f .#endif. SSL_
e550: 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 CTX_sess_set_cac
e560: 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 he_size(ctx, 128
e570: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 );.. /* Set u
e580: 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 ser defined ciph
e590: 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 ers, cipher suit
e5a0: 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 es, and security
e5b0: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 level */. if
e5c0: 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 ((ciphers != NU
e5d0: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f LL) && !SSL_CTX_
e5e0: 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 set_cipher_list(
e5f0: 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b ctx, ciphers)) {
e600: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
e610: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
e620: 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 ciphers failed:
e630: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 No valid ciphers
e640: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
e650: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
e660: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ctx);..return NU
e670: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
e680: 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 ((ciphersuites
e690: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c != NULL) && !SSL
e6a0: 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 _CTX_set_ciphers
e6b0: 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 uites(ctx, ciphe
e6c0: 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c rsuites)) {..Tcl
e6d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e6e0: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 terp, "Set ciphe
e6f0: 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a r suites failed:
e700: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 No valid cipher
e710: 73 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c s", (char *)NULL
e720: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
e730: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e (ctx);..return N
e740: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
e750: 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20 /* Set security
e760: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 level */. if
e770: 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c (level > -1 && l
e780: 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 evel < 6) {../*
e790: 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 SSL_set_security
e7a0: 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 _level */..SSL_C
e7b0: 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f TX_set_security_
e7c0: 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c level(ctx, level
e7d0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
e7e0: 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 set some callba
e7f0: 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 cks */. SSL_C
e800: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 TX_set_default_p
e810: 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 asswd_cb(ctx, Pa
e820: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b sswordCallback);
e830: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
e840: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f _default_passwd_
e850: 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c cb_userdata(ctx,
e860: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
e870: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 r);.. /* read
e880: 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 a Diffie-Hellma
e890: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c n parameters fil
e8a0: 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 e, or use the bu
e8b0: 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 20 20 ilt-in one */.
e8c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
e8d0: 74 28 26 64 73 29 3b 0a 23 69 66 64 65 66 20 4f t(&ds);.#ifdef O
e8e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 PENSSL_NO_DH.
e8f0: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d if (DHparams !=
e900: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
e910: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
e920: 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 p, "DH parameter
e930: 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 support not ava
e940: 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a ilable", (char *
e950: 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 )NULL);..SSL_CTX
e960: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
e970: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
e980: 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a #else. {..DH*
e990: 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 dh;..if (DHpara
e9a0: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ms != NULL) {..
e9b0: 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20 BIO *bio;...
e9c0: 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 bio = BIO_new
e9d0: 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 _file(F2N(DHpara
e9e0: 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a ms, &ds), "r");.
e9f0: 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b . if (!bio) {
ea00: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ...Tcl_DStringFr
ea10: 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 ee(&ds);...Tcl_A
ea20: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
ea30: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 rp, "Could not f
ea40: 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 ind DH parameter
ea50: 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a s file", (char *
ea60: 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 )NULL);...SSL_CT
ea70: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
ea80: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
ea90: 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45 }... dh = PE
eaa0: 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 M_read_bio_DHpar
eab0: 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e ams(bio, NULL, N
eac0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ULL, NULL);..
ead0: 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a BIO_free(bio);.
eae0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
eaf0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
eb00: 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c if (!dh) {...Tcl
eb10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
eb20: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 terp, "Could not
eb30: 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 read DH paramet
eb40: 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 ers from file",
eb50: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 (char *)NULL);..
eb60: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
eb70: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
eb80: 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53 L;.. }.. S
eb90: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 SL_CTX_set_tmp_d
eba0: 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 h(ctx, dh);..
ebb0: 20 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 09 7d DH_free(dh);..}
ebc0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 else {.. /*
ebd0: 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 Use well known D
ebe0: 48 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 H parameters tha
ebf0: 74 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 t have built-in
ec00: 73 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 support in OpenS
ec10: 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 SL */.. if (!
ec20: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 SSL_CTX_set_dh_a
ec30: 75 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 uto(ctx, 1)) {..
ec40: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
ec50: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 t(interp, "Could
ec60: 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 not enable set
ec70: 44 48 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f DH auto: ", GET_
ec80: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
ec90: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 har *)NULL);...S
eca0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
ecb0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
ecc0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d .. }..}. }
ecd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
ece0: 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 set our certific
ecf0: 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f ate */. load_
ed00: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b private_key = 0;
ed10: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c . if (certfil
ed20: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f e != NULL) {..lo
ed30: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
ed40: 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 1;...if (SSL_CT
ed50: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
ed60: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 e_file(ctx, F2N(
ed70: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 certfile, &ds),
ed80: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
ed90: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) <= 0) {.. T
eda0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
edb0: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
edc0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
edd0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
ede0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 t certificate fi
edf0: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 le ", certfile,
ee00: 22 3a 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f ": ",... GET_
ee10: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
ee20: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 har *)NULL);..
ee30: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
ee40: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
ee50: 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 NULL;..}..Tcl_D
ee60: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
ee70: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
ee80: 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b (cert != NULL) {
ee90: 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b ..load_private_k
eea0: 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c ey = 1;..if (SSL
eeb0: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 _CTX_use_certifi
eec0: 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 cate_ASN1(ctx, c
eed0: 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c ert_len, cert) <
eee0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
eef0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
ef00: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
ef10: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a set certificate:
ef20: 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 ",... GET_ER
ef30: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
ef40: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
ef50: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
ef60: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
ef70: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c ULL;..}. } el
ef80: 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d se {..certfile =
ef90: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 (char*)X509_get
efa0: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 _default_cert_fi
efb0: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f le();...if (SSL_
efc0: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
efd0: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 ate_file(ctx, ce
efe0: 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 rtfile, SSL_FILE
eff0: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 TYPE_PEM) <= 0)
f000: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c {.#if 0.. Tcl
f010: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
f020: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
f030: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 use default cer
f040: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c tificate file ",
f050: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c certfile, ": ",
f060: 0a 09 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 ... GET_ERR_R
f070: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
f080: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c )NULL);.. SSL
f090: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
f0a0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
f0b0: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 ;.#endif..}.
f0c0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 }.. /* set ou
f0d0: 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f r private key */
f0e0: 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 . if (load_pr
f0f0: 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 ivate_key) {..if
f100: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
f110: 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c L && key == NULL
f120: 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 ) {.. keyfile
f130: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a = certfile;..}.
f140: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d ..if (keyfile !=
f150: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a NULL) {.. /*
f160: 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 get the private
f170: 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 key associated
f180: 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 with this certif
f190: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 icate */.. if
f1a0: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
f1b0: 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d L) {...keyfile =
f1c0: 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 certfile;..
f1d0: 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f }... if (SSL_
f1e0: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b CTX_use_PrivateK
f1f0: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e ey_file(ctx, F2N
f200: 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 (keyfile, &ds),
f210: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
f220: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f ) <= 0) {...Tcl_
f230: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
f240: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 ;.../* flush the
f250: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 passphrase whic
f260: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 h might be left
f270: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f in the result */
f280: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
f290: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 (interp, NULL, T
f2a0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 CL_STATIC);...Tc
f2b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
f2c0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
f2d0: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 o set public key
f2e0: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 file ", keyfile
f2f0: 2c 20 22 20 22 2c 0a 09 09 09 47 45 54 5f 45 52 , " ",....GET_ER
f300: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
f310: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c r *)NULL);...SSL
f320: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
f330: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
f340: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
f350: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
f360: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 ..} else if (key
f370: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
f380: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 if (SSL_CTX_use
f390: 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 _PrivateKey_ASN1
f3a0: 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 (EVP_PKEY_RSA, c
f3b0: 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 tx, key,key_len)
f3c0: 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 6c <= 0) {.../* fl
f3d0: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 ush the passphra
f3e0: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 se which might b
f3f0: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 e left in the re
f400: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 sult */...Tcl_Se
f410: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
f420: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 NULL, TCL_STATIC
f430: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 );...Tcl_AppendR
f440: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
f450: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 nable to set pub
f460: 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f lic key: ", GET_
f470: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
f480: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 har *)NULL);...S
f490: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f4a0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
f4b0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e .. }..}../* N
f4c0: 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 ow we know that
f4d0: 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 a key and cert h
f4e0: 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 ave been set aga
f4f0: 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c inst.. * the SSL
f500: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 context */..if
f510: 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f (!SSL_CTX_check_
f520: 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 private_key(ctx)
f530: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
f540: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
f550: 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 , "private key d
f560: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 oes not match th
f570: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 e certificate pu
f580: 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 blic key",....
f590: 20 20 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 (char *)NULL)
f5a0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
f5b0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
f5c0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 eturn NULL;..}.
f5d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
f5e0: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 to use default
f5f0: 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 66 69 6c location and fil
f600: 65 20 66 6f 72 20 43 65 72 74 69 66 69 63 61 74 e for Certificat
f610: 65 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 e Authority (CA)
f620: 20 63 65 72 74 69 66 69 63 61 74 65 73 2e 20 54 certificates. T
f630: 68 65 0a 20 20 20 20 20 2a 20 76 65 72 69 66 79 he. * verify
f640: 20 70 61 74 68 20 61 6e 64 20 73 74 6f 72 65 20 path and store
f650: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 can be overridde
f660: 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 n by the SSL_CER
f670: 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 T_DIR env var. T
f680: 68 65 20 76 65 72 69 66 79 20 66 69 6c 65 20 63 he verify file c
f690: 61 6e 0a 20 20 20 20 20 2a 20 62 65 20 6f 76 65 an. * be ove
f6a0: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 rridden by the S
f6b0: 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 SL_CERT_FILE env
f6c0: 20 76 61 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20 var. */. if
f6d0: 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 (!SSL_CTX_set_de
f6e0: 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 fault_verify_pat
f6f0: 68 73 28 63 74 78 29 29 20 7b 0a 09 61 62 6f 72 hs(ctx)) {..abor
f700: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 t++;. }..
f710: 2f 2a 20 4f 76 65 72 72 69 64 65 73 20 66 6f 72 /* Overrides for
f720: 20 74 68 65 20 43 41 20 76 65 72 69 66 79 20 70 the CA verify p
f730: 61 74 68 20 61 6e 64 20 66 69 6c 65 20 2a 2f 0a ath and file */.
f740: 20 20 20 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 {.#if OPENSS
f750: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
f760: 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
f770: 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 if (CApath != NU
f780: 4c 4c 20 7c 7c 20 43 41 66 69 6c 65 20 21 3d 20 LL || CAfile !=
f790: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c NULL) {.. Tcl
f7a0: 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 09 20 _DString ds1;..
f7b0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
f7c0: 69 74 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 it(&ds1);...
f7d0: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
f7e0: 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f d_verify_locatio
f7f0: 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 ns(ctx, F2N(CAfi
f800: 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 le, &ds), F2N(CA
f810: 70 61 74 68 2c 20 26 64 73 31 29 29 29 20 7b 0a path, &ds1))) {.
f820: 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 ..abort++;..
f830: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
f840: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 ngFree(&ds);..
f850: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
f860: 65 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 2f e(&ds1);... /
f870: 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 * Set list of CA
f880: 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 s to send to cli
f890: 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 ent when request
f8a0: 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 ing a client cer
f8b0: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
f8c0: 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 /* https://sour
f8d0: 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c ceforge.net/p/tl
f8e0: 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09 20 s/bugs/57/ */..
f8f0: 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 /* XXX:TODO:
f900: 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 Let the user sup
f910: 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 ply values here
f920: 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 instead of somet
f930: 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 hing that exists
f940: 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 on the filesyst
f950: 65 6d 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b em */.. STACK
f960: 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a _OF(X509_NAME) *
f970: 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f certNames = SSL_
f980: 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 load_client_CA_f
f990: 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 ile(F2N(CAfile,
f9a0: 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 &ds));.. if (
f9b0: 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c certNames != NUL
f9c0: 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 L) {...SSL_CTX_s
f9d0: 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
f9e0: 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 t(ctx, certNames
f9f0: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 );.. }.. T
fa00: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
fa10: 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 ds);..}..#else..
fa20: 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 if (CApath != NU
fa30: 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 LL) {.. if (!
fa40: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 SSL_CTX_load_ver
fa50: 69 66 79 5f 64 69 72 28 63 74 78 2c 20 46 32 4e ify_dir(ctx, F2N
fa60: 28 43 41 70 61 74 68 2c 20 26 64 73 29 29 29 20 (CApath, &ds)))
fa70: 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 {...abort++;..
fa80: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
fa90: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
faa0: 7d 0a 09 69 66 20 28 43 41 66 69 6c 65 20 21 3d }..if (CAfile !=
fab0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 NULL) {.. if
fac0: 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f (!SSL_CTX_load_
fad0: 76 65 72 69 66 79 5f 66 69 6c 65 28 63 74 78 2c verify_file(ctx,
fae0: 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 F2N(CAfile, &ds
faf0: 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b ))) {...abort++;
fb00: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
fb10: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
fb20: 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 );... /* Set
fb30: 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 list of CAs to s
fb40: 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 end to client wh
fb50: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 en requesting a
fb60: 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 client certifica
fb70: 74 65 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b te */.. STACK
fb80: 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a _OF(X509_NAME) *
fb90: 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f certNames = SSL_
fba0: 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 load_client_CA_f
fbb0: 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 ile(F2N(CAfile,
fbc0: 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 &ds));.. if (
fbd0: 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c certNames != NUL
fbe0: 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 L) {...SSL_CTX_s
fbf0: 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
fc00: 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 t(ctx, certNames
fc10: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 );.. }.. T
fc20: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
fc30: 64 73 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 ds);..}.#endif.
fc40: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e }.. return
fc50: 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d ctx;.}.../*. *-
fc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fca0: 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f --. *. * StatusO
fcb0: 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 bjCmd -- return
fcc0: 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 certificate for
fcd0: 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a connected peer..
fce0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
fcf0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
fd00: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
fd10: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
fd20: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
fd70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 */.static int.St
fd80: 61 74 75 73 4f 62 6a 43 6d 64 28 0a 20 20 20 20 atusObjCmd(.
fd90: 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 TCL_UNUSED(void
fda0: 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 *),. Tcl_Inte
fdb0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 rp *interp,.
fdc0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 int objc,. Tc
fdd0: 6c 5f 4f 62 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj.*const obj
fde0: 76 5b 5d 29 0a 7b 0a 20 20 20 20 53 74 61 74 65 v[]).{. State
fdf0: 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 *statePtr;.
fe00: 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 X509 *peer;.
fe10: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
fe20: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
fe30: 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 chan;. char
fe40: 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 *channelName, *c
fe50: 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 iphers;. int
fe60: 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 mode;. const
fe70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
fe80: 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e roto;. unsign
fe90: 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 ed int len;.
fea0: 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 0a 20 int nid, res;..
feb0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
fec0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
fed0: 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 bjc < 2 || objc
fee0: 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 > 3 || (objc ==
fef0: 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c 3 && !strcmp(Tcl
ff00: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
ff10: 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 1]), "-local")))
ff20: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
ff30: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
ff40: 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 objv, "?-local?
ff50: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
ff60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
ff70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
ff80: 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 channel Id */.
ff90: 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 channelName =
ffa0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
ffb0: 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 jv[(objc == 2 ?
ffc0: 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 68 1 : 2)]);. ch
ffd0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
ffe0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e nel(interp, chan
fff0: 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b nelName, &mode);
10000 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
10010 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
10020 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
10030 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
10040 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
10050 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
10060 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
10070 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
10080 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
10090 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 nel(chan);. i
100a0 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
100b0 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
100c0 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
100d0 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
100e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
100f0 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
10100 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
10110 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a me(chan),..."\":
10120 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
10130 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c el", (char *)NUL
10140 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f L);..Tcl_SetErro
10150 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
10160 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 LS", "STATUS", "
10170 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
10180 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c ID", (char *)NUL
10190 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
101a0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
101b0 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
101c0 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 te *) Tcl_GetCha
101d0 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
101e0 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 (chan);.. /*
101f0 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 Get certificate
10200 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 for peer or self
10210 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
10220 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d == 2) {..peer =
10230 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 SSL_get_peer_ce
10240 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 rtificate(stateP
10250 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 tr->ssl);. }
10260 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 else {..peer = S
10270 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 SL_get_certifica
10280 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
10290 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 );. }. /*
102a0 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66 69 Get X509 certifi
102b0 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 cate info */.
102c0 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 if (peer) {..ob
102d0 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 jPtr = Tls_NewX5
102e0 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 09Obj(interp, pe
102f0 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d er);..if (objc =
10300 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 = 2) {.. X509
10310 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 _free(peer);..
10320 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 peer = NULL;..
10330 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
10340 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
10350 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
10360 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
10370 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 Peer name */.
10380 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
10390 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 erp, objPtr, "pe
103a0 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 ername", SSL_get
103b0 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 0_peername(state
103c0 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a Ptr->ssl), -1);.
103d0 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 LAPPEND_INT(
103e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
103f0 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 "sbits", SSL_get
10400 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 _cipher_bits(sta
10410 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c tePtr->ssl, NULL
10420 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 ));.. ciphers
10430 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 = (char*)SSL_ge
10440 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 t_cipher(statePt
10450 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 r->ssl);. LAP
10460 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10470 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 objPtr, "cipher
10480 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b ", ciphers, -1);
10490 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 .. /* Verify
104a0 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 the X509 certifi
104b0 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 cate presented b
104c0 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 y the peer */.
104d0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
104e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 terp, objPtr, "v
104f0 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 erifyResult",..X
10500 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 509_verify_cert_
10510 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c error_string(SSL
10520 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 _get_verify_resu
10530 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c lt(statePtr->ssl
10540 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a )), -1);.. /*
10550 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a Verify mode */.
10560 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 mode = SSL_g
10570 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 et_verify_mode(s
10580 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
10590 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 if (mode && S
105a0 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 SL_VERIFY_NONE)
105b0 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 {..LAPPEND_STR(i
105c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
105d0 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f verifyMode", "no
105e0 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 ne", -1);. }
105f0 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 else {..Tcl_Obj
10600 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 *listObjPtr = Tc
10610 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
10620 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 NULL);..if (mode
10630 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 && SSL_VERIFY_P
10640 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f EER) {.. Tcl_
10650 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10660 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
10670 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
10680 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 StringObj("peer"
10690 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
106a0 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
106b0 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
106c0 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
106d0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
106e0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
106f0 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
10700 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 _NewStringObj("f
10710 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 ail if no peer c
10720 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ert", -1));..}..
10730 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f if (mode && SSL_
10740 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e VERIFY_CLIENT_ON
10750 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c CE) {.. Tcl_L
10760 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10770 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
10780 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ObjPtr, Tcl_NewS
10790 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 tringObj("client
107a0 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d once", -1));..}
107b0 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 ..if (mode && SS
107c0 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 L_VERIFY_POST_HA
107d0 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 NDSHAKE) {..
107e0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
107f0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10800 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
10810 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 _NewStringObj("p
10820 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 ost handshake",
10830 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e -1));..}..LAPPEN
10840 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 D_OBJ(interp, ob
10850 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 jPtr, "verifyMod
10860 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a e", listObjPtr).
10870 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 }.. /* Ve
10880 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 rify mode depth
10890 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 */. LAPPEND_I
108a0 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
108b0 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68 22 r, "verifyDepth"
108c0 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 , SSL_get_verify
108d0 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72 2d _depth(statePtr-
108e0 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 >ssl));.. /*
108f0 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
10900 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
10910 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
10920 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 negotiation */.
10930 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e SSL_get0_alpn
10940 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 _selected(stateP
10950 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c tr->ssl, &proto,
10960 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 &len);. LAPP
10970 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10980 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 objPtr, "alpn",
10990 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 (char *)proto, (
109a0 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a Tcl_Size) len);.
109b0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
109c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
109d0 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f "protocol", SSL_
109e0 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 get_version(stat
109f0 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b ePtr->ssl), -1);
10a00 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 .. /* Valid f
10a10 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 or non-RSA signa
10a20 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 ture and TLS 1.3
10a30 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
10a40 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 == 2) {..res =
10a50 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 SSL_get_peer_sig
10a60 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 nature_nid(state
10a70 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b Ptr->ssl, &nid);
10a80 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 . } else {..r
10a90 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 es = SSL_get_sig
10aa0 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 nature_nid(state
10ab0 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b Ptr->ssl, &nid);
10ac0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 . }. if (!
10ad0 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a res) {nid = 0;}.
10ae0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
10af0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10b00 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c "signatureHashAl
10b10 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 gorithm", OBJ_ni
10b20 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a d2ln(nid), -1);.
10b30 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d . if (objc ==
10b40 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 2) {..res = SSL
10b50 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 _get_peer_signat
10b60 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 ure_type_nid(sta
10b70 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
10b80 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
10b90 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 .res = SSL_get_s
10ba0 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 ignature_type_ni
10bb0 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
10bc0 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 &nid);. }.
10bd0 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 if (!res) {nid
10be0 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 = 0;}. LAPPE
10bf0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
10c00 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 bjPtr, "signatur
10c10 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 eType", OBJ_nid2
10c20 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 ln(nid), -1);..
10c30 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
10c40 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
10c50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
10c60 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
10c70 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
10c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10cb0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 ----. *. * Conne
10cc0 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 ctionInfoObjCmd
10cd0 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 -- return connec
10ce0 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f tion info from O
10cf0 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 penSSL.. *. * Re
10d00 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 sults:. *.A list
10d10 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 of connection i
10d20 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nfo. *. *------
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 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
10d70 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f /..static int Co
10d80 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
10d90 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 md(. TCL_UNUS
10da0 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 ED(void *),.
10db0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
10dc0 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 rp,. int objc
10dd0 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ,. Tcl_Obj *c
10de0 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 onst objv[]).{.
10df0 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
10e00 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
10e10 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
10e20 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 de on */. Sta
10e30 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f te *statePtr;../
10e40 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
10e50 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
10e60 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
10e70 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a jPtr, *listPtr;.
10e80 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 const SSL *s
10e90 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 sl;. const SS
10ea0 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 L_CIPHER *cipher
10eb0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
10ec0 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
10ed0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f ;. const EVP_
10ee0 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 20 MD *md;.. if
10ef0 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
10f00 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
10f10 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
10f20 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
10f30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
10f40 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 }.. chan
10f50 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
10f60 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
10f70 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c String(objv[1]),
10f80 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
10f90 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
10fa0 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
10fb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
10fc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
10fd0 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
10fe0 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
10ff0 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
11000 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
11010 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
11020 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 ;. if (Tcl_Ge
11030 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
11040 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
11050 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
11060 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
11070 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
11080 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
11090 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
110a0 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 .. "\": not a
110b0 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 TLS channel", (
110c0 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 char *)NULL);..T
110d0 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
110e0 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
110f0 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 CONNECTION", "CH
11100 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 ANNEL", "INVALID
11110 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
11120 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
11130 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
11140 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
11150 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
11160 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 ;.. /* Connec
11170 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 tion info */.
11180 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
11190 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
111a0 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
111b0 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d chan);. ssl =
111c0 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a statePtr->ssl;.
111d0 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e if (ssl != N
111e0 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 ULL) {../* conne
111f0 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 ction state */..
11200 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11210 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 rp, objPtr, "sta
11220 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 te", SSL_state_s
11230 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c tring_long(ssl),
11240 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 -1);.../* Get S
11250 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72 NI requested ser
11260 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 ver name */..LAP
11270 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11280 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 objPtr, "server
11290 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 name", SSL_get_s
112a0 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 ervername(ssl, T
112b0 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 LSEXT_NAMETYPE_h
112c0 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a ost_name), -1);.
112d0 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f ../* Get protoco
112e0 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 l */..LAPPEND_ST
112f0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11300 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 , "protocol", SS
11310 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 L_get_version(ss
11320 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 l), -1);.../* Re
11330 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f negotiation allo
11340 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f wed */..LAPPEND_
11350 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
11360 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 Ptr, "renegotiat
11370 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 ion_allowed", SS
11380 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e L_get_secure_ren
11390 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f egotiation_suppo
113a0 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 rt((SSL *) ssl))
113b0 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 ;.../* Get secur
113c0 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 ity level */..LA
113d0 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
113e0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 , objPtr, "secur
113f0 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f ity_level", SSL_
11400 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 get_security_lev
11410 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 el(ssl));.../* S
11420 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 ession info */..
11430 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
11440 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
11450 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 ssion_reused", S
11460 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 SL_session_reuse
11470 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 d(ssl));.../* Is
11480 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a server info */.
11490 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
114a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 terp, objPtr, "i
114b0 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 s_server", SSL_i
114c0 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a s_server(ssl));.
114d0 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a ../* Is DTLS */.
114e0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
114f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 terp, objPtr, "i
11500 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f s_dtls", SSL_is_
11510 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 dtls(ssl));.
11520 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 }.. /* Cipher
11530 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 info */. cip
11540 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 her = SSL_get_cu
11550 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c rrent_cipher(ssl
11560 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 );. if (ciphe
11570 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 r != NULL) {..ch
11580 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d ar buf[BUFSIZ] =
11590 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c {0};..int bits,
115a0 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 alg_bits;.../*
115b0 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 Cipher name */..
115c0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
115d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 rp, objPtr, "cip
115e0 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 her", SSL_CIPHER
115f0 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 _get_name(cipher
11600 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 ), -1);.../* RFC
11610 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 name of cipher
11620 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
11630 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11640 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c "standard_name",
11650 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e SSL_CIPHER_stan
11660 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 dard_name(cipher
11670 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 ), -1);.../* Ope
11680 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 nSSL name of cip
11690 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
116a0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
116b0 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d tr, "openssl_nam
116c0 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 e", OPENSSL_ciph
116d0 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 er_name(SSL_CIPH
116e0 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
116f0 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
11700 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 ../* number of s
11710 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64 20 ecret bits used
11720 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 for cipher */..b
11730 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 its = SSL_CIPHER
11740 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 _get_bits(cipher
11750 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c , &alg_bits);..L
11760 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
11770 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 p, objPtr, "secr
11780 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b et_bits", bits);
11790 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
117a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 terp, objPtr, "a
117b0 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 lgorithm_bits",
117c0 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 alg_bits);../* a
117d0 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 lg_bits is actua
117e0 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 l key secret bit
117f0 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61 s. If use bits a
11800 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 nd secret (algor
11810 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 ithm) bits diffe
11820 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 r,.. the rest
11830 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20 of the bits are
11840 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 fixed, i.e. for
11850 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 limited export c
11860 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 iphers (bits < 5
11870 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 6) */.../* Indic
11880 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54 ates which SSL/T
11890 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 LS protocol vers
118a0 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65 ion first define
118b0 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a d the cipher */.
118c0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
118d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 erp, objPtr, "mi
118e0 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f n_version", SSL_
118f0 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 CIPHER_get_versi
11900 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b on(cipher), -1);
11910 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 .../* Cipher NID
11920 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
11930 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11940 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 "cipherNID", (c
11950 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e har *)OBJ_nid2ln
11960 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f (SSL_CIPHER_get_
11970 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 cipher_nid(ciphe
11980 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 r)), -1);..LAPPE
11990 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
119a0 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 bjPtr, "digestNI
119b0 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f D", (char *)OBJ_
119c0 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 nid2ln(SSL_CIPHE
119d0 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 R_get_digest_nid
119e0 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
119f0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11a00 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 erp, objPtr, "ke
11a10 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 yExchangeNID", (
11a20 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c char *)OBJ_nid2l
11a30 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 n(SSL_CIPHER_get
11a40 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 _kx_nid(cipher))
11a50 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
11a60 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11a70 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 tr, "authenticat
11a80 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a ionNID", (char *
11a90 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f )OBJ_nid2ln(SSL_
11aa0 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f CIPHER_get_auth_
11ab0 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
11ac0 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 );.../* message
11ad0 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 authentication c
11ae0 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 ode - Cipher is
11af0 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f AEAD (e.g. GCM o
11b00 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 r ChaCha20/Poly1
11b10 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 305) or not */..
11b20 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 /* Authenticated
11b30 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 Encryption with
11b40 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 associated data
11b50 20 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f (AEAD) check */
11b60 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
11b70 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11b80 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c cipher_is_aead",
11b90 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 SSL_CIPHER_is_a
11ba0 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 ead(cipher));...
11bb0 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 64 /* Digest used d
11bc0 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c uring the SSL/TL
11bd0 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e S handshake when
11be0 20 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 65 using the ciphe
11bf0 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f r. */..md = SSL_
11c00 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 CIPHER_get_hands
11c10 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68 hake_digest(ciph
11c20 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 er);..LAPPEND_ST
11c30 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11c40 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 , "handshake_dig
11c50 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56 est", (char *)EV
11c60 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d P_MD_name(md), -
11c70 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 1);.../* Get Ope
11c80 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 nSSL-specific ID
11c90 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f , not IANA ID */
11ca0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
11cb0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
11cc0 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 ipher_id", (int)
11cd0 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
11ce0 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f id(cipher));.../
11cf0 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 * Two-byte ID us
11d00 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 ed in the TLS pr
11d10 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 otocol of the gi
11d20 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c ven cipher */..L
11d30 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
11d40 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 p, objPtr, "prot
11d50 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 ocol_id", (int)
11d60 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 SSL_CIPHER_get_p
11d70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 rotocol_id(ciphe
11d80 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 r));.../* Textua
11d90 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 l description of
11da0 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 the cipher */..
11db0 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 if (SSL_CIPHER_d
11dc0 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 escription(ciphe
11dd0 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 r, buf, sizeof(b
11de0 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a uf)) != NULL) {.
11df0 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
11e00 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11e10 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 "description",
11e20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 buf, -1);..}.
11e30 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 }.. /* Sessi
11e40 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 on info */. s
11e50 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 ession = SSL_get
11e60 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 _session(ssl);.
11e70 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 if (session !
11e80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 = NULL) {..const
11e90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
11ea0 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 ticket;..size_t
11eb0 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 len2;..unsigned
11ec0 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 int ulen;..const
11ed0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
11ee0 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f session_id, *pro
11ef0 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 to;..unsigned ch
11f00 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 ar buffer[SSL_MA
11f10 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e X_MASTER_KEY_LEN
11f20 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 GTH];.../* Repor
11f30 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 t the selected p
11f40 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 rotocol as a res
11f50 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 ult of the ALPN
11f60 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 negotiation */..
11f70 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
11f80 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 _alpn_selected(s
11f90 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 ession, &proto,
11fa0 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 &len2);..LAPPEND
11fb0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11fc0 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 Ptr, "alpn", (ch
11fd0 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 ar *) proto, (Tc
11fe0 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a l_Size) len2);..
11ff0 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 ./* Report the s
12000 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
12010 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
12020 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 the NPN negotiat
12030 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 ion */.#ifdef US
12040 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f E_NPN..SSL_get0_
12050 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 next_proto_negot
12060 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 iated(ssl, &prot
12070 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 o, &ulen);..LAPP
12080 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12090 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 objPtr, "npn", (
120a0 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 char *) proto, (
120b0 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b Tcl_Size) ulen);
120c0 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 .#endif.../* Res
120d0 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a umable session *
120e0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
120f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12100 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c "resumable", SSL
12110 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 _SESSION_is_resu
12120 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b mable(session));
12130 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 .../* Session st
12140 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 art time (second
12150 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a s since epoch) *
12160 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 /..LAPPEND_LONG(
12170 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12180 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 "start_time", SS
12190 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
121a0 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 me(session));...
121b0 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 /* Timeout value
121c0 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 - SSL_CTX_get_t
121d0 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e imeout (in secon
121e0 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ds) */..LAPPEND_
121f0 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a LONG(interp, obj
12200 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 Ptr, "timeout",
12210 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
12220 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 timeout(session)
12230 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
12240 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 id - TLSv1.2 and
12250 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 below only */..
12260 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c session_id = SSL
12270 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 _SESSION_get_id(
12280 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b session, &ulen);
12290 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
122a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
122b0 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 "session_id", s
122c0 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f ession_id, (Tcl_
122d0 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f Size) ulen);.../
122e0 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 * Session contex
122f0 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 t */..session_id
12300 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
12310 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 et0_id_context(s
12320 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a ession, &ulen);.
12330 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
12340 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12350 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 "session_context
12360 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 ", session_id, (
12370 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b Tcl_Size) ulen);
12380 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 .../* Session ti
12390 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e cket - client on
123a0 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 ly */..SSL_SESSI
123b0 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 ON_get0_ticket(s
123c0 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c ession, &ticket,
123d0 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e &len2);..LAPPEN
123e0 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
123f0 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
12400 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 n_ticket", ticke
12410 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 t, (Tcl_Size) le
12420 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f n2);.../* Sessio
12430 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d n ticket lifetim
12440 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e e hint (in secon
12450 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ds) */..LAPPEND_
12460 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a LONG(interp, obj
12470 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c Ptr, "lifetime",
12480 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
12490 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 _ticket_lifetime
124a0 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b _hint(session));
124b0 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 .../* Ticket app
124c0 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45 data */.#if OPE
124d0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
124e0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
124f0 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 L..SSL_SESSION_g
12500 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 et0_ticket_appda
12510 74 61 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20 ta((SSL_SESSION
12520 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 *) session, &tic
12530 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 ket, &len2);..LA
12540 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 PPEND_BARRAY(int
12550 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 erp, objPtr, "ti
12560 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 cket_app_data",
12570 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a ticket, (Tcl_Siz
12580 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66 e) len2);.#endif
12590 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 .../* Get master
125a0 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 key */..len2 =
125b0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
125c0 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 master_key(sessi
125d0 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f on, buffer, SSL_
125e0 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c MAX_MASTER_KEY_L
125f0 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 ENGTH);..LAPPEND
12600 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
12610 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f objPtr, "master_
12620 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54 key", buffer, (T
12630 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a cl_Size) len2);.
12640 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e ../* Compression
12650 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 id */..unsigned
12660 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 int id = SSL_SE
12670 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 SSION_get_compre
12680 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a ss_id(session);.
12690 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
126a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f erp, objPtr, "co
126b0 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 mpression_id", i
126c0 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 d == 1 ? "zlib"
126d0 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 : "none", -1);.
126e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d }.. /* Com
126f0 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f pression info */
12700 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 . if (ssl !=
12710 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 NULL) {.#ifdef H
12720 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 AVE_SSL_COMPRESS
12730 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f ION..const COMP_
12740 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 METHOD *comp, *e
12750 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c xpn;..comp = SSL
12760 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d _get_current_com
12770 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 pression(ssl);..
12780 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 expn = SSL_get_c
12790 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e urrent_expansion
127a0 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 (ssl);...LAPPEND
127b0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
127c0 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f Ptr, "compressio
127d0 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 n", comp ? SSL_C
127e0 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d OMP_get_name(com
127f0 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 p) : "none", -1)
12800 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
12810 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12820 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e expansion", expn
12830 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f ? SSL_COMP_get_
12840 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f name(expn) : "no
12850 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a ne", -1);.#else.
12860 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12870 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f erp, objPtr, "co
12880 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e mpression", "non
12890 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e e", -1);..LAPPEN
128a0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
128b0 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e jPtr, "expansion
128c0 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a ", "none", -1);.
128d0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
128e0 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f /* Server info
128f0 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 */. {..long
12900 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 mode = SSL_CTX_g
12910 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 et_session_cache
12920 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e _mode(statePtr->
12930 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 ctx);..char *msg
12940 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 ;...if (mode & S
12950 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 SL_SESS_CACHE_OF
12960 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 F) {.. msg =
12970 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 "off";..} else i
12980 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
12990 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 SS_CACHE_CLIENT)
129a0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63 {.. msg = "c
129b0 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 lient";..} else
129c0 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
129d0 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 ESS_CACHE_SERVER
129e0 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 ) {.. msg = "
129f0 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 server";..} else
12a00 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
12a10 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 SESS_CACHE_BOTH)
12a20 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62 {.. msg = "b
12a30 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a oth";..} else {.
12a40 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e . msg = "unkn
12a50 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e own";..}..LAPPEN
12a60 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
12a70 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 jPtr, "session_c
12a80 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c ache_mode", msg,
12a90 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 -1);. }..
12aa0 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 /* CA List */.
12ab0 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 /* IF not a s
12ac0 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53 erver, same as S
12ad0 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f SL_get0_peer_CA_
12ae0 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 72 20 list. If server
12af0 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f same as SSL_CTX_
12b00 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 get_client_CA_li
12b10 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 st */. listPt
12b20 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
12b30 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 bj(0, NULL);.
12b40 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e STACK_OF(X509_N
12b50 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 AME) *ca_list;.
12b60 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20 if ((ca_list
12b70 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 = SSL_get_client
12b80 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 _CA_list(ssl)) !
12b90 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 = NULL) {..char
12ba0 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a buffer[BUFSIZ];.
12bb0 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b .for (int i = 0;
12bc0 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d i < sk_X509_NAM
12bd0 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 E_num(ca_list);
12be0 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 i++) {.. X509
12bf0 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b _NAME *name = sk
12c00 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 _X509_NAME_value
12c10 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 (ca_list, i);..
12c20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 if (name) {..
12c30 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 .X509_NAME_oneli
12c40 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c ne(name, buffer,
12c50 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f BUFSIZ);...Tcl_
12c60 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
12c70 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
12c80 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 tPtr, Tcl_NewStr
12c90 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d ingObj(buffer, -
12ca0 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 1));.. }..}.
12cb0 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 }. LAPPEND
12cc0 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a _OBJ(interp, obj
12cd0 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c Ptr, "caList", l
12ce0 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 istPtr);. LAP
12cf0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
12d00 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 objPtr, "caList
12d10 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f Count", sk_X509_
12d20 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 NAME_num(ca_list
12d30 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 ));.. Tcl_Set
12d40 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
12d50 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
12d60 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
12d70 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
12d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
12dc0 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d VersionObjCmd -
12dd0 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e - return version
12de0 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 string from Ope
12df0 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nSSL.. *. * Resu
12e00 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
12e10 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
12e20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
12e30 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
12e40 2a 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 2d 2d 2d ----------------
12e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e80 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
12e90 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d int.VersionObjCm
12ea0 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 d(. TCL_UNUSE
12eb0 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 D(void *),. T
12ec0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
12ed0 70 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 p,. TCL_UNUSE
12ee0 44 28 69 6e 74 29 20 2f 2a 20 6f 62 6a 63 20 2a D(int) /* objc *
12ef0 2f 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 /,. TCL_UNUSE
12f00 44 28 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 D(Tcl_Obj *const
12f10 20 2a 29 20 2f 2a 20 6f 62 6a 76 20 2a 2f 29 0a *) /* objv */).
12f20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f {. Tcl_Obj *o
12f30 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 bjPtr;.. dpri
12f40 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
12f50 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
12f60 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 _NewStringObj(OP
12f70 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 ENSSL_VERSION_TE
12f80 58 54 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 XT, -1);.. Tc
12f90 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
12fa0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
12fb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
12fc0 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
12fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
13010 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 *. * MiscObjCmd
13020 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 -- misc command
13030 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
13040 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
13050 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
13060 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
13070 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
130d0 4d 69 73 63 4f 62 6a 43 6d 64 28 0a 20 20 20 20 MiscObjCmd(.
130e0 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 TCL_UNUSED(void
130f0 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 *),. Tcl_Inte
13100 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 rp *interp,.
13110 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 int objc,. Tc
13120 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
13130 76 5b 5d 29 0a 7b 0a 20 20 20 20 73 74 61 74 69 v[]).{. stati
13140 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f c const char *co
13150 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 mmands [] = { "r
13160 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e eq", "strreq", N
13170 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 ULL };. enum
13180 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c command { C_REQ,
13190 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d C_STRREQ, C_DUM
131a0 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 69 MY };. Tcl_Si
131b0 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e 74 20 ze cmd;. int
131c0 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 isStr;. char
131d0 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a buffer[16384];..
131e0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
131f0 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
13200 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c objc < 2) {..Tcl
13210 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
13220 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
13230 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 subcommand ?args
13240 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ?");..return TCL
13250 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
13260 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 if (Tcl_GetInd
13270 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 exFromObj(interp
13280 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 , objv[1], comma
13290 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 nds, "command",
132a0 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 0, &cmd) != TCL_
132b0 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
132c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
132d0 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
132e0 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 ror();.. isSt
132f0 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 r = (cmd == C_ST
13300 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 RREQ);. switc
13310 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 h ((enum command
13320 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 ) cmd) {..case C
13330 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 _REQ:..case C_ST
13340 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 RREQ: {.. EVP
13350 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c _PKEY *pkey=NULL
13360 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 ;.. X509 *cer
13370 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 t=NULL;.. X50
13380 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 9_NAME *name=NUL
13390 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 L;.. Tcl_Obj
133a0 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 **listv;.. Tc
133b0 6c 5f 53 69 7a 65 20 6c 69 73 74 63 2c 69 3b 0a l_Size listc,i;.
133c0 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e .. BIO *out=N
133d0 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 6f 6e 73 74 ULL;... const
133e0 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b char *k_C="",*k
133f0 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a _ST="",*k_L="",*
13400 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c k_O="",*k_OU="",
13410 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 *k_CN="",*k_Emai
13420 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 l="";.. char
13430 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c *keyout,*pemout,
13440 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b *str;.. int k
13450 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c eysize,serial=0,
13460 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f days=365;..#if O
13470 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
13480 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
13490 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 00L.. BIGNUM
134a0 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 *bne = NULL;..
134b0 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c RSA *rsa = NUL
134c0 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 L;.#else.. EV
134d0 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 P_PKEY_CTX *ctx
134e0 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a = NULL;.#endif..
134f0 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 . if ((objc<5
13500 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b ) || (objc>6)) {
13510 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 ...Tcl_WrongNumA
13520 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f rgs(interp, 2, o
13530 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 bjv, "keysize ke
13540 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f yfile certfile ?
13550 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 info?");...retur
13560 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
13570 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 }... if (Tc
13580 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
13590 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c interp, objv[2],
135a0 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 &keysize) != TC
135b0 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e L_OK) {...return
135c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
135d0 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 }.. keyout=T
135e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
135f0 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f v[3]);.. pemo
13600 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ut=Tcl_GetString
13610 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 (objv[4]);..
13620 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 if (isStr) {...T
13630 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
13640 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 ,keyout,"",0);..
13650 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 .Tcl_SetVar(inte
13660 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b rp,pemout,"",0);
13670 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 .. }... if
13680 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 (objc>=6) {...i
13690 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 f (Tcl_ListObjGe
136a0 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 tElements(interp
136b0 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 , objv[5], &list
136c0 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43 c, &listv) != TC
136d0 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 L_OK) {... re
136e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
136f0 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 ..}....if ((list
13700 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 c%2) != 0) {...
13710 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
13720 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 (interp,"Informa
13730 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 tion list must h
13740 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 ave even number
13750 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 of arguments",NU
13760 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 LL);... retur
13770 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
13780 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c ...for (i=0; i<l
13790 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 istc; i+=2) {...
137a0 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 str=Tcl_GetS
137b0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b tring(listv[i]);
137c0 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d ... if (strcm
137d0 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 p(str,"days")==0
137e0 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 ) {....if (Tcl_G
137f0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
13800 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 erp,listv[i+1],&
13810 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 days)!=TCL_OK)..
13820 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
13830 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 _ERROR;... }
13840 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
13850 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 str,"serial")==0
13860 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 ) {....if (Tcl_G
13870 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
13880 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 erp,listv[i+1],&
13890 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 serial)!=TCL_OK)
138a0 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 .... return T
138b0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 CL_ERROR;...
138c0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
138d0 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b p(str,"C")==0) {
138e0 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 ....k_C=Tcl_GetS
138f0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13900 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
13910 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
13920 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f ST")==0) {....k_
13930 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ST=Tcl_GetString
13940 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
13950 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
13960 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d trcmp(str,"L")==
13970 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 0) {....k_L=Tcl_
13980 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
13990 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
139a0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
139b0 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"O")==0) {...
139c0 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_O=Tcl_GetStri
139d0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
139e0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
139f0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 (strcmp(str,"OU"
13a00 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d )==0) {....k_OU=
13a10 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
13a20 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
13a30 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
13a40 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 mp(str,"CN")==0)
13a50 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 {....k_CN=Tcl_G
13a60 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
13a70 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
13a80 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
13a90 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b r,"Email")==0) {
13aa0 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f ....k_Email=Tcl_
13ab0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
13ac0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
13ad0 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 lse {....Tcl_Set
13ae0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 Result(interp,"U
13af0 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 nknown parameter
13b00 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 ",NULL);....retu
13b10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
13b20 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d }...}.. }
13b30 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
13b40 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
13b50 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 x30000000L..
13b60 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a bne = BN_new();.
13b70 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e . rsa = RSA_n
13b80 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 ew();.. pkey
13b90 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 = EVP_PKEY_new()
13ba0 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d ;.. if (bne =
13bb0 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d = NULL || rsa ==
13bc0 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d NULL || pkey ==
13bd0 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 NULL || !BN_set
13be0 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 _word(bne,RSA_F4
13bf0 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 ) ||...!RSA_gene
13c00 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c rate_key_ex(rsa,
13c10 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e keysize, bne, N
13c20 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 ULL) || !EVP_PKE
13c30 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 Y_assign_RSA(pke
13c40 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50 y, rsa)) {...EVP
13c50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
13c60 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 ;.../* RSA_free(
13c70 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45 rsa); freed by E
13c80 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a VP_PKEY_free */.
13c90 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a ..BN_free(bne);.
13ca0 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20 #else.. pkey
13cb0 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 = EVP_RSA_gen((u
13cc0 6e 73 69 67 6e 65 64 20 69 6e 74 29 6b 65 79 73 nsigned int)keys
13cd0 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d ize);.. ctx =
13ce0 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 EVP_PKEY_CTX_ne
13cf0 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 w(pkey,NULL);..
13d00 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e if (pkey == N
13d10 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 ULL || ctx == NU
13d20 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f LL || !EVP_PKEY_
13d30 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 keygen_init(ctx)
13d40 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f ||...!EVP_PKEY_
13d50 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 CTX_set_rsa_keyg
13d60 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 en_bits(ctx, key
13d70 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b size) || !EVP_PK
13d80 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 EY_keygen(ctx, &
13d90 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 pkey)) {...EVP_P
13da0 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
13db0 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 ..EVP_PKEY_CTX_f
13dc0 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 ree(ctx);.#endif
13dd0 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
13de0 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 (interp,"Error g
13df0 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 enerating privat
13e00 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 e key",NULL);...
13e10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
13e20 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ;.. } else {.
13e30 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 ..if (isStr) {..
13e40 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
13e50 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 (BIO_s_mem());..
13e60 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
13e70 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 io_PrivateKey(ou
13e80 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c t,pkey,NULL,NULL
13e90 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 ,0,NULL,NULL);..
13ea0 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 . i=BIO_read(
13eb0 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f out,buffer,sizeo
13ec0 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 f(buffer)-1);...
13ed0 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 i=(i<0) ? 0
13ee0 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 : i;... buffe
13ef0 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 r[i]='\0';...
13f00 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 Tcl_SetVar(inte
13f10 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 rp,keyout,buffer
13f20 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 ,0);... BIO_f
13f30 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 lush(out);...
13f40 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a BIO_free(out);.
13f50 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 ..} else {...
13f60 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f out=BIO_new(BIO
13f70 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 _s_file());...
13f80 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 BIO_write_file
13f90 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 name(out,keyout)
13fa0 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 ;... PEM_writ
13fb0 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 e_bio_PrivateKey
13fc0 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e (out,pkey,NULL,N
13fd0 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 ULL,0,NULL,NULL)
13fe0 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 ;... /* PEM_w
13ff0 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 rite_bio_RSAPriv
14000 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c ateKey(out, rsa,
14010 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 NULL, NULL, 0,
14020 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a NULL, NULL); */.
14030 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 .. BIO_free_a
14040 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 ll(out);.. .}...
14050 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f .if ((cert=X509_
14060 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a new())==NULL) {.
14070 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 .. Tcl_SetRes
14080 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f ult(interp,"Erro
14090 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 r generating cer
140a0 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73 74 tificate request
140b0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 ",NULL);... E
140c0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 VP_PKEY_free(pke
140d0 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f y);.#if OPENSSL_
140e0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
140f0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 0x30000000L...
14100 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b BN_free(bne);
14110 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 .#endif... re
14120 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
14130 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f ..}....X509_set_
14140 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b version(cert,2);
14150 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f ...ASN1_INTEGER_
14160 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 set(X509_get_ser
14170 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c ialNumber(cert),
14180 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f serial);...X509_
14190 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f gmtime_adj(X509_
141a0 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 getm_notBefore(c
141b0 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f ert),0);...X509_
141c0 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f gmtime_adj(X509_
141d0 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 getm_notAfter(ce
141e0 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a rt),(long)60*60*
141f0 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 24*days);...X509
14200 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 _set_pubkey(cert
14210 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d ,pkey);....name=
14220 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 X509_get_subject
14230 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 _name(cert);....
14240 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
14250 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
14260 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 "C", MBSTRING_AS
14270 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e C, (const unsign
14280 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 ed char *) k_C,
14290 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
142a0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
142b0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 y_by_txt(name,"S
142c0 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 T", MBSTRING_ASC
142d0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
142e0 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 d char *) k_ST,
142f0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
14300 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
14310 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c y_by_txt(name,"L
14320 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
14330 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
14340 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 char *) k_L, -1
14350 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
14360 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
14370 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c by_txt(name,"O",
14380 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
14390 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
143a0 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 har *) k_O, -1,
143b0 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
143c0 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
143d0 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 _txt(name,"OU",
143e0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
143f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
14400 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 ar *) k_OU, -1,
14410 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
14420 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
14430 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 _txt(name,"CN",
14440 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
14450 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
14460 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 ar *) k_CN, -1,
14470 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
14480 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
14490 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c _txt(name,"Email
144a0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
144b0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
144c0 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c char *) k_Email
144d0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 , -1, -1, 0);...
144e0 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 .X509_set_subjec
144f0 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 t_name(cert,name
14500 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f );....if (!X509_
14510 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 sign(cert,pkey,E
14520 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a VP_sha256())) {.
14530 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 .. X509_free(
14540 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 cert);... EVP
14550 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
14560 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
14570 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
14580 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
14590 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
145a0 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f endif... Tcl_
145b0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
145c0 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 ,"Error signing
145d0 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c certificate",NUL
145e0 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e L);... return
145f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a TCL_ERROR;...}.
14600 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a ...if (isStr) {.
14610 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
14620 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a w(BIO_s_mem());.
14630 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
14640 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 bio_X509(out,cer
14650 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f t);... i=BIO_
14660 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c read(out,buffer,
14670 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 sizeof(buffer)-1
14680 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 );... i=(i<0)
14690 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 ? 0 : i;...
146a0 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a buffer[i]='\0';.
146b0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 .. Tcl_SetVar
146c0 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 (interp,pemout,b
146d0 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 uffer,0);...
146e0 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a BIO_flush(out);.
146f0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f .. BIO_free(o
14700 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a ut);...} else {.
14710 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
14720 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b w(BIO_s_file());
14730 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 ... BIO_write
14740 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 _filename(out,pe
14750 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d mout);... PEM
14760 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 _write_bio_X509(
14770 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 out,cert);...
14780 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 BIO_free_all(ou
14790 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f t);...}....X509_
147a0 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 free(cert);...EV
147b0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
147c0 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 );.#if OPENSSL_V
147d0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
147e0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 0x30000000L...BN
147f0 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
14800 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 if.. }..}..br
14810 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 eak;. default
14820 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a :..break;. }.
14830 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
14840 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a K;.}.../********
14850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a ************/./*
14860 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 Init
14870 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./**********
14880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a **********/../*.
14890 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
148a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
148b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
148c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
148d0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
148e0 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Free --. *. *.Th
148f0 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 is procedure cle
14900 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 ans up when a SS
14910 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
14920 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f hannel. *.is clo
14930 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 sed and its refe
14940 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c rence count fall
14950 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 s below 1. *. *
14960 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 Results:. *.none
14970 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
14980 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c cts:. *.Frees al
14990 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 l the state. *.
149a0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
149b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
149c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
149d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
149e0 2d 2d 2d 2d 0a 20 2a 2f 0a 23 75 6e 64 65 66 20 ----. */.#undef
149f0 54 6c 73 5f 46 72 65 65 0a 76 6f 69 64 0a 23 69 Tls_Free.void.#i
14a00 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 f TCL_MAJOR_VERS
14a10 49 4f 4e 20 3e 20 38 0a 54 6c 73 5f 46 72 65 65 ION > 8.Tls_Free
14a20 28 76 6f 69 64 20 2a 62 6c 6f 63 6b 50 74 72 29 (void *blockPtr)
14a30 0a 23 65 6c 73 65 0a 54 6c 73 5f 46 72 65 65 28 .#else.Tls_Free(
14a40 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 0a char *blockPtr).
14a50 23 65 6e 64 69 66 0a 7b 0a 20 20 20 20 53 74 61 #endif.{. Sta
14a60 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
14a70 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 State *)blockPtr
14a80 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
14a90 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 Called");.. T
14aa0 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 ls_Clean(statePt
14ab0 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 r);. ckfree(b
14ac0 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a lockPtr);.}.../*
14ad0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
14ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b10 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
14b20 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 _Clean --. *. *.
14b30 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 This procedure c
14b40 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 leans up when a
14b50 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 SSL socket based
14b60 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 channel. *.is c
14b70 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 losed and its re
14b80 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 ference count fa
14b90 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 lls below 1. Th
14ba0 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 is should. *.be
14bb0 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f called synchrono
14bc0 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 usly by the Clos
14bd0 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 eProc, not in th
14be0 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 e. *.EventuallyF
14bf0 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a ree callback.. *
14c00 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
14c10 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 none. *. * Side
14c20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 effects:. *.Free
14c30 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a s all the state.
14c40 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
14c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c80 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
14c90 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 d Tls_Clean(Stat
14ca0 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 e *statePtr) {.
14cb0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
14cc0 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ed");.. /*.
14cd0 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d * we're assum
14ce0 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65 ing here that we
14cf0 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 're single-threa
14d00 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ded. */.
14d10 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 if (statePtr->ti
14d20 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 mer != (Tcl_Time
14d30 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a rToken) NULL) {.
14d40 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 .Tcl_DeleteTimer
14d50 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 Handler(statePtr
14d60 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 ->timer);..state
14d70 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c Ptr->timer = NUL
14d80 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 L;. }.. if
14d90 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 (statePtr->prot
14da0 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 os) {..ckfree(st
14db0 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b atePtr->protos);
14dc0 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
14dd0 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d os = NULL;. }
14de0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
14df0 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 r->bio) {../* Th
14e00 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c is will call SSL
14e10 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 _shutdown. Bug 1
14e20 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 414045 */..dprin
14e30 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c tf("BIO_free_all
14e40 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
14e50 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 >bio);..BIO_free
14e60 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 _all(statePtr->b
14e70 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e io);..statePtr->
14e80 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 bio = NULL;.
14e90 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
14ea0 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 tr->ssl) {..dpri
14eb0 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 ntf("SSL_free(%p
14ec0 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 )", statePtr->ss
14ed0 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 l);..SSL_free(st
14ee0 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 atePtr->ssl);..s
14ef0 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e tatePtr->ssl = N
14f00 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
14f10 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 f (statePtr->ctx
14f20 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 ) {..SSL_CTX_fre
14f30 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 e(statePtr->ctx)
14f40 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ;..statePtr->ctx
14f50 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
14f60 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
14f70 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 >callback) {..Tc
14f80 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
14f90 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
14fa0 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 k);..statePtr->c
14fb0 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a allback = NULL;.
14fc0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
14fd0 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
14fe0 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
14ff0 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
15000 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 password);..stat
15010 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
15020 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
15030 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
15040 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 cmd) {..Tcl_Decr
15050 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
15060 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 r->vcmd);..state
15070 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c Ptr->vcmd = NULL
15080 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
15090 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 intf("Returning"
150a0 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
150b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150f0 2d 2d 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 --. *. * Build I
15100 6e 66 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 nfo Command --.
15110 2a 0a 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d *. *.Create comm
15120 61 6e 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75 and to return bu
15130 69 6c 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 ild info for pac
15140 6b 61 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 kage.. *. * Resu
15150 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
15160 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a rd Tcl result. *
15170 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
15180 3a 0a 20 2a 09 43 72 65 61 74 65 64 20 62 75 69 :. *.Created bui
15190 6c 64 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e ld-info command.
151a0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
151b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
151f0 0a 0a 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 ..#ifndef STRING
15200 49 46 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 IFY.# define ST
15210 52 49 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e RINGIFY(x) STRIN
15220 47 49 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 GIFY1(x).# defi
15230 6e 65 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 ne STRINGIFY1(x)
15240 20 23 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a #x.#endif..int.
15250 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 BuildInfoCommand
15260 28 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 (Tcl_Interp* int
15270 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 erp) {. Tcl_C
15280 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 mdInfo info;..
15290 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d if (Tcl_GetCom
152a0 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c mandInfo(interp,
152b0 20 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 "::tcl::build-i
152c0 6e 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a nfo", &info)) {.
152d0 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f .Tcl_CreateObjCo
152e0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
152f0 3a 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f :tls::build-info
15300 22 2c 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c ", info.objProc,
15310 20 28 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 (void *)(...PAC
15320 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 KAGE_VERSION "+"
15330 20 53 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 STRINGIFY(TLS_V
15340 45 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 ERSION_UUID).#if
15350 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 defined(__clang
15360 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f __) && defined(_
15370 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a _clang_major__).
15380 09 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 ... ".clang-"
15390 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 STRINGIFY(__cla
153a0 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 ng_major__).#if
153b0 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 __clang_minor__
153c0 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a < 10.... "0".
153d0 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 #endif.... ST
153e0 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f RINGIFY(__clang_
153f0 6d 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a minor__).#endif.
15400 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 #if defined(__cp
15410 6c 75 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 lusplus) && !def
15420 69 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 ined(__OBJC__)..
15430 09 09 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 .. ".cplusplu
15440 73 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 s".#endif.#ifnde
15450 66 20 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 f NDEBUG....
15460 22 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a ".debug".#endif.
15470 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 #if !defined(__c
15480 6c 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 lang__) && !defi
15490 6e 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 ned(__INTEL_COMP
154a0 49 4c 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 ILER) && defined
154b0 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 (__GNUC__)....
154c0 20 20 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 ".gcc-" STRING
154d0 49 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 IFY(__GNUC__).#i
154e0 66 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f f __GNUC_MINOR__
154f0 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 < 10.... "0"
15500 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 .#endif.... S
15510 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f TRINGIFY(__GNUC_
15520 4d 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a MINOR__).#endif.
15530 23 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 #ifdef __INTEL_C
15540 4f 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 OMPILER.... "
15550 2e 69 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 .icc-" STRINGIFY
15560 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 (__INTEL_COMPILE
15570 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 R).#endif.#ifdef
15580 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 TCL_MEM_DEBUG..
15590 09 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 .. ".memdebug
155a0 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ".#endif.#if def
155b0 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 ined(_MSC_VER)..
155c0 09 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 .. ".msvc-" S
155d0 54 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 TRINGIFY(_MSC_VE
155e0 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 R).#endif.#ifdef
155f0 20 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 USE_NMAKE....
15600 20 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 ".nmake".#endi
15610 66 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 f.#ifndef TCL_CF
15620 47 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 G_OPTIMIZED....
15630 20 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 ".no-optimize
15640 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ".#endif.#ifdef
15650 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 __OBJC__....
15660 22 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 ".objective-c".#
15670 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c if defined(__cpl
15680 75 73 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 usplus).... "
15690 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 plusplus".#endif
156a0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 .#endif.#ifdef T
156b0 43 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a CL_CFG_PROFILED.
156c0 09 09 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 ... ".profile
156d0 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ".#endif.#ifdef
156e0 50 55 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e PURIFY.... ".
156f0 70 75 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 purify".#endif.#
15700 69 66 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 ifdef STATIC_BUI
15710 4c 44 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 LD.... ".stat
15720 69 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 ic".#endif...),
15730 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL);. }.
15740 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
15750 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
15760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
157a0 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 * Tls_Init --.
157b0 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 *. *.This is a p
157c0 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a ackage initializ
157d0 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c ation procedure,
157e0 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 which is called
157f0 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 . *.by Tcl when
15800 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 this package is
15810 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 to be added to a
15820 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 n interpreter..
15830 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 *. * Results: S
15840 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e sl configured an
15850 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 d loaded. *. * S
15860 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
15870 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 create the ssl
15880 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c command, initial
15890 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a ize ssl context.
158a0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
158b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158e0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 --------. */..#i
158f0 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 f TCL_MAJOR_VERS
15900 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 ION > 8.#define
15910 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 MIN_VERSION "9.0
15920 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 ".#else.#define
15930 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 MIN_VERSION "8.5
15940 22 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 ".#endif..static
15950 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 const char tlsT
15960 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d clInitScript[] =
15970 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 {.#include "tls
15980 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 .tcl.h"..0x00.
15990 20 20 7d 3b 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 };..DLLEXPORT
159a0 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c int Tls_Init(Tcl
159b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 _Interp *interp)
159c0 20 7b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
159d0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64 "Called");..#ifd
159e0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 ef USE_TCL_STUBS
159f0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 . if (Tcl_Ini
15a00 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d tStubs(interp, M
15a10 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d IN_VERSION, 0) =
15a20 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
15a30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
15a40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 }.#endif. if
15a50 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 (Tcl_PkgRequire
15a60 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 (interp, "Tcl",
15a70 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 MIN_VERSION, 0)
15a80 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
15a90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
15aa0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 }.. if (Tls
15ab0 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 LibInit(0) != TC
15ac0 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 L_OK) {..Tcl_App
15ad0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
15ae0 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 , "could not ini
15af0 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 tialize SSL libr
15b00 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 ary", (char *)NU
15b10 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
15b20 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
15b30 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15b40 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15b50 22 3a 3a 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 "::tls::ciphers"
15b60 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c , CiphersObjCmd,
15b70 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c 2c 20 (void *) NULL,
15b80 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
15b90 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
15ba0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
15bb0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
15bc0 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e :tls::connection
15bd0 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 ", ConnectionInf
15be0 6f 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a oObjCmd, (void *
15bf0 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
15c00 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
15c10 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
15c20 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
15c30 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61 terp, "::tls::ha
15c40 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 ndshake", Handsh
15c50 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64 akeObjCmd, (void
15c60 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 *) NULL, (Tcl_C
15c70 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
15c80 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
15c90 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
15ca0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a interp, "::tls::
15cb0 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f import", ImportO
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 75 6e 69 6d rp, "::tls::unim
15d20 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f port", UnimportO
15d30 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20 bjCmd, (void *)
15d40 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
15d50 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
15d60 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
15d70 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
15d80 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 rp, "::tls::stat
15d90 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d us", StatusObjCm
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 76 65 72 73 69 6f 6e 22 "::tls::version"
15e00 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c , VersionObjCmd,
15e10 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c 2c 20 (void *) NULL,
15e20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
15e30 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
15e40 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
15e50 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
15e60 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 :tls::misc", Mis
15e70 63 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a cObjCmd, (void *
15e80 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
15e90 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
15ea0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
15eb0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
15ec0 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 70 72 terp, "::tls::pr
15ed0 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 otocols", Protoc
15ee0 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64 olsObjCmd, (void
15ef0 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 *) NULL, (Tcl_C
15f00 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
15f10 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 75 69 6c NULL);.. Buil
15f20 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 dInfoCommand(int
15f30 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 erp);.. if (i
15f40 6e 74 65 72 70 20 26 26 20 54 63 6c 5f 45 76 61 nterp && Tcl_Eva
15f50 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c l(interp, tlsTcl
15f60 49 6e 69 74 53 63 72 69 70 74 29 20 21 3d 20 54 InitScript) != T
15f70 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
15f80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
15f90 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 }.. return Tc
15fa0 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 l_PkgProvide(int
15fb0 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d erp, PACKAGE_NAM
15fc0 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 E, PACKAGE_VERSI
15fd0 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d ON);.}../*. *---
15fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16010 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 ---*. *. *.Tls_S
16020 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a afeInit --. *. *
16030 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
16040 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 -*. *.Standard p
16070 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 rocedure require
16080 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 d by 'load'.. *.
16090 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 Initializes this
160a0 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 extension for a
160b0 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 safe interprete
160c0 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d r.. *.----------
160d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
160e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
160f0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 ------*. *. *.Si
16100 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 de effects:. *..
16110 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 As of 'Tls_Init'
16120 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 . *. *.Result:.
16130 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *..A standard Tc
16140 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a l error code.. *
16150 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
16160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a ---------*. */..
16190 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c DLLEXPORT int Tl
161a0 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 s_SafeInit(Tcl_I
161b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
161c0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
161d0 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 lled");. retu
161e0 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 rn Tls_Init(inte
161f0 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d rp);.}../*. *---
16200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16230 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 ---*. *. *.TlsLi
16240 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d bInit --. *. *.-
16250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
16280 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 . *.Initializes
16290 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 SSL library once
162a0 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e per application
162b0 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
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 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 ----*. *. *.Side
162f0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e effects:. *..in
16300 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 itializes SSL li
16310 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 brary. *. *.Resu
16320 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a lt:. *..none. *.
16330 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16360 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 --------*. */.st
16370 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 atic int TlsLibI
16380 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 nit(int uninitia
16390 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 lize) {. stat
163a0 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a ic int initializ
163b0 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 ed = 0;. int
163c0 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b status = TCL_OK;
163d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
163e0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
163f0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
16400 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 EADS). size_t
16410 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 num_locks;.#end
16420 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e if.. if (unin
16430 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 itialize) {..if
16440 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b (!initialized) {
16450 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 .. dprintf("A
16460 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 sked to uninitia
16470 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 lize, but we are
16480 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 not initialized
16490 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e ");... return
164a0 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 TCL_OK;..}...dp
164b0 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 rintf("Asked to
164c0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a uninitialize");.
164d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
164e0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
164f0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
16500 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 EADS)..Tcl_Mutex
16510 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a Lock(&init_mx);.
16520 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 ..if (locks) {..
16530 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b free(locks);
16540 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 .. locks = NU
16550 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f LL;.. locksCo
16560 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 unt = 0;..}.#end
16570 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 if..initialized
16580 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 = 0;..#if define
16590 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
165a0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
165b0 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f L_THREADS)..Tcl_
165c0 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 MutexUnlock(&ini
165d0 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 t_mx);.#endif...
165e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 return TCL_OK;.
165f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e }.. if (in
16600 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 itialized) {..dp
16610 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 rintf("Called, b
16620 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 ut using cached
16630 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e value");..return
16640 20 73 74 61 74 75 73 3b 0a 20 20 20 20 7d 0a 0a status;. }..
16650 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
16660 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 led");..#if defi
16670 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
16680 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
16690 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 TCL_THREADS).
166a0 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 Tcl_MutexLock(&
166b0 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 init_mx);.#endif
166c0 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 . initialized
166d0 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e = 1;..#if defin
166e0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
166f0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
16700 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 CL_THREADS).
16710 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 num_locks = 1;.
16720 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 locksCount =
16730 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b (int) num_locks;
16740 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c . locks = mal
16750 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b loc(sizeof(*lock
16760 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b s) * num_locks);
16770 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b . memset(lock
16780 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f s, 0, sizeof(*lo
16790 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 cks) * num_locks
167a0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f );.#endif.. /
167b0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 * Initialize BOT
167c0 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 H libcrypto and
167d0 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f libssl. */. O
167e0 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 PENSSL_init_ssl(
167f0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 OPENSSL_INIT_LOA
16800 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 D_SSL_STRINGS |
16810 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 OPENSSL_INIT_LOA
16820 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 D_CRYPTO_STRINGS
16830 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 ..| OPENSSL_INIT
16840 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 _ADD_ALL_CIPHERS
16850 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f | OPENSSL_INIT_
16860 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c ADD_ALL_DIGESTS,
16870 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f NULL);.. BIO
16880 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 _new_tcl(NULL, 0
16890 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a );..#if 0. /*
168a0 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f . * XXX:TODO
168b0 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f : Remove this co
168c0 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 de and replace i
168d0 74 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 t with a check.
168e0 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 * for enough
168f0 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 entropy and do
16900 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 not try to creat
16910 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a e our own. *
16920 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 terrible entrop
16930 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a y. */. /*
16940 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 . * Seed the
16950 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 random number g
16960 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 enerator in the
16970 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 SSL library,.
16980 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f * using the do
16990 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 /while construct
169a0 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 because of the
169b0 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a bug note in the.
169c0 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 * OpenSSL F
169d0 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 AQ at http://www
169e0 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 .openssl.org/sup
169f0 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 port/faq.html#US
16a00 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 ER1. *.
16a10 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 * The crux of th
16a20 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 e problem is tha
16a30 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 t Solaris 7 does
16a40 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 not have a.
16a50 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f * /dev/random o
16a60 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 r /dev/urandom d
16a70 65 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e evice so it cann
16a80 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 ot gather enough
16a90 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 . * entropy
16aa0 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 from the RAND_se
16ab0 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e ed() when TLS in
16ac0 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 itializes and re
16ad0 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 fuses. * to
16ae0 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c go further. Earl
16af0 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 ier versions of
16b00 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 OpenSSL carried
16b10 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 on regardless..
16b20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 */. srand
16b30 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 ((unsigned int)
16b40 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 time((time_t *)
16b50 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b NULL));. do {
16b60 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 ..for (i = 0; i
16b70 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 < 16; i++) {..
16b80 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 rnd_seed[i] =
16b90 31 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 1 + (char) (255.
16ba0 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 0 * rand()/(RAND
16bb0 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 _MAX+1.0));..}..
16bc0 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 RAND_seed(rnd_se
16bd0 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 ed, sizeof(rnd_s
16be0 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 eed));. } whi
16bf0 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 le (RAND_status(
16c00 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a ) != 1);.#endif.
16c10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
16c20 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
16c30 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
16c40 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 EADS). Tcl_Mu
16c50 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f texUnlock(&init_
16c60 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 mx);.#endif..
16c70 20 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a return status;.
16c80 7d 0a }.