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 20 ULL) ? (char *)
04a0: 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f 54 NULL : \...Tcl_T
04b0: 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 ranslateFileName
04c0: 28 69 6e 74 65 72 70 2c 20 28 6b 65 79 29 2c 20 (interp, (key),
04d0: 28 64 73 70 29 29 29 0a 0a 73 74 61 74 69 63 20 (dsp)))..static
04e0: 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69 SSL_CTX *CTX_Ini
04f0: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 t(State *statePt
0500: 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c r, int isServer,
0510: 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 int proto, char
0520: 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 2a 63 *key,...char *c
0530: 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 6e 65 ertfile, unsigne
0540: 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 6e 31 d char *key_asn1
0550: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
0560: 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 69 6e *cert_asn1,...in
0570: 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e 2c 20 t key_asn1_len,
0580: 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65 int cert_asn1_le
0590: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c n, char *CApath,
05a0: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a 09 char *CAfile,..
05b0: 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 .char *ciphers,
05c0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 char *ciphersuit
05d0: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 es, int level, c
05e0: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a har *DHparams);.
05f0: 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 4c .static int.TlsL
0600: 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 ibInit(int unini
0610: 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 69 tialize);..#defi
0620: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ne TLS_PROTO_SSL
0630: 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20 2..0x01.#define
0640: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 09 TLS_PROTO_SSL3..
0650: 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c 53 0x02.#define TLS
0660: 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 30 _PROTO_TLS1..0x0
0670: 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4.#define TLS_PR
0680: 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 0a OTO_TLS1_1.0x08.
0690: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 #define TLS_PROT
06a0: 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 64 O_TLS1_2.0x10.#d
06b0: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f efine TLS_PROTO_
06c0: 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 66 TLS1_3.0x20.#def
06d0: 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67 ine ENABLED(flag
06e0: 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29 , mask).(((flag)
06f0: 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d & (mask)) == (m
0700: 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 53 ask))..#define S
0710: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 53 SLKEYLOGFILE.."S
0720: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a 2f SLKEYLOGFILE"../
0730: 2a 0a 20 2a 20 54 68 72 65 61 64 2d 53 61 66 65 *. * Thread-Safe
0740: 20 54 4c 53 20 43 6f 64 65 0a 20 2a 2f 0a 0a 23 TLS Code. */..#
0750: 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44 ifdef TCL_THREAD
0760: 53 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 53 53 S.#define OPENSS
0770: 4c 5f 54 48 52 45 41 44 5f 44 45 46 49 4e 45 53 L_THREAD_DEFINES
0780: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 .#include <opens
0790: 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e 66 2e 68 sl/opensslconf.h
07a0: 3e 0a 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 >..#ifdef OPENSS
07b0: 4c 5f 54 48 52 45 41 44 53 0a 23 69 6e 63 6c 75 L_THREADS.#inclu
07c0: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 79 70 de <openssl/cryp
07d0: 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c to.h>.#include <
07e0: 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 0a openssl/ssl.h>..
07f0: 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65 64 20 6f /*. * Threaded o
0800: 70 65 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 peration require
0810: 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c 62 61 s locking callba
0820: 63 6b 73 0a 20 2a 20 42 61 73 65 64 20 66 72 6f cks. * Based fro
0830: 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79 70 74 6c m /crypto/cryptl
0840: 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53 53 4c 20 ib.c of OpenSSL
0850: 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c 2e 0a 20 and NSOpenSSL..
0860: 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d */..static Tcl_M
0870: 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d 20 4e 55 utex *locks = NU
0880: 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6c LL;.static int l
0890: 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 73 ocksCount = 0;.s
08a0: 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 tatic Tcl_Mutex
08b0: 69 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64 69 66 20 init_mx;.#endif
08c0: 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 /* OPENSSL_THREA
08d0: 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 DS */.#endif /*
08e0: 54 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 0a TCL_THREADS */..
08f0: 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
0900: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c *******/./* Call
0910: 62 61 63 6b 73 20 20 20 20 20 20 20 20 2a 2f 0a backs */.
0920: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
0930: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 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 2d ----------------
0980: 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 43 61 6c 6c . *. * Eval Call
0990: 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a back Command --.
09a0: 20 2a 0a 20 2a 09 45 76 61 6c 20 63 61 6c 6c 62 *. *.Eval callb
09b0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 ack command and
09c0: 63 61 74 63 68 20 61 6e 79 20 65 72 72 6f 72 73 catch any errors
09d0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
09e0: 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 *.0 = Command r
09f0: 65 74 75 72 6e 65 64 20 66 61 69 6c 20 6f 72 20 eturned fail or
0a00: 65 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 eval returned TC
0a10: 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 20 3d 20 43 L_ERROR. *.1 = C
0a20: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 ommand returned
0a30: 73 75 63 63 65 73 73 20 6f 72 20 65 76 61 6c 20 success or eval
0a40: 72 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f 4b 0a returned TCL_OK.
0a50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
0a60: 74 73 3a 0a 20 2a 09 45 76 61 6c 75 61 74 65 73 ts:. *.Evaluates
0a70: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
0a80: 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d d. *. *---------
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 2d 0a 20 2a 2f 0a 73 ----------. */.s
0ad0: 74 61 74 69 63 20 69 6e 74 0a 45 76 61 6c 43 61 tatic int.EvalCa
0ae0: 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 6e 74 65 72 llback(Tcl_Inter
0af0: 70 20 2a 69 6e 74 65 72 70 2c 20 53 74 61 74 65 p *interp, State
0b00: 20 2a 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f *statePtr, Tcl_
0b10: 4f 62 6a 20 2a 63 6d 64 50 74 72 29 20 7b 0a 20 Obj *cmdPtr) {.
0b20: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 6f 6b 20 int code, ok
0b30: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 = 0;.. dprint
0b40: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
0b50: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
0b60: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
0b70: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 rp);. Tcl_Pre
0b80: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
0b90: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
0ba0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
0bb0: 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73 ack with success
0bc0: 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72 for ok or retur
0bd0: 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20 n value 1, fail
0be0: 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74 for error or ret
0bf0: 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20 urn value 0 */.
0c00: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 Tcl_ResetResu
0c10: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 lt(interp);.
0c20: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f code = Tcl_EvalO
0c30: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 bjEx(interp, cmd
0c40: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c Ptr, TCL_EVAL_GL
0c50: 4f 42 41 4c 29 3b 0a 20 20 20 20 64 70 72 69 6e OBAL);. dprin
0c60: 74 66 28 22 45 76 61 6c 43 61 6c 6c 62 61 63 6b tf("EvalCallback
0c70: 3a 20 25 64 22 2c 20 63 6f 64 65 29 3b 0a 20 20 : %d", code);.
0c80: 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 if (code == TC
0c90: 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43 68 65 63 L_OK) {../* Chec
0ca0: 6b 20 72 65 73 75 6c 74 20 66 6f 72 20 72 65 74 k result for ret
0cb0: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 54 63 urn value */..Tc
0cc0: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 20 3d 20 l_Obj *result =
0cd0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_GetObjResult
0ce0: 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 28 72 (interp);..if (r
0cf0: 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c esult == NULL ||
0d00: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f Tcl_GetIntFromO
0d10: 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c bj(interp, resul
0d20: 74 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c 5f 4f t, &ok) != TCL_O
0d30: 4b 29 20 7b 0a 09 20 20 20 20 6f 6b 20 3d 20 31 K) {.. ok = 1
0d40: 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 66 28 22 52 ;..}..dprintf("R
0d50: 65 73 75 6c 74 3a 20 25 64 22 2c 20 6f 6b 29 3b esult: %d", ok);
0d60: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f . } else {../
0d70: 2a 20 45 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 * Error - reject
0d80: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
0d90: 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 54 63 */..dprintf("Tc
0da0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
0db0: 72 22 29 3b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 r");.#if (TCL_MA
0dc0: 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 JOR_VERSION == 8
0dd0: 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f ) && (TCL_MINOR_
0de0: 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 VERSION < 6)..Tc
0df0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
0e00: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 r(interp);.#else
0e10: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
0e20: 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 Exception(interp
0e30: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a , code);.#endif.
0e40: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 52 }.. Tcl_R
0e50: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
0e60: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 ta) statePtr);.
0e70: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
0e80: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
0e90: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 rp);. return
0ea0: 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ok;.}.../*. *---
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 2d ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ef0: 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 . *. * InfoCallb
0f00: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e ack --. *. *.Mon
0f10: 69 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63 itors SSL connec
0f20: 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a tion process. *.
0f30: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
0f40: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
0f50: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
0f60: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
0f70: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d fined). *. *----
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 2d 2d ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0fc0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a */.static void.
0fd0: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e InfoCallback(con
0fe0: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 st SSL *ssl, int
0ff0: 20 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 where, int ret)
1000: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
1010: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a atePtr = (State*
1020: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 )SSL_get_app_dat
1030: 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 a((SSL *)ssl);.
1040: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
1050: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
1060: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
1070: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
1080: 20 20 20 63 68 61 72 20 2a 6d 61 6a 6f 72 2c 20 char *major,
1090: 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 72 *minor;.. dpr
10a0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
10b0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
10c0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 r->callback == (
10d0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 Tcl_Obj*)NULL)..
10e0: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20 return;.. if
10f0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1100: 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54 29 HANDSHAKE_START)
1110: 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e {..major = "han
1120: 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 dshake";..minor
1130: 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20 7d = "start";. }
1140: 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 else if (where
1150: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 & SSL_CB_HANDSHA
1160: 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f KE_DONE) {..majo
1170: 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b r = "handshake";
1180: 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 ..minor = "done"
1190: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
11a0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
11b0: 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72 CB_ALERT)..major
11c0: 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73 = "alert";..els
11d0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 e if (where & SS
11e0: 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 L_ST_CONNECT).ma
11f0: 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b jor = "connect";
1200: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 ..else if (where
1210: 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50 54 & SSL_ST_ACCEPT
1220: 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65 )..major = "acce
1230: 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d pt";..else.....m
1240: 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 ajor = "unknown"
1250: 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 ;...if (where &
1260: 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d 69 SSL_CB_READ)..mi
1270: 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09 65 nor = "read";..e
1280: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
1290: 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09 6d SSL_CB_WRITE)..m
12a0: 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b 0a inor = "write";.
12b0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
12c0: 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 & SSL_CB_LOOP)..
12d0: 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a minor = "loop";.
12e0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
12f0: 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09 09 & SSL_CB_EXIT)..
1300: 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a minor = "exit";.
1310: 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72 20 .else.....minor
1320: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 = "unknown";.
1330: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
1340: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
1350: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c l with fn, chan,
1360: 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d major, minor, m
1370: 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79 70 65 essage, and type
1380: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 args */. cmd
1390: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
13a0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
13b0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 >callback);.
13c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
13d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
13e0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
13f0: 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 StringObj("info"
1400: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
1410: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1420: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
1430: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
1440: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
1450: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
1460: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
1470: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
1480: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1490: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
14a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
14b0: 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a bj(major, -1));.
14c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
14d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
14e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
14f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 _NewStringObj(mi
1500: 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 nor, -1));..
1510: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
1520: 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c CB_ALERT) {..Tcl
1530: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1540: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1550: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
1560: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
1570: 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e alert_desc_strin
1580: 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 g_long(ret), -1)
1590: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
15a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
15b0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
15c0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
15d0: 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 bj(SSL_alert_typ
15e0: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 e_string_long(re
15f0: 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 t), -1));. }
1600: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 else {..Tcl_List
1610: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1620: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
1630: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
1640: 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 ingObj(SSL_state
1650: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c _string_long(ssl
1660: 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ), -1));..Tcl_Li
1670: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1680: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1690: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
16a0: 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 Obj("info", -1))
16b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
16c0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
16d0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
16e0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
16f0: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
1700: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
1710: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
1720: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
1730: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
1740: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1790: 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 . * MessageCallb
17a0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e ack --. *. *.Mon
17b0: 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 itors SSL protoc
17c0: 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 ol messages. *.
17d0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
17e0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
17f0: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
1800: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
1810: 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ined). *. *-----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
1860: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 */.#ifndef OPENS
1870: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a SL_NO_SSL_TRACE.
1880: 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 static void.Mess
1890: 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 ageCallback(int
18a0: 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 write_p, int ver
18b0: 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e sion, int conten
18c0: 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f t_type, const vo
18d0: 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 id *buf, size_t
18e0: 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 len, SSL *ssl, v
18f0: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 oid *arg) {.
1900: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
1910: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 = (State*)arg;.
1920: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
1930: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
1940: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
1950: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
1960: 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 char *ver, *t
1970: 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 ype;. BIO *bi
1980: 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 o;. char buff
1990: 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 er[15000];. b
19a0: 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 uffer[0] = 0;..
19b0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
19c0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
19d0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
19e0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
19f0: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 ULL)..return;..
1a00: 20 20 20 73 77 69 74 63 68 28 76 65 72 73 69 6f switch(versio
1a10: 6e 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c n) {.#if OPENSSL
1a20: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
1a30: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
1a40: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
1a50: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
1a60: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
1a70: 20 20 20 20 63 61 73 65 20 53 53 4c 32 5f 56 45 case SSL2_VE
1a80: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 RSION:..ver = "S
1a90: 53 4c 76 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 SLv2";..break;.#
1aa0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
1ab0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 ed(NO_SSL3) && !
1ac0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
1ad0: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73 NO_SSL3). cas
1ae0: 65 20 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a e SSL3_VERSION:.
1af0: 09 76 65 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a .ver = "SSLv3";.
1b00: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 .break;.#endif.
1b10: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 56 45 52 case TLS1_VER
1b20: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c SION:..ver = "TL
1b30: 53 76 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 Sv1";..break;.
1b40: 20 20 63 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 case TLS1_1_VE
1b50: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 RSION:..ver = "T
1b60: 4c 53 76 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b LSv1.1";..break;
1b70: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 32 . case TLS1_2
1b80: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d _VERSION:..ver =
1b90: 20 22 54 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 "TLSv1.2";..bre
1ba0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 ak;. case TLS
1bb0: 31 5f 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 1_3_VERSION:..ve
1bc0: 72 20 3d 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 r = "TLSv1.3";..
1bd0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1be0: 30 3a 0a 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22 0:..ver = "none"
1bf0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 ;..break;. de
1c00: 66 61 75 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75 fault:..ver = "u
1c10: 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b nknown";..break;
1c20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 . }.. swit
1c30: 63 68 20 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65 ch (content_type
1c40: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 53 53 4c ) {. case SSL
1c50: 33 5f 52 54 5f 48 45 41 44 45 52 3a 0a 09 74 79 3_RT_HEADER:..ty
1c60: 70 65 20 3d 20 22 48 65 61 64 65 72 22 3b 0a 09 pe = "Header";..
1c70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1c80: 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f SSL3_RT_INNER_CO
1c90: 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70 NTENT_TYPE:..typ
1ca0: 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65 e = "Inner Conte
1cb0: 6e 74 20 54 79 70 65 22 3b 0a 09 62 72 65 61 6b nt Type";..break
1cc0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1cd0: 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48 45 52 RT_CHANGE_CIPHER
1ce0: 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d 20 22 _SPEC:..type = "
1cf0: 43 68 61 6e 67 65 20 43 69 70 68 65 72 22 3b 0a Change Cipher";.
1d00: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 .break;. case
1d10: 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a SSL3_RT_ALERT:.
1d20: 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22 3b .type = "Alert";
1d30: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1d40: 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 e SSL3_RT_HANDSH
1d50: 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 AKE:..type = "Ha
1d60: 6e 64 73 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b ndshake";..break
1d70: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1d80: 52 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 RT_APPLICATION_D
1d90: 41 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 ATA:..type = "Ap
1da0: 70 20 44 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b p Data";..break;
1db0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
1dc0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
1dd0: 33 30 30 30 30 30 30 30 4c 0a 20 20 20 20 63 61 30000000L. ca
1de0: 73 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 se DTLS1_RT_HEAR
1df0: 54 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 TBEAT:..type = "
1e00: 48 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65 Heartbeat";..bre
1e10: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 ak;.#endif. d
1e20: 65 66 61 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 efault:..type =
1e30: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d "unknown";. }
1e40: 0a 0a 20 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 .. /* Needs c
1e50: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 ompile time opti
1e60: 6f 6e 20 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 on "enable-ssl-t
1e70: 72 61 63 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 race". */. if
1e80: 20 28 28 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 ((bio = BIO_new
1e90: 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 (BIO_s_mem())) !
1ea0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e = NULL) {..int n
1eb0: 3b 0a 09 53 53 4c 5f 74 72 61 63 65 28 77 72 69 ;..SSL_trace(wri
1ec0: 74 65 5f 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 te_p, version, c
1ed0: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 ontent_type, buf
1ee0: 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 , len, ssl, (voi
1ef0: 64 20 2a 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 d *)bio);..n = B
1f00: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66 IO_read(bio, buf
1f10: 66 65 72 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67 fer, BIO_pending
1f20: 28 62 69 6f 29 20 3c 20 31 35 30 30 30 20 3f 20 (bio) < 15000 ?
1f30: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 BIO_pending(bio)
1f40: 20 3a 20 31 34 39 39 39 29 3b 0a 09 6e 20 3d 20 : 14999);..n =
1f50: 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 (n<0) ? 0 : n;..
1f60: 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 buffer[n] = 0;..
1f70: 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 (void)BIO_flush(
1f80: 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28 bio);..BIO_free(
1f90: 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 bio);. }..
1fa0: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
1fb0: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 d to eval with f
1fc0: 6e 2c 20 63 68 61 6e 2c 20 64 69 72 65 63 74 69 n, chan, directi
1fd0: 6f 6e 2c 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 on, version, typ
1fe0: 65 2c 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61 e, and message a
1ff0: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
2000: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
2010: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
2020: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 allback);. Tc
2030: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2040: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2050: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
2060: 72 69 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 ringObj("message
2070: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
2080: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2090: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
20a0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
20b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
20c0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
20d0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
20e0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
20f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2100: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2110: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2120: 4f 62 6a 28 77 72 69 74 65 5f 70 20 3f 20 22 53 Obj(write_p ? "S
2130: 65 6e 74 22 20 3a 20 22 52 65 63 65 69 76 65 64 ent" : "Received
2140: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
2150: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2160: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
2170: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
2180: 69 6e 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 ingObj(ver, -1))
2190: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
21a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
21b0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
21c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
21d0: 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 type, -1));.
21e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
21f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2200: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2210: 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 StringObj(buffer
2220: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 , -1));.. /*
2230: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
2240: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
2250: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2260: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
2270: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
2280: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
2290: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
22a0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
22b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 .}.#endif.../*.
22c0: 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
2300: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 ----. *. * Verif
2310: 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a yCallback --. *.
2320: 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 *.Monitors SSL
2330: 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 certificate vali
2340: 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 dation process.
2350: 55 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 Used to control
2360: 74 68 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 the. *.behavior
2370: 77 68 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 when the SSL_VER
2380: 49 46 59 5f 50 45 45 52 20 66 6c 61 67 20 69 73 IFY_PEER flag is
2390: 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 63 61 set. This is ca
23a0: 6c 6c 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 lled. *.whenever
23b0: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 69 a certificate i
23c0: 73 20 69 6e 73 70 65 63 74 65 64 20 6f 72 20 64 s inspected or d
23d0: 65 63 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 ecided invalid.
23e0: 43 61 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 Called for. *.ea
23f0: 63 68 20 63 65 72 74 69 66 69 63 61 74 65 20 69 ch certificate i
2400: 6e 20 74 68 65 20 63 65 72 74 20 63 68 61 69 6e n the cert chain
2410: 2e 0a 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a .. *. * Checks:.
2420: 20 2a 09 54 68 65 20 63 65 72 74 69 66 69 63 61 *.The certifica
2430: 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65 63 te chain is chec
2440: 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 ked starting wit
2450: 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e 65 h the deepest ne
2460: 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 sting level. *.
2470: 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63 65 (the root CA ce
2480: 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20 77 rtificate) and w
2490: 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f 20 orked upward to
24a0: 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74 69 the peer's certi
24b0: 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 ficate.. *.All s
24c0: 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76 61 ignatures are va
24d0: 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69 6d lid, current tim
24e0: 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72 73 e is within firs
24f0: 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 t and last valid
2500: 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 ity time.. *.Che
2510: 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72 74 ck that the cert
2520: 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75 65 ificate is issue
2530: 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72 20 d by the issuer
2540: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73 75 certificate issu
2550: 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 er.. *.Check the
2560: 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 revocation stat
2570: 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72 74 us for each cert
2580: 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 ificate.. *.Chec
2590: 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20 6f k the validity o
25a0: 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c 20 f the given CRL
25b0: 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65 76 and the cert rev
25c0: 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a ocation status..
25d0: 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f 6c *.Check the pol
25e0: 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 icies of all the
25f0: 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a certificates. *
2600: 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 76 . * Args. *.prev
2610: 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 erify_ok indicat
2620: 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 63 es whether the c
2630: 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69 66 ertificate verif
2640: 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20 28 ication passed (
2650: 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 1) or not (0). *
2660: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
2670: 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 A callback bound
2680: 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 6d to the socket m
2690: 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 ay return one of
26a0: 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 74 :. *. 0...- t
26b0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 he certificate i
26c0: 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 s deemed invalid
26d0: 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61 74 , send verificat
26e0: 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 6c ion. *.... fail
26f0: 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65 65 ure alert to pee
2700: 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 r, and terminate
2710: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 handshake.. *.
2720: 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72 1...- the cer
2730: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d tificate is deem
2740: 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e ed valid, contin
2750: 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b ue with handshak
2760: 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20 e.. *. empty
2770: 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e string.- no chan
2780: 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 ge to certificat
2790: 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a e validation. *.
27a0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
27b0: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c . *.The err fiel
27c0: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 d of the current
27d0: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 ly operative Sta
27e0: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 te is set. *. t
27f0: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 o a string descr
2800: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 ibing the SSL ne
2810: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 gotiation failur
2820: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d e reason. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2870: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
2880: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 .VerifyCallback(
2890: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f int ok, X509_STO
28a0: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 RE_CTX *ctx) {.
28b0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
28c0: 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 tr;. SSL *s
28d0: 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 sl..= (SSL*)X509
28e0: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 _STORE_CTX_get_e
28f0: 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c 5f x_data(ctx, SSL_
2900: 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 get_ex_data_X509
2910: 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 _STORE_CTX_idx()
2920: 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65 );. X509 *ce
2930: 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 rt..= X509_STORE
2940: 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 _CTX_get_current
2950: 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20 _cert(ctx);.
2960: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 State *statePtr.
2970: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 = (State*)SSL_ge
2980: 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b t_app_data(ssl);
2990: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
29a0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
29b0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
29c0: 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35 30 int depth..= X50
29d0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 9_STORE_CTX_get_
29e0: 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29 error_depth(ctx)
29f0: 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09 3d ;. int err..=
2a00: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
2a10: 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a get_error(ctx);.
2a20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
2a30: 6c 6c 65 64 22 29 3b 0a 20 20 20 20 64 70 72 69 lled");. dpri
2a40: 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 ntf("VerifyCallb
2a50: 61 63 6b 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a ack: %d", ok);..
2a60: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
2a70: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f ->vcmd == (Tcl_O
2a80: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 bj*)NULL) {../*
2a90: 55 73 65 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 Use ok value if
2aa0: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 73 20 verification is
2ab0: 72 65 71 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 required */..if
2ac0: 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 (statePtr->vflag
2ad0: 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 s & SSL_VERIFY_F
2ae0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 AIL_IF_NO_PEER_C
2af0: 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 ERT) {.. retu
2b00: 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b rn ok;..} else {
2b10: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a .. return 1;.
2b20: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 .}. } else if
2b30: 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c (cert == NULL |
2b40: 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b | ssl == NULL) {
2b50: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 ..return 0;.
2b60: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 }.. dprintf("
2b70: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 VerifyCallback:
2b80: 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b eval callback");
2b90: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
2ba0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
2bb0: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 with fn, chan, d
2bc0: 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 epth, cert info
2bd0: 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e list, status, an
2be0: 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a d error args */.
2bf0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
2c00: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
2c10: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 atePtr->vcmd);.
2c20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2c30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2c40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
2c50: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 NewStringObj("ve
2c60: 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 rify", -1));.
2c70: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2c80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2c90: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e , cmdPtr,..Tcl_N
2ca0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
2cb0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
2cc0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
2cd0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
2ce0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2cf0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2d00: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a r, Tcl_NewIntObj
2d10: 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63 (depth));. Tc
2d20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2d30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2d40: 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 mdPtr, Tls_NewX5
2d50: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 09Obj(interp, ce
2d60: 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 rt));. Tcl_Li
2d70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2d80: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2d90: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a r, Tcl_NewIntObj
2da0: 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c (ok));. Tcl_L
2db0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2dc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2dd0: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 tr,..Tcl_NewStri
2de0: 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30 ngObj((char*)X50
2df0: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 9_verify_cert_er
2e00: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c ror_string(err),
2e10: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 -1));.. /* P
2e20: 72 65 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 revent I/O while
2e30: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 callback is in
2e40: 70 72 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 progress */.
2e50: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 /* statePtr->fla
2e60: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 gs |= TLS_TCL_CA
2e70: 4c 4c 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 LLBACK; */..
2e80: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
2e90: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
2ea0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
2eb0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b (cmdPtr);. ok
2ec0: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 = EvalCallback(
2ed0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
2ee0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
2ef0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
2f00: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 cmdPtr);.. dp
2f10: 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c rintf("VerifyCal
2f20: 6c 62 61 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 lback: command r
2f30: 65 73 75 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 esult = %d", ok)
2f40: 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 ;.. /* stateP
2f50: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 tr->flags &= ~(T
2f60: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 LS_TCL_CALLBACK)
2f70: 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 ; */. return
2f80: 6f 6b 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c ok;./* By defaul
2f90: 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 t, leave verific
2fa0: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e ation unchanged.
2fb0: 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3000: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 . *. * Tls_Error
3010: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 --. *. *.Calls
3020: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 65 72 callback with er
3030: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a ror message.. *.
3040: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
3050: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c . *.The err fiel
3060: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 d of the current
3070: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 ly operative Sta
3080: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 te is set. *. t
3090: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 o a string descr
30a0: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 ibing the SSL ne
30b0: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 gotiation failur
30c0: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d e reason. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3110: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 -. */.void.Tls_E
3120: 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 rror(State *stat
3130: 65 50 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 ePtr, const char
3140: 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c *msg) {. Tcl
3150: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
3160: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
3170: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
3180: 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 *cmdPtr, *listPt
3190: 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 r;. unsigned
31a0: 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74 long err;. st
31b0: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 atePtr->err = ms
31c0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 g;.. dprintf(
31d0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
31e0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
31f0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f llback == (Tcl_O
3200: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 bj*)NULL)..retur
3210: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 n;.. /* Creat
3220: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
3230: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c l with fn, chan,
3240: 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 and message arg
3250: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
3260: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
3270: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
3280: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f lback);. Tcl_
3290: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
32a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
32b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
32c0: 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d ngObj("error", -
32d0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
32e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
32f0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3300: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
3310: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
3320: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
3330: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
3340: 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d ;. if (msg !=
3350: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 NULL) {..Tcl_Li
3360: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3370: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
3380: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
3390: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a Obj(msg, -1));..
33a0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 } else if ((
33b0: 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 msg = Tcl_GetStr
33c0: 69 6e 67 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 ing(Tcl_GetObjRe
33d0: 73 75 6c 74 28 69 6e 74 65 72 70 29 29 29 20 21 sult(interp))) !
33e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c = NULL) {..Tcl_L
33f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3400: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3410: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
3420: 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a gObj(msg, -1));.
3430: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c . } else {..l
3440: 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 istPtr = Tcl_New
3450: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
3460: 3b 0a 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d ;..while ((err =
3470: 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 ERR_get_error()
3480: 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) != 0) {.. T
3490: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
34a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
34b0: 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 listPtr, Tcl_New
34c0: 53 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 StringObj(ERR_re
34d0: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e ason_error_strin
34e0: 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d g(err), -1));..}
34f0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
3500: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3510: 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 p, cmdPtr, listP
3520: 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 tr);. }..
3530: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
3540: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
3550: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
3560: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 (cmdPtr);. Ev
3570: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 alCallback(inter
3580: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 p, statePtr, cmd
3590: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 Ptr);. Tcl_De
35a0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
35b0: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d r);.}.../*. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3600: 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c . *. * KeyLogCal
3610: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 lback --. *. *.W
3620: 72 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 rite received ke
3630: 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 y data to log fi
3640: 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 le.. *. * Side e
3650: 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a ffects:. *.none.
3660: 20 2a 0a 20 2a 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 2d 2d 2d ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
36b0: 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b d KeyLogCallback
36c0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
36d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e const char *lin
36e0: 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 e) {. char *s
36f0: 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b tr = getenv(SSLK
3700: 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 EYLOGFILE);.
3710: 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 FILE *fd;.. d
3720: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
3730: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 ;.. if (str)
3740: 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 {..fd = fopen(st
3750: 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 r, "a");..fprint
3760: 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e f(fd, "%s\n",lin
3770: 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b e);..fclose(fd);
3780: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a . }.}.../*. *
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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f ---. *. * Passwo
37e0: 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 rd Callback --.
37f0: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e *. *.Called when
3800: 20 61 20 70 61 73 73 77 6f 72 64 20 69 73 20 6e a password is n
3810: 65 65 64 65 64 20 66 6f 72 20 61 20 70 72 69 76 eeded for a priv
3820: 61 74 65 20 6b 65 79 20 77 68 65 6e 20 6c 6f 61 ate key when loa
3830: 64 69 6e 67 0a 20 2a 09 6f 72 20 73 74 6f 72 69 ding. *.or stori
3840: 6e 67 20 61 20 50 45 4d 20 63 65 72 74 69 66 69 ng a PEM certifi
3850: 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 79 70 cate with encryp
3860: 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c tion. Evals call
3870: 62 61 63 6b 0a 20 2a 09 73 63 72 69 70 74 20 61 back. *.script a
3880: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 nd returns the r
3890: 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 61 73 esult as the pas
38a0: 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20 sword string in
38b0: 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c buf.. *. * Resul
38c0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
38d0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
38e0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
38f0: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
3900: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
3910: 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69 .Password size i
3920: 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f n bytes or -1 fo
3930: 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 r an error.. *.
3940: 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
3980: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
3990: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c int.PasswordCall
39a0: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 back(char *buf,
39b0: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77 int size, int rw
39c0: 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74 flag, void *udat
39d0: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a a) {. State *
39e0: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 statePtr.= (Stat
39f0: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 e *) udata;.
3a00: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
3a10: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
3a20: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
3a30: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
3a40: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 54 63 int code;. Tc
3a50: 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 0a 20 20 20 l_Size len;..
3a60: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
3a70: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e ");.. /* If n
3a80: 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 o callback, use
3a90: 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b default callback
3aa0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
3ab0: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
3ac0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 = NULL) {..if (T
3ad0: 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 cl_EvalEx(interp
3ae0: 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 , "tls::password
3af0: 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f ", -1, TCL_EVAL_
3b00: 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f GLOBAL) == TCL_O
3b10: 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a K) {.. char *
3b20: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 ret = (char *) T
3b30: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
3b40: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 Obj(Tcl_GetObjRe
3b50: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c sult(interp), &l
3b60: 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 en);.. if (le
3b70: 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 n > (Tcl_Size) s
3b80: 69 7a 65 2d 31 29 20 7b 0a 09 09 6c 65 6e 20 3d ize-1) {...len =
3b90: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 (Tcl_Size) size
3ba0: 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 -1;.. }..
3bb0: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 strncpy(buf, ret
3bc0: 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b , (size_t) len);
3bd0: 0a 09 20 20 20 20 62 75 66 5b 6c 65 6e 5d 20 3d .. buf[len] =
3be0: 20 27 5c 30 27 3b 0a 09 20 20 20 20 72 65 74 75 '\0';.. retu
3bf0: 72 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d rn (int) len;..}
3c00: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 else {.. ret
3c10: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d urn -1;..}. }
3c20: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
3c30: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
3c40: 77 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c with fn, rwflag,
3c50: 20 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a and size args *
3c60: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
3c70: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
3c80: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
3c90: 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 rd);. Tcl_Lis
3ca0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3cb0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3cc0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
3cd0: 62 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d bj("password", -
3ce0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
3cf0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3d00: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3d10: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
3d20: 72 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 rwflag));. Tc
3d30: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
3d40: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
3d50: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e mdPtr, Tcl_NewIn
3d60: 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 tObj(size));..
3d70: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
3d80: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
3d90: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 rp);. Tcl_Pre
3da0: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 serve((ClientDat
3db0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
3dc0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
3dd0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
3de0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
3df0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
3e00: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
3e10: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d ObjEx(interp, cm
3e20: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 dPtr, TCL_EVAL_G
3e30: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 LOBAL);. if (
3e40: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
3e50: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 {.#if (TCL_MAJOR
3e60: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 _VERSION == 8) &
3e70: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 & (TCL_MINOR_VER
3e80: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 SION < 6)..Tcl_B
3e90: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 ackgroundError(i
3ea0: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 nterp);.#else..T
3eb0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 cl_BackgroundExc
3ec0: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 eption(interp, c
3ed0: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 ode);.#endif.
3ee0: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
3ef0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
3f00: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 .. Tcl_Releas
3f10: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
3f20: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f tatePtr);.. /
3f30: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c * If successful,
3f40: 20 70 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 pass back passw
3f50: 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 ord string and t
3f60: 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c runcate if too l
3f70: 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 ong */. if (c
3f80: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b ode == TCL_OK) {
3f90: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 ..char *ret = (c
3fa0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 har *) Tcl_GetSt
3fb0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f ringFromObj(Tcl_
3fc0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 GetObjResult(int
3fd0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 erp), &len);..if
3fe0: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a (len > (Tcl_Siz
3ff0: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 e) size-1) {..
4000: 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a len = (Tcl_Siz
4010: 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 e) size-1;..}..s
4020: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c trncpy(buf, ret,
4030: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a (size_t) len);.
4040: 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 .buf[len] = '\0'
4050: 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 ;..Tcl_Release((
4060: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 ClientData) inte
4070: 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e rp);..return (in
4080: 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 t) len;. }.
4090: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
40a0: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 lientData) inter
40b0: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d p);. return -
40c0: 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 1;.}.../*. *----
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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4110: 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 *. * Session Ca
4120: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e llback for Clien
4130: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c ts --. *. *.Call
4140: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65 ed when a new se
4150: 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 ssion is added t
4160: 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20 o the cache. In
4170: 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 TLS 1.3. *.this
4180: 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20 may be received
4190: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 multiple times a
41a0: 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 fter the handsha
41b0: 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 ke. For. *.earli
41c0: 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 er versions, thi
41d0: 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76 s will be receiv
41e0: 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61 ed during the ha
41f0: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 ndshake.. *.This
4200: 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72 65 is the preferre
4210: 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 d way to obtain
4220: 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73 a resumable sess
4230: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
4240: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
4250: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
4260: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
4270: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
4280: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
4290: 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 s:. *.0 = error
42a0: 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69 where session wi
42b0: 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c ll be immediatel
42c0: 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 y removed from t
42d0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 he internal cach
42e0: 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73 e.. *.1 = succes
42f0: 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74 61 s where app reta
4300: 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 ins session in s
4310: 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e ession cache, an
4320: 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f d must call SSL_
4330: 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 SESSION_free() w
4340: 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d hen done.. *. *-
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4390: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
43a0: 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 t.SessionCallbac
43b0: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f k(SSL *ssl, SSL_
43c0: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
43d0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
43e0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
43f0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
4400: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a ta((SSL *)ssl);.
4410: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
4420: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
4430: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
4440: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
4450: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
4460: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
4470: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
4480: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
4490: 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 n_id;. size_t
44a0: 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 len2;. unsig
44b0: 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 ned int ulen;..
44c0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
44d0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
44e0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
44f0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
4500: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
4510: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
4520: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
4530: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
4540: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4550: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
4560: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
4570: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
4580: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e al with fn, chan
4590: 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65 , session id, se
45a0: 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e ssion ticket, an
45b0: 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20 d lifetime args
45c0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
45d0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
45e0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
45f0: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ack);. Tcl_Li
4600: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4610: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4620: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
4630: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d Obj("session", -
4640: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
4650: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4660: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4670: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
4680: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
4690: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
46a0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
46b0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f ;.. /* Sessio
46c0: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 n id */. sess
46d0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 ion_id = SSL_SES
46e0: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 SION_get_id(sess
46f0: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 ion, &ulen);.
4700: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
4710: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
4720: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
4730: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 wByteArrayObj(se
4740: 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 ssion_id, (Tcl_S
4750: 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 ize) ulen));..
4760: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 /* Session tic
4770: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 ket */. SSL_S
4780: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b ESSION_get0_tick
4790: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 et(session, &tic
47a0: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 ket, &len2);.
47b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
47c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
47d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
47e0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 wByteArrayObj(ti
47f0: 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 cket, (Tcl_Size)
4800: 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a len2));.. /*
4810: 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 Lifetime - numb
4820: 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f er of seconds */
4830: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4840: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4850: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 terp, cmdPtr,..T
4860: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c cl_NewLongObj((l
4870: 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e ong) SSL_SESSION
4880: 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 _get_ticket_life
4890: 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f time_hint(sessio
48a0: 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 n)));.. /* Ev
48b0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
48c0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
48d0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
48e0: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c tr);. EvalCal
48f0: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
4900: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b atePtr, cmdPtr);
4910: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
4920: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
4930: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30 20 /* Return 0
4940: 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73 65 for now until se
4950: 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 69 ssion handling i
4960: 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 s complete */.
4970: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a return 0;.}...
4980: 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 --------. *. * A
49d0: 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 LPN Callback for
49e0: 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e Servers and NPN
49f0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c Callback for Cl
4a00: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 ients --. *. *.P
4a10: 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 erform protocol
4a20: 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 (http/1.1, h2, h
4a30: 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 3, etc.) selecti
4a40: 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e on for the. *.in
4a50: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f coming connectio
4a60: 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 n. Called after
4a70: 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 Hello and server
4a80: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 callbacks.. *.W
4a90: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 here 'out' is se
4aa0: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
4ab0: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 and 'in' is the
4ac0: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20 peer advertised
4ad0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 list.. *. * Resu
4ae0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
4af0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4b00: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
4b10: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
4b20: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
4b30: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
4b40: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 T_ERR_OK: ALPN p
4b50: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
4b60: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
4b70: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
4b80: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
4b90: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 ERT_FATAL: There
4ba0: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 was no overlap
4bb0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 between the clie
4bc0: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 nt's. *. supp
4bd0: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 lied list and th
4be0: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 e server configu
4bf0: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e ration. The conn
4c00: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 ection will be a
4c10: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 borted.. *.SSL_T
4c20: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
4c30: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e ALPN protocol n
4c40: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 ot selected, e.g
4c50: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c ., because no AL
4c60: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 PN. *. protoc
4c70: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 ols are configur
4c80: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e ed for this conn
4c90: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e ection. The conn
4ca0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
4cb0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
4d00: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 tatic int.ALPNCa
4d10: 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c llback(SSL *ssl,
4d20: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
4d30: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 char **out, unsi
4d40: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 gned char *outle
4d50: 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n,..const unsign
4d60: 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 ed char *in, uns
4d70: 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c igned int inlen,
4d80: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 void *arg) {.
4d90: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
4da0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b r = (State*)arg;
4db0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
4dc0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
4dd0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
4de0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
4df0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 . int code, r
4e00: 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 es;.. dprintf
4e10: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
4e20: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
4e30: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 || arg == NULL)
4e40: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
4e50: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4e60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
4e70: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a elect protocol *
4e80: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65 /. if (SSL_se
4e90: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 lect_next_proto(
4ea0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
4eb0: 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 *) out, outlen,
4ec0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
4ed0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 , statePtr->prot
4ee0: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c os_len,..in, inl
4ef0: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e en) == OPENSSL_N
4f00: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b PN_NEGOTIATED) {
4f10: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 ../* Match found
4f20: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 */..res = SSL_T
4f30: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 LSEXT_ERR_OK;.
4f40: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f } else {../* O
4f50: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 PENSSL_NPN_NO_OV
4f60: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c ERLAP = No overl
4f70: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 ap, so use first
4f80: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e item from clien
4f90: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 t protocol list
4fa0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c */..res = SSL_TL
4fb0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4fc0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
4fd0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d tatePtr->vcmd ==
4fe0: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
4ff0: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a {..return res;.
5000: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
5010: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
5020: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
5030: 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 an, depth, cert
5040: 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 info list, statu
5050: 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 s, and error arg
5060: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
5070: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
5080: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d bj(statePtr->vcm
5090: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
50a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
50b0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
50c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
50d0: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a j("alpn", -1));.
50e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
50f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5100: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
5110: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
5120: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
5130: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
5140: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 self), -1));.
5150: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5160: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5170: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
5180: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 wStringObj((cons
5190: 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20 t char *) *out,
51a0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
51b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
51c0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
51d0: 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 r, Tcl_NewBoolea
51e0: 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f nObj(res == SSL_
51f0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b TLSEXT_ERR_OK));
5200: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
5210: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
5220: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
5230: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5240: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 if ((code =
5250: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
5260: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
5270: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 mdPtr)) > 1) {..
5280: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
5290: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
52a0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
52b0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
52c0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
52d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
52e0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
52f0: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
5300: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
5310: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
5320: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
5330: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d res;.}.../*. *-
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5380: 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 --. *. * Adverti
5390: 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c se Protocols Cal
53a0: 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 lback for Next P
53b0: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 rotocol Negotiat
53c0: 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 ion (NPN) in Ser
53d0: 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 verHello --. *.
53e0: 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 *.called when a
53f0: 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 TLS server needs
5400: 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f a list of suppo
5410: 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 rted protocols f
5420: 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f or Next. *.Proto
5430: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e col Negotiation.
5440: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
5450: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
5460: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 de effects:. *.
5470: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
5480: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
5490: 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 R_OK: NPN protoc
54a0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 ol selected. The
54b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
54c0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
54d0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
54e0: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 NPN protocol not
54f0: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 selected. The c
5500: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
5510: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ues.. *. *------
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 2d 2d ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5560: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e /.#ifdef USE_NPN
5570: 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 .static int.NPNC
5580: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
5590: 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e L *ssl, const un
55a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 signed char **ou
55b0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 t, unsigned int
55c0: 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 *outlen, void *a
55d0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
55e0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
55f0: 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 te*)arg;.. dp
5600: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
5610: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d .. if (ssl ==
5620: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 NULL || arg ==
5630: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
5640: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
5650: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
5660: 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c /* Set protocol
5670: 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 s list */. if
5680: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 (statePtr->prot
5690: 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a os != NULL) {..*
56a0: 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e out = statePtr->
56b0: 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e protos;..*outlen
56c0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f = statePtr->pro
56d0: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 tos_len;. } e
56e0: 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 lse {..*out = NU
56f0: 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 LL;..*outlen = 0
5700: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c ;..return SSL_TL
5710: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
5720: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
5730: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5740: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f OK;.}.#endif.../
5750: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e -------. *. * SN
57a0: 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 I Callback for S
57b0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
57c0: 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 Perform server-s
57d0: 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 ide SNI hostname
57e0: 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 selection after
57f0: 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 receiving SNI e
5800: 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 xtension. *.in C
5810: 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c lient Hello. Cal
5820: 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 led after hello
5830: 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 callback but bef
5840: 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 ore ALPN callbac
5850: 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 k.. *. * Results
5860: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
5870: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
5880: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 .Calls callback
5890: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a (if defined). *.
58a0: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
58b0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
58c0: 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e RR_OK: SNI hostn
58d0: 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e ame is accepted.
58e0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
58f0: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
5900: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
5910: 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f RT_FATAL: SNI ho
5920: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
5930: 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e cepted. The conn
5940: 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 ection. *. is
5950: 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c aborted. Defaul
5960: 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 t for alert is S
5970: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a SL_AD_UNRECOGNIZ
5980: 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f ED_NAME.. *.SSL_
5990: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
59a0: 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f _WARNING: SNI ho
59b0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
59c0: 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 cepted, warning
59d0: 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e alert. *. sen
59e0: 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 t (not supported
59f0: 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 in TLSv1.3). Th
5a00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
5a10: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 tinues.. *.SSL_T
5a20: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a LSEXT_ERR_NOACK:
5a30: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 SNI hostname is
5a40: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e not accepted an
5a50: 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 d not acknowledg
5a60: 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 ed,. *. e.g.
5a70: 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 if SNI has not b
5a80: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 een configured.
5a90: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
5aa0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d ontinues.. *. *-
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5af0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
5b00: 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f t.SNICallback(co
5b10: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e nst SSL *ssl, in
5b20: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a t *alert, void *
5b30: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
5b40: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
5b50: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 ate*)arg;. Tc
5b60: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
5b70: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
5b80: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
5b90: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e *cmdPtr;. in
5ba0: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 t code, res;.
5bb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 const char *ser
5bc0: 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a vername = NULL;.
5bd0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
5be0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
5bf0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 (ssl == NULL ||
5c00: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 arg == NULL) {..
5c10: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
5c20: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
5c30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 }.. /* Only
5c40: 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e works for TLS 1.
5c50: 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 2 and earlier */
5c60: 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 . servername
5c70: 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 = SSL_get_server
5c80: 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 name(ssl, TLSEXT
5c90: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e _NAMETYPE_host_n
5ca0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 ame);. if (!s
5cb0: 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 ervername || ser
5cc0: 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c vername[0] == '\
5cd0: 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 0') {..return SS
5ce0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
5cf0: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 CK;. }.. i
5d00: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d f (statePtr->vcm
5d10: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e d == (Tcl_Obj*)N
5d20: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
5d30: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5d40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5d50: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
5d60: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
5d70: 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 chan, and server
5d80: 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 name args */.
5d90: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
5da0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
5db0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
5dc0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5dd0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5de0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
5df0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 wStringObj("sni"
5e00: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
5e10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5e20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5e30: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
5e40: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
5e50: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
5e60: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
5e70: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
5e80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
5e90: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
5ea0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
5eb0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 bj(servername ,
5ec0: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 -1));.. /* Ev
5ed0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
5ee0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
5ef0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
5f00: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f tr);. if ((co
5f10: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 de = EvalCallbac
5f20: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
5f30: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 tr, cmdPtr)) > 1
5f40: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 ) {..res = SSL_T
5f50: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5f60: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 WARNING;..*alert
5f70: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f = SSL_AD_UNRECO
5f80: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 GNIZED_NAME; /*
5f90: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 Not supported by
5fa0: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 TLS 1.3 */.
5fb0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
5fc0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
5fd0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5fe0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
5ff0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
6000: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c _ERR_ALERT_FATAL
6010: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
6020: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f AD_UNRECOGNIZED_
6030: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 NAME; /* Not sup
6040: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e ported by TLS 1.
6050: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 3 */. }. T
6060: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
6070: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
6080: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a urn res;.}.../*.
6090: 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60d0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 -----. *. * Clie
60e0: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b ntHello Handshak
60f0: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 e Callback for S
6100: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 ervers --. *. *.
6110: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 Used by server t
6120: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 o examine the se
6130: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 rver name indica
6140: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e tion (SNI) exten
6150: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 sion. *.provided
6160: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 by the client i
6170: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 n order to selec
6180: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 t an appropriate
6190: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a certificate to.
61a0: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 *.present, and
61b0: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 make other confi
61c0: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d guration adjustm
61d0: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f ents relevant to
61e0: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 that server. *.
61f0: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e name and its con
6200: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 figuration. This
6210: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 includes swappi
6220: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 ng out the assoc
6230: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 iated. *.SSL_CTX
6240: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 pointer, modify
6250: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 ing the server's
6260: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 list of permitt
6270: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c ed TLS versions,
6280: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 . *.changing the
6290: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 server's cipher
62a0: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 list in respons
62b0: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 e to the client'
62c0: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 s cipher list, e
62d0: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 tc.. *.Called be
62e0: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 fore SNI and ALP
62f0: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a N callbacks.. *.
6300: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
6310: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
6320: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
6330: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
6340: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
6350: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
6360: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 L_CLIENT_HELLO_R
6370: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 ETRY: suspend th
6380: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 e handshake, and
6390: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 the handshake f
63a0: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 unction will ret
63b0: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a urn immediately.
63c0: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 *.SSL_CLIENT_HE
63d0: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 LLO_ERROR: failu
63e0: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f re, terminate co
63f0: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c nnection. Set al
6400: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 ert to error cod
6410: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 e.. *.SSL_CLIENT
6420: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 _HELLO_SUCCESS:
6430: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d success. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6480: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
6490: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53 HelloCallback(SS
64a0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
64b0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
64c0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
64d0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
64e0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
64f0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
6500: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
6510: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
6520: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
6530: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
6540: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
6550: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
6560: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 igned char *p;.
6570: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 size_t len, r
6580: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 emaining;.. d
6590: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
65a0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
65b0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
65c0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
65d0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
65e0: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b T_HELLO_SUCCESS;
65f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
6600: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 ssl == (const SS
6610: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 L *)NULL || arg
6620: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 == (void *)NULL)
6630: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 {..return SSL_C
6640: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6650: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6660: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 Get names */.
6670: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e if (!SSL_clien
6680: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 t_hello_get0_ext
6690: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 (ssl, TLSEXT_TYP
66a0: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 E_server_name, &
66b0: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c p, &remaining) |
66c0: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 | remaining <= 2
66d0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
66e0: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f L_R_SSLV3_ALERT_
66f0: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 ILLEGAL_PARAMETE
6700: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 R;..return SSL_C
6710: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6720: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6730: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e Extract the len
6740: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c gth of the suppl
6750: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 ied list of name
6760: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 s. */. len =
6770: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 (*(p++) << 8);.
6780: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 len += *(p++)
6790: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 ;. if (len +
67a0: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 != remaining)
67b0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
67c0: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c R_SSLV3_ALERT_IL
67d0: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b LEGAL_PARAMETER;
67e0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
67f0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
6800: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 . }. remai
6810: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 ning = len;..
6820: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 /* The list in
6830: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 practice only ha
6840: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 s a single eleme
6850: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 nt, so we only c
6860: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 onsider the firs
6870: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 t one. */. if
6880: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 (remaining == 0
6890: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 || *p++ != TLSE
68a0: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
68b0: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 _name) {..*alert
68c0: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
68d0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
68e0: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c ROR;..return SSL
68f0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6900: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
6910: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 emaining--;..
6920: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 /* Now we can f
6930: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 inally pull out
6940: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 the byte array w
6950: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 ith the actual h
6960: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 ostname. */.
6970: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d if (remaining <=
6980: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 2) {..*alert =
6990: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
69a0: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
69b0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
69c0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
69d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 ;. }. len
69e0: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
69f0: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
6a00: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
6a10: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 + 2 > remaining)
6a20: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
6a30: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
6a40: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
6a50: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6a60: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
6a70: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
6a80: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 ng = len;. se
6a90: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 rvername = (cons
6aa0: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 t char *)p;..
6ab0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
6ac0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 nd to eval with
6ad0: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 fn, chan, and se
6ae0: 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a rver name args *
6af0: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
6b00: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
6b10: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
6b20: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
6b30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
6b40: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
6b50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
6b60: 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 hello", -1));.
6b70: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
6b80: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
6b90: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
6ba0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
6bb0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
6bc0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
6bd0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
6be0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6bf0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6c00: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
6c10: 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e tringObj(servern
6c20: 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 ame, (Tcl_Size)
6c30: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 len));.. /* E
6c40: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
6c50: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mand */. Tcl_
6c60: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
6c70: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 Ptr);. if ((c
6c80: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 ode = EvalCallba
6c90: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ck(interp, state
6ca0: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 Ptr, cmdPtr)) >
6cb0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 1) {..res = SSL_
6cc0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 CLIENT_HELLO_RET
6cd0: 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 RY;..*alert = SS
6ce0: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
6cf0: 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a USER_CANCELLED;.
6d00: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
6d10: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 ode == 1) {..res
6d20: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 = SSL_CLIENT_HE
6d30: 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 LLO_SUCCESS;.
6d40: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
6d50: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6d60: 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 O_ERROR;..*alert
6d70: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
6d80: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
6d90: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 ROR;. }. T
6da0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
6db0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 cmdPtr);. ret
6dc0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a urn res;.}.../**
6dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6de0: 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 **/./* Commands
6df0: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a */./****
6e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6e10: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d /../*. *--------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
6e60: 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 * CiphersObjCmd
6e70: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c -- list availabl
6e80: 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 e ciphers. *. *.
6e90: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
6ea0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
6eb0: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 cess the "tls::c
6ec0: 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a iphers" command.
6ed0: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c *.to list avail
6ee0: 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 able ciphers, ba
6ef0: 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f sed upon protoco
6f00: 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 l selected.. *.
6f10: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
6f20: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
6f30: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 ult list.. *. *
6f40: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
6f50: 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 .constructs and
6f60: 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e destroys SSL con
6f70: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a text (CTX). *. *
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fc0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 ---. */.static c
6fd0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f onst char *proto
6fe0: 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c cols[] = {.."ssl
6ff0: 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 2", "ssl3", "tls
7000: 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 1", "tls1.1", "t
7010: 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 ls1.2", "tls1.3"
7020: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 , NULL.};.enum p
7030: 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c rotocol {. TL
7040: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 S_SSL2, TLS_SSL3
7050: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f , TLS_TLS1, TLS_
7060: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 TLS1_1, TLS_TLS1
7070: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 _2, TLS_TLS1_3,
7080: 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 TLS_NONE.};..sta
7090: 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f tic int.CiphersO
70a0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
70b0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
70c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
70d0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
70e0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
70f0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ) {. Tcl_Obj
7100: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a *objPtr = NULL;.
7110: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
7120: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c = NULL;. SSL
7130: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ssl = NULL;.
7140: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 STACK_OF(SSL_C
7150: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 IPHER) *sk;.
7160: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d char buf[BUFSIZ]
7170: 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c ;. int index,
7180: 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 verbose = 0, us
7190: 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b e_supported = 0;
71a0: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d . const SSL_M
71b0: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 20 ETHOD *method;.
71c0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 (void) client
71d0: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e Data;.. dprin
71e0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
71f0: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 if ((objc < 2
7200: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 ) || (objc > 4))
7210: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
7220: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
7230: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 objv, "protocol
7240: 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f ?verbose? ?suppo
7250: 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e rted?");..return
7260: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
7270: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 }. if (Tcl_Ge
7280: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e tIndexFromObj(in
7290: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 terp, objv[1], p
72a0: 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f rotocols, "proto
72b0: 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 col", 0, &index)
72c0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
72d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
72e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
72f0: 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c objc > 2) && Tcl
7300: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f _GetBooleanFromO
7310: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
7320: 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 2], &verbose) !=
7330: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
7340: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7350: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
7360: 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65 c > 3) && Tcl_Ge
7370: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
7380: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c interp, objv[3],
7390: 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 &use_supported)
73a0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
73b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
73c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
73d0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
73e0: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 switch ((enu
73f0: 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 m protocol)index
7400: 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 ) {..case TLS_SS
7410: 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f L2:.#if OPENSSL_
7420: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e VERSION_NUMBER >
7430: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c = 0x10100000L ||
7440: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 defined(NO_SSL2
7450: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
7460: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 NSSL_NO_SSL2)..
7470: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
7480: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
7490: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
74a0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
74b0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
74c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 *) NULL);.. r
74d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
74e0: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
74f0: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f od = SSLv2_metho
7500: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
7510: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c if..case TLS_SSL
7520: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 3:.#if defined(N
7530: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e O_SSL3) || defin
7540: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
7550: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L3) || defined(O
7560: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d PENSSL_NO_SSL3_M
7570: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f ETHOD).. Tcl_
7580: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7590: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
75a0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
75b0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
75c0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
75d0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
75e0: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
75f0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 . method = SS
7600: 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 Lv3_method(); br
7610: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 eak;.#endif..cas
7620: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 e TLS_TLS1:.#if
7630: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
7640: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7650: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 SSL_NO_TLS1) ||
7660: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7670: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
7680: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
7690: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
76a0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
76b0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
76c0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
76d0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
76e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
76f0: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 R;.#else.. me
7700: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 thod = TLSv1_met
7710: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
7720: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
7730: 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e LS1_1:.#if defin
7740: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
7750: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7760: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 _NO_TLS1_1) || d
7770: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7780: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 O_TLS1_1_METHOD)
7790: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
77a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
77b0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
77c0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
77d0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
77e0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
77f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7800: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
7810: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f ethod = TLSv1_1_
7820: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b method(); break;
7830: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c .#endif..case TL
7840: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 S_TLS1_2:.#if de
7850: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
7860: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7870: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c SSL_NO_TLS1_2) |
7880: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7890: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 L_NO_TLS1_2_METH
78a0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 OD).. Tcl_App
78b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
78c0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
78d0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
78e0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
78f0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
7900: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
7910: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 ERROR;.#else..
7920: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 method = TLSv1
7930: 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 _2_method(); bre
7940: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
7950: 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 TLS_TLS1_3:.#if
7960: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
7970: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _3) || defined(O
7980: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
7990: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
79a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
79b0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
79c0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
79d0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 t supported", (c
79e0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
79f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
7a00: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ROR;.#else..
7a10: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 method = TLS_met
7a20: 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f hod();.. SSL_
7a30: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
7a40: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 o_version(ctx, T
7a50: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a LS1_3_VERSION);.
7a60: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
7a70: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _max_proto_versi
7a80: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 on(ctx, TLS1_3_V
7a90: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 ERSION);.. br
7aa0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 eak;.#endif..def
7ab0: 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f ault:.. metho
7ac0: 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 d = TLS_method()
7ad0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 ;.. break;.
7ae0: 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 }.. ctx = S
7af0: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f SL_CTX_new(metho
7b00: 64 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20 d);. if (ctx
7b10: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
7b20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7b30: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 erp, GET_ERR_REA
7b40: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
7b50: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
7b60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7b70: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e . ssl = SSL_n
7b80: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20 ew(ctx);. if
7b90: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
7ba0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
7bb0: 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 t(interp, GET_ER
7bc0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
7bd0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c r *) NULL);..SSL
7be0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
7bf0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7c00: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
7c10: 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 Use list and or
7c20: 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 der as would be
7c30: 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 sent in a Client
7c40: 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 Hello or all ava
7c50: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a ilable ciphers *
7c60: 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 /. if (use_su
7c70: 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d pported) {..sk =
7c80: 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 SSL_get1_suppor
7c90: 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 ted_ciphers(ssl)
7ca0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
7cb0: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 sk = SSL_get_cip
7cc0: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d hers(ssl);. }
7cd0: 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 .. if (sk !=
7ce0: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 NULL) {..if (!ve
7cf0: 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 63 6f rbose) {.. co
7d00: 6e 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 09 20 nst char *cp;..
7d10: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
7d20: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
7d30: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 LL);.. for (i
7d40: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
7d50: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 _SSL_CIPHER_num(
7d60: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f sk); i++) {...co
7d70: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a nst SSL_CIPHER *
7d80: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 c = sk_SSL_CIPHE
7d90: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a R_value(sk, i);.
7da0: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 ..if (c == NULL)
7db0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a continue;..../*
7dc0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 cipher name or
7dd0: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d (NONE) */...cp =
7de0: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
7df0: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 name(c);...if (c
7e00: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b p == NULL) break
7e10: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
7e20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
7e30: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
7e40: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 _NewStringObj((c
7e50: 68 61 72 20 2a 29 20 63 70 2c 20 2d 31 29 29 3b har *) cp, -1));
7e60: 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 .. }...} else
7e70: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d {.. objPtr =
7e80: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
7e90: 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f j("",0);.. fo
7ea0: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
7eb0: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f < sk_SSL_CIPHER_
7ec0: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a num(sk); i++) {.
7ed0: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 ..const SSL_CIPH
7ee0: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 ER *c = sk_SSL_C
7ef0: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 IPHER_value(sk,
7f00: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e i);...if (c == N
7f10: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a ULL) continue;..
7f20: 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 ../* textual des
7f30: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 cription of the
7f40: 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 cipher */...if (
7f50: 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 SSL_CIPHER_descr
7f60: 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 iption(c, buf, s
7f70: 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e izeof(buf)) != N
7f80: 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c ULL) {... Tcl
7f90: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a _AppendToObj(obj
7fa0: 50 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 Ptr, buf, (Tcl_S
7fb0: 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29 ize) strlen(buf)
7fc0: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
7fd0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f Tcl_AppendTo
7fe0: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b Obj(objPtr, "UNK
7ff0: 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d NOWN\n", 8);...}
8000: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 .. }..}..if (
8010: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b use_supported) {
8020: 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 .. sk_SSL_CIP
8030: 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d HER_free(sk);..}
8040: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 . }. SSL_f
8050: 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 ree(ssl);. SS
8060: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
8070: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
8080: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
8090: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
80a0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
80b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
80c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 -------. *. * Pr
8100: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d otocolsObjCmd --
8110: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
8120: 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 protocols. *. *.
8130: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
8140: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
8150: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 cess the "tls::p
8160: 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e rotocols" comman
8170: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 d. *.to list ava
8180: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 ilable protocols
8190: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
81a0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
81b0: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a cl result list..
81c0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
81d0: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
81e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
81f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8220: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
8230: 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a int.ProtocolsObj
8240: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
8250: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
8260: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
8270: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
8280: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
8290: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f {. Tcl_Obj *o
82a0: 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 bjPtr;. (void
82b0: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
82c0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
82d0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
82e0: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c bjc != 1) {..Tcl
82f0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
8300: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
8310: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
8320: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
8330: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
8340: 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 r();.. objPtr
8350: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
8360: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 j(0, NULL);..#if
8370: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
8380: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
8390: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 0000L && !define
83a0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
83b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
83c0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f O_SSL2). Tcl_
83d0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
83e0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
83f0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
8400: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
8410: 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b TLS_SSL2], -1));
8420: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
8430: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 ined(NO_SSL3) &&
8440: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
8450: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 L_NO_SSL3) && !d
8460: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8470: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 O_SSL3_METHOD).
8480: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
8490: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
84a0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
84b0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f NewStringObj(pro
84c0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d tocols[TLS_SSL3]
84d0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
84e0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
84f0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
8500: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8510: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8520: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 ENSSL_NO_TLS1_ME
8530: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 THOD). Tcl_Li
8540: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
8550: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
8560: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
8570: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
8580: 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 S_TLS1], -1));.#
8590: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
85a0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
85b0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
85c0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 L_NO_TLS1_1) &&
85d0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
85e0: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f _NO_TLS1_1_METHO
85f0: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f D). Tcl_ListO
8600: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
8610: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
8620: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
8630: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
8640: 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 LS1_1], -1));.#e
8650: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
8660: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 d(NO_TLS1_2) &&
8670: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
8680: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 _NO_TLS1_2) && !
8690: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
86a0: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 NO_TLS1_2_METHOD
86b0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
86c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
86d0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
86e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
86f0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
8700: 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e S1_2], -1));.#en
8710: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
8720: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
8730: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8740: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 NO_TLS1_3). T
8750: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
8760: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
8770: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
8780: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
8790: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 ls[TLS_TLS1_3],
87a0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 -1));.#endif..
87b0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
87c0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
87d0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
87e0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
87f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8830: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 ---. *. * Handsh
8840: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a akeObjCmd --. *.
8850: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 *.This command
8860: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 is used to verif
8870: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 y whether the ha
8880: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c ndshake is compl
8890: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 ete. *.or not..
88a0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
88b0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
88c0: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 result. 1 means
88d0: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 handshake comple
88e0: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 te, 0 means pend
88f0: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ing.. *. * Side
8900: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
8910: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 force SSL negoti
8920: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c ation to take pl
8930: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ace.. *. *------
8940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
8980: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e /.static int Han
8990: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 dshakeObjCmd(Cli
89a0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
89b0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
89c0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
89d0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
89e0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
89f0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
8a00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 /* The c
8a10: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 hannel to set a
8a20: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 mode on. */.
8a30: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
8a40: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e /* clien
8a50: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
8a60: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f socket */. co
8a70: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 nst char *errStr
8a80: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 = NULL;. int
8a90: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e ret = 1;. in
8aa0: 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20 28 t err = 0;. (
8ab0: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
8ac0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
8ad0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
8ae0: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
8af0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
8b00: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
8b10: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
8b20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
8b30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
8b40: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
8b50: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
8b60: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
8b70: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
8b80: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
8b90: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
8ba0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
8bb0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
8bc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
8bd0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
8be0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
8bf0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
8c00: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
8c10: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
8c20: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
8c30: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
8c40: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
8c50: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
8c60: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
8c70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
8c80: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
8c90: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
8ca0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 ame(chan),..
8cb0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
8cc0: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a hannel", (char *
8cd0: 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 ) NULL);..Tcl_Se
8ce0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
8cf0: 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 p, "TLS", "HANDS
8d00: 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 HAKE", "CHANNEL"
8d10: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
8d20: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
8d30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
8d40: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
8d50: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
8d60: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
8d70: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
8d80: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
8d90: 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f lling Tls_WaitFo
8da0: 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 rConnect");.
8db0: 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f ret = Tls_WaitFo
8dc0: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 rConnect(statePt
8dd0: 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 r, &err, 1);.
8de0: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 dprintf("Tls_Wa
8df0: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 itForConnect ret
8e00: 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 urned: %i", ret)
8e10: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c ;.. if (ret <
8e20: 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 0 && ((statePtr
8e30: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 ->flags & TLS_TC
8e40: 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 L_ASYNC) && (err
8e50: 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a == EAGAIN))) {.
8e60: 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 .dprintf("Async
8e70: 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 set and err = EA
8e80: 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 GAIN");..ret = 0
8e90: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
8ea0: 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e (ret < 0) {..lon
8eb0: 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 g result;..errSt
8ec0: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 r = statePtr->er
8ed0: 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 r;..Tcl_ResetRes
8ee0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 ult(interp);..Tc
8ef0: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b l_SetErrno(err);
8f00: 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c ...if (!errStr |
8f10: 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 | (*errStr == 0)
8f20: 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 ) {.. errStr
8f30: 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 = Tcl_PosixError
8f40: 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 (interp);..}...T
8f50: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8f60: 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 interp, "handsha
8f70: 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 ke failed: ", er
8f80: 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e rStr, (char *) N
8f90: 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75 ULL);..if ((resu
8fa0: 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 lt = SSL_get_ver
8fb0: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 ify_result(state
8fc0: 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 Ptr->ssl)) != X5
8fd0: 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 09_V_OK) {..
8fe0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
8ff0: 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74 (interp, " due t
9000: 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72 69 o \"", X509_veri
9010: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 fy_cert_error_st
9020: 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22 5c ring(result), "\
9030: 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c "", (char *) NUL
9040: 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 L);..}..Tcl_SetE
9050: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
9060: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 "TLS", "HANDSHA
9070: 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 KE", "FAILED", (
9080: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
9090: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
90a0: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 ng TCL_ERROR wit
90b0: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c h handshake fail
90c0: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 ed: %s", errStr)
90d0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
90e0: 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ROR;. } else
90f0: 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 {..if (err != 0)
9100: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
9110: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 "Got an error wi
9120: 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 th a completed h
9130: 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 andshake: err =
9140: 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 %i", err);..}..r
9150: 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 et = 1;. }..
9160: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
9170: 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 rning TCL_OK wit
9180: 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 h data \"%i\"",
9190: 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ret);. Tcl_Se
91a0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
91b0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a p, Tcl_NewIntObj
91c0: 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 (ret));. retu
91d0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a rn TCL_OK;.}../*
91e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
91f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9220: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 ------. *. * Imp
9230: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a ortObjCmd --. *.
9240: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
9250: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
9260: 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c process the "ssl
9270: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 " command. *. *.
9280: 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 The ssl command
9290: 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 pushes SSL over
92a0: 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 a (newly connect
92b0: 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 ed) tcp socket.
92c0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
92d0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
92e0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
92f0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
9300: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 ay modify the be
9310: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 havior of an IO
9320: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d channel.. *. *--
9330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9370: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
9380: 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c .ImportObjCmd(Cl
9390: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
93a0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
93b0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
93c0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
93d0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
93e0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
93f0: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
9400: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
9410: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on. */. State
9420: 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 *statePtr;../*
9430: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
9440: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
9450: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 SSL_CTX *ctx.
9460: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c .= NULL;. Tcl
9470: 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d 20 _Obj *script..=
9480: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
9490: 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 4e j *password..= N
94a0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
94b0: 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a *vcmd..= NULL;.
94c0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
94d0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
94e0: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 slation, upperCh
94f0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 annelBlocking, u
9500: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
9510: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ing, upperChanne
9520: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e lEOFChar;. in
9530: 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 t idx;. Tcl_S
9540: 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 ize len;. int
9550: 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54 flags...= TLS_T
9560: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 CL_INIT;. int
9570: 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f server...= 0;./
9580: 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 * is connection
9590: 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 incoming or outg
95a0: 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 oing? */. cha
95b0: 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55 r *keyfile..= NU
95c0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 LL;. char *ce
95d0: 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a rtfile..= NULL;.
95e0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
95f0: 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a r *key..= NULL;.
9600: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 Tcl_Size key
9610: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75 _len..= 0;. u
9620: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
9630: 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 rt..= NULL;.
9640: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 Tcl_Size cert_le
9650: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 n..= 0;. char
9660: 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c *ciphers..= NUL
9670: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 L;. char *cip
9680: 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c hersuites..= NUL
9690: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 L;. char *CAf
96a0: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ile..= NULL;.
96b0: 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d char *CApath..=
96c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
96d0: 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 4e 55 4c *DHparams..= NUL
96e0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 L;. char *mod
96f0: 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 el...= NULL;.
9700: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
9710: 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f e..= NULL;./* ho
9720: 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 stname for Serve
9730: 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f r Name Indicatio
9740: 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 73 n */. char *s
9750: 65 73 73 69 6f 6e 5f 69 64 09 09 3d 20 4e 55 4c ession_id..= NUL
9760: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
9770: 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 alpn..= NULL;.
9780: 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 int ssl2 = 0,
9790: 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e ssl3 = 0;. in
97a0: 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 t tls1 = 1, tls1
97b0: 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d _1 = 1, tls1_2 =
97c0: 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 1, tls1_3 = 1;.
97d0: 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 int proto =
97e0: 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 0, level = -1;.
97f0: 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 int verify =
9800: 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 0, require = 0,
9810: 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 request = 1, pos
9820: 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b t_handshake = 0;
9830: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
9840: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ntData;.. dpr
9850: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
9860: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
9870: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
9880: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
9890: 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a ). tls1 = 0;.
98a0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
98b0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c ed(NO_TLS1_1) ||
98c0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
98d0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 _NO_TLS1_1).
98e0: 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 tls1_1 = 0;.#end
98f0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
9900: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 O_TLS1_2) || def
9910: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
9920: 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 TLS1_2). tls1
9930: 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 _2 = 0;.#endif.#
9940: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
9950: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
9960: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
9970: 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d _3). tls1_3 =
9980: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 0;.#endif..
9990: 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a if (objc < 2) {.
99a0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
99b0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
99c0: 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 v, "channel ?opt
99d0: 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e ions?");..return
99e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
99f0: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
9a00: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 _error();.. c
9a10: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
9a20: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
9a30: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
9a40: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 1]), NULL);.
9a50: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
9a60: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
9a70: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
9a80: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
9a90: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
9aa0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
9ab0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
9ac0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
9ad0: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
9ae0: 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 han);.. for (
9af0: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f idx = 2; idx < o
9b00: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 bjc; idx++) {..c
9b10: 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 har *opt = Tcl_G
9b20: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 etString(objv[id
9b30: 78 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 x]);...if (opt[0
9b40: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 ] != '-').. b
9b50: 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 reak;...OPTOBJ("
9b60: 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 -alpn", alpn);..
9b70: 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c OPTSTR("-cadir",
9b80: 20 43 41 70 61 74 68 29 3b 0a 09 4f 50 54 53 54 CApath);..OPTST
9b90: 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 R("-cafile", CAf
9ba0: 69 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 ile);..OPTBYTE("
9bb0: 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 -cert", cert, ce
9bc0: 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 rt_len);..OPTSTR
9bd0: 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 ("-certfile", ce
9be0: 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 rtfile);..OPTSTR
9bf0: 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 ("-cipher", ciph
9c00: 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ers);..OPTSTR("-
9c10: 63 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 ciphers", cipher
9c20: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 s);..OPTSTR("-ci
9c30: 70 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 phersuites", cip
9c40: 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 hersuites);..OPT
9c50: 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 OBJ("-command",
9c60: 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 script);..OPTSTR
9c70: 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 ("-dhparams", DH
9c80: 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 params);..OPTBYT
9c90: 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b E("-key", key, k
9ca0: 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 ey_len);..OPTSTR
9cb0: 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 ("-keyfile", key
9cc0: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 file);..OPTSTR("
9cd0: 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b -model", model);
9ce0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 ..OPTOBJ("-passw
9cf0: 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b ord", password);
9d00: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 ..OPTBOOL("-post
9d10: 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 _handshake", pos
9d20: 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f t_handshake);..O
9d30: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 PTBOOL("-request
9d40: 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 ", request);..OP
9d50: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 TBOOL("-require"
9d60: 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 , require);..OPT
9d70: 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 5f 6c INT("-security_l
9d80: 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 evel", level);..
9d90: 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 OPTBOOL("-server
9da0: 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 ", server);..OPT
9db0: 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 STR("-servername
9dc0: 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a ", servername);.
9dd0: 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f .OPTSTR("-sessio
9de0: 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 n_id", session_i
9df0: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 d);..OPTBOOL("-s
9e00: 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 sl2", ssl2);..OP
9e10: 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 TBOOL("-ssl3", s
9e20: 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 sl3);..OPTBOOL("
9e30: 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 -tls1", tls1);..
9e40: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 OPTBOOL("-tls1.1
9e50: 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 ", tls1_1);..OPT
9e60: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 BOOL("-tls1.2",
9e70: 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f tls1_2);..OPTBOO
9e80: 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 L("-tls1.3", tls
9e90: 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 1_3);..OPTOBJ("-
9ea0: 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 validatecommand"
9eb0: 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a , vcmd);..OPTOBJ
9ec0: 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b ("-vcmd", vcmd);
9ed0: 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f ...OPTBAD("optio
9ee0: 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 n", "-alpn, -cad
9ef0: 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 ir, -cafile, -ce
9f00: 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d rt, -certfile, -
9f10: 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 cipher, -ciphers
9f20: 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c uites, -command,
9f30: 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 -dhparams, -key
9f40: 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 , -keyfile, -mod
9f50: 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d el, -password, -
9f60: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 post_handshake,
9f70: 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 -request, -requi
9f80: 72 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 re, -security_le
9f90: 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 vel, -server, -s
9fa0: 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 ervername, -sess
9fb0: 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d ion_id, -ssl2, -
9fc0: 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c ssl3, -tls1, -tl
9fd0: 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d s1.1, -tls1.2, -
9fe0: 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 tls1.3, or -vali
9ff0: 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a datecommand");..
a000: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
a010: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
a020: 28 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66 (request)..verif
a030: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
a040: 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 CLIENT_ONCE | SS
a050: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 L_VERIFY_PEER;.
a060: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 if (request &
a070: 26 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66 & require).verif
a080: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
a090: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f FAIL_IF_NO_PEER_
a0a0: 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 CERT;. if (re
a0b0: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 quest && post_ha
a0c0: 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 ndshake).verify
a0d0: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f |= SSL_VERIFY_PO
a0e0: 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 ST_HANDSHAKE;.
a0f0: 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 if (verify ==
a100: 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c 0)..verify = SSL
a110: 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 _VERIFY_NONE;..
a120: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c proto |= (ssl
a130: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 2 ? TLS_PROTO_SS
a140: 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f L2 : 0);. pro
a150: 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c to |= (ssl3 ? TL
a160: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 S_PROTO_SSL3 : 0
a170: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
a180: 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 (tls1 ? TLS_PROT
a190: 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 O_TLS1 : 0);.
a1a0: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
a1b0: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 1 ? TLS_PROTO_TL
a1c0: 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 S1_1 : 0);. p
a1d0: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 roto |= (tls1_2
a1e0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
a1f0: 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f _2 : 0);. pro
a200: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 to |= (tls1_3 ?
a210: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
a220: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 : 0);.. /* r
a230: 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 eset to NULL if
a240: 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f blank string pro
a250: 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 vided */. if
a260: 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 (cert && !*cert)
a270: 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 .. cert.
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 6b 65 79 20 26 26 20 21 2a if (key && !*
a2a0: 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 key).. ke
a2b0: 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c y. = NULL
a2c0: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 ;. if (certfi
a2d0: 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 le && !*certfile
a2e0: 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 ) certfi
a2f0: 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 le.= NULL;. i
a300: 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a f (keyfile && !*
a310: 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c keyfile)..keyfil
a320: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c e. = NULL
a330: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 ;. if (cipher
a340: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 s && !*ciphers).
a350: 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 ciphers.
a360: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a370: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 if (ciphersu
a380: 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 ites && !*cipher
a390: 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 suites) ciphersu
a3a0: 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a ites = NULL;.
a3b0: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 if (CAfile &
a3c0: 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 & !*CAfile).
a3d0: 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 CAfile.
a3e0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
a3f0: 66 20 28 43 41 70 61 74 68 20 26 26 20 21 2a 43 f (CApath && !*C
a400: 41 70 61 74 68 29 09 20 20 20 20 20 20 20 20 43 Apath). C
a410: 41 70 61 74 68 09 20 20 20 20 20 20 20 20 3d 20 Apath. =
a420: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 NULL;. if (DH
a430: 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 params && !*DHpa
a440: 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 rams). DH
a450: 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 params =
a460: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 NULL;.. /* ne
a470: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 w SSL state */.
a480: 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 statePtr..= (
a490: 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 State *) ckalloc
a4a0: 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 ((unsigned) size
a4b0: 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 of(State));.
a4c0: 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c memset(statePtr,
a4d0: 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 0, sizeof(State
a4e0: 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 ));.. statePt
a4f0: 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 r->flags.= flags
a500: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
a510: 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b interp.= interp;
a520: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 . statePtr->v
a530: 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a flags.= verify;.
a540: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 statePtr->er
a550: 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 r.= "";.. /*
a560: 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 allocate script
a570: 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 */. if (scrip
a580: 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c t) {..(void) Tcl
a590: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
a5a0: 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b j(script, &len);
a5b0: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 ..if (len) {..
a5c0: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c statePtr->call
a5d0: 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 back = script;..
a5e0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
a5f0: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 ount(statePtr->c
a600: 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 allback);..}.
a610: 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 }.. /* alloc
a620: 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a ate password */.
a630: 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 if (password
a640: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
a650: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
a660: 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 (password, &len)
a670: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 ;..if (len) {..
a680: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 statePtr->pas
a690: 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 sword = password
a6a0: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
a6b0: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
a6c0: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a ->password);..}.
a6d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c }.. /* al
a6e0: 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 locate validate
a6f0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 command */. i
a700: 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 f (vcmd) {..(voi
a710: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 d) Tcl_GetString
a720: 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c FromObj(vcmd, &l
a730: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b en);..if (len) {
a740: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
a750: 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 vcmd = vcmd;..
a760: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
a770: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d nt(statePtr->vcm
a780: 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 d);..}. }..
a790: 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e if (model != N
a7a0: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 ULL) {..int mode
a7b0: 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d ;../* Get the "m
a7c0: 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f odel" context */
a7d0: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 ..chan = Tcl_Get
a7e0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
a7f0: 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 model, &mode);..
a800: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
a810: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
a820: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 {.. Tls_Free(
a830: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a (tls_free_type *
a840: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
a850: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
a860: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 OR;..}.../*.. *
a870: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
a880: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
a890: 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f ost channel.. */
a8a0: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 ..chan = Tcl_Get
a8b0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
a8c0: 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 ;..if (Tcl_GetCh
a8d0: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
a8e0: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
a8f0: 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c pe()) {.. Tcl
a900: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
a910: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
a920: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
a930: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
a940: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
a950: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 LS channel", (ch
a960: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
a970: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
a980: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
a990: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 , "IMPORT", "CHA
a9a0: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
a9b0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
a9c0: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
a9d0: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a (tls_free_type *
a9e0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
a9f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
aa00: 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 OR;..}..ctx = ((
aa10: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
aa20: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
aa30: 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a ta(chan))->ctx;.
aa40: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 } else {..if
aa50: 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 ((ctx = CTX_Ini
aa60: 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 t(statePtr, serv
aa70: 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 er, proto, keyfi
aa80: 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 le, certfile, ke
aa90: 79 2c 20 63 65 72 74 2c 20 28 69 6e 74 29 20 6b y, cert, (int) k
aaa0: 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e ey_len,.. (in
aab0: 74 29 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 t) cert_len, CAp
aac0: 61 74 68 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 ath, CAfile, cip
aad0: 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 hers, ciphersuit
aae0: 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 es, level, DHpar
aaf0: 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b ams)) == NULL) {
ab00: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
ab10: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 tls_free_type *)
ab20: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
ab30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
ab40: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 R;..}. }..
ab50: 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d statePtr->ctx =
ab60: 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ctx;.. /*.
ab70: 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 * We need to
ab80: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 make sure that t
ab90: 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 he channel works
aba0: 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 in binary (for
abb0: 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 the. * encry
abc0: 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 ption not to get
abd0: 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 goofed up)..
abe0: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 */. Tcl_DSt
abf0: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
ac00: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
ac10: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 n);. Tcl_DStr
ac20: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
ac30: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a annelBlocking);.
ac40: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
ac50: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
ac60: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 lEOFChar);. T
ac70: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
ac80: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
ac90: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 ding);. Tcl_G
aca0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
acb0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
acc0: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 eofchar", &upper
acd0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
ace0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
acf0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
ad00: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 , chan, "-encodi
ad10: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ng", &upperChann
ad20: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 elEncoding);.
ad30: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
ad40: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
ad50: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f an, "-translatio
ad60: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 n", &upperChanne
ad70: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 lTranslation);.
ad80: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
ad90: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
ada0: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 chan, "-blocking
adb0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
adc0: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 Blocking);. T
add0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
ade0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
adf0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
ae00: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 , "binary");.
ae10: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
ae20: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
ae30: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c an, "-blocking",
ae40: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 "true");. dp
ae50: 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 rintf("Consuming
ae60: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 Tcl channel %s"
ae70: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
ae80: 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 Name(chan));.
ae90: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 statePtr->self
aea0: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e = Tcl_StackChann
aeb0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 el(interp, Tls_C
aec0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 hannelType(), (C
aed0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
aee0: 50 74 72 2c 0a 09 28 54 43 4c 5f 52 45 41 44 41 Ptr,..(TCL_READA
aef0: 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 BLE | TCL_WRITAB
af00: 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 LE), chan);.
af10: 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 dprintf("Created
af20: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 channel named %
af30: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e s", Tcl_GetChann
af40: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
af50: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 >self));. if
af60: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 (statePtr->self
af70: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
af80: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a NULL) {../*.. *
af90: 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 No use of Tcl_E
afa0: 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 ventuallyFree be
afb0: 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c cause no possibl
afc0: 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a e Tcl_Preserve..
afd0: 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 . */..Tls_Free((
afe0: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 tls_free_type *)
aff0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 54 63 6c statePtr);..Tcl
b000: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 _DStringFree(&up
b010: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
b020: 61 74 69 6f 6e 29 3b 0a 09 54 63 6c 5f 44 53 74 ation);..Tcl_DSt
b030: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 ringFree(&upperC
b040: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
b050: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
b060: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 e(&upperChannelE
b070: 4f 46 43 68 61 72 29 3b 0a 09 54 63 6c 5f 44 53 OFChar);..Tcl_DS
b080: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
b090: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 ChannelBlocking)
b0a0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
b0b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
b0c0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
b0d0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
b0e0: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 tePtr->self, "-t
b0f0: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c ranslation", Tcl
b100: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
b110: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
b120: 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 lation));. Tc
b130: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
b140: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
b150: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 Ptr->self, "-enc
b160: 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 oding", Tcl_DStr
b170: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 ingValue(&upperC
b180: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 hannelEncoding))
b190: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
b1a0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
b1b0: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
b1c0: 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 f, "-eofchar", T
b1d0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
b1e0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
b1f0: 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f Char));. Tcl_
b200: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
b210: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
b220: 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b r->self, "-block
b230: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ing", Tcl_DStrin
b240: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
b250: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a nnelBlocking));.
b260: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
b270: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 ree(&upperChanne
b280: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 lTranslation);.
b290: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
b2a0: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ee(&upperChannel
b2b0: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 Encoding);. T
b2c0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
b2d0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
b2e0: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 har);. Tcl_DS
b2f0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
b300: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 ChannelBlocking)
b310: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
b320: 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 SSL Initializat
b330: 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ion. */.
b340: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 statePtr->ssl =
b350: 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 SSL_new(statePtr
b360: 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 ->ctx);. if (
b370: 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 !statePtr->ssl)
b380: 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 {../* SSL librar
b390: 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f y error */..Tcl_
b3a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
b3b0: 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 erp, "couldn't c
b3c0: 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 onstruct ssl ses
b3d0: 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f 45 52 52 sion: ", GET_ERR
b3e0: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
b3f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
b400: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
b410: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
b420: 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 "IMPORT", "INIT"
b430: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
b440: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 r *) NULL);..Tls
b450: 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f _Free((tls_free_
b460: 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 type *) statePtr
b470: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
b480: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
b490: 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 /* Set host ser
b4a0: 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 ver name */.
b4b0: 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 if (servername)
b4c0: 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 {../* Sets the s
b4d0: 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 erver name indic
b4e0: 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 ation (SNI) in C
b4f0: 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e lientHello exten
b500: 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 sion */../* Per
b510: 52 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 RFC 6066, hostna
b520: 6d 65 20 69 73 20 61 20 41 53 43 49 49 20 65 6e me is a ASCII en
b530: 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68 coded string, th
b540: 6f 75 67 68 20 52 46 43 20 34 33 36 36 20 73 61 ough RFC 4366 sa
b550: 79 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 ys UTF-8. */..if
b560: 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 (!SSL_set_tlsex
b570: 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 t_host_name(stat
b580: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 ePtr->ssl, serve
b590: 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 rname) && requir
b5a0: 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 e) {.. Tcl_Ap
b5b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
b5c0: 70 2c 20 22 53 65 74 20 53 4e 49 20 65 78 74 65 p, "Set SNI exte
b5d0: 6e 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c nsion failed: ",
b5e0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
b5f0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
b600: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
b610: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
b620: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
b630: 2c 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 , "SNI", "FAILED
b640: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
b650: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 );.. Tls_Free
b660: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 ((tls_free_type
b670: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
b680: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
b690: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 ROR;..}.../* Set
b6a0: 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 hostname for pe
b6b0: 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 68 er certificate h
b6c0: 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 ostname verifica
b6d0: 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e tion in clients.
b6e0: 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 .. Don't use S
b6f0: 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e SL_set1_host sin
b700: 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 ce it has limita
b710: 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 tions. */..if (!
b720: 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 SSL_add1_host(st
b730: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 atePtr->ssl, ser
b740: 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 vername)) {..
b750: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
b760: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 44 t(interp, "Set D
b770: 4e 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69 6c NS hostname fail
b780: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 ed: ", GET_ERR_R
b790: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
b7a0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
b7b0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
b7c0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
b7d0: 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d MPORT", "HOSTNAM
b7e0: 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 E", "FAILED", (c
b7f0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
b800: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 Tls_Free((tls
b810: 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 _free_type *) st
b820: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
b830: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
b840: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
b850: 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 Resume session
b860: 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 id */. if (se
b870: 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c ssion_id && strl
b880: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c en(session_id) <
b890: 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 = SSL_MAX_SID_CT
b8a0: 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 X_LENGTH) {../*
b8b0: 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_set_session(
b8c0: 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 ) */..if (!SSL_S
b8d0: 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 ESSION_set1_id_c
b8e0: 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 ontext(SSL_get_s
b8f0: 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d ession(statePtr-
b900: 3e 73 73 6c 29 2c 0a 09 09 28 63 6f 6e 73 74 20 >ssl),...(const
b910: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
b920: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e session_id, (un
b930: 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c signed int) strl
b940: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 en(session_id)))
b950: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
b960: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b970: 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e "Resume session
b980: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f failed: ", GET_
b990: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
b9a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
b9b0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
b9c0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
b9d0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 ", "IMPORT", "SE
b9e0: 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 SSION", "FAILED"
b9f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
ba00: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
ba10: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a (tls_free_type *
ba20: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
ba30: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
ba40: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
ba50: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c /* Enable Appl
ba60: 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 ication-Layer Pr
ba70: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 otocol Negotiati
ba80: 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 72 65 on. Examples are
ba90: 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 : http/1.0,..htt
baa0: 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 p/1.1, h2, h3, f
bab0: 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 tp, imap, pop3,
bac0: 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 xmpp-client, xmp
bad0: 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 p-server, mqtt,
bae0: 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 irc, etc. */.
baf0: 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a if (alpn) {../*
bb00: 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c Convert a TCL l
bb10: 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f ist into a proto
bb20: 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 col-list in wire
bb30: 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 -format */..unsi
bb40: 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f gned char *proto
bb50: 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 s, *p;..unsigned
bb60: 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 int protos_len
bb70: 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 = 0;..Tcl_Size c
bb80: 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 nt, i;..int j;..
bb90: 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a Tcl_Obj **list;.
bba0: 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 ..if (Tcl_ListOb
bbb0: 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 jGetElements(int
bbc0: 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c erp, alpn, &cnt,
bbd0: 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f &list) != TCL_O
bbe0: 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 K) {.. Tls_Fr
bbf0: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 ee((tls_free_typ
bc00: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a e *) statePtr);.
bc10: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
bc20: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 ERROR;..}.../* D
bc30: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d etermine the mem
bc40: 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 ory required for
bc50: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 the protocol-li
bc60: 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 st */..for (i =
bc70: 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 0; i < cnt; i++)
bc80: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 {.. Tcl_GetS
bc90: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 tringFromObj(lis
bca0: 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 t[i], &len);..
bcb0: 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 if (len > 255)
bcc0: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 {...Tcl_AppendR
bcd0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 esult(interp, "A
bce0: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d LPN protocol nam
bcf0: 65 73 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 es too long", (c
bd00: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
bd10: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
bd20: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
bd30: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 "IMPORT", "ALPN"
bd40: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
bd50: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c r *) NULL);...Tl
bd60: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
bd70: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
bd80: 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c r);...return TCL
bd90: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
bda0: 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b protos_len +
bdb0: 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b = 1 + (int) len;
bdc0: 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 ..}.../* Build t
bdd0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 he complete prot
bde0: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 ocol-list */..pr
bdf0: 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 otos = ckalloc(p
be00: 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 rotos_len);../*
be10: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 protocol-lists c
be20: 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 onsist of 8-bit
be30: 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c length-prefixed,
be40: 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f byte strings */
be50: 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20 ..for (j = 0, p
be60: 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e = protos; j < cn
be70: 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63 t; j++) {.. c
be80: 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 har *str = Tcl_G
be90: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
bea0: 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a list[j], &len);.
beb0: 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 . *p++ = (uns
bec0: 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e 3b igned char) len;
bed0: 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 .. memcpy(p,
bee0: 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 str, (size_t) le
bef0: 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 n);.. p += le
bf00: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 n;..}.../* SSL_s
bf10: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d et_alpn_protos m
bf20: 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 akes a copy of t
bf30: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 he protocol-list
bf40: 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 */../* Note: Th
bf50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 76 65 is function reve
bf60: 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 rses the return
bf70: 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e value convention
bf80: 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 */..if (SSL_set
bf90: 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 _alpn_protos(sta
bfa0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 tePtr->ssl, prot
bfb0: 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 os, protos_len))
bfc0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
bfd0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
bfe0: 20 22 53 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f "Set ALPN proto
bff0: 63 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22 2c 20 cols failed: ",
c000: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
c010: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
c020: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
c030: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
c040: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
c050: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 "ALPN", "FAILED
c060: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
c070: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 );.. Tls_Free
c080: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 ((tls_free_type
c090: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
c0a0: 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 ckfree(protos
c0b0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
c0c0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
c0d0: 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c * Store protocol
c0e0: 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 s list */..state
c0f0: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 Ptr->protos = pr
c100: 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d otos;..statePtr-
c110: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 >protos_len = pr
c120: 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 otos_len;. }
c130: 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 else {..statePtr
c140: 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b ->protos = NULL;
c150: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
c160: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 os_len = 0;.
c170: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
c180: 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 SSL Callbacks.
c190: 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 */. SSL_s
c1a0: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 et_app_data(stat
c1b0: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 ePtr->ssl, (void
c1c0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a *)statePtr);./*
c1d0: 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 point back to u
c1e0: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 s */. SSL_set
c1f0: 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 _verify(statePtr
c200: 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 ->ssl, verify, V
c210: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a erifyCallback);.
c220: 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f SSL_set_info
c230: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 _callback(stateP
c240: 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c tr->ssl, InfoCal
c250: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 lback);.. /*
c260: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 Callback for obs
c270: 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 erving protocol
c280: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e messages */.#ifn
c290: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 def OPENSSL_NO_S
c2a0: 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 SL_TRACE. /*
c2b0: 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 void SSL_CTX_set
c2c0: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 _msg_callback_ar
c2d0: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c g(statePtr->ctx,
c2e0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c2f0: 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c r);. void SSL
c300: 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c _CTX_set_msg_cal
c310: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e lback(statePtr->
c320: 63 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c ctx, MessageCall
c330: 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 back); */. SS
c340: 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 L_set_msg_callba
c350: 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d ck_arg(statePtr-
c360: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 >ssl, (void *)st
c370: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c atePtr);. SSL
c380: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
c390: 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c k(statePtr->ssl,
c3a0: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b MessageCallback
c3b0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f );.#endif.. /
c3c0: 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 * Create Tcl_Cha
c3d0: 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 nnel BIO Handler
c3e0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
c3f0: 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 ->p_bio.= BIO_ne
c400: 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 w_tcl(statePtr,
c410: 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 BIO_NOCLOSE);.
c420: 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 statePtr->bio.
c430: 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f = BIO_new(BIO_f_
c440: 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 ssl());.. if
c450: 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 (server) {../* S
c460: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 erver callbacks
c470: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f */..SSL_CTX_set_
c480: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d tlsext_servernam
c490: 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e e_arg(statePtr->
c4a0: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ctx, (void *)sta
c4b0: 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 tePtr);..SSL_CTX
c4c0: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 _set_tlsext_serv
c4d0: 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 ername_callback(
c4e0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 statePtr->ctx, S
c4f0: 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 NICallback);..SS
c500: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 L_CTX_set_client
c510: 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 _hello_cb(stateP
c520: 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 tr->ctx, HelloCa
c530: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 llback, (void *)
c540: 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 statePtr);..if (
c550: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
c560: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
c570: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 SSL_CTX_set_alp
c580: 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 n_select_cb(stat
c590: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 ePtr->ctx, ALPNC
c5a0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
c5b0: 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 )statePtr);.#ifd
c5c0: 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 ef USE_NPN..
c5d0: 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 if (tls1_2 == 0
c5e0: 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 && tls1_3 == 0)
c5f0: 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {...SSL_CTX_set_
c600: 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 next_protos_adve
c610: 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 rtised_cb(stateP
c620: 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c tr->ctx, NPNCall
c630: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
c640: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a atePtr);.. }.
c650: 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 #endif..}.../* E
c660: 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 nable server to
c670: 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 send cert reques
c680: 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b t after handshak
c690: 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 e (TLS 1.3 only)
c6a0: 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 */../* A write
c6b0: 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 operation must t
c6c0: 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 ake place for th
c6d0: 65 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 e Certificate Re
c6e0: 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 quest to be..
c6f0: 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 sent to the clie
c700: 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 nt, this can be
c710: 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f done with SSL_do
c720: 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f _handshake(). */
c730: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 ..if (request &&
c740: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 post_handshake
c750: 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 && tls1_3) {..
c760: 20 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 SSL_verify_cli
c770: 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 ent_post_handsha
c780: 6b 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ke(statePtr->ssl
c790: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 );..}.../* set a
c7a0: 75 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 utomatic curve s
c7b0: 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c election */..SSL
c7c0: 5f 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 _set_ecdh_auto(s
c7d0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 tatePtr->ssl, 1)
c7e0: 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 ;.../* Set serve
c7f0: 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 r mode */..state
c800: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c Ptr->flags |= TL
c810: 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 S_TCL_SERVER;..S
c820: 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 SL_set_accept_st
c830: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
c840: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b l);. } else {
c850: 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c ../* Client call
c860: 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 backs */.#ifdef
c870: 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 USE_NPN..if (sta
c880: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d tePtr->protos !=
c890: 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 NULL && tls1_2
c8a0: 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d == 0 && tls1_3 =
c8b0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f = 0) {.. SSL_
c8c0: 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f CTX_set_next_pro
c8d0: 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 to_select_cb(sta
c8e0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e tePtr->ctx, ALPN
c8f0: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 Callback, (void
c900: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a *)statePtr);..}.
c910: 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 #endif.../* Sess
c920: 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 ion caching */..
c930: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 SSL_CTX_set_sess
c940: 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 ion_cache_mode(s
c950: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 tatePtr->ctx, SS
c960: 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 L_SESS_CACHE_CLI
c970: 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 ENT | SSL_SESS_C
c980: 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c ACHE_NO_INTERNAL
c990: 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 _STORE);..SSL_CT
c9a0: 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 X_sess_set_new_c
c9b0: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c b(statePtr->ctx,
c9c0: 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b SessionCallback
c9d0: 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 );.../* Enable p
c9e0: 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 ost handshake Au
c9f0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 thentication ext
ca00: 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 ension. TLS 1.3
ca10: 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 only, not http/2
ca20: 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 . */..if (reques
ca30: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 t && post_handsh
ca40: 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f ake) {.. SSL_
ca50: 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 set_post_handsha
ca60: 6b 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 ke_auth(statePtr
ca70: 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 ->ssl, 1);..}...
ca80: 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f /* Set client mo
ca90: 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 de */..SSL_set_c
caa0: 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 onnect_state(sta
cab0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
cac0: 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 }. SSL_set_b
cad0: 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c io(statePtr->ssl
cae0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 , statePtr->p_bi
caf0: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 o, statePtr->p_b
cb00: 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 io);. BIO_set
cb10: 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 _ssl(statePtr->b
cb20: 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 io, statePtr->ss
cb30: 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b l, BIO_NOCLOSE);
cb40: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
cb50: 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a End of SSL Init.
cb60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 */. dpri
cb70: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 ntf("Returning %
cb80: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e s", Tcl_GetChann
cb90: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
cba0: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c >self));. Tcl
cbb0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
cbc0: 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f p, (char *) Tcl_
cbd0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
cbe0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
cbf0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a TCL_VOLATILE);..
cc00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
cc10: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
cc60: 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 *. * UnimportOb
cc70: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
cc80: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
cc90: 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 invoked to remov
cca0: 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 e the topmost ch
ccb0: 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a annel filter.. *
ccc0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
ccd0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
cce0: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
ccf0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 e effects:. *.Ma
cd00: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 y modify the beh
cd10: 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 avior of an IO c
cd20: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d hannel.. *. *---
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd70: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
cd80: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 UnimportObjCmd(C
cd90: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
cda0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
cdb0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
cdc0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
cdd0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
cde0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
cdf0: 6e 2c 20 63 68 69 6c 64 3b 09 2f 2a 20 54 68 65 n, child;./* The
ce00: 20 73 74 61 63 6b 65 64 20 61 6e 64 20 75 6e 64 stacked and und
ce10: 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 73 erlying channels
ce20: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */. Tcl_DStr
ce30: 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c ing upperChannel
ce40: 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 Translation, upp
ce50: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
ce60: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 g, upperChannelE
ce70: 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 ncoding, upperCh
ce80: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 annelEOFChar;.
ce90: 20 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f int res = TCL_
cea0: 4f 4b 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 OK;. (void) c
ceb0: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 lientData;..
cec0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
ced0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
cee0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 != 2) {..Tcl_Wr
cef0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
cf00: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
cf10: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 nnel");..return
cf20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
cf30: 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 .. /* Validat
cf40: 65 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 2a e channel name *
cf50: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
cf60: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
cf70: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
cf80: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c g(objv[1]), NULL
cf90: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
cfa0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
cfb0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
cfc0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
cfd0: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 }.. /* Make s
cfe0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
cff0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
d000: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
d010: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
d020: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 annel(chan);.
d030: 20 63 68 69 6c 64 20 3d 20 54 63 6c 5f 47 65 74 child = Tcl_Get
d040: 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 63 StackedChannel(c
d050: 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 han);.. /* Ve
d060: 72 69 66 79 20 69 73 20 61 20 73 74 61 63 6b 65 rify is a stacke
d070: 64 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 d channel */.
d080: 20 69 66 20 28 63 68 69 6c 64 20 3d 3d 20 4e 55 if (child == NU
d090: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
d0a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
d0b0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
d0c0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
d0d0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c Name(chan),..."\
d0e0: 22 3a 20 6e 6f 74 20 61 20 73 74 61 63 6b 65 64 ": not a stacked
d0f0: 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 channel", (char
d100: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
d110: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
d120: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
d130: 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 "UNIMPORT", "CHA
d140: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
d150: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
d160: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
d170: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
d180: 2f 2a 20 46 6c 75 73 68 20 61 6e 79 20 70 65 6e /* Flush any pen
d190: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 20 ding data */.
d1a0: 20 69 66 20 28 54 63 6c 5f 46 6c 75 73 68 28 63 if (Tcl_Flush(c
d1b0: 68 61 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 han) != TCL_OK)
d1c0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
d1d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
d1e0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
d1f0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
d200: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
d210: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
d220: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
d230: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 king);. Tcl_D
d240: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
d250: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
d260: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
d270: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
d280: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 0a 20 nelEncoding);..
d290: 20 20 20 2f 2a 20 47 65 74 20 63 75 72 72 65 6e /* Get curren
d2a0: 74 20 63 6f 6e 66 69 67 20 2d 20 45 4f 4c 20 74 t config - EOL t
d2b0: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 65 6e 63 6f ranslation, enco
d2c0: 64 69 6e 67 20 61 6e 64 20 62 75 66 66 65 72 69 ding and bufferi
d2d0: 6e 67 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 73 ng options are s
d2e0: 68 61 72 65 64 20 62 65 74 77 65 65 6e 20 61 6c hared between al
d2f0: 6c 20 63 68 61 6e 6e 65 6c 73 20 69 6e 20 74 68 l channels in th
d300: 65 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 54 e stack */. T
d310: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
d320: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
d330: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 , "-blocking", &
d340: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
d350: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 king);. Tcl_G
d360: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
d370: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
d380: 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 encoding", &uppe
d390: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
d3a0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
d3b0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
d3c0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 rp, chan, "-eofc
d3d0: 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e har", &upperChan
d3e0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
d3f0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
d400: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
d410: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f an, "-translatio
d420: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 n", &upperChanne
d430: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 0a lTranslation);..
d440: 20 20 20 20 2f 2a 20 55 6e 73 74 61 63 6b 20 74 /* Unstack t
d450: 68 65 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 72 he channel and r
d460: 65 73 74 6f 72 65 20 75 6e 64 65 72 6c 79 69 6e estore underlyin
d470: 67 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 g channel config
d480: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f */. if (Tcl_
d490: 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 UnstackChannel(i
d4a0: 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 nterp, chan) ==
d4b0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 TCL_OK) {..Tcl_S
d4c0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
d4d0: 69 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 interp, child, "
d4e0: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f -encoding", Tcl_
d4f0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
d500: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
d510: 6e 67 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68 ng));..Tcl_SetCh
d520: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
d530: 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d 65 6f 66 rp, child, "-eof
d540: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 char", Tcl_DStri
d550: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
d560: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a annelEOFChar));.
d570: 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f .Tcl_SetChannelO
d580: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
d590: 69 6c 64 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 ild, "-translati
d5a0: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 on", Tcl_DString
d5b0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
d5c0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 nelTranslation))
d5d0: 3b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 ;..Tcl_SetChanne
d5e0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
d5f0: 63 68 69 6c 64 2c 20 22 2d 62 6c 6f 63 6b 69 6e child, "-blockin
d600: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 g", Tcl_DStringV
d610: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
d620: 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 elBlocking));.
d630: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 } else {..res
d640: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 = TCL_ERROR;.
d650: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e }.. /* Clean
d660: 2d 75 70 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 -up */. Tcl_D
d670: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
d680: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
d690: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ion);. Tcl_DS
d6a0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
d6b0: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
d6c0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
d6d0: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e gFree(&upperChan
d6e0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
d6f0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
d700: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
d710: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 72 65 74 ocking);. ret
d720: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a urn res;.}.../*.
d730: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
d740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d770: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f -----. *. * CTX_
d780: 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 Init -- construc
d790: 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 t a SSL_CTX inst
d7a0: 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ance. *. * Resul
d7b0: 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 ts:. *.A valid S
d7c0: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 SL_CTX instance
d7d0: 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 or NULL.. *. * S
d7e0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
d7f0: 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 constructs SSL c
d800: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a ontext (CTX). *.
d810: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
d820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d850: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
d860: 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 SSL_CTX *.CTX_I
d870: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 nit(State *state
d880: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 Ptr, int isServe
d890: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 r, int proto, ch
d8a0: 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 ar *keyfile, cha
d8b0: 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 r *certfile,.
d8c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
d8d0: 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 key, unsigned ch
d8e0: 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 ar *cert, int ke
d8f0: 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f y_len, int cert_
d900: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 len, char *CApat
d910: 68 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 h,. char *CAf
d920: 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 ile, char *ciphe
d930: 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 rs, char *cipher
d940: 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 suites, int leve
d950: 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d l, char *DHparam
d960: 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 s) {. Tcl_Int
d970: 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 erp *interp = st
d980: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
d990: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
d9a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
d9b0: 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 _DString ds;.
d9c0: 20 69 6e 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 int off = 0, ab
d9d0: 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 ort = 0;. int
d9e0: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 load_private_ke
d9f0: 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c y;. const SSL
da00: 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b _METHOD *method;
da10: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
da20: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
da30: 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c (!proto) {..Tcl
da40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
da50: 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 terp, "no valid
da60: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 protocol selecte
da70: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
da80: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
da90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
daa0: 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 create SSL conte
dab0: 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 xt */.#if OPENSS
dac0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
dad0: 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 >= 0x10100000L
dae0: 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 || defined(NO_SS
daf0: 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L2) || defined(O
db00: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
db10: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
db20: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
db30: 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 _SSL2)) {..Tcl_A
db40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
db50: 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 rp, "SSL2 protoc
db60: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
db70: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
db80: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
db90: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
dba0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c f defined(NO_SSL
dbb0: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
dbc0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 ENSSL_NO_SSL3).
dbd0: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
dbe0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
dbf0: 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 SSL3)) {..Tcl_Ap
dc00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
dc10: 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f p, "SSL3 protoco
dc20: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
dc30: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
dc40: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
dc50: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
dc60: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
dc70: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
dc80: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 NSSL_NO_TLS1).
dc90: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
dca0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
dcb0: 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 LS1)) {..Tcl_App
dcc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
dcd0: 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f , "TLS 1.0 proto
dce0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
dcf0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
dd00: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
dd10: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
dd20: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
dd30: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
dd40: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
dd50: 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _1). if (ENAB
dd60: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
dd70: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a ROTO_TLS1_1)) {.
dd80: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
dd90: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
dda0: 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .1 protocol not
ddb0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
ddc0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
ddd0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
dde0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
ddf0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c ed(NO_TLS1_2) ||
de00: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
de10: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 _NO_TLS1_2).
de20: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
de30: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
de40: 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 1_2)) {..Tcl_App
de50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
de60: 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f , "TLS 1.2 proto
de70: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
de80: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
de90: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
dea0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
deb0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
dec0: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_3) || defined
ded0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
dee0: 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 _3). if (ENAB
def0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
df00: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a ROTO_TLS1_3)) {.
df10: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
df20: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 t(interp, "TLS 1
df30: 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 .3 protocol not
df40: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
df50: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
df60: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
df70: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 #endif. if (p
df80: 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a roto == 0) {../*
df90: 20 55 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 Use full range
dfa0: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f */..SSL_CTX_set_
dfb0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
dfc0: 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f n(ctx, 0);..SSL_
dfd0: 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 CTX_set_max_prot
dfe0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 o_version(ctx, 0
dff0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 );. }.. sw
e000: 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 itch (proto) {.#
e010: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
e020: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
e030: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 100000L && !defi
e040: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
e050: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e060: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 _NO_SSL2). ca
e070: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c se TLS_PROTO_SSL
e080: 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 2:..method = isS
e090: 65 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 erver ? SSLv2_se
e0a0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
e0b0: 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 SSLv2_client_met
e0c0: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
e0d0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
e0e0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 ed(NO_SSL3) && !
e0f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e100: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
e110: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e120: 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 SSL3_METHOD).
e130: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
e140: 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 SSL3:..method =
e150: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 isServer ? SSLv3
e160: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
e170: 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f : SSLv3_client_
e180: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
e190: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
e1a0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
e1b0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e1c0: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 SL_NO_TLS1) && !
e1d0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e1e0: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
e1f0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
e200: 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 TO_TLS1:..method
e210: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
e220: 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f Sv1_server_metho
e230: 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 d() : TLSv1_clie
e240: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
e250: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
e260: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
e270: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
e280: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
e290: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
e2a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
e2b0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 _METHOD). cas
e2c0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
e2d0: 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 _1:..method = is
e2e0: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 Server ? TLSv1_1
e2f0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
e300: 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e : TLSv1_1_clien
e310: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
e320: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
e330: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
e340: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
e350: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
e360: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
e370: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f ENSSL_NO_TLS1_2_
e380: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
e390: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
e3a0: 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 2:..method = isS
e3b0: 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f erver ? TLSv1_2_
e3c0: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
e3d0: 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 : TLSv1_2_client
e3e0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
e3f0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
e400: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
e410: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
e420: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
e430: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
e440: 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 OTO_TLS1_3:../*
e450: 55 73 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 Use the generic
e460: 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 method and const
e470: 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 raint range afte
e480: 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 r context is cre
e490: 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 ated */..method
e4a0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
e4b0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
e4c0: 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 : TLS_client_me
e4d0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
e4e0: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 #endif. defau
e4f0: 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 lt:../* Negotiat
e500: 65 20 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 e highest availa
e510: 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 ble SSL/TLS vers
e520: 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d ion */..method =
e530: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f isServer ? TLS_
e540: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
e550: 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 : TLS_client_met
e560: 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 hod();.#if OPENS
e570: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
e580: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 R < 0x10100000L
e590: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 && !defined(NO_S
e5a0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL2) && !defined
e5b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
e5c0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
e5d0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
e5e0: 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 OTO_SSL2) ? 0
e5f0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 : SSL_OP_NO_SSLv
e600: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 2);.#endif.#if !
e610: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
e620: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e630: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f NSSL_NO_SSL3)..o
e640: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
e650: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
e660: 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 SSL3) ? 0 : SS
e670: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a L_OP_NO_SSLv3);.
e680: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
e690: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 ned(NO_TLS1) &&
e6a0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e6b0: 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c _NO_TLS1)..off |
e6c0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
e6d0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
e6e0: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 ) ? 0 : SSL_OP
e6f0: 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 _NO_TLSv1);.#end
e700: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
e710: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
e720: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e730: 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c O_TLS1_1)..off |
e740: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
e750: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
e760: 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 _1) ? 0 : SSL_OP
e770: 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 _NO_TLSv1_1);.#e
e780: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
e790: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 d(NO_TLS1_2) &&
e7a0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e7b0: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 _NO_TLS1_2)..off
e7c0: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
e7d0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
e7e0: 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f S1_2) ? 0 : SSL_
e7f0: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a OP_NO_TLSv1_2);.
e800: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
e810: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
e820: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e830: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f SL_NO_TLS1_3)..o
e840: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
e850: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
e860: 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 TLS1_3) ? 0 : SS
e870: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 L_OP_NO_TLSv1_3)
e880: 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b ;.#endif..break;
e890: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
e8a0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
e8b0: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 ctx = SSL_CT
e8c0: 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 X_new(method);.
e8d0: 20 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 if (!ctx) {..
e8e0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
e8f0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 }.. if (gete
e900: 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 nv(SSLKEYLOGFILE
e910: 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 )) {..SSL_CTX_se
e920: 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 t_keylog_callbac
e930: 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c k(ctx, KeyLogCal
e940: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 lback);. }..#
e950: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
e960: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
e970: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e980: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 S1_3). if (pr
e990: 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f oto == TLS_PROTO
e9a0: 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f _TLS1_3) {..SSL_
e9b0: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
e9c0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 o_version(ctx, T
e9d0: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a LS1_3_VERSION);.
e9e0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 .SSL_CTX_set_max
e9f0: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
ea00: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
ea10: 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ON);. }.#endi
ea20: 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 f.. /* Force
ea30: 63 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e cipher selection
ea40: 20 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72 order by server
ea50: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 */. if (!isS
ea60: 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 erver) {..SSL_CT
ea70: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
ea80: 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 x, SSL_OP_CIPHER
ea90: 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e _SERVER_PREFEREN
eaa0: 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 CE);. }..#if
eab0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
eac0: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
ead0: 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 000L. OpenSSL
eae0: 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 _add_all_algorit
eaf0: 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 hms(); /* Load c
eb00: 69 70 68 65 72 73 20 61 6e 64 20 64 69 67 65 73 iphers and diges
eb10: 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 ts */.#endif..
eb20: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 SSL_CTX_set_ap
eb30: 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 p_data(ctx, (voi
eb40: 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 d*)interp);./* r
eb50: 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 emember the inte
eb60: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 rpreter */. S
eb70: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
eb80: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 ns(ctx, SSL_OP_A
eb90: 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 LL);./* all SSL
eba0: 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 bug workarounds
ebb0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
ebc0: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
ebd0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 SSL_OP_NO_COMPRE
ebe0: 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 SSION);./* disab
ebf0: 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 le compression e
ec00: 76 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 ven if supported
ec10: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
ec20: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c set_options(ctx,
ec30: 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 off);../* disab
ec40: 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 le protocol vers
ec50: 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e ions */.#if OPEN
ec60: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
ec70: 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c ER < 0x10101000L
ec80: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
ec90: 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d _mode(ctx, SSL_M
eca0: 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b ODE_AUTO_RETRY);
ecb0: 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 ./* handle new h
ecc0: 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 andshakes in bac
ecd0: 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 kground. On by d
ece0: 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 efault in OpenSS
ecf0: 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 L 1.1.1. */.#end
ed00: 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 if. SSL_CTX_s
ed10: 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 ess_set_cache_si
ed20: 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 ze(ctx, 128);..
ed30: 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 /* Set user d
ed40: 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 efined ciphers,
ed50: 63 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 cipher suites, a
ed60: 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 nd security leve
ed70: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 l */. if ((ci
ed80: 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 phers != NULL) &
ed90: 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 & !SSL_CTX_set_c
eda0: 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 ipher_list(ctx,
edb0: 63 69 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c ciphers)) {..Tcl
edc0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
edd0: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 terp, "Set ciphe
ede0: 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 rs failed: No va
edf0: 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 lid ciphers", (c
ee00: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 har *) NULL);..S
ee10: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
ee20: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
ee30: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 }. if ((c
ee40: 69 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e iphersuites != N
ee50: 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 ULL) && !SSL_CTX
ee60: 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 _set_ciphersuite
ee70: 73 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 s(ctx, ciphersui
ee80: 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 tes)) {..Tcl_App
ee90: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
eea0: 2c 20 22 53 65 74 20 63 69 70 68 65 72 20 73 75 , "Set cipher su
eeb0: 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 ites failed: No
eec0: 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 valid ciphers",
eed0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
eee0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
eef0: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c x);..return NULL
ef00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
ef10: 53 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 Set security lev
ef20: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 el */. if (le
ef30: 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 vel > -1 && leve
ef40: 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c l < 6) {../* SSL
ef50: 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _set_security_le
ef60: 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f vel */..SSL_CTX_
ef70: 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 set_security_lev
ef80: 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a el(ctx, level);.
ef90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 }.. /* se
efa0: 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 t some callbacks
efb0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
efc0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 set_default_pass
efd0: 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 wd_cb(ctx, Passw
efe0: 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 ordCallback);.
eff0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 SSL_CTX_set_de
f000: 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f fault_passwd_cb_
f010: 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 userdata(ctx, (v
f020: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
f030: 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 .. /* read a
f040: 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 Diffie-Hellman p
f050: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 arameters file,
f060: 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 or use the built
f070: 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 54 -in one */. T
f080: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
f090: 64 73 29 3b 0a 23 69 66 64 65 66 20 4f 50 45 4e ds);.#ifdef OPEN
f0a0: 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 SSL_NO_DH. if
f0b0: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
f0c0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
f0d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f0e0: 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 "DH parameter su
f0f0: 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 pport not availa
f100: 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ble", (char *) N
f110: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
f120: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
f130: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
f140: 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 lse. {..DH* d
f150: 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 h;..if (DHparams
f160: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
f170: 20 42 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20 20 BIO *bio;...
f180: 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 bio = BIO_new_f
f190: 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 ile(F2N(DHparams
f1a0: 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 , &ds), "r");..
f1b0: 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 if (!bio) {..
f1c0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
f1d0: 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 (&ds);...Tcl_App
f1e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
f1f0: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e , "Could not fin
f200: 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 d DH parameters
f210: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 file", (char *)
f220: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
f230: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
f240: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
f250: 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d }... dh = PEM
f260: 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 _read_bio_DHpara
f270: 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 ms(bio, NULL, NU
f280: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 LL, NULL);..
f290: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 BIO_free(bio);..
f2a0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
f2b0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 ree(&ds);.. i
f2c0: 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f f (!dh) {...Tcl_
f2d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f2e0: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 erp, "Could not
f2f0: 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 read DH paramete
f300: 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 rs from file", (
f310: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
f320: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
f330: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
f340: 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53 L;.. }.. S
f350: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 SL_CTX_set_tmp_d
f360: 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 h(ctx, dh);..
f370: 20 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 DH_free(dh);...
f380: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a } else {.. /*
f390: 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 Use well known
f3a0: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 DH parameters th
f3b0: 61 74 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e at have built-in
f3c0: 20 73 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e support in Open
f3d0: 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 SSL */.. if (
f3e0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f !SSL_CTX_set_dh_
f3f0: 61 75 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a auto(ctx, 1)) {.
f400: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
f410: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c lt(interp, "Coul
f420: 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 d not enable set
f430: 20 44 48 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 DH auto: ", GET
f440: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
f450: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
f460: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
f470: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
f480: 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 L;.. }..}.
f490: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f }.#endif.. /
f4a0: 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 * set our certif
f4b0: 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 icate */. loa
f4c0: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 d_private_key =
f4d0: 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 0;. if (certf
f4e0: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile != NULL) {..
f4f0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 load_private_key
f500: 20 3d 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f = 1;...if (SSL_
f510: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
f520: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 ate_file(ctx, F2
f530: 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 N(certfile, &ds)
f540: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 , SSL_FILETYPE_P
f550: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 EM) <= 0) {..
f560: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
f570: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
f580: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f590: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
f5a0: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 set certificate
f5b0: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 file ", certfile
f5c0: 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 , ": ",...GET_ER
f5d0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
f5e0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
f5f0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
f600: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
f610: 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 NULL;..}..Tcl_DS
f620: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
f630: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
f640: 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a cert != NULL) {.
f650: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 .load_private_ke
f660: 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f y = 1;..if (SSL_
f670: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
f680: 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 ate_ASN1(ctx, ce
f690: 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d rt_len, cert) <=
f6a0: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 0) {.. Tcl_A
f6b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
f6c0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
f6d0: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 et certificate:
f6e0: 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 ",...GET_ERR_REA
f6f0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
f700: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
f710: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
f720: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
f730: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ..}. } else {
f740: 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 ..certfile = (ch
f750: 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 ar*)X509_get_def
f760: 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 ault_cert_file()
f770: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f ;...if (SSL_CTX_
f780: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f use_certificate_
f790: 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 file(ctx, certfi
f7a0: 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 le, SSL_FILETYPE
f7b0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 _PEM) <= 0) {.#i
f7c0: 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 f 0.. Tcl_App
f7d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
f7e0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 , "unable to use
f7f0: 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 default certifi
f800: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 cate file ", cer
f810: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 tfile, ": ",...G
f820: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
f830: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
f840: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
f850: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
f860: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 turn NULL;.#endi
f870: 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 f..}. }..
f880: 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 /* set our priva
f890: 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 te key */. if
f8a0: 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b (load_private_k
f8b0: 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 ey) {..if (keyfi
f8c0: 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 le == NULL && ke
f8d0: 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 y == NULL) {..
f8e0: 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 keyfile = cert
f8f0: 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b file;..}...if (k
f900: 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 eyfile != NULL)
f910: 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 {.. /* get th
f920: 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 e private key as
f930: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 sociated with th
f940: 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 2a is certificate *
f950: 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 /.. if (keyfi
f960: 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 le == NULL) {...
f970: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 keyfile = certfi
f980: 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 le;.. }...
f990: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 if (SSL_CTX_use
f9a0: 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 _PrivateKey_file
f9b0: 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c (ctx, F2N(keyfil
f9c0: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c e, &ds), SSL_FIL
f9d0: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 ETYPE_PEM) <= 0)
f9e0: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 {...Tcl_DString
f9f0: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 Free(&ds);.../*
fa00: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 flush the passph
fa10: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 rase which might
fa20: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 be left in the
fa30: 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f result */...Tcl_
fa40: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
fa50: 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 , NULL, TCL_STAT
fa60: 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e IC);...Tcl_Appen
fa70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
fa80: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 "unable to set p
fa90: 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 ublic key file "
faa0: 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a , keyfile, " ",.
fab0: 09 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 .. GET_ERR_RE
fac0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
fad0: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
fae0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
faf0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
fb00: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 }.. Tcl_DStr
fb10: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 ingFree(&ds);...
fb20: 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 } else if (key !
fb30: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 = NULL) {.. i
fb40: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 f (SSL_CTX_use_P
fb50: 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 rivateKey_ASN1(E
fb60: 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 VP_PKEY_RSA, ctx
fb70: 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c , key,key_len) <
fb80: 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 6c 75 73 = 0) {.../* flus
fb90: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 h the passphrase
fba0: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 which might be
fbb0: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 left in the resu
fbc0: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 lt */...Tcl_SetR
fbd0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 esult(interp, NU
fbe0: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b LL, TCL_STATIC);
fbf0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
fc00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
fc10: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 ble to set publi
fc20: 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f 45 52 c key: ", GET_ER
fc30: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
fc40: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
fc50: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
fc60: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
fc70: 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f . }..}../* No
fc80: 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 w we know that a
fc90: 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 key and cert ha
fca0: 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 ve been set agai
fcb0: 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 nst.. * the SSL
fcc0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 context */..if (
fcd0: 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 !SSL_CTX_check_p
fce0: 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 rivate_key(ctx))
fcf0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
fd00: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
fd10: 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f "private key do
fd20: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 es not match the
fd30: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62 certificate pub
fd40: 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 lic key",....
fd50: 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 (char *) NULL)
fd60: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
fd70: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
fd80: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 eturn NULL;..}.
fd90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
fda0: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 to use default
fdb0: 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 66 69 6c location and fil
fdc0: 65 20 66 6f 72 20 43 65 72 74 69 66 69 63 61 74 e for Certificat
fdd0: 65 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 e Authority (CA)
fde0: 20 63 65 72 74 69 66 69 63 61 74 65 73 2e 20 54 certificates. T
fdf0: 68 65 0a 20 20 20 20 20 2a 20 76 65 72 69 66 79 he. * verify
fe00: 20 70 61 74 68 20 61 6e 64 20 73 74 6f 72 65 20 path and store
fe10: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 can be overridde
fe20: 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 n by the SSL_CER
fe30: 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 T_DIR env var. T
fe40: 68 65 20 76 65 72 69 66 79 20 66 69 6c 65 20 63 he verify file c
fe50: 61 6e 0a 20 20 20 20 20 2a 20 62 65 20 6f 76 65 an. * be ove
fe60: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 rridden by the S
fe70: 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 SL_CERT_FILE env
fe80: 20 76 61 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20 var. */. if
fe90: 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 (!SSL_CTX_set_de
fea0: 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 fault_verify_pat
feb0: 68 73 28 63 74 78 29 29 20 7b 0a 09 61 62 6f 72 hs(ctx)) {..abor
fec0: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 t++;. }..
fed0: 2f 2a 20 4f 76 65 72 72 69 64 65 73 20 66 6f 72 /* Overrides for
fee0: 20 74 68 65 20 43 41 20 76 65 72 69 66 79 20 70 the CA verify p
fef0: 61 74 68 20 61 6e 64 20 66 69 6c 65 20 2a 2f 0a ath and file */.
ff00: 20 20 20 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 {.#if OPENSS
ff10: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
ff20: 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
ff30: 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 if (CApath != NU
ff40: 4c 4c 20 7c 7c 20 43 41 66 69 6c 65 20 21 3d 20 LL || CAfile !=
ff50: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c NULL) {.. Tcl
ff60: 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 09 20 _DString ds1;..
ff70: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
ff80: 69 74 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 it(&ds1);...
ff90: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
ffa0: 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f d_verify_locatio
ffb0: 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 ns(ctx, F2N(CAfi
ffc0: 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 le, &ds), F2N(CA
ffd0: 70 61 74 68 2c 20 26 64 73 31 29 29 29 20 7b 0a path, &ds1))) {.
ffe0: 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 ..abort++;..
fff0: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
10000 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 ngFree(&ds);..
10010 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
10020 65 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 2f e(&ds1);... /
10030 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 * Set list of CA
10040 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 s to send to cli
10050 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 ent when request
10060 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 ing a client cer
10070 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
10080 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 /* https://sour
10090 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c ceforge.net/p/tl
100a0 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09 20 s/bugs/57/ */..
100b0 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 /* XXX:TODO:
100c0 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 Let the user sup
100d0 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 ply values here
100e0 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 instead of somet
100f0 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 hing that exists
10100 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 on the filesyst
10110 65 6d 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b em */.. STACK
10120 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a _OF(X509_NAME) *
10130 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f certNames = SSL_
10140 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 load_client_CA_f
10150 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 ile(F2N(CAfile,
10160 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 &ds));.. if (
10170 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c certNames != NUL
10180 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 L) {...SSL_CTX_s
10190 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
101a0 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 t(ctx, certNames
101b0 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 );.. }.. T
101c0 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
101d0 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 ds);..}..#else..
101e0 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 if (CApath != NU
101f0 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 LL) {.. if (!
10200 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 SSL_CTX_load_ver
10210 69 66 79 5f 64 69 72 28 63 74 78 2c 20 46 32 4e ify_dir(ctx, F2N
10220 28 43 41 70 61 74 68 2c 20 26 64 73 29 29 29 20 (CApath, &ds)))
10230 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 {...abort++;..
10240 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
10250 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
10260 7d 0a 09 69 66 20 28 43 41 66 69 6c 65 20 21 3d }..if (CAfile !=
10270 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 NULL) {.. if
10280 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f (!SSL_CTX_load_
10290 76 65 72 69 66 79 5f 66 69 6c 65 28 63 74 78 2c verify_file(ctx,
102a0 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 F2N(CAfile, &ds
102b0 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b ))) {...abort++;
102c0 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
102d0 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
102e0 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 );... /* Set
102f0 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 list of CAs to s
10300 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 end to client wh
10310 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 en requesting a
10320 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 client certifica
10330 74 65 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b te */.. STACK
10340 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a _OF(X509_NAME) *
10350 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f certNames = SSL_
10360 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 load_client_CA_f
10370 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 ile(F2N(CAfile,
10380 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 &ds));.. if (
10390 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c certNames != NUL
103a0 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 L) {...SSL_CTX_s
103b0 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
103c0 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 t(ctx, certNames
103d0 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 );.. }.. T
103e0 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
103f0 64 73 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 ds);..}.#endif.
10400 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e }.. return
10410 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d ctx;.}.../*. *-
10420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10460 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f --. *. * StatusO
10470 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 bjCmd -- return
10480 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 certificate for
10490 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a connected peer..
104a0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
104b0 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
104c0 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
104d0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
104e0 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
104f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
10530 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 */.static int.St
10540 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e atusObjCmd(Clien
10550 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
10560 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
10570 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
10580 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
10590 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 bjv[]) {. Sta
105a0 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 te *statePtr;.
105b0 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 X509 *peer;.
105c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
105d0 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e r;. Tcl_Chann
105e0 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 el chan;. cha
105f0 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 r *channelName,
10600 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e *ciphers;. in
10610 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 t mode;. cons
10620 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
10630 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 *proto;. unsi
10640 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 gned int len;.
10650 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a int nid, res;.
10660 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e (void) clien
10670 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 tData;.. dpri
10680 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
10690 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
106a0 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 || objc > 3 ||
106b0 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 (objc == 3 && !s
106c0 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 trcmp(Tcl_GetStr
106d0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d ing(objv[1]), "-
106e0 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c local"))) {..Tcl
106f0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
10700 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
10710 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c ?-local? channel
10720 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
10730 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
10740 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c /* Get channel
10750 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e Id */. chann
10760 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 elName = Tcl_Get
10770 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28 6f 62 6a String(objv[(obj
10780 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d c == 2 ? 1 : 2)]
10790 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 );. chan = Tc
107a0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
107b0 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 erp, channelName
107c0 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 , &mode);. if
107d0 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
107e0 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
107f0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
10800 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
10810 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
10820 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
10830 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
10840 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
10850 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
10860 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f n);. if (Tcl_
10870 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
10880 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
10890 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
108a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
108b0 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
108c0 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
108d0 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
108e0 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
108f0 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 TLS channel", (c
10900 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 har *) NULL);..T
10910 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
10920 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
10930 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 STATUS", "CHANNE
10940 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
10950 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
10960 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
10970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 ;. }. stat
10980 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
10990 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 Tcl_GetChannelI
109a0 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
109b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 );.. /* Get c
109c0 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 ertificate for p
109d0 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 eer or self */.
109e0 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
109f0 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f ) {..peer = SSL_
10a00 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 get_peer_certifi
10a10 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 cate(statePtr->s
10a20 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 sl);. } else
10a30 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 {..peer = SSL_ge
10a40 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 t_certificate(st
10a50 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
10a60 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 }. /* Get X
10a70 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 509 certificate
10a80 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 info */. if (
10a90 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 peer) {..objPtr
10aa0 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a = Tls_NewX509Obj
10ab0 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a (interp, peer);.
10ac0 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 .if (objc == 2)
10ad0 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 {.. X509_free
10ae0 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 (peer);.. pee
10af0 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 r = NULL;..}.
10b00 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 } else {..objPt
10b10 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
10b20 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 bj(0, NULL);.
10b30 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 }.. /* Peer
10b40 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 name */. LAPP
10b50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10b60 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d objPtr, "peernam
10b70 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 e", SSL_get0_pee
10b80 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e rname(statePtr->
10b90 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c ssl), -1);. L
10ba0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
10bb0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 p, objPtr, "sbit
10bc0 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 s", SSL_get_ciph
10bd0 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 er_bits(statePtr
10be0 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a ->ssl, NULL));..
10bf0 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 ciphers = (c
10c00 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 har*)SSL_get_cip
10c10 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 her(statePtr->ss
10c20 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f l);. LAPPEND_
10c30 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
10c40 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 tr, "cipher", ci
10c50 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 phers, -1);..
10c60 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 /* Verify the X
10c70 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 509 certificate
10c80 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 presented by the
10c90 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 peer */. LAP
10ca0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10cb0 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 objPtr, "verify
10cc0 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 Result",..X509_v
10cd0 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 erify_cert_error
10ce0 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f _string(SSL_get_
10cf0 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 verify_result(st
10d00 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d atePtr->ssl)), -
10d10 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 1);.. /* Veri
10d20 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d fy mode */. m
10d30 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 ode = SSL_get_ve
10d40 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 rify_mode(stateP
10d50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 tr->ssl);. if
10d60 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
10d70 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 RIFY_NONE) {..LA
10d80 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
10d90 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 , objPtr, "verif
10da0 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 yMode", "none",
10db0 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 -1);. } else
10dc0 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 {..Tcl_Obj *list
10dd0 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 ObjPtr = Tcl_New
10de0 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
10df0 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 ;..if (mode && S
10e00 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 SL_VERIFY_PEER)
10e10 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
10e20 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10e30 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 interp, listObjP
10e40 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
10e50 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 gObj("peer", -1)
10e60 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 );..}..if (mode
10e70 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 && SSL_VERIFY_FA
10e80 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 IL_IF_NO_PEER_CE
10e90 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c RT) {.. Tcl_L
10ea0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10eb0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
10ec0 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ObjPtr, Tcl_NewS
10ed0 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 tringObj("fail i
10ee0 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c f no peer cert",
10ef0 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d -1));..}..if (m
10f00 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
10f10 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b Y_CLIENT_ONCE) {
10f20 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
10f30 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10f40 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 nterp, listObjPt
10f50 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
10f60 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 Obj("client once
10f70 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 ", -1));..}..if
10f80 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 (mode && SSL_VER
10f90 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 IFY_POST_HANDSHA
10fa0 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c KE) {.. Tcl_L
10fb0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
10fc0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
10fd0 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ObjPtr, Tcl_NewS
10fe0 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 tringObj("post h
10ff0 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b andshake", -1));
11000 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a ..}..LAPPEND_OBJ
11010 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11020 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c "verifyMode", l
11030 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d istObjPtr). }
11040 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 .. /* Verify
11050 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 mode depth */.
11060 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e LAPPEND_INT(in
11070 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 terp, objPtr, "v
11080 65 72 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c erifyDepth", SSL
11090 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 _get_verify_dept
110a0 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 h(statePtr->ssl)
110b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 );.. /* Repor
110c0 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 t the selected p
110d0 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 rotocol as a res
110e0 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 ult of the negot
110f0 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 iation */. SS
11100 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 L_get0_alpn_sele
11110 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 cted(statePtr->s
11120 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e sl, &proto, &len
11130 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 );. LAPPEND_S
11140 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11150 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 r, "alpn", (char
11160 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 *)proto, (Tcl_S
11170 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c ize) len);. L
11180 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11190 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 p, objPtr, "prot
111a0 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 ocol", SSL_get_v
111b0 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d ersion(statePtr-
111c0 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 >ssl), -1);..
111d0 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f /* Valid for no
111e0 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 n-RSA signature
111f0 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 and TLS 1.3 */.
11200 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
11210 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 ) {..res = SSL_g
11220 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 et_peer_signatur
11230 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
11240 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
11250 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
11260 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 SSL_get_signatur
11270 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
11280 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
11290 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 }. if (!res)
112a0 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c {nid = 0;}. L
112b0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
112c0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e p, objPtr, "sign
112d0 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 atureHashAlgorit
112e0 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 hm", OBJ_nid2ln(
112f0 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 nid), -1);..
11300 2f 2a 20 41 64 64 65 64 20 69 6e 20 4f 70 65 6e /* Added in Open
11310 53 53 4c 20 31 2e 31 2e 31 61 20 2a 2f 0a 23 69 SSL 1.1.1a */.#i
11320 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
11330 4e 5f 4e 55 4d 42 45 52 20 3e 20 30 78 31 30 31 N_NUMBER > 0x101
11340 30 31 30 30 30 4c 0a 20 20 20 20 69 66 20 28 6f 01000L. if (o
11350 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 bjc == 2) {..res
11360 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f = SSL_get_peer_
11370 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e signature_type_n
11380 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c id(statePtr->ssl
11390 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 , &nid);. } e
113a0 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c lse {..res = SSL
113b0 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 _get_signature_t
113c0 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 ype_nid(statePtr
113d0 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 ->ssl, &nid);.
113e0 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 }. if (!res
113f0 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 ) {nid = 0;}.
11400 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
11410 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 erp, objPtr, "si
11420 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20 4f 42 gnatureType", OB
11430 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d J_nid2ln(nid), -
11440 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 1);.#endif..
11450 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
11460 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
11470 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
11480 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
11490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
114d0 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 -. *. * Connecti
114e0 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 onInfoObjCmd --
114f0 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f return connectio
11500 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e n info from Open
11510 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c SSL.. *. * Resul
11520 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 ts:. *.A list of
11530 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f connection info
11540 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *---------
11550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
11590 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 static int Conne
115a0 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 ctionInfoObjCmd(
115b0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
115c0 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
115d0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
115e0 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
115f0 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
11600 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
11610 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
11620 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
11630 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 e on */. Stat
11640 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a e *statePtr;../*
11650 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
11660 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
11670 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
11680 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 Ptr, *listPtr;.
11690 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 const SSL *ss
116a0 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c l;. const SSL
116b0 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b _CIPHER *cipher;
116c0 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 . const SSL_S
116d0 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b ESSION *session;
116e0 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d . const EVP_M
116f0 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64 D *md;. (void
11700 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
11710 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 if (objc != 2
11720 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
11730 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
11740 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 objv, "channel"
11750 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
11760 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
11770 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
11780 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
11790 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
117a0 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 v[1]), NULL);.
117b0 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
117c0 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
117d0 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
117e0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
117f0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
11800 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
11810 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
11820 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
11830 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
11840 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 (chan);. if (
11850 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
11860 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
11870 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
11880 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
11890 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 lt(interp, "bad
118a0 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c channel \"", Tcl
118b0 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
118c0 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a chan),.. "\":
118d0 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
118e0 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 el", (char *) NU
118f0 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 LL);..Tcl_SetErr
11900 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
11910 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f TLS", "CONNECTIO
11920 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 N", "CHANNEL", "
11930 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
11940 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
11950 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
11960 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d }.. objPtr =
11970 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
11980 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 0, NULL);.. /
11990 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 * Connection inf
119a0 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 o */. statePt
119b0 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c r = (State *)Tcl
119c0 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
119d0 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 nceData(chan);.
119e0 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 ssl = statePt
119f0 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 r->ssl;. if (
11a00 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl != NULL) {..
11a10 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 /* connection st
11a20 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ate */..LAPPEND_
11a30 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11a40 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 4c tr, "state", SSL
11a50 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f _state_string_lo
11a60 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 ng(ssl), -1);...
11a70 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 /* Get SNI reque
11a80 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 sted server name
11a90 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
11aa0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11ab0 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 53 "servername", S
11ac0 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d SL_get_servernam
11ad0 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 e(ssl, TLSEXT_NA
11ae0 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 METYPE_host_name
11af0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 ), -1);.../* Get
11b00 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 protocol */..LA
11b10 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11b20 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f , objPtr, "proto
11b30 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 col", SSL_get_ve
11b40 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b rsion(ssl), -1);
11b50 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 .../* Renegotiat
11b60 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 ion allowed */..
11b70 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 LAPPEND_BOOL(int
11b80 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 erp, objPtr, "re
11b90 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f negotiation_allo
11ba0 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 wed", SSL_get_se
11bb0 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 cure_renegotiati
11bc0 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53 53 4c 20 on_support((SSL
11bd0 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 *) ssl));.../* G
11be0 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 et security leve
11bf0 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e l */..LAPPEND_IN
11c00 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
11c10 2c 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65 , "security_leve
11c20 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 l", SSL_get_secu
11c30 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 rity_level(ssl))
11c40 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 ;.../* Session i
11c50 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f nfo */..LAPPEND_
11c60 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
11c70 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 Ptr, "session_re
11c80 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 used", SSL_sessi
11c90 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b on_reused(ssl));
11ca0 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 .../* Is server
11cb0 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 info */..LAPPEND
11cc0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
11cd0 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 jPtr, "is_server
11ce0 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 ", SSL_is_server
11cf0 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 (ssl));.../* Is
11d00 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 DTLS */..LAPPEND
11d10 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
11d20 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c jPtr, "is_dtls",
11d30 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c SSL_is_dtls(ssl
11d40 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ));. }.. /
11d50 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f * Cipher info */
11d60 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 . cipher = SS
11d70 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 L_get_current_ci
11d80 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 pher(ssl);. i
11d90 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c f (cipher != NUL
11da0 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 L) {..char buf[B
11db0 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 UFSIZ] = {0};..i
11dc0 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 nt bits, alg_bit
11dd0 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e s;.../* Cipher n
11de0 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ame */..LAPPEND_
11df0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11e00 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 tr, "cipher", SS
11e10 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d L_CIPHER_get_nam
11e20 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a e(cipher), -1);.
11e30 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 ../* RFC name of
11e40 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 cipher */..LAPP
11e50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11e60 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 objPtr, "standar
11e70 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 d_name", SSL_CIP
11e80 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d HER_standard_nam
11e90 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a e(cipher), -1);.
11ea0 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d ../* OpenSSL nam
11eb0 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 e of cipher */..
11ec0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11ed0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 rp, objPtr, "ope
11ee0 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e nssl_name", OPEN
11ef0 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 SSL_cipher_name(
11f00 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 SSL_CIPHER_stand
11f10 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 ard_name(cipher)
11f20 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d ), -1);.../* num
11f30 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 ber of secret bi
11f40 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 ts used for ciph
11f50 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 er */..bits = SS
11f60 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 L_CIPHER_get_bit
11f70 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 s(cipher, &alg_b
11f80 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 its);..LAPPEND_I
11f90 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
11fa0 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 r, "secret_bits"
11fb0 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e , bits);..LAPPEN
11fc0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
11fd0 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d jPtr, "algorithm
11fe0 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 _bits", alg_bits
11ff0 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 );../* alg_bits
12000 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 is actual key se
12010 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 cret bits. If us
12020 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 e bits and secre
12030 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 t (algorithm) bi
12040 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 ts differ,.. t
12050 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 he rest of the b
12060 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 its are fixed, i
12070 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 .e. for limited
12080 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 export ciphers (
12090 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 bits < 56) */...
120a0 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 /* Indicates whi
120b0 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f ch SSL/TLS proto
120c0 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 col version firs
120d0 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 t defined the ci
120e0 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 pher */..LAPPEND
120f0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12100 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f Ptr, "min_versio
12110 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 n", SSL_CIPHER_g
12120 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 et_version(ciphe
12130 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 r), -1);.../* Ci
12140 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 pher NID */..LAP
12150 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12160 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 objPtr, "cipher
12170 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 NID", (char *)OB
12180 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 J_nid2ln(SSL_CIP
12190 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e HER_get_cipher_n
121a0 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 id(cipher)), -1)
121b0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
121c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
121d0 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 digestNID", (cha
121e0 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
121f0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 SL_CIPHER_get_di
12200 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 gest_nid(cipher)
12210 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 ), -1);..LAPPEND
12220 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12230 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 Ptr, "keyExchang
12240 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f eNID", (char *)O
12250 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
12260 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 PHER_get_kx_nid(
12270 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 cipher)), -1);..
12280 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12290 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 rp, objPtr, "aut
122a0 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c henticationNID",
122b0 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 (char *)OBJ_nid
122c0 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 2ln(SSL_CIPHER_g
122d0 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 et_auth_nid(ciph
122e0 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 er)), -1);.../*
122f0 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 message authenti
12300 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 cation code - Ci
12310 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65 2e pher is AEAD (e.
12320 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 g. GCM or ChaCha
12330 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 20/Poly1305) or
12340 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 not */../* Authe
12350 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 nticated Encrypt
12360 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 ion with associa
12370 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29 20 ted data (AEAD)
12380 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e check */..LAPPEN
12390 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
123a0 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 bjPtr, "cipher_i
123b0 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 s_aead", SSL_CIP
123c0 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 HER_is_aead(ciph
123d0 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 er));.../* Diges
123e0 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 t used during th
123f0 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 e SSL/TLS handsh
12400 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 ake when using t
12410 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d he cipher. */..m
12420 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 d = SSL_CIPHER_g
12430 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 et_handshake_dig
12440 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 est(cipher);..LA
12450 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12460 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 , objPtr, "hands
12470 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 hake_digest", (c
12480 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d har *)EVP_MD_nam
12490 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a e(md), -1);.../*
124a0 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 Get OpenSSL-spe
124b0 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 cific ID, not IA
124c0 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e NA ID */..LAPPEN
124d0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
124e0 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 jPtr, "cipher_id
124f0 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 ", (int) SSL_CIP
12500 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 HER_get_id(ciphe
12510 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 r));.../* Two-by
12520 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 te ID used in th
12530 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f e TLS protocol o
12540 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 f the given ciph
12550 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 er */..LAPPEND_I
12560 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
12570 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 r, "protocol_id"
12580 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 , (int) SSL_CIPH
12590 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f ER_get_protocol_
125a0 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f id(cipher));.../
125b0 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 * Textual descri
125c0 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 ption of the cip
125d0 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f her */..if (SSL_
125e0 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 CIPHER_descripti
125f0 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 on(cipher, buf,
12600 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 sizeof(buf)) !=
12610 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 NULL) {.. LAP
12620 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
12630 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 objPtr, "descri
12640 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 ption", buf, -1)
12650 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
12660 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 /* Session info
12670 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d */. session =
12680 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e SSL_get_session
12690 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 (ssl);. if (s
126a0 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 ession != NULL)
126b0 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 {..const unsigne
126c0 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a d char *ticket;.
126d0 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 .size_t len2;..u
126e0 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e nsigned int ulen
126f0 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 ;..const unsigne
12700 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f d char *session_
12710 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 id, *proto;..uns
12720 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65 igned char buffe
12730 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 r[SSL_MAX_MASTER
12740 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 _KEY_LENGTH];...
12750 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 /* Report the se
12760 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 lected protocol
12770 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
12780 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 he ALPN negotiat
12790 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 ion */..SSL_SESS
127a0 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 ION_get0_alpn_se
127b0 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 lected(session,
127c0 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a &proto, &len2);.
127d0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
127e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c erp, objPtr, "al
127f0 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 pn", (char *) pr
12800 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 oto, (Tcl_Size)
12810 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f len2);.../* Repo
12820 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 rt the selected
12830 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 protocol as a re
12840 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 sult of the NPN
12850 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 negotiation */.#
12860 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 ifdef USE_NPN..S
12870 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f SL_get0_next_pro
12880 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 to_negotiated(ss
12890 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e l, &proto, &ulen
128a0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
128b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
128c0 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 "npn", (char *)
128d0 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 proto, (Tcl_Size
128e0 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a ) ulen);.#endif.
128f0 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 ../* Resumable s
12900 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 ession */..LAPPE
12910 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
12920 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 objPtr, "resumab
12930 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e le", SSL_SESSION
12940 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 _is_resumable(se
12950 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 ssion));.../* Se
12960 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 ssion start time
12970 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 (seconds since
12980 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 epoch) */..LAPPE
12990 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
129a0 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 objPtr, "start_t
129b0 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f ime", SSL_SESSIO
129c0 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 N_get_time(sessi
129d0 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f on));.../* Timeo
129e0 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 ut value - SSL_C
129f0 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 TX_get_timeout (
12a00 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 in seconds) */..
12a10 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 LAPPEND_LONG(int
12a20 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 erp, objPtr, "ti
12a30 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 meout", SSL_SESS
12a40 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 ION_get_timeout(
12a50 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 session));.../*
12a60 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 Session id - TLS
12a70 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f v1.2 and below o
12a80 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f nly */..session_
12a90 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e id = SSL_SESSION
12aa0 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c _get_id(session,
12ab0 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ulen);..LAPPEN
12ac0 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
12ad0 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
12ae0 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 n_id", session_i
12af0 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c d, (Tcl_Size) ul
12b00 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f en);.../* Sessio
12b10 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 n context */..se
12b20 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 ssion_id = SSL_S
12b30 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 ESSION_get0_id_c
12b40 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 ontext(session,
12b50 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 &ulen);..LAPPEND
12b60 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
12b70 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
12b80 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 _context", sessi
12b90 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 on_id, (Tcl_Size
12ba0 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 ) ulen);.../* Se
12bb0 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 ssion ticket - c
12bc0 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 lient only */..S
12bd0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
12be0 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 ticket(session,
12bf0 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b &ticket, &len2);
12c00 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
12c10 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12c20 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 "session_ticket
12c30 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f ", ticket, (Tcl_
12c40 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f Size) len2);.../
12c50 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 * Session ticket
12c60 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 lifetime hint (
12c70 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 in seconds) */..
12c80 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 LAPPEND_LONG(int
12c90 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 erp, objPtr, "li
12ca0 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 fetime", SSL_SES
12cb0 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f SION_get_ticket_
12cc0 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 lifetime_hint(se
12cd0 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 ssion));.../* Ti
12ce0 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f cket app data */
12cf0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
12d00 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
12d10 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f 53 30000000L..SSL_S
12d20 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b ESSION_get0_tick
12d30 65 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c 5f et_appdata((SSL_
12d40 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 69 SESSION *) sessi
12d50 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 on, &ticket, &le
12d60 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 n2);..LAPPEND_BA
12d70 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a RRAY(interp, obj
12d80 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 Ptr, "ticket_app
12d90 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 _data", ticket,
12da0 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
12db0 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 ;.#endif.../* Ge
12dc0 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a t master key */.
12dd0 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 .len2 = SSL_SESS
12de0 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b ION_get_master_k
12df0 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 ey(session, buff
12e00 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 er, SSL_MAX_MAST
12e10 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a ER_KEY_LENGTH);.
12e20 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
12e30 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12e40 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 "master_key", bu
12e50 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29 ffer, (Tcl_Size)
12e60 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d len2);.../* Com
12e70 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 pression id */..
12e80 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 unsigned int id
12e90 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
12ea0 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 t_compress_id(se
12eb0 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 ssion);..LAPPEND
12ec0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12ed0 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f Ptr, "compressio
12ee0 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f n_id", id == 1 ?
12ef0 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 "zlib" : "none"
12f00 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 , -1);. }..
12f10 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e /* Compression
12f20 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 info */. if
12f30 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl != NULL) {.
12f40 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f #ifdef HAVE_SSL_
12f50 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e COMPRESSION..con
12f60 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a st COMP_METHOD *
12f70 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f comp, *expn;..co
12f80 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 mp = SSL_get_cur
12f90 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e rent_compression
12fa0 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 (ssl);..expn = S
12fb0 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 SL_get_current_e
12fc0 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a xpansion(ssl);..
12fd0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12fe0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f erp, objPtr, "co
12ff0 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 mpression", comp
13000 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f ? SSL_COMP_get_
13010 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f name(comp) : "no
13020 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 ne", -1);..LAPPE
13030 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
13040 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f bjPtr, "expansio
13050 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 n", expn ? SSL_C
13060 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 OMP_get_name(exp
13070 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 n) : "none", -1)
13080 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 ;.#else..LAPPEND
13090 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
130a0 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f Ptr, "compressio
130b0 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b n", "none", -1);
130c0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
130d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 terp, objPtr, "e
130e0 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 xpansion", "none
130f0 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 ", -1);.#endif.
13100 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 }.. /* Ser
13110 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ver info */.
13120 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 {..long mode = S
13130 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 SL_CTX_get_sessi
13140 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 on_cache_mode(st
13150 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 atePtr->ctx);..c
13160 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 har *msg;...if (
13170 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
13180 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 CACHE_OFF) {..
13190 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 msg = "off";..
131a0 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 } else if (mode
131b0 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
131c0 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 _CLIENT) {..
131d0 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a msg = "client";.
131e0 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 .} else if (mode
131f0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
13200 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 E_SERVER) {..
13210 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b msg = "server";
13220 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 ..} else if (mod
13230 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 e & SSL_SESS_CAC
13240 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 HE_BOTH) {..
13250 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d msg = "both";..}
13260 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 else {.. msg
13270 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d = "unknown";..}
13280 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
13290 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
132a0 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 ession_cache_mod
132b0 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 e", msg, -1);.
132c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c }.. /* CA L
132d0 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 ist */. /* IF
132e0 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 not a server, s
132f0 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f ame as SSL_get0_
13300 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 peer_CA_list. If
13310 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 server same as
13320 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 SSL_CTX_get_clie
13330 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 nt_CA_list */.
13340 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f listPtr = Tcl_
13350 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
13360 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f LL);. STACK_O
13370 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 F(X509_NAME) *ca
13380 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 _list;. if ((
13390 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 ca_list = SSL_ge
133a0 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 t_client_CA_list
133b0 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 (ssl)) != NULL)
133c0 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 {..char buffer[B
133d0 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e UFSIZ];..for (in
133e0 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
133f0 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 X509_NAME_num(ca
13400 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 _list); i++) {..
13410 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e X509_NAME *n
13420 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 ame = sk_X509_NA
13430 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 ME_value(ca_list
13440 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e , i);.. if (n
13450 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 ame) {...X509_NA
13460 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c ME_oneline(name,
13470 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 buffer, BUFSIZ)
13480 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 ;...Tcl_ListObjA
13490 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
134a0 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 erp, listPtr, Tc
134b0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 l_NewStringObj(b
134c0 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 uffer, -1));..
134d0 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 }..}. }.
134e0 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 LAPPEND_OBJ(int
134f0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 erp, objPtr, "ca
13500 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b List", listPtr);
13510 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 . LAPPEND_INT
13520 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13530 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 "caListCount",
13540 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d sk_X509_NAME_num
13550 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 (ca_list));..
13560 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
13570 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
13580 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
13590 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
135a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
135b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
135c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
135d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
135e0 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e --. *. * Version
135f0 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
13600 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 version string
13610 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a from OpenSSL.. *
13620 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
13630 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
13640 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
13650 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
13660 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
13670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
136a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
136b0 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 .static int.Vers
136c0 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 ionObjCmd(Client
136d0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
136e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
136f0 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
13700 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
13710 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
13720 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 Obj *objPtr;.
13730 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 (void) clientDa
13740 74 61 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 6f ta;. (void) o
13750 62 6a 63 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 bjc;. (void)
13760 6f 62 6a 76 3b 0a 0a 20 20 20 20 64 70 72 69 6e objv;.. dprin
13770 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
13780 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
13790 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 NewStringObj(OPE
137a0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 NSSL_VERSION_TEX
137b0 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f T, -1);. Tcl_
137c0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
137d0 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 erp, objPtr);..
137e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
137f0 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
13800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
13840 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 *. * MiscObjCmd
13850 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 -- misc commands
13860 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
13870 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
13880 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
13890 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
138a0 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
138b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
138f0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d */.static int.M
13900 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 iscObjCmd(Client
13910 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
13920 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
13930 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
13940 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
13950 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 jv[]) {. stat
13960 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 ic const char *c
13970 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 ommands [] = { "
13980 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 req", "strreq",
13990 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d NULL };. enum
139a0 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 command { C_REQ
139b0 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 , C_STRREQ, C_DU
139c0 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 MMY };. Tcl_S
139d0 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e 74 ize cmd;. int
139e0 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 isStr;. char
139f0 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a buffer[16384];.
13a00 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e (void) clien
13a10 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 tData;.. dpri
13a20 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
13a30 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
13a40 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
13a50 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
13a60 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 objv, "subcomma
13a70 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 nd ?args?");..re
13a80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13a90 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 }. if (Tc
13aa0 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
13ab0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 j(interp, objv[1
13ac0 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f ], commands, "co
13ad0 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 mmand", 0, &cmd)
13ae0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
13af0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
13b00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
13b10 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
13b20 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 isStr = (cmd
13b30 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 == C_STRREQ);.
13b40 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d switch ((enum
13b50 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b command) cmd) {
13b60 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 ..case C_REQ:..c
13b70 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a ase C_STRREQ: {.
13b80 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 . EVP_PKEY *p
13b90 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 key=NULL;.. X
13ba0 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 509 *cert=NULL;.
13bb0 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a . X509_NAME *
13bc0 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 name=NULL;..
13bd0 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b Tcl_Obj **listv;
13be0 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c .. Tcl_Size l
13bf0 69 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20 69 istc;.. int i
13c00 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 ;... BIO *out
13c10 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 =NULL;... cha
13c20 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d r *k_C="",*k_ST=
13c30 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d "",*k_L="",*k_O=
13c40 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 "",*k_OU="",*k_C
13c50 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 N="",*k_Email=""
13c60 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 ;.. char *key
13c70 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 out,*pemout,*str
13c80 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 ;.. int keysi
13c90 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 ze,serial=0,days
13ca0 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 =365;..#if OPENS
13cb0 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
13cc0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
13cd0 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 . BIGNUM *bne
13ce0 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 = NULL;.. RS
13cf0 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 A *rsa = NULL;.#
13d00 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b else.. EVP_PK
13d10 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 EY_CTX *ctx = NU
13d20 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 LL;.#endif...
13d30 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c if ((objc<5) ||
13d40 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 (objc>6)) {...T
13d50 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
13d60 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c interp, 2, objv,
13d70 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c "keysize keyfil
13d80 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f e certfile ?info
13d90 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 ?");...return TC
13da0 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
13db0 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 .. if (Tcl_Ge
13dc0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 tIntFromObj(inte
13dd0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 rp, objv[2], &ke
13de0 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b ysize) != TCL_OK
13df0 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c ) {...return TCL
13e00 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
13e10 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 keyout=Tcl_G
13e20 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d etString(objv[3]
13e30 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 );.. pemout=T
13e40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
13e50 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 v[4]);.. if (
13e60 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 isStr) {...Tcl_S
13e70 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 etVar(interp,key
13e80 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c out,"",0);...Tcl
13e90 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 _SetVar(interp,p
13ea0 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 emout,"",0);..
13eb0 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 }... if (ob
13ec0 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 jc>=6) {...if (T
13ed0 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 cl_ListObjGetEle
13ee0 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 ments(interp, ob
13ef0 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 26 jv[5], &listc, &
13f00 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b listv) != TCL_OK
13f10 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e ) {... return
13f20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a TCL_ERROR;...}.
13f30 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 ...if ((listc%2)
13f40 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 != 0) {... T
13f50 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
13f60 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e erp,"Information
13f70 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 list must have
13f80 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 even number of a
13f90 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b rguments",NULL);
13fa0 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
13fb0 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 L_ERROR;...}...f
13fc0 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 or (i=0; i<listc
13fd0 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 ; i+=2) {...
13fe0 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e str=Tcl_GetStrin
13ff0 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 g(listv[i]);...
14000 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 if (strcmp(st
14010 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a r,"days")==0) {.
14020 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e ...if (Tcl_GetIn
14030 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
14040 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 listv[i+1],&days
14050 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 )!=TCL_OK)....
14060 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
14070 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 OR;... } else
14080 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
14090 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a "serial")==0) {.
140a0 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e ...if (Tcl_GetIn
140b0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c tFromObj(interp,
140c0 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 listv[i+1],&seri
140d0 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 al)!=TCL_OK)....
140e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
140f0 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c RROR;... } el
14100 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
14110 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 r,"C")==0) {....
14120 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e k_C=Tcl_GetStrin
14130 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
14140 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
14150 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 strcmp(str,"ST")
14160 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 ==0) {....k_ST=T
14170 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
14180 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
14190 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
141a0 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b p(str,"L")==0) {
141b0 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 ....k_L=Tcl_GetS
141c0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
141d0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
141e0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
141f0 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f O")==0) {....k_O
14200 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
14210 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
14220 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
14230 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 cmp(str,"OU")==0
14240 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f ) {....k_OU=Tcl_
14250 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
14260 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
14270 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
14280 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 tr,"CN")==0) {..
14290 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 ..k_CN=Tcl_GetSt
142a0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
142b0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
142c0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 f (strcmp(str,"E
142d0 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 mail")==0) {....
142e0 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 k_Email=Tcl_GetS
142f0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
14300 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
14310 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 {....Tcl_SetResu
14320 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f lt(interp,"Unkno
14330 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 wn parameter",NU
14340 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 LL);....return T
14350 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 CL_ERROR;...
14360 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 }...}.. }..#i
14370 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
14380 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
14390 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 00000L.. bne
143a0 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 = BN_new();..
143b0 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 rsa = RSA_new()
143c0 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 ;.. pkey = EV
143d0 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 P_PKEY_new();..
143e0 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 if (bne == NU
143f0 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c LL || rsa == NUL
14400 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c L || pkey == NUL
14410 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 L || !BN_set_wor
14420 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c d(bne,RSA_F4) ||
14430 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 ...!RSA_generate
14440 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 _key_ex(rsa, key
14450 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 size, bne, NULL)
14460 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 || !EVP_PKEY_as
14470 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 sign_RSA(pkey, r
14480 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 sa)) {...EVP_PKE
14490 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
144a0 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 /* RSA_free(rsa)
144b0 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 ; freed by EVP_P
144c0 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e KEY_free */...BN
144d0 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 _free(bne);.#els
144e0 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 e.. pkey = EV
144f0 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 P_RSA_gen((unsig
14500 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 ned int) keysize
14510 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 );.. ctx = EV
14520 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 P_PKEY_CTX_new(p
14530 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 key,NULL);..
14540 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c if (pkey == NULL
14550 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 || ctx == NULL
14560 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 || !EVP_PKEY_key
14570 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c gen_init(ctx) ||
14580 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 ...!EVP_PKEY_CTX
14590 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f _set_rsa_keygen_
145a0 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a bits(ctx, keysiz
145b0 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f e) || !EVP_PKEY_
145c0 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 keygen(ctx, &pke
145d0 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 y)) {...EVP_PKEY
145e0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 _free(pkey);...E
145f0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 VP_PKEY_CTX_free
14600 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (ctx);.#endif...
14610 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
14620 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 terp,"Error gene
14630 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b rating private k
14640 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 ey",NULL);...ret
14650 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
14660 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 } else {...i
14670 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 f (isStr) {...
14680 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
14690 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 O_s_mem());...
146a0 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
146b0 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 PrivateKey(out,p
146c0 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c key,NULL,NULL,0,
146d0 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 NULL,NULL);...
146e0 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 i=BIO_read(out
146f0 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 ,buffer,sizeof(b
14700 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 uffer)-1);...
14710 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 i=(i<0) ? 0 : i
14720 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 ;... buffer[i
14730 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 ]='\0';... Tc
14740 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
14750 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 keyout,buffer,0)
14760 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 ;... BIO_flus
14770 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 h(out);... BI
14780 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d O_free(out);...}
14790 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 else {... ou
147a0 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
147b0 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 file());... B
147c0 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d IO_write_filenam
147d0 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 e(out,keyout);..
147e0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
147f0 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 io_PrivateKey(ou
14800 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c t,pkey,NULL,NULL
14810 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 ,0,NULL,NULL);..
14820 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 . /* PEM_writ
14830 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 e_bio_RSAPrivate
14840 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 Key(out, rsa, NU
14850 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c LL, NULL, 0, NUL
14860 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 L, NULL); */...
14870 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 BIO_free_all(
14880 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 out);.. .}....if
14890 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 ((cert=X509_new
148a0 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 ())==NULL) {...
148b0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
148c0 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 (interp,"Error g
148d0 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 enerating certif
148e0 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e icate request",N
148f0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f ULL);... EVP_
14900 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
14910 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
14920 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
14930 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
14940 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
14950 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 ndif... retur
14960 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
14970 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 ....X509_set_ver
14980 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 sion(cert,2);...
14990 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 ASN1_INTEGER_set
149a0 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c (X509_get_serial
149b0 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 Number(cert),ser
149c0 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ial);...X509_gmt
149d0 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
149e0 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 m_notBefore(cert
149f0 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ),0);...X509_gmt
14a00 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
14a10 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 m_notAfter(cert)
14a20 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a ,(long)60*60*24*
14a30 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 days);...X509_se
14a40 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b t_pubkey(cert,pk
14a50 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 ey);....name=X50
14a60 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 9_get_subject_na
14a70 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 me(cert);....X50
14a80 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
14a90 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 _by_txt(name,"C"
14aa0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
14ab0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
14ac0 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c char *) k_C, -1,
14ad0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
14ae0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
14af0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c y_txt(name,"ST",
14b00 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
14b10 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
14b20 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c har *) k_ST, -1,
14b30 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
14b40 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
14b50 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 y_txt(name,"L",
14b60 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
14b70 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
14b80 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d ar *) k_L, -1, -
14b90 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
14ba0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
14bb0 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 txt(name,"O", MB
14bc0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
14bd0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
14be0 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c *) k_O, -1, -1,
14bf0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
14c00 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
14c10 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 t(name,"OU", MBS
14c20 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
14c30 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
14c40 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c *) k_OU, -1, -1,
14c50 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
14c60 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
14c70 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 t(name,"CN", MBS
14c80 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
14c90 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
14ca0 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c *) k_CN, -1, -1,
14cb0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
14cc0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
14cd0 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 t(name,"Email",
14ce0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
14cf0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
14d00 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d ar *) k_Email, -
14d10 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 1, -1, 0);....X5
14d20 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 09_set_subject_n
14d30 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a ame(cert,name);.
14d40 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 ...if (!X509_sig
14d50 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f n(cert,pkey,EVP_
14d60 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 sha256())) {...
14d70 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 X509_free(cer
14d80 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b t);... EVP_PK
14d90 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
14da0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
14db0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
14dc0 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 000000L... BN
14dd0 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
14de0 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 if... Tcl_Set
14df0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
14e00 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 rror signing cer
14e10 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b tificate",NULL);
14e20 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
14e30 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 L_ERROR;...}....
14e40 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
14e50 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
14e60 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
14e70 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
14e80 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b _X509(out,cert);
14e90 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 ... i=BIO_rea
14ea0 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a d(out,buffer,siz
14eb0 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a eof(buffer)-1);.
14ec0 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 .. i=(i<0) ?
14ed0 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 0 : i;... buf
14ee0 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 fer[i]='\0';...
14ef0 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e Tcl_SetVar(in
14f00 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 terp,pemout,buff
14f10 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f er,0);... BIO
14f20 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 _flush(out);...
14f30 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 BIO_free(out)
14f40 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
14f50 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
14f60 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 IO_s_file());...
14f70 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 BIO_write_fi
14f80 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 lename(out,pemou
14f90 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 t);... PEM_wr
14fa0 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 ite_bio_X509(out
14fb0 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 ,cert);... BI
14fc0 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
14fd0 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 ...}....X509_fre
14fe0 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 e(cert);...EVP_P
14ff0 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
15000 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
15010 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
15020 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 0000000L...BN_fr
15030 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
15040 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b . }..}..break
15050 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 ;. default:..
15060 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
15070 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
15080 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a }.../***********
15090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e *********/./* In
150a0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2a it *
150b0 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /./*************
150c0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15110 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 --. *. * Tls_Fre
15120 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 e --. *. *.This
15130 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 procedure cleans
15140 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 up when a SSL s
15150 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e ocket based chan
15160 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 nel. *.is closed
15170 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e and its referen
15180 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 ce count falls b
15190 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 elow 1. *. * Res
151a0 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
151b0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
151c0 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
151d0 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
151e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15220 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 -. */.void.Tls_F
15230 72 65 65 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 ree(tls_free_typ
15240 65 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 e *blockPtr) {.
15250 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
15260 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c tr = (State *)bl
15270 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 ockPtr;.. dpr
15280 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
15290 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 . Tls_Clean(s
152a0 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b tatePtr);. ck
152b0 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a free(blockPtr);.
152c0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
152d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
15310 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a * Tls_Clean --.
15320 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
15330 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 dure cleans up w
15340 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
15350 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
15360 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 *.is closed and
15370 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f its reference co
15380 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 unt falls below
15390 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 1. This should.
153a0 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e *.be called syn
153b0 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 chronously by th
153c0 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 e CloseProc, not
153d0 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 in the. *.Event
153e0 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 uallyFree callba
153f0 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ck.. *. * Result
15400 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.none. *. *
15410 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
15420 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 *.Frees all the
15430 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d state. *. *-----
15440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
15480 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 */.void Tls_Clea
15490 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 n(State *statePt
154a0 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 r) {. dprintf
154b0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
154c0 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 /*. * we're
154d0 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 assuming here t
154e0 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 hat we're single
154f0 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a -threaded. *
15500 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
15510 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 tr->timer != (Tc
15520 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
15530 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 LL) {..Tcl_Delet
15540 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 eTimerHandler(st
15550 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a atePtr->timer);.
15560 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 .statePtr->timer
15570 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a = NULL;. }..
15580 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
15590 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 ->protos) {..ckf
155a0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 ree(statePtr->pr
155b0 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 otos);..statePtr
155c0 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b ->protos = NULL;
155d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
155e0 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a tatePtr->bio) {.
155f0 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 ./* This will ca
15600 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e ll SSL_shutdown.
15610 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a Bug 1414045 */.
15620 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 .dprintf("BIO_fr
15630 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 ee_all(%p)", sta
15640 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 tePtr->bio);..BI
15650 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 O_free_all(state
15660 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 Ptr->bio);..stat
15670 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c ePtr->bio = NULL
15680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
15690 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b statePtr->ssl) {
156a0 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 ..dprintf("SSL_f
156b0 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 ree(%p)", stateP
156c0 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 tr->ssl);..SSL_f
156d0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ree(statePtr->ss
156e0 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 l);..statePtr->s
156f0 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d sl = NULL;. }
15700 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
15710 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 r->ctx) {..SSL_C
15720 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 TX_free(statePtr
15730 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 ->ctx);..statePt
15740 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 r->ctx = NULL;.
15750 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
15760 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
15770 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {..Tcl_DecrRefC
15780 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 ount(statePtr->c
15790 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 allback);..state
157a0 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 Ptr->callback =
157b0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
157c0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 if (statePtr->pa
157d0 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 ssword) {..Tcl_D
157e0 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 ecrRefCount(stat
157f0 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b ePtr->password);
15800 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 ..statePtr->pass
15810 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 word = NULL;.
15820 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
15830 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 Ptr->vcmd) {..Tc
15840 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
15850 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a tatePtr->vcmd);.
15860 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 .statePtr->vcmd
15870 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 = NULL;. }..
15880 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
15890 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a rning");.}.../*.
158a0 20 2a 2d 2d 2d 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 0a 20 2a 20 42 --------. *. * B
158f0 75 69 6c 64 20 49 6e 66 6f 20 43 6f 6d 6d 61 6e uild Info Comman
15900 64 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 d --. *. *.Creat
15910 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 65 74 e command to ret
15920 75 72 6e 20 62 75 69 6c 64 20 69 6e 66 6f 20 66 urn build info f
15930 6f 72 20 70 61 63 6b 61 67 65 2e 0a 20 2a 0a 20 or package.. *.
15940 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
15950 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
15960 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ult. *. * Side e
15970 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 ffects:. *.Creat
15980 65 64 20 62 75 69 6c 64 2d 69 6e 66 6f 20 63 6f ed build-info co
15990 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d mmand.. *. *----
159a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159e0 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 --. */..#ifndef
159f0 53 54 52 49 4e 47 49 46 59 0a 23 20 20 64 65 66 STRINGIFY.# def
15a00 69 6e 65 20 53 54 52 49 4e 47 49 46 59 28 78 29 ine STRINGIFY(x)
15a10 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 0a 23 STRINGIFY1(x).#
15a20 20 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49 define STRINGI
15a30 46 59 31 28 78 29 20 23 78 0a 23 65 6e 64 69 66 FY1(x) #x.#endif
15a40 0a 0a 69 6e 74 0a 42 75 69 6c 64 49 6e 66 6f 43 ..int.BuildInfoC
15a50 6f 6d 6d 61 6e 64 28 54 63 6c 5f 49 6e 74 65 72 ommand(Tcl_Inter
15a60 70 2a 20 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 p* interp) {.
15a70 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 69 6e 66 Tcl_CmdInfo inf
15a80 6f 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f o;.. if (Tcl_
15a90 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 GetCommandInfo(i
15aa0 6e 74 65 72 70 2c 20 22 3a 3a 74 63 6c 3a 3a 62 nterp, "::tcl::b
15ab0 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 26 69 6e 66 uild-info", &inf
15ac0 6f 29 29 20 7b 0a 09 54 63 6c 5f 43 72 65 61 74 o)) {..Tcl_Creat
15ad0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
15ae0 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 62 75 69 6c rp, "::tls::buil
15af0 64 2d 69 6e 66 6f 22 2c 20 69 6e 66 6f 2e 6f 62 d-info", info.ob
15b00 6a 50 72 6f 63 2c 20 28 76 6f 69 64 20 2a 29 28 jProc, (void *)(
15b10 0a 09 09 50 41 43 4b 41 47 45 5f 56 45 52 53 49 ...PACKAGE_VERSI
15b20 4f 4e 20 22 2b 22 20 53 54 52 49 4e 47 49 46 59 ON "+" STRINGIFY
15b30 28 54 4c 53 5f 56 45 52 53 49 4f 4e 5f 55 55 49 (TLS_VERSION_UUI
15b40 44 29 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f D).#if defined(_
15b50 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 64 65 66 _clang__) && def
15b60 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a ined(__clang_maj
15b70 6f 72 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63 or__).... ".c
15b80 6c 61 6e 67 2d 22 20 53 54 52 49 4e 47 49 46 59 lang-" STRINGIFY
15b90 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f (__clang_major__
15ba0 29 0a 23 69 66 20 5f 5f 63 6c 61 6e 67 5f 6d 69 ).#if __clang_mi
15bb0 6e 6f 72 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 nor__ < 10....
15bc0 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 "0".#endif....
15bd0 20 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f 5f STRINGIFY(__
15be0 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 29 0a 23 clang_minor__).#
15bf0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
15c00 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 20 26 d(__cplusplus) &
15c10 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 42 4a & !defined(__OBJ
15c20 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63 70 C__).... ".cp
15c30 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a lusplus".#endif.
15c40 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 09 #ifndef NDEBUG..
15c50 09 09 20 20 20 20 22 2e 64 65 62 75 67 22 0a 23 .. ".debug".#
15c60 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
15c70 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 ed(__clang__) &&
15c80 20 21 64 65 66 69 6e 65 64 28 5f 5f 49 4e 54 45 !defined(__INTE
15c90 4c 5f 43 4f 4d 50 49 4c 45 52 29 20 26 26 20 64 L_COMPILER) && d
15ca0 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 efined(__GNUC__)
15cb0 0a 09 09 09 20 20 20 20 22 2e 67 63 63 2d 22 20 .... ".gcc-"
15cc0 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 STRINGIFY(__GNUC
15cd0 5f 5f 29 0a 23 69 66 20 5f 5f 47 4e 55 43 5f 4d __).#if __GNUC_M
15ce0 49 4e 4f 52 5f 5f 20 3c 20 31 30 0a 09 09 09 20 INOR__ < 10....
15cf0 20 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09 "0".#endif...
15d00 09 20 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f . STRINGIFY(_
15d10 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 29 0a 23 _GNUC_MINOR__).#
15d20 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 49 endif.#ifdef __I
15d30 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 0a 09 09 NTEL_COMPILER...
15d40 09 20 20 20 20 22 2e 69 63 63 2d 22 20 53 54 52 . ".icc-" STR
15d50 49 4e 47 49 46 59 28 5f 5f 49 4e 54 45 4c 5f 43 INGIFY(__INTEL_C
15d60 4f 4d 50 49 4c 45 52 29 0a 23 65 6e 64 69 66 0a OMPILER).#endif.
15d70 23 69 66 64 65 66 20 54 43 4c 5f 4d 45 4d 5f 44 #ifdef TCL_MEM_D
15d80 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e 6d 65 EBUG.... ".me
15d90 6d 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 mdebug".#endif.#
15da0 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f if defined(_MSC_
15db0 56 45 52 29 0a 09 09 09 20 20 20 20 22 2e 6d 73 VER).... ".ms
15dc0 76 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f vc-" STRINGIFY(_
15dd0 4d 53 43 5f 56 45 52 29 0a 23 65 6e 64 69 66 0a MSC_VER).#endif.
15de0 23 69 66 64 65 66 20 55 53 45 5f 4e 4d 41 4b 45 #ifdef USE_NMAKE
15df0 0a 09 09 09 20 20 20 20 22 2e 6e 6d 61 6b 65 22 .... ".nmake"
15e00 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 .#endif.#ifndef
15e10 54 43 4c 5f 43 46 47 5f 4f 50 54 49 4d 49 5a 45 TCL_CFG_OPTIMIZE
15e20 44 0a 09 09 09 20 20 20 20 22 2e 6e 6f 2d 6f 70 D.... ".no-op
15e30 74 69 6d 69 7a 65 22 0a 23 65 6e 64 69 66 0a 23 timize".#endif.#
15e40 69 66 64 65 66 20 5f 5f 4f 42 4a 43 5f 5f 0a 09 ifdef __OBJC__..
15e50 09 09 20 20 20 20 22 2e 6f 62 6a 65 63 74 69 76 .. ".objectiv
15e60 65 2d 63 22 0a 23 69 66 20 64 65 66 69 6e 65 64 e-c".#if defined
15e70 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 09 09 (__cplusplus)...
15e80 09 20 20 20 20 22 70 6c 75 73 70 6c 75 73 22 0a . "plusplus".
15e90 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 #endif.#endif.#i
15ea0 66 64 65 66 20 54 43 4c 5f 43 46 47 5f 50 52 4f fdef TCL_CFG_PRO
15eb0 46 49 4c 45 44 0a 09 09 09 20 20 20 20 22 2e 70 FILED.... ".p
15ec0 72 6f 66 69 6c 65 22 0a 23 65 6e 64 69 66 0a 23 rofile".#endif.#
15ed0 69 66 64 65 66 20 50 55 52 49 46 59 0a 09 09 09 ifdef PURIFY....
15ee0 20 20 20 20 22 2e 70 75 72 69 66 79 22 0a 23 65 ".purify".#e
15ef0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 54 41 54 ndif.#ifdef STAT
15f00 49 43 5f 42 55 49 4c 44 0a 09 09 09 20 20 20 20 IC_BUILD....
15f10 22 2e 73 74 61 74 69 63 22 0a 23 65 6e 64 69 66 ".static".#endif
15f20 0a 09 09 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 ...), NULL);.
15f30 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }. return TC
15f40 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
15f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f90 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 --. *. * Tls_Ini
15fa0 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 t --. *. *.This
15fb0 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 is a package ini
15fc0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 tialization proc
15fd0 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 edure, which is
15fe0 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c called. *.by Tcl
15ff0 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 when this packa
16000 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 ge is to be adde
16010 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 d to an interpre
16020 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ter.. *. * Resul
16030 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 ts: Ssl configu
16040 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 red and loaded.
16050 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
16060 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 s:. *. create th
16070 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 e ssl command, i
16080 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f nitialize ssl co
16090 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ntext. *. *-----
160a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
160b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
160c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
160d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
160e0 2a 2f 0a 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f */..#if TCL_MAJO
160f0 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 64 R_VERSION > 8.#d
16100 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f efine MIN_VERSIO
16110 4e 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23 64 N "9.0".#else.#d
16120 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f efine MIN_VERSIO
16130 4e 20 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a 0a N "8.5".#endif..
16140 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
16150 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 r tlsTclInitScri
16160 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 pt[] = {.#includ
16170 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 e "tls.tcl.h"..0
16180 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 44 4c 4c 45 x00. };..DLLE
16190 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e XPORT int Tls_In
161a0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 it(Tcl_Interp *i
161b0 6e 74 65 72 70 29 20 7b 0a 0a 20 20 20 20 64 70 nterp) {.. dp
161c0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
161d0 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c ..#ifdef USE_TCL
161e0 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 28 54 _STUBS. if (T
161f0 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 cl_InitStubs(int
16200 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e erp, MIN_VERSION
16210 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a , 0) == NULL) {.
16220 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
16230 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a R;. }.#endif.
16240 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 if (Tcl_PkgR
16250 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 equire(interp, "
16260 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f Tcl", MIN_VERSIO
16270 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b N, 0) == NULL) {
16280 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
16290 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
162a0 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 f (TlsLibInit(0)
162b0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 != TCL_OK) {..T
162c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
162d0 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e interp, "could n
162e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 ot initialize SS
162f0 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68 61 L library", (cha
16300 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
16310 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
16320 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 }.. Tcl_Cr
16330 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
16340 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63 nterp, "::tls::c
16350 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 iphers", Ciphers
16360 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
16370 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f ata) NULL, (Tcl_
16380 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
16390 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
163a0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
163b0 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a (interp, "::tls:
163c0 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f :connection", Co
163d0 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
163e0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
163f0 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
16400 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
16410 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
16420 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
16430 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61 6e erp, "::tls::han
16440 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 dshake", Handsha
16450 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e keObjCmd, (Clien
16460 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 tData) NULL, (Tc
16470 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
16480 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
16490 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
164a0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c nd(interp, "::tl
164b0 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f s::import", Impo
164c0 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e rtObjCmd, (Clien
164d0 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 tData) NULL, (Tc
164e0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
164f0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
16500 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
16510 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c nd(interp, "::tl
16520 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e s::unimport", Un
16530 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 importObjCmd, (C
16540 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c lientData) NULL,
16550 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
16560 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
16570 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
16580 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
16590 3a 3a 74 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c ::tls::unstack",
165a0 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c UnimportObjCmd,
165b0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
165c0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
165d0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
165e0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
165f0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
16600 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 75 73 , "::tls::status
16610 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c ", StatusObjCmd,
16620 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
16630 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
16640 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
16650 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
16660 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
16670 2c 20 22 3a 3a 74 6c 73 3a 3a 76 65 72 73 69 6f , "::tls::versio
16680 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d n", VersionObjCm
16690 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
166a0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
166b0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
166c0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
166d0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
166e0 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 6d 69 73 63 rp, "::tls::misc
166f0 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 ", MiscObjCmd, (
16700 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
16710 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
16720 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
16730 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
16740 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
16750 22 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c "::tls::protocol
16760 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a s", ProtocolsObj
16770 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
16780 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
16790 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
167a0 4c 4c 29 3b 0a 0a 20 20 20 20 42 75 69 6c 64 49 LL);.. BuildI
167b0 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 nfoCommand(inter
167c0 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 p);.. if (int
167d0 65 72 70 20 26 26 20 54 63 6c 5f 45 76 61 6c 28 erp && Tcl_Eval(
167e0 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e interp, tlsTclIn
167f0 69 74 53 63 72 69 70 74 29 20 21 3d 20 54 43 4c itScript) != TCL
16800 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
16810 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
16820 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f . return Tcl_
16830 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 PkgProvide(inter
16840 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c p, PACKAGE_NAME,
16850 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e PACKAGE_VERSION
16860 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
16870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
168a0 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 -*. *. *.Tls_Saf
168b0 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d eInit --. *. *.-
168c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
168d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
168e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
168f0 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f . *.Standard pro
16900 63 65 64 75 72 65 20 72 65 71 75 69 72 65 64 20 cedure required
16910 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e by 'load'.. *.In
16920 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 itializes this e
16930 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 xtension for a s
16940 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e afe interpreter.
16950 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
16960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16980 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 ----*. *. *.Side
16990 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 effects:. *..As
169a0 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 of 'Tls_Init'.
169b0 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 *. *.Result:. *.
169c0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
169d0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 error code.. *.
169e0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
169f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a10 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c -------*. */.DLL
16a20 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 EXPORT int Tls_S
16a30 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 afeInit(Tcl_Inte
16a40 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 rp *interp) {.
16a50 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
16a60 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 d");. return
16a70 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 Tls_Init(interp)
16a80 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
16a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ac0 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e *. *. *.TlsLibIn
16ad0 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d it --. *. *.----
16ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
16b10 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c .Initializes SSL
16b20 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 library once pe
16b30 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a r application. *
16b40 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
16b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b70 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 -*. *. *.Side ef
16b80 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 fects:. *..initi
16b90 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 alizes SSL libra
16ba0 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a ry. *. *.Result:
16bb0 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d . *..none. *. *-
16bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16bf0 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 -----*. */.stati
16c00 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 c int TlsLibInit
16c10 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a (int uninitializ
16c20 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 e) {. static
16c30 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 int initialized
16c40 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 = 0;. int sta
16c50 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 tus = TCL_OK;.#i
16c60 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
16c70 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
16c80 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
16c90 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 S). size_t nu
16ca0 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a m_locks;.#endif.
16cb0 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 . if (uniniti
16cc0 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 alize) {..if (!i
16cd0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 nitialized) {..
16ce0 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 dprintf("Aske
16cf0 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a d to uninitializ
16d00 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f e, but we are no
16d10 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b t initialized");
16d20 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
16d30 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e L_OK;..}...dprin
16d40 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 tf("Asked to uni
16d50 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 nitialize");..#i
16d60 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
16d70 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
16d80 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
16d90 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 S)..Tcl_MutexLoc
16da0 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 k(&init_mx);...i
16db0 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 f (locks) {..
16dc0 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 free(locks);..
16dd0 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b locks = NULL;
16de0 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 .. locksCount
16df0 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a = 0;..}.#endif.
16e00 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 .initialized = 0
16e10 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
16e20 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
16e30 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
16e40 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 HREADS)..Tcl_Mut
16e50 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d exUnlock(&init_m
16e60 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 x);.#endif...ret
16e70 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 urn TCL_OK;.
16e80 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 }.. if (initi
16e90 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e alized) {..dprin
16ea0 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 tf("Called, but
16eb0 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c using cached val
16ec0 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 20 73 74 ue");..return st
16ed0 61 74 75 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 atus;. }..
16ee0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
16ef0 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 ");..#if defined
16f00 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
16f10 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
16f20 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 _THREADS). Tc
16f30 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 l_MutexLock(&ini
16f40 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 t_mx);.#endif.
16f50 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 initialized =
16f60 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 1;..#if defined(
16f70 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
16f80 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
16f90 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d THREADS). num
16fa0 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 _locks = 1;.
16fb0 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e locksCount = (in
16fc0 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 t) num_locks;.
16fd0 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 locks = malloc
16fe0 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 (sizeof(*locks)
16ff0 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 * num_locks);.
17000 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 memset(locks,
17010 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 0, sizeof(*locks
17020 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a ) * num_locks);.
17030 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 #endif.. /* I
17040 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c nitialize BOTH l
17050 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 ibcrypto and lib
17060 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e ssl. */. OPEN
17070 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 SSL_init_ssl(OPE
17080 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 NSSL_INIT_LOAD_S
17090 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 SL_STRINGS | OPE
170a0 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 NSSL_INIT_LOAD_C
170b0 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c RYPTO_STRINGS..|
170c0 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 OPENSSL_INIT_AD
170d0 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 D_ALL_CIPHERS |
170e0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 OPENSSL_INIT_ADD
170f0 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 _ALL_DIGESTS, NU
17100 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 LL);.. BIO_ne
17110 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a w_tcl(NULL, 0);.
17120 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
17130 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
17140 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
17150 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 EADS)..Tcl_Mutex
17160 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 Unlock(&init_mx)
17170 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 ;.#endif.. re
17180 74 75 72 6e 20 73 74 61 74 75 73 3b 0a 7d 0a turn status;.}.