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 68 61 72 20 2a 6d 73 67 29 ePtr, char *msg)
3140: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 {. Tcl_Inter
3150: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
3160: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
3170: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
3180: 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 r, *listPtr;.
3190: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 unsigned long e
31a0: 72 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 rr;. statePtr
31b0: 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 ->err = msg;..
31c0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
31d0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
31e0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
31f0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
3200: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 LL)..return;..
3210: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
3220: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 and to eval with
3230: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d fn, chan, and m
3240: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 essage args */.
3250: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
3260: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
3270: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
3280: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3290: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
32a0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
32b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
32c0: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 "error", -1));.
32d0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
32e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
32f0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
3300: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3310: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
3320: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
3330: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
3340: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 if (msg != NULL)
3350: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
3360: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3370: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3380: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 _NewStringObj(ms
3390: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 g, -1));.. }
33a0: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 else if ((msg =
33b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63 Tcl_GetString(Tc
33c0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
33d0: 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c nterp))) != NULL
33e0: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
33f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3400: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
3410: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
3420: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d sg, -1));.. }
3430: 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 else {..listPtr
3440: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
3450: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 j(0, NULL);..whi
3460: 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 le ((err = ERR_g
3470: 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 et_error()) != 0
3480: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
3490: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
34a0: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 t(interp, listPt
34b0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
34c0: 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 Obj(ERR_reason_e
34d0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 rror_string(err)
34e0: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f , -1));..}..Tcl_
34f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3500: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3510: 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 Ptr, listPtr);.
3520: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 }.. /* Eva
3530: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
3540: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
3550: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
3560: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
3570: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
3580: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
3590: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
35a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
35b0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
3600: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 KeyLogCallback
3610: 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 --. *. *.Write r
3620: 65 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 eceived key data
3630: 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a to log file.. *
3640: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
3650: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d :. *.none. *. *-
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36a0: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c --. */.void KeyL
36b0: 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 ogCallback(const
36c0: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 SSL *ssl, const
36d0: 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 char *line) {.
36e0: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67 char *str = g
36f0: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 etenv(SSLKEYLOGF
3700: 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a ILE);. FILE *
3710: 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 fd;.. dprintf
3720: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
3730: 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 if (str) {..fd
3740: 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 = fopen(str, "a"
3750: 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 );..fprintf(fd,
3760: 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 "%s\n",line);..f
3770: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d close(fd);. }
3780: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
37d0: 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c . * Password Cal
37e0: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 lback --. *. *.C
37f0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 alled when a pas
3800: 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 sword is needed
3810: 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 for a private ke
3820: 79 20 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a 20 y when loading.
3830: 2a 09 6f 72 20 73 74 6f 72 69 6e 67 20 61 20 50 *.or storing a P
3840: 45 4d 20 63 65 72 74 69 66 69 63 61 74 65 20 77 EM certificate w
3850: 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20 ith encryption.
3860: 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 0a 20 Evals callback.
3870: 2a 09 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 *.script and ret
3880: 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 urns the result
3890: 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 20 as the password
38a0: 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20 string in buf..
38b0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
38c0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
38d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
38e0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
38f0: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
3900: 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77 eturns:. *.Passw
3910: 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 ord size in byte
3920: 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 s or -1 for an e
3930: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d rror.. *. *-----
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3980: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61 */.static int.Pa
3990: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 sswordCallback(c
39a0: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 har *buf, int si
39b0: 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c 20 ze, int rwflag,
39c0: 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 void *udata) {.
39d0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
39e0: 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75 tr.= (State *) u
39f0: 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e data;. Tcl_In
3a00: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
3a10: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
3a20: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
3a30: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f dPtr;. int co
3a40: 64 65 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 de;. Tcl_Size
3a50: 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e len;.. dprin
3a60: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
3a70: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c /* If no call
3a80: 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c back, use defaul
3a90: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 t callback */.
3aa0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
3ab0: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c password == NULL
3ac0: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 ) {..if (Tcl_Eva
3ad0: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 lEx(interp, "tls
3ae0: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c ::password", -1,
3af0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
3b00: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) == TCL_OK) {..
3b10: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 char *ret =
3b20: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
3b30: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
3b40: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3b50: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 nterp), &len);..
3b60: 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 28 54 if (len > (T
3b70: 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 cl_Size) size-1)
3b80: 20 7b 0a 09 09 6c 65 6e 20 3d 20 28 54 63 6c 5f {...len = (Tcl_
3b90: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 20 Size) size-1;..
3ba0: 20 20 20 7d 0a 09 20 20 20 20 73 74 72 6e 63 70 }.. strncp
3bb0: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a y(buf, ret, (siz
3bc0: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 e_t) len);..
3bd0: 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b buf[len] = '\0';
3be0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e .. return (in
3bf0: 74 29 20 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20 t) len;..} else
3c00: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 {.. return -1
3c10: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
3c20: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
3c30: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 d to eval with f
3c40: 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73 n, rwflag, and s
3c50: 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 ize args */.
3c60: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
3c70: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
3c80: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 tr->password);.
3c90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3ca0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3cb0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3cc0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 NewStringObj("pa
3cd0: 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 ssword", -1));.
3ce0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3cf0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3d00: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3d10: 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 NewIntObj(rwflag
3d20: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
3d30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3d40: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3d50: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 Tcl_NewIntObj(s
3d60: 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ize));.. Tcl_
3d70: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
3d80: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
3d90: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
3da0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
3db0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
3dc0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
3dd0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
3de0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
3df0: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 dPtr);. code
3e00: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
3e10: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3e20: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
3e30: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 ;. if (code !
3e40: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 = TCL_OK) {.#if
3e50: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 (TCL_MAJOR_VERSI
3e60: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c ON == 8) && (TCL
3e70: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c _MINOR_VERSION <
3e80: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 6)..Tcl_Backgro
3e90: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 undError(interp)
3ea0: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 ;.#else..Tcl_Bac
3eb0: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
3ec0: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a (interp, code);.
3ed0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 #endif. }.
3ee0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
3ef0: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
3f00: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
3f10: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
3f20: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 r);.. /* If s
3f30: 75 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 uccessful, pass
3f40: 62 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 back password st
3f50: 72 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 ring and truncat
3f60: 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f e if too long */
3f70: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d . if (code ==
3f80: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 TCL_OK) {..char
3f90: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 *ret = (char *)
3fa0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
3fb0: 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a omObj(Tcl_GetObj
3fc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 Result(interp),
3fd0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 &len);..if (len
3fe0: 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a > (Tcl_Size) siz
3ff0: 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 e-1) {.. len
4000: 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a = (Tcl_Size) siz
4010: 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 e-1;..}..strncpy
4020: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 (buf, ret, (size
4030: 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c _t) len);..buf[l
4040: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c en] = '\0';..Tcl
4050: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
4060: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 Data) interp);..
4070: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e return (int) len
4080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
4090: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
40a0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
40b0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c return -1;.}..
40c0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40f0: 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 0a 20 2a 0a 20 2a 20 ---------. *. *
4110: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b Session Callback
4120: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a for Clients --.
4130: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 *. *.Called whe
4140: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 n a new session
4150: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 is added to the
4160: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e cache. In TLS 1.
4170: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 3. *.this may be
4180: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 received multip
4190: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 le times after t
41a0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f he handshake. Fo
41b0: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 r. *.earlier ver
41c0: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c sions, this will
41d0: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 be received dur
41e0: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b ing the handshak
41f0: 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 e.. *.This is th
4200: 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 e preferred way
4210: 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 to obtain a resu
4220: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 mable session..
4230: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
4240: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
4250: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
4260: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
4270: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
4280: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
4290: 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 0 = error where
42a0: 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 session will be
42b0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f immediately remo
42c0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 ved from the int
42d0: 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 ernal cache.. *.
42e0: 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 1 = success wher
42f0: 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 e app retains se
4300: 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e ssion in session
4310: 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 cache, and must
4320: 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f call SSL_SESSIO
4330: 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f N_free() when do
4340: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
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 0a 20 2a 2f ------------. */
4390: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 .static int.Sess
43a0: 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 ionCallback(SSL
43b0: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f *ssl, SSL_SESSIO
43c0: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 N *session) {.
43d0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
43e0: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f r = (State*)SSL_
43f0: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 get_app_data((SS
4400: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 L *)ssl);. Tc
4410: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
4420: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
4430: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
4440: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f *cmdPtr;. co
4450: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4460: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 r *ticket;. c
4470: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
4480: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a ar *session_id;.
4490: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b size_t len2;
44a0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e . unsigned in
44b0: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 t ulen;.. dpr
44c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
44d0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
44e0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 r->callback == (
44f0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
4500: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
4510: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
4520: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d } else if (ssl =
4530: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
4540: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
4550: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
4560: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
4570: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 mand to eval wit
4580: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 73 h fn, chan, sess
4590: 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e 20 ion id, session
45a0: 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 65 ticket, and life
45b0: 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 time args */.
45c0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
45d0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
45e0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
45f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4600: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4610: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
4620: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 _NewStringObj("s
4630: 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 ession", -1));.
4640: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4650: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4660: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
4670: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
4680: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
4690: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
46a0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 elf), -1));..
46b0: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a /* Session id *
46c0: 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 /. session_id
46d0: 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
46e0: 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 et_id(session, &
46f0: 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c ulen);. Tcl_L
4700: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4710: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4720: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 tr, Tcl_NewByteA
4730: 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f rrayObj(session_
4740: 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 id, (Tcl_Size) u
4750: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 len));.. /* S
4760: 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f ession ticket */
4770: 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e . SSL_SESSION
4780: 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 _get0_ticket(ses
4790: 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 sion, &ticket, &
47a0: 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c len2);. Tcl_L
47b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
47c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
47d0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 tr, Tcl_NewByteA
47e0: 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 rrayObj(ticket,
47f0: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
4800: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 );.. /* Lifet
4810: 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 ime - number of
4820: 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 seconds */. T
4830: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
4840: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
4850: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 cmdPtr,..Tcl_New
4860: 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 LongObj((long) S
4870: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 SL_SESSION_get_t
4880: 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 icket_lifetime_h
4890: 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a int(session)));.
48a0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
48b0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
48c0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
48d0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
48e0: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 EvalCallback(
48f0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
4900: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
4910: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
4920: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a cmdPtr);.. /*
4930: 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e 6f Return 0 for no
4940: 77 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e 20 w until session
4950: 68 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d 70 handling is comp
4960: 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 lete */. retu
4970: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d rn 0;.}.../*. *-
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 --. *. * ALPN Ca
49d0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 llback for Serve
49e0: 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 rs and NPN Callb
49f0: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 ack for Clients
4a00: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d --. *. *.Perform
4a10: 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f protocol (http/
4a20: 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 1.1, h2, h3, etc
4a30: 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 .) selection for
4a40: 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 the. *.incoming
4a50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c connection. Cal
4a60: 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 led after Hello
4a70: 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62 and server callb
4a80: 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 acks.. *.Where '
4a90: 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 64 out' is selected
4aa0: 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 protocol and 'i
4ab0: 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20 61 n' is the peer a
4ac0: 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a dvertised list..
4ad0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
4ae0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
4af0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
4b00: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
4b10: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
4b20: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
4b30: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
4b40: 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f OK: ALPN protoco
4b50: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 l selected. The
4b60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
4b70: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
4b80: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 EXT_ERR_ALERT_FA
4b90: 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e TAL: There was n
4ba0: 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 o overlap betwee
4bb0: 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 n the client's.
4bc0: 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c *. supplied l
4bd0: 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 76 ist and the serv
4be0: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e er configuration
4bf0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
4c00: 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 will be aborted
4c10: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
4c20: 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 ERR_NOACK: ALPN
4c30: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c protocol not sel
4c40: 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 ected, e.g., bec
4c50: 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 ause no ALPN. *.
4c60: 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 protocols ar
4c70: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 e configured for
4c80: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e this connection
4c90: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
4ca0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 continues.. *.
4cb0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cf0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
4d00: 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b int.ALPNCallback
4d10: 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 (SSL *ssl, const
4d20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
4d30: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 *out, unsigned c
4d40: 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f har *outlen,..co
4d50: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
4d60: 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 r *in, unsigned
4d70: 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 int inlen, void
4d80: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 *arg) {. Stat
4d90: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
4da0: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 tate*)arg;. T
4db0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4dc0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
4dd0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
4de0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
4df0: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 nt code, res;..
4e00: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
4e10: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
4e20: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 sl == NULL || ar
4e30: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 g == NULL) {..re
4e40: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
4e50: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
4e60: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 .. /* Select
4e70: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 protocol */.
4e80: 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e if (SSL_select_n
4e90: 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67 ext_proto((unsig
4ea0: 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 74 ned char **) out
4eb0: 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 , outlen, stateP
4ec0: 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 tr->protos, stat
4ed0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
4ee0: 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d ,..in, inlen) ==
4ef0: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 OPENSSL_NPN_NEG
4f00: 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d OTIATED) {../* M
4f10: 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 atch found */..r
4f20: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
4f30: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c ERR_OK;. } el
4f40: 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c se {../* OPENSSL
4f50: 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 _NPN_NO_OVERLAP
4f60: 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f = No overlap, so
4f70: 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 use first item
4f80: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 from client prot
4f90: 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 ocol list */..re
4fa0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
4fb0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
4fc0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
4fd0: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f r->vcmd == (Tcl_
4fe0: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 Obj*)NULL) {..re
4ff0: 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a turn res;. }.
5000: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
5010: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
5020: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 ith fn, chan, de
5030: 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c pth, cert info l
5040: 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 ist, status, and
5050: 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 error args */.
5060: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
5070: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
5080: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 tePtr->vcmd);.
5090: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
50a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
50b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
50c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 ewStringObj("alp
50d0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 n", -1));. Tc
50e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
50f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
5100: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
5110: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
5120: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
5130: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
5140: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
5150: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5160: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5170: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
5180: 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72 gObj((const char
5190: 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a *) *out, -1));.
51a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
51b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
51c0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
51d0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 _NewBooleanObj(r
51e0: 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54 es == SSL_TLSEXT
51f0: 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20 _ERR_OK));..
5200: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
5210: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
5220: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
5230: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 (cmdPtr);. if
5240: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 ((code = EvalCa
5250: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 llback(interp, s
5260: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 tatePtr, cmdPtr)
5270: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 ) > 1) {..res =
5280: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
5290: 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 OACK;. } else
52a0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
52b0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
52c0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
52d0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
52e0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
52f0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 LERT_FATAL;.
5300: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 }. Tcl_DecrRe
5310: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5320: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a return res;.
5330: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5360: 2d 2d 2d 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 0a 20 2a 0a ------------. *.
5380: 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f * Advertise Pro
5390: 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 tocols Callback
53a0: 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f for Next Protoco
53b0: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e l Negotiation (N
53c0: 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c PN) in ServerHel
53d0: 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c lo --. *. *.call
53e0: 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65 ed when a TLS se
53f0: 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73 rver needs a lis
5400: 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70 t of supported p
5410: 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 rotocols for Nex
5420: 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 t. *.Protocol Ne
5430: 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a gotiation.. *. *
5440: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
5450: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
5460: 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 ects:. *. * Retu
5470: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c rn codes:. *.SSL
5480: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 _TLSEXT_ERR_OK:
5490: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c NPN protocol sel
54a0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 ected. The conne
54b0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
54c0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
54d0: 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 RR_NOACK: NPN pr
54e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 otocol not selec
54f0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
5500: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
5510: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 23 69 66 64 -------. */.#ifd
5560: 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 ef USE_NPN.stati
5570: 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 c int.NPNCallbac
5580: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
5590: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 , const unsigned
55a0: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 char **out, uns
55b0: 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 igned int *outle
55c0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a n, void *arg) {.
55d0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
55e0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
55f0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 g;.. dprintf(
5600: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
5610: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 if (ssl == NULL
5620: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 || arg == NULL)
5630: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
5640: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
5650: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
5660: 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 t protocols list
5670: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
5680: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
5690: 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 NULL) {..*out =
56a0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
56b0: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 ;..*outlen = sta
56c0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
56d0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a n;. } else {.
56e0: 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a .*out = NULL;..*
56f0: 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 outlen = 0;..ret
5700: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
5710: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
5720: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 return SSL_T
5730: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a LSEXT_ERR_OK;.}.
5740: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c -. *. * SNI Call
57a0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
57b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 --. *. *.Perfor
57c0: 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e m server-side SN
57d0: 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 I hostname selec
57e0: 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69 tion after recei
57f0: 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69 ving SNI extensi
5800: 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20 on. *.in Client
5810: 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66 Hello. Called af
5820: 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 ter hello callba
5830: 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c ck but before AL
5840: 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a PN callback.. *.
5850: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
5860: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
5870: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 ffects:. *.Calls
5880: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 callback (if de
5890: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 fined). *. * Ret
58a0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
58b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
58c0: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 SNI hostname is
58d0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 accepted. The c
58e0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
58f0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ues.. *.SSL_TLSE
5900: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 XT_ERR_ALERT_FAT
5910: 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 AL: SNI hostname
5920: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
5930: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
5940: 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 . *. is abort
5950: 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 ed. Default for
5960: 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f alert is SSL_AD_
5970: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d UNRECOGNIZED_NAM
5980: 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 E.. *.SSL_TLSEXT
5990: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 _ERR_ALERT_WARNI
59a0: 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 NG: SNI hostname
59b0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 is not accepted
59c0: 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a , warning alert.
59d0: 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 *. sent (not
59e0: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c supported in TL
59f0: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e Sv1.3). The conn
5a00: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
5a10: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
5a20: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 ERR_NOACK: SNI h
5a30: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 ostname is not a
5a40: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 ccepted and not
5a50: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a acknowledged,. *
5a60: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 . e.g. if SNI
5a70: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f has not been co
5a80: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f nfigured. The co
5a90: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
5aa0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
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 0a 20 2a 2f ------------. */
5af0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 .static int.SNIC
5b00: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
5b10: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
5b20: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
5b30: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
5b40: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
5b50: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
5b60: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
5b70: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
5b80: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
5b90: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
5ba0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
5bb0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
5bc0: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 e = NULL;.. d
5bd0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
5be0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d ;.. if (ssl =
5bf0: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d = NULL || arg ==
5c00: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
5c10: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5c20: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
5c30: 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 /* Only works
5c40: 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 for TLS 1.2 and
5c50: 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 earlier */. s
5c60: 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f ervername = SSL_
5c70: 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 get_servername(s
5c80: 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 sl, TLSEXT_NAMET
5c90: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a YPE_host_name);.
5ca0: 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e if (!servern
5cb0: 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d ame || servernam
5cc0: 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a e[0] == '\0') {.
5cd0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
5ce0: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 XT_ERR_NOACK;.
5cf0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
5d00: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 tePtr->vcmd == (
5d10: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
5d20: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
5d30: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
5d40: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
5d50: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
5d60: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 with fn, chan,
5d70: 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 and server name
5d80: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 args */. cmdP
5d90: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
5da0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
5db0: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
5dc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5dd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5de0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
5df0: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 gObj("sni", -1))
5e00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
5e10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5e20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
5e30: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
5e40: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
5e50: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
5e60: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
5e70: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5e80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5e90: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
5ea0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 NewStringObj(ser
5eb0: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a vername , -1));.
5ec0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
5ed0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
5ee0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
5ef0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
5f00: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
5f10: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
5f20: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
5f30: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
5f40: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
5f50: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e ERR_ALERT_WARNIN
5f60: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c G;..*alert = SSL
5f70: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 _AD_UNRECOGNIZED
5f80: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 _NAME; /* Not su
5f90: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 pported by TLS 1
5fa0: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 .3 */. } else
5fb0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
5fc0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
5fd0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
5fe0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
5ff0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
6000: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c LERT_FATAL;..*al
6010: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 ert = SSL_AD_UNR
6020: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 ECOGNIZED_NAME;
6030: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 /* Not supported
6040: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 by TLS 1.3 */.
6050: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
6060: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
6070: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
6080: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d s;.}.../*. *----
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60b0: 2d 2d 2d 2d 2d 2d 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 0a ---------------.
60d0: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c *. * ClientHell
60e0: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c o Handshake Call
60f0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
6100: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 --. *. *.Used b
6110: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d y server to exam
6120: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e ine the server n
6130: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 ame indication (
6140: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 SNI) extension.
6150: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 *.provided by th
6160: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 e client in orde
6170: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 r to select an a
6180: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 ppropriate certi
6190: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 ficate to. *.pre
61a0: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f sent, and make o
61b0: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 ther configurati
61c0: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 on adjustments r
61d0: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 elevant to that
61e0: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 server. *.name a
61f0: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 nd its configura
6200: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 tion. This inclu
6210: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 des swapping out
6220: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a the associated.
6230: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 *.SSL_CTX point
6240: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 er, modifying th
6250: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 e server's list
6260: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 of permitted TLS
6270: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 versions,. *.ch
6280: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 anging the serve
6290: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 r's cipher list
62a0: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 in response to t
62b0: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 he client's ciph
62c0: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a er list, etc.. *
62d0: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 .Called before S
62e0: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c NI and ALPN call
62f0: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 backs.. *. * Res
6300: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
6310: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
6320: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
6330: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
6340: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
6350: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 des:. *.SSL_CLIE
6360: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 NT_HELLO_RETRY:
6370: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 suspend the hand
6380: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 shake, and the h
6390: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f andshake functio
63a0: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d n will return im
63b0: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c mediately. *.SSL
63c0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
63d0: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 ROR: failure, te
63e0: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 rminate connecti
63f0: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f on. Set alert to
6400: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 error code.. *.
6410: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6420: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 _SUCCESS: succes
6430: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d s. *. *---------
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 0a 20 2a 2f 0a 73 ----------. */.s
6480: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 tatic int.HelloC
6490: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c allback(SSL *ssl
64a0: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f , int *alert, vo
64b0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
64c0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
64d0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
64e0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
64f0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
6500: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
6510: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
6520: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
6530: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
6540: 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 *servername;.
6550: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
6560: 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a char *p;. siz
6570: 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 e_t len, remaini
6580: 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 ng;.. dprintf
6590: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
65a0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
65b0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
65c0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e )NULL) {..return
65d0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
65e0: 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d O_SUCCESS;. }
65f0: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d else if (ssl ==
6600: 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 (const SSL *)NU
6610: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f LL || arg == (vo
6620: 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 id *)NULL) {..re
6630: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
6640: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
6650: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e }.. /* Get n
6660: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 ames */. if (
6670: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c !SSL_client_hell
6680: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 o_get0_ext(ssl,
6690: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 TLSEXT_TYPE_serv
66a0: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 er_name, &p, &re
66b0: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 maining) || rema
66c0: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a ining <= 2) {..*
66d0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 alert = SSL_R_SS
66e0: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 LV3_ALERT_ILLEGA
66f0: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 L_PARAMETER;..re
6700: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
6710: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
6720: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 }.. /* Extra
6730: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 ct the length of
6740: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 the supplied li
6750: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a st of names. */.
6760: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b len = (*(p++
6770: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e ) << 8);. len
6780: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 += *(p++);.
6790: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 if (len + 2 != r
67a0: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c emaining) {..*al
67b0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 ert = SSL_R_SSLV
67c0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 3_ALERT_ILLEGAL_
67d0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 PARAMETER;..retu
67e0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
67f0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
6800: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d . remaining =
6810: 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 len;.. /* Th
6820: 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 e list in practi
6830: 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 ce only has a si
6840: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f ngle element, so
6850: 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 we only conside
6860: 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e r the first one.
6870: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 */. if (rema
6880: 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 ining == 0 || *p
6890: 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d ++ != TLSEXT_NAM
68a0: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
68b0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
68c0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
68d0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
68e0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
68f0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
6900: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
6910: 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f ng--;.. /* No
6920: 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 w we can finally
6930: 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 pull out the by
6940: 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 te array with th
6950: 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d e actual hostnam
6960: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 e. */. if (re
6970: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a maining <= 2) {.
6980: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
6990: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 TLSV1_ALERT_INTE
69a0: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 RNAL_ERROR;..ret
69b0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
69c0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
69d0: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 }. len = (*(p
69e0: 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c ++) << 8);. l
69f0: 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 en += *(p++);.
6a00: 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 if (len + 2 >
6a10: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 remaining) {..*a
6a20: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 lert = SSL_R_TLS
6a30: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 V1_ALERT_INTERNA
6a40: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e L_ERROR;..return
6a50: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6a60: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 O_ERROR;. }.
6a70: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c remaining = l
6a80: 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 en;. serverna
6a90: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 me = (const char
6aa0: 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 *)p;.. /* Cr
6ab0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
6ac0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
6ad0: 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e an, and server n
6ae0: 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 ame args */.
6af0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
6b00: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
6b10: 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 tr->vcmd);. T
6b20: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6b30: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
6b40: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
6b50: 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 tringObj("hello"
6b60: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
6b70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
6b80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
6b90: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
6ba0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
6bb0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
6bc0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
6bd0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
6be0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
6bf0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
6c00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
6c10: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 bj(servername, (
6c20: 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b Tcl_Size) len));
6c30: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
6c40: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
6c50: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
6c60: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
6c70: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 if ((code =
6c80: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
6c90: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
6ca0: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 mdPtr)) > 1) {..
6cb0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 res = SSL_CLIENT
6cc0: 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a _HELLO_RETRY;..*
6cd0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
6ce0: 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 SV1_ALERT_USER_C
6cf0: 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 ANCELLED;. }
6d00: 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d else if (code ==
6d10: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 1) {..res = SSL
6d20: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 _CLIENT_HELLO_SU
6d30: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 CCESS;. } els
6d40: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 e {..res = SSL_C
6d50: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6d60: 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c R;..*alert = SSL
6d70: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
6d80: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 NTERNAL_ERROR;.
6d90: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
6da0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
6db0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
6dc0: 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a s;.}.../********
6dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a ************/./*
6de0: 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 Commands
6df0: 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./**********
6e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a **********/../*.
6e10: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e30: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 43 69 70 68 -----. *. * Ciph
6e60: 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 ersObjCmd -- lis
6e70: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 t available ciph
6e80: 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 ers. *. *.This p
6e90: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
6ea0: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
6eb0: 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 he "tls::ciphers
6ec0: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 " command. *.to
6ed0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 list available c
6ee0: 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 iphers, based up
6ef0: 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 on protocol sele
6f00: 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 cted.. *. * Resu
6f10: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
6f20: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 rd Tcl result li
6f30: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 st.. *. * Side e
6f40: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 ffects:. *.const
6f50: 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f ructs and destro
6f60: 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 ys SSL context (
6f70: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 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 0a 20 2a -------------. *
6fc0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 /.static const c
6fd0: 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d har *protocols[]
6fe0: 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73 = {.."ssl2", "s
6ff0: 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74 sl3", "tls1", "t
7000: 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22 ls1.1", "tls1.2"
7010: 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c , "tls1.3", NULL
7020: 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f .};.enum protoco
7030: 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32 l {. TLS_SSL2
7040: 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f , TLS_SSL3, TLS_
7050: 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 TLS1, TLS_TLS1_1
7060: 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c , TLS_TLS1_2, TL
7070: 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f S_TLS1_3, TLS_NO
7080: 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e NE.};..static in
7090: 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 t.CiphersObjCmd(
70a0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
70b0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
70c0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
70d0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
70e0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
70f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
7100: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 r = NULL;. SS
7110: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c L_CTX *ctx = NUL
7120: 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 L;. SSL *ssl
7130: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 = NULL;. STAC
7140: 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 K_OF(SSL_CIPHER)
7150: 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 62 *sk;. char b
7160: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 uf[BUFSIZ];.
7170: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f int index, verbo
7180: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 se = 0, use_supp
7190: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 orted = 0;. c
71a0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
71b0: 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f *method;. (vo
71c0: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a id) clientData;.
71d0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
71e0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
71f0: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 ((objc < 2) || (
7200: 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 objc > 4)) {..Tc
7210: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
7220: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
7230: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f "protocol ?verbo
7240: 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 se? ?supported?"
7250: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
7260: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
7270: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
7280: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
7290: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f objv[1], protoco
72a0: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 ls, "protocol",
72b0: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 0, &index) != TC
72c0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
72d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
72e0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e . if ((objc >
72f0: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 2) && Tcl_GetBo
7300: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 oleanFromObj(int
7310: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 erp, objv[2], &v
7320: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f erbose) != TCL_O
7330: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
7340: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
7350: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 if ((objc > 3)
7360: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 && Tcl_GetBoole
7370: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 anFromObj(interp
7380: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f , objv[3], &use_
7390: 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 supported) != TC
73a0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
73b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
73c0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
73d0: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 error();.. sw
73e0: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 itch ((enum prot
73f0: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 ocol)index) {..c
7400: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 ase TLS_SSL2:.#i
7410: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
7420: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 N_NUMBER >= 0x10
7430: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 100000L || defin
7440: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 ed(NO_SSL2) || d
7450: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7460: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c O_SSL2).. Tcl
7470: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
7480: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
7490: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
74a0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
74b0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
74c0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
74d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
74e0: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 .. method = S
74f0: 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 SLv2_method(); b
7500: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
7510: 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 se TLS_SSL3:.#if
7520: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 defined(NO_SSL3
7530: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
7540: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c NSSL_NO_SSL3) ||
7550: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7560: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 _NO_SSL3_METHOD)
7570: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
7580: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
7590: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
75a0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
75b0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
75c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
75d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
75e0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
75f0: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 ethod = SSLv3_me
7600: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
7610: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
7620: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 TLS1:.#if define
7630: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 d(NO_TLS1) || de
7640: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7650: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
7660: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
7670: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 1_METHOD).. T
7680: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7690: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
76a0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
76b0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
76c0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
76d0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
76e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
76f0: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d se.. method =
7700: 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b TLSv1_method();
7710: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 break;.#endif..
7720: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a case TLS_TLS1_1:
7730: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
7740: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
7750: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7760: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
7770: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
7780: 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 _1_METHOD)..
7790: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
77a0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
77b0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
77c0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
77d0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
77e0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 NULL);.. retu
77f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
7800: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 lse.. method
7810: 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 = TLSv1_1_method
7820: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 (); break;.#endi
7830: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 f..case TLS_TLS1
7840: 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _2:.#if defined(
7850: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 NO_TLS1_2) || de
7860: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7870: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
7880: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7890: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 LS1_2_METHOD)..
78a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
78b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
78c0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
78d0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
78e0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
78f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 *) NULL);.. r
7900: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7910: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 .#else.. meth
7920: 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 od = TLSv1_2_met
7930: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
7940: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 ndif..case TLS_T
7950: 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e LS1_3:.#if defin
7960: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c ed(NO_TLS1_3) ||
7970: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7980: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 _NO_TLS1_3)..
7990: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
79a0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
79b0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
79c0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
79d0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
79e0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
79f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
7a00: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 else.. method
7a10: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b = TLS_method();
7a20: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
7a30: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
7a40: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
7a50: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 VERSION);.. S
7a60: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
7a70: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
7a80: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
7a90: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 );.. break;.#
7aa0: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a endif..default:.
7ab0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c . method = TL
7ac0: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 S_method();..
7ad0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 break;. }..
7ae0: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
7af0: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 _new(method);.
7b00: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c if (ctx == NUL
7b10: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
7b20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 Result(interp, G
7b30: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
7b40: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
7b50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7b60: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 OR;. }.. s
7b70: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 sl = SSL_new(ctx
7b80: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d );. if (ssl =
7b90: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
7ba0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7bb0: 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 rp, GET_ERR_REAS
7bc0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
7bd0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
7be0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
7bf0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
7c00: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c }.. /* Use l
7c10: 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 ist and order as
7c20: 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 would be sent i
7c30: 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 n a ClientHello
7c40: 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 or all available
7c50: 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 ciphers */.
7c60: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 if (use_supporte
7c70: 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 d) {..sk = SSL_g
7c80: 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 et1_supported_ci
7c90: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 phers(ssl);.
7ca0: 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 } else {..sk = S
7cb0: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 SL_get_ciphers(s
7cc0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 sl);. }..
7cd0: 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 if (sk != NULL)
7ce0: 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 {..if (!verbose)
7cf0: 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68 {.. const ch
7d00: 61 72 20 2a 63 70 3b 0a 09 20 20 20 20 6f 62 6a ar *cp;.. obj
7d10: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
7d20: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 tObj(0, NULL);..
7d30: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d for (int i =
7d40: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 0; i < sk_SSL_C
7d50: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 IPHER_num(sk); i
7d60: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 ++) {...const SS
7d70: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b L_CIPHER *c = sk
7d80: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 _SSL_CIPHER_valu
7d90: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 e(sk, i);...if (
7da0: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 c == NULL) conti
7db0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 nue;..../* ciphe
7dc0: 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 r name or (NONE)
7dd0: 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 */...cp = SSL_C
7de0: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 IPHER_get_name(c
7df0: 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e );...if (cp == N
7e00: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 ULL) break;...Tc
7e10: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
7e20: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
7e30: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
7e40: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 ringObj((char *)
7e50: 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 cp, -1));..
7e60: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 }...} else {..
7e70: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
7e80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 ewStringObj("",0
7e90: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 );.. for (int
7ea0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 i = 0; i < sk_S
7eb0: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b SL_CIPHER_num(sk
7ec0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 ); i++) {...cons
7ed0: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 t SSL_CIPHER *c
7ee0: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f = sk_SSL_CIPHER_
7ef0: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 value(sk, i);...
7f00: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 if (c == NULL) c
7f10: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 ontinue;..../* t
7f20: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 extual descripti
7f30: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 on of the cipher
7f40: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 */...if (SSL_CI
7f50: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
7f60: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 (c, buf, sizeof(
7f70: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b buf)) != NULL) {
7f80: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ... Tcl_Appen
7f90: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 dToObj(objPtr, b
7fa0: 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 uf, (Tcl_Size) s
7fb0: 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d trlen(buf));...}
7fc0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 else {... Tc
7fd0: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 l_AppendToObj(ob
7fe0: 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e jPtr, "UNKNOWN\n
7ff0: 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 ", 8);...}..
8000: 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 }..}..if (use_su
8010: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 pported) {..
8020: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 sk_SSL_CIPHER_fr
8030: 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d ee(sk);..}. }
8040: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 . SSL_free(ss
8050: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f l);. SSL_CTX_
8060: 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 free(ctx);..
8070: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
8080: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
8090: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
80a0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
80b0: 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c -. *. * Protocol
8100: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 sObjCmd -- list
8110: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 available protoc
8120: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 ols. *. *.This p
8130: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
8140: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
8150: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f he "tls::protoco
8160: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 ls" command. *.t
8170: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 o list available
8180: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 protocols.. *.
8190: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
81a0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
81b0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 ult list.. *. *
81c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
81d0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .none. *. *-----
81e0: 2d 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 0a 20 --------------.
8220: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 */.static int.Pr
8230: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c otocolsObjCmd(Cl
8240: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
8250: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
8260: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
8270: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
8280: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
8290: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
82a0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
82b0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ntData;.. dpr
82c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
82d0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
82e0: 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 1) {..Tcl_Wrong
82f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
8300: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 1, objv, "");..r
8310: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8320: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
8330: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
8340: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
8350: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
8360: 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 ULL);..#if OPENS
8370: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
8380: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 R < 0x10100000L
8390: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 && !defined(NO_S
83a0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL2) && !defined
83b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
83c0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
83d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
83e0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
83f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8400: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 protocols[TLS_SS
8410: 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 L2], -1));.#endi
8420: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
8430: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 O_SSL3) && !defi
8440: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
8450: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
8460: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
8470: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
8480: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
8490: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
84a0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
84b0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
84c0: 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 [TLS_SSL3], -1))
84d0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
84e0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
84f0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
8500: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 SL_NO_TLS1) && !
8510: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8520: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
8530: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
8540: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
8550: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
8560: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
8570: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 otocols[TLS_TLS1
8580: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
8590: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
85a0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
85b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
85c0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
85d0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
85e0: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_1_METHOD).
85f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
8600: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
8610: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
8620: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
8630: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d cols[TLS_TLS1_1]
8640: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 , -1));.#endif.#
8650: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
8660: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
8670: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
8680: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
8690: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
86a0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_2_METHOD).
86b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
86c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
86d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
86e0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
86f0: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c ols[TLS_TLS1_2],
8700: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 -1));.#endif.#i
8710: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
8720: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
8730: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
8740: 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1_3). Tcl_Lis
8750: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8760: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8770: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
8780: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
8790: 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a _TLS1_3], -1));.
87a0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f #endif.. Tcl_
87b0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
87c0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
87d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
87e0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
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 0a 20 2a -------------. *
8830: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a . * HandshakeObj
8840: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
8850: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 s command is use
8860: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 d to verify whet
8870: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b her the handshak
8880: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a e is complete. *
8890: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 .or not.. *. * R
88a0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
88b0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
88c0: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 . 1 means handsh
88d0: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 ake complete, 0
88e0: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 means pending..
88f0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
8900: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 s:. *.May force
8910: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 SSL negotiation
8920: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 to take place..
8930: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
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 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
8980: 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 ic int Handshake
8990: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
89a0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
89b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
89c0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
89d0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
89e0: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
89f0: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 nnel chan;
8a00: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c /* The channel
8a10: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
8a20: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 n. */. State
8a30: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 *statePtr;
8a40: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 /* client stat
8a50: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 e for ssl socket
8a60: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 */. const ch
8a70: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c ar *errStr = NUL
8a80: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d L;. int ret =
8a90: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 1;. int err
8aa0: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 = 0;. (void)
8ab0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
8ac0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
8ad0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a ");.. if (obj
8ae0: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
8af0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
8b00: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
8b10: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
8b20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8b30: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
8b40: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 _error();.. c
8b50: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
8b60: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c nnel(interp, Tcl
8b70: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
8b80: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 1]), NULL);.
8b90: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
8ba0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
8bb0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
8bc0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
8bd0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
8be0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
8bf0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
8c00: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
8c10: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
8c20: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 han);. if (Tc
8c30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
8c40: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
8c50: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
8c60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
8c70: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
8c80: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
8c90: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
8ca0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e an),.. "\": n
8cb0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
8cc0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
8cd0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
8ce0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
8cf0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c S", "HANDSHAKE",
8d00: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
8d10: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
8d20: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
8d30: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
8d40: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
8d50: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
8d60: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
8d70: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 ta(chan);.. d
8d80: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 printf("Calling
8d90: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
8da0: 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 ct");. ret =
8db0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
8dc0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 ct(statePtr, &er
8dd0: 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e r, 1);. dprin
8de0: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 tf("Tls_WaitForC
8df0: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a onnect returned:
8e00: 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 %i", ret);..
8e10: 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 if (ret < 0 &&
8e20: 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ((statePtr->flag
8e30: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e s & TLS_TCL_ASYN
8e40: 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 C) && (err == EA
8e50: 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e GAIN))) {..dprin
8e60: 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e tf("Async set an
8e70: 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 d err = EAGAIN")
8e80: 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 ;..ret = 0;.
8e90: 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c } else if (ret <
8ea0: 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 0) {..long resu
8eb0: 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74 lt;..errStr = st
8ec0: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 atePtr->err;..Tc
8ed0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e l_ResetResult(in
8ee0: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 terp);..Tcl_SetE
8ef0: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 rrno(err);...if
8f00: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 (!errStr || (*er
8f10: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 rStr == 0)) {..
8f20: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f errStr = Tcl_
8f30: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 PosixError(inter
8f40: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 p);..}...Tcl_App
8f50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
8f60: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 , "handshake fai
8f70: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 led: ", errStr,
8f80: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
8f90: 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53 .if ((result = S
8fa0: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 SL_get_verify_re
8fb0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 sult(statePtr->s
8fc0: 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f sl)) != X509_V_O
8fd0: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 K) {.. Tcl_Ap
8fe0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8ff0: 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22 2c p, " due to \"",
9000: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 X509_verify_cer
9010: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72 t_error_string(r
9020: 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63 esult), "\"", (c
9030: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d har *) NULL);..}
9040: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
9050: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
9060: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 , "HANDSHAKE", "
9070: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
9080: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 ) NULL);..dprint
9090: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
90a0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 _ERROR with hand
90b0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 shake failed: %s
90c0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 ", errStr);..ret
90d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
90e0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
90f0: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 (err != 0) {..
9100: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 dprintf("Got a
9110: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 n error with a c
9120: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 ompleted handsha
9130: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 ke: err = %i", e
9140: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 rr);..}..ret = 1
9150: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
9160: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
9170: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 TCL_OK with data
9180: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a \"%i\"", ret);.
9190: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
91a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
91b0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 _NewIntObj(ret))
91c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
91d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d _OK;.}../*. *---
91e0: 2d 2d 2d 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: 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a . *. * ImportObj
9230: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
9240: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
9250: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
9260: 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d s the "ssl" comm
9270: 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 and. *. *.The ss
9280: 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 l command pushes
9290: 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 SSL over a (new
92a0: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 ly connected) tc
92b0: 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 p socket. *. * R
92c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
92d0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
92e0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
92f0: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 ects:. *.May mod
9300: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 ify the behavior
9310: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 of an IO channe
9320: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
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 0a 20 2a 2f 0a -----------. */.
9370: 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 static int.Impor
9380: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 tObjCmd(ClientDa
9390: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
93a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
93b0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
93c0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
93d0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
93e0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
93f0: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
9400: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
9410: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
9420: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 ePtr;../* client
9430: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
9440: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c ocket */. SSL
9450: 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c _CTX *ctx..= NUL
9460: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
9470: 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a script..= NULL;.
9480: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 Tcl_Obj *pas
9490: 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 sword..= NULL;.
94a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 Tcl_Obj *vcmd
94b0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 ..= NULL;. Tc
94c0: 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 l_DString upperC
94d0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
94e0: 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 n, upperChannelB
94f0: 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 locking, upperCh
9500: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 annelEncoding, u
9510: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
9520: 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b ar;. int idx;
9530: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 . Tcl_Size le
9540: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 n;. int flags
9550: 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 ...= TLS_TCL_INI
9560: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 T;. int serve
9570: 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63 r...= 0;./* is c
9580: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 onnection incomi
9590: 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 ng or outgoing?
95a0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 */. char *key
95b0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 file..= NULL;.
95c0: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 char *certfile
95d0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e ..= NULL;. un
95e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 signed char *key
95f0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 ..= NULL;. Tc
9600: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09 l_Size key_len..
9610: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 = 0;. unsigne
9620: 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20 d char *cert..=
9630: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 NULL;. Tcl_Si
9640: 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30 ze cert_len..= 0
9650: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
9660: 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ers..= NULL;.
9670: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
9680: 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 tes..= NULL;.
9690: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d char *CAfile..=
96a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
96b0: 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b *CApath..= NULL;
96c0: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 . char *DHpar
96d0: 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ams..= NULL;.
96e0: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d char *model...=
96f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
9700: 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e *servername..= N
9710: 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 ULL;./* hostname
9720: 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 for Server Name
9730: 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 Indication */.
9740: 20 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e char *session
9750: 5f 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 _id..= NULL;.
9760: 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 Tcl_Obj *alpn..
9770: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
9780: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d ssl2 = 0, ssl3 =
9790: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 0;. int tls1
97a0: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 = 1, tls1_1 = 1
97b0: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c , tls1_2 = 1, tl
97c0: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e s1_3 = 1;. in
97d0: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 t proto = 0, lev
97e0: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 el = -1;. int
97f0: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 verify = 0, req
9800: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 uire = 0, reques
9810: 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 t = 1, post_hand
9820: 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28 shake = 0;. (
9830: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
9840: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
9850: 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 Called");..#if d
9860: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
9870: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
9880: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 SL_NO_TLS1).
9890: 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 tls1 = 0;.#endif
98a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
98b0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
98c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
98d0: 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 S1_1). tls1_1
98e0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
98f0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
9900: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
9910: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
9920: 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 ). tls1_2 = 0
9930: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
9940: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
9950: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
9960: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
9970: 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 tls1_3 = 0;.#e
9980: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 ndif.. if (ob
9990: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc < 2) {..Tcl_W
99a0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
99b0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
99c0: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 annel ?options?"
99d0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
99e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
99f0: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
9a00: 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 ();.. chan =
9a10: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
9a20: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
9a30: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e ring(objv[1]), N
9a40: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ULL);. if (ch
9a50: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
9a60: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
9a70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
9a80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b }.. /* Mak
9a90: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
9aa0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
9ab0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
9ac0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
9ad0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
9ae0: 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 . for (idx =
9af0: 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 2; idx < objc; i
9b00: 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f dx++) {..char *o
9b10: 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 pt = Tcl_GetStri
9b20: 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a 0a ng(objv[idx]);..
9b30: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 .if (opt[0] != '
9b40: 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a -').. break;.
9b50: 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 ..OPTOBJ("-alpn"
9b60: 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 , alpn);..OPTSTR
9b70: 28 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61 74 ("-cadir", CApat
9b80: 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 h);..OPTSTR("-ca
9b90: 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a file", CAfile);.
9ba0: 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 .OPTBYTE("-cert"
9bb0: 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e , cert, cert_len
9bc0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 );..OPTSTR("-cer
9bd0: 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 tfile", certfile
9be0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
9bf0: 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a her", ciphers);.
9c00: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 .OPTSTR("-cipher
9c10: 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f s", ciphers);..O
9c20: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 PTSTR("-ciphersu
9c30: 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 ites", ciphersui
9c40: 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d tes);..OPTOBJ("-
9c50: 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 command", script
9c60: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 );..OPTSTR("-dhp
9c70: 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 arams", DHparams
9c80: 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 );..OPTBYTE("-ke
9c90: 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e y", key, key_len
9ca0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 );..OPTSTR("-key
9cb0: 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b file", keyfile);
9cc0: 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c ..OPTSTR("-model
9cd0: 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f ", model);..OPTO
9ce0: 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 BJ("-password",
9cf0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 password);..OPTB
9d00: 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 OOL("-post_hands
9d10: 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 hake", post_hand
9d20: 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c shake);..OPTBOOL
9d30: 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 ("-request", req
9d40: 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 uest);..OPTBOOL(
9d50: 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 "-require", requ
9d60: 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d ire);..OPTINT("-
9d70: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c security_level",
9d80: 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f level);..OPTBOO
9d90: 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 L("-server", ser
9da0: 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ver);..OPTSTR("-
9db0: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 servername", ser
9dc0: 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 vername);..OPTST
9dd0: 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c R("-session_id",
9de0: 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f session_id);..O
9df0: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 PTBOOL("-ssl2",
9e00: 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 ssl2);..OPTBOOL(
9e10: 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a "-ssl3", ssl3);.
9e20: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 .OPTBOOL("-tls1"
9e30: 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f , tls1);..OPTBOO
9e40: 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 L("-tls1.1", tls
9e50: 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 1_1);..OPTBOOL("
9e60: 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 -tls1.2", tls1_2
9e70: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
9e80: 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a s1.3", tls1_3);.
9e90: 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 .OPTOBJ("-valida
9ea0: 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 tecommand", vcmd
9eb0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d );..OPTOBJ("-vcm
9ec0: 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 d", vcmd);...OPT
9ed0: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d BAD("option", "-
9ee0: 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 alpn, -cadir, -c
9ef0: 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 afile, -cert, -c
9f00: 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 ertfile, -cipher
9f10: 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c , -ciphersuites,
9f20: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 -command, -dhpa
9f30: 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 rams, -key, -key
9f40: 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 file, -model, -p
9f50: 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 assword, -post_h
9f60: 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65 andshake, -reque
9f70: 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73 st, -require, -s
9f80: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 2d ecurity_level, -
9f90: 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e server, -servern
9fa0: 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 ame, -session_id
9fb0: 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 , -ssl2, -ssl3,
9fc0: 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 -tls1, -tls1.1,
9fd0: 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 -tls1.2, -tls1.3
9fe0: 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f , or -validateco
9ff0: 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 mmand");...retur
a000: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
a010: 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 }. if (reque
a020: 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 st)..verify |= S
a030: 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 SL_VERIFY_CLIENT
a040: 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 _ONCE | SSL_VERI
a050: 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 FY_PEER;. if
a060: 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 (request && requ
a070: 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 ire).verify |= S
a080: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 SL_VERIFY_FAIL_I
a090: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a F_NO_PEER_CERT;.
a0a0: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 if (request
a0b0: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b && post_handshak
a0c0: 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c e).verify |= SSL
a0d0: 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e _VERIFY_POST_HAN
a0e0: 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 DSHAKE;. if (
a0f0: 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 verify == 0)..ve
a100: 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 rify = SSL_VERIF
a110: 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f Y_NONE;.. pro
a120: 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c to |= (ssl2 ? TL
a130: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 S_PROTO_SSL2 : 0
a140: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
a150: 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 (ssl3 ? TLS_PROT
a160: 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 O_SSL3 : 0);.
a170: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 proto |= (tls1
a180: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
a190: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f : 0);. proto
a1a0: 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c |= (tls1_1 ? TL
a1b0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a S_PROTO_TLS1_1 :
a1c0: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
a1d0: 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f = (tls1_2 ? TLS_
a1e0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 PROTO_TLS1_2 : 0
a1f0: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 );. proto |=
a200: 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 (tls1_3 ? TLS_PR
a210: 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b OTO_TLS1_3 : 0);
a220: 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 .. /* reset t
a230: 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 o NULL if blank
a240: 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 string provided
a250: 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 */. if (cert
a260: 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 && !*cert)..
a270: 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 cert.
a280: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
a290: 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 (key && !*key)..
a2a0: 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 key.
a2b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a2c0: 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 if (certfile &&
a2d0: 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 !*certfile)
a2e0: 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e certfile.= N
a2f0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 ULL;. if (key
a300: 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c file && !*keyfil
a310: 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 e)..keyfile.
a320: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a330: 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 if (ciphers && !
a340: 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 *ciphers).
a350: 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 ciphers.
a360: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
a370: 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 (ciphersuites &
a380: 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 & !*ciphersuites
a390: 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 ) ciphersuites
a3a0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
a3b0: 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 (CAfile && !*CA
a3c0: 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 file). CA
a3d0: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e file. = N
a3e0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 70 ULL;. if (CAp
a3f0: 61 74 68 20 26 26 20 21 2a 43 41 70 61 74 68 29 ath && !*CApath)
a400: 09 20 20 20 20 20 20 20 20 43 41 70 61 74 68 09 . CApath.
a410: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a420: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 if (DHparams
a430: 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 && !*DHparams).
a440: 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73 DHparams
a450: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a460: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 . /* new SSL
a470: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 state */. sta
a480: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 tePtr..= (State
a490: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 *) ckalloc((unsi
a4a0: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 gned) sizeof(Sta
a4b0: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 te));. memset
a4c0: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 (statePtr, 0, si
a4d0: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 zeof(State));..
a4e0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 statePtr->fla
a4f0: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 gs.= flags;.
a500: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
a510: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 .= interp;. s
a520: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 tatePtr->vflags.
a530: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74 = verify;. st
a540: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 atePtr->err.= ""
a550: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 ;.. /* alloca
a560: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 te script */.
a570: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 if (script) {..
a580: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 (void) Tcl_GetSt
a590: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 ringFromObj(scri
a5a0: 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 pt, &len);..if (
a5b0: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 len) {.. stat
a5c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
a5d0: 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63 script;.. Tc
a5e0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 l_IncrRefCount(s
a5f0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
a600: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 k);..}. }..
a610: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 /* allocate pa
a620: 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 ssword */. if
a630: 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 (password) {..(
a640: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 void) Tcl_GetStr
a650: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 ingFromObj(passw
a660: 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 ord, &len);..if
a670: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 (len) {.. sta
a680: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 tePtr->password
a690: 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 = password;..
a6a0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
a6b0: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 t(statePtr->pass
a6c0: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a word);..}. }.
a6d0: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 . /* allocate
a6e0: 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e validate comman
a6f0: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d d */. if (vcm
a700: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c d) {..(void) Tcl
a710: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
a720: 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 j(vcmd, &len);..
a730: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 if (len) {..
a740: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
a750: 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f vcmd;.. Tcl_
a760: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 IncrRefCount(sta
a770: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d tePtr->vcmd);..}
a780: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
a790: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b model != NULL) {
a7a0: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 ..int mode;../*
a7b0: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 Get the "model"
a7c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e context */..chan
a7d0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
a7e0: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c l(interp, model,
a7f0: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 &mode);..if (ch
a800: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
a810: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 el) NULL) {..
a820: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 Tls_Free((tls_f
a830: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 ree_type *) stat
a840: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
a850: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
a860: 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 .../*.. * Make s
a870: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
a880: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
a890: 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e annel.. */..chan
a8a0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
a8b0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 nnel(chan);..if
a8c0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
a8d0: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
a8e0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
a8f0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
a900: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
a910: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
a920: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
a930: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c Name(chan),..."\
a940: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
a950: 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 nnel", (char *)
a960: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
a970: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
a980: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
a990: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c ORT", "CHANNEL",
a9a0: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
a9b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
a9c0: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 Tls_Free((tls_f
a9d0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 ree_type *) stat
a9e0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
a9f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
aa00: 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 ..ctx = ((State
aa10: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c *)Tcl_GetChannel
aa20: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
aa30: 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 n))->ctx;. }
aa40: 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 else {..if ((ctx
aa50: 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 = CTX_Init(stat
aa60: 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 ePtr, server, pr
aa70: 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 oto, keyfile, ce
aa80: 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 rtfile, key, cer
aa90: 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e t, (int) key_len
aaa0: 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 63 65 72 ,.. (int) cer
aab0: 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 2c 20 43 t_len, CApath, C
aac0: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 Afile, ciphers,
aad0: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 ciphersuites, le
aae0: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 vel, DHparams))
aaf0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
ab00: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 Tls_Free((tls_fr
ab10: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 ee_type *) state
ab20: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
ab30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
ab40: 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 }.. state
ab50: 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a Ptr->ctx = ctx;.
ab60: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 . /*. * W
ab70: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 e need to make s
ab80: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61 ure that the cha
ab90: 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 nnel works in bi
aba0: 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 nary (for the.
abb0: 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 * encryption
abc0: 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 not to get goofe
abd0: 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 d up).. */.
abe0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
abf0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
ac00: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 Translation);.
ac10: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
ac20: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 t(&upperChannelB
ac30: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 locking);. Tc
ac40: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
ac50: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
ac60: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ar);. Tcl_DSt
ac70: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
ac80: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
ac90: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
aca0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
acb0: 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 , chan, "-eofcha
acc0: 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 r", &upperChanne
acd0: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 lEOFChar);. T
ace0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
acf0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
ad00: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 , "-encoding", &
ad10: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
ad20: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 ding);. Tcl_G
ad30: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
ad40: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
ad50: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 translation", &u
ad60: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
ad70: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c lation);. Tcl
ad80: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
ad90: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
ada0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 "-blocking", &up
adb0: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 perChannelBlocki
adc0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 ng);. Tcl_Set
add0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
ade0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
adf0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e anslation", "bin
ae00: 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 ary");. Tcl_S
ae10: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
ae20: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
ae30: 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 blocking", "true
ae40: 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ");. dprintf(
ae50: 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 "Consuming Tcl c
ae60: 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f hannel %s", Tcl_
ae70: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
ae80: 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 han));. state
ae90: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f Ptr->self = Tcl_
aea0: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 StackChannel(int
aeb0: 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c erp, Tls_Channel
aec0: 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 Type(), (ClientD
aed0: 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 ata) statePtr,..
aee0: 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 (TCL_READABLE |
aef0: 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 TCL_WRITABLE), c
af00: 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 han);. dprint
af10: 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e f("Created chann
af20: 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 el named %s", Tc
af30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
af40: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
af50: 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 );. if (state
af60: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 Ptr->self == (Tc
af70: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
af80: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 {../*.. * No us
af90: 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 e of Tcl_Eventua
afa0: 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20 llyFree because
afb0: 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f no possible Tcl_
afc0: 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 Preserve... */..
afd0: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 Tls_Free((tls_fr
afe0: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 ee_type *) state
aff0: 50 74 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 Ptr);..Tcl_DStri
b000: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 ngFree(&upperCha
b010: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
b020: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ;..Tcl_DStringFr
b030: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ee(&upperChannel
b040: 45 6e 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c 5f Encoding);..Tcl_
b050: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 DStringFree(&upp
b060: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
b070: 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 );..Tcl_DStringF
b080: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 ree(&upperChanne
b090: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65 74 lBlocking);..ret
b0a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
b0b0: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 }.. Tcl_Se
b0c0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
b0d0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
b0e0: 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 >self, "-transla
b0f0: 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 tion", Tcl_DStri
b100: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
b110: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
b120: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ));. Tcl_SetC
b130: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
b140: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
b150: 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 elf, "-encoding"
b160: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
b170: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
b180: 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 Encoding));.
b190: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
b1a0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
b1b0: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 tePtr->self, "-e
b1c0: 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 ofchar", Tcl_DSt
b1d0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
b1e0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 ChannelEOFChar))
b1f0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
b200: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
b210: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
b220: 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 f, "-blocking",
b230: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
b240: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
b250: 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 ocking));. Tc
b260: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 l_DStringFree(&u
b270: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
b280: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c lation);. Tcl
b290: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 _DStringFree(&up
b2a0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
b2b0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ng);. Tcl_DSt
b2c0: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 ringFree(&upperC
b2d0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a hannelEOFChar);.
b2e0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
b2f0: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 ree(&upperChanne
b300: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 lBlocking);..
b310: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 /*. * SSL I
b320: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 nitialization.
b330: 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 */. stateP
b340: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 tr->ssl = SSL_ne
b350: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 w(statePtr->ctx)
b360: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 ;. if (!state
b370: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 Ptr->ssl) {../*
b380: 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f SSL library erro
b390: 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 r */..Tcl_Append
b3a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b3b0: 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 couldn't constru
b3c0: 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 ct ssl session:
b3d0: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ", GET_ERR_REASO
b3e0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
b3f0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
b400: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
b410: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
b420: 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 T", "INIT", "FAI
b430: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
b440: 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 ULL);..Tls_Free(
b450: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a (tls_free_type *
b460: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 ) statePtr);..re
b470: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
b480: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
b490: 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 t host server na
b4a0: 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 me */. if (se
b4b0: 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 rvername) {../*
b4c0: 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20 Sets the server
b4d0: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 name indication
b4e0: 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 (SNI) in ClientH
b4f0: 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a ello extension *
b500: 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 /../* Per RFC 60
b510: 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 66, hostname is
b520: 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 a ASCII encoded
b530: 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 string, though R
b540: 46 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46 FC 4366 says UTF
b550: 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c -8. */..if (!SSL
b560: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 _set_tlsext_host
b570: 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e _name(statePtr->
b580: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 ssl, servername)
b590: 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 && require) {..
b5a0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
b5b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 sult(interp, "Se
b5c0: 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 t SNI extension
b5d0: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 failed: ", GET_E
b5e0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
b5f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b600: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
b610: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b620: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 , "IMPORT", "SNI
b630: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
b640: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b650: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f Tls_Free((tls_
b660: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 free_type *) sta
b670: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
b680: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
b690: 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e }.../* Set hostn
b6a0: 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 ame for peer cer
b6b0: 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d tificate hostnam
b6c0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 e verification i
b6d0: 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 n clients... D
b6e0: 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 on't use SSL_set
b6f0: 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 1_host since it
b700: 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e has limitations.
b710: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 */..if (!SSL_ad
b720: 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 d1_host(statePtr
b730: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d ->ssl, servernam
b740: 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 e)) {.. Tcl_A
b750: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
b760: 72 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73 rp, "Set DNS hos
b770: 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c tname failed: ",
b780: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
b790: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
b7a0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
b7b0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
b7c0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
b7d0: 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 , "HOSTNAME", "F
b7e0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
b7f0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 NULL);.. Tls
b800: 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f _Free((tls_free_
b810: 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 type *) statePtr
b820: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
b830: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 CL_ERROR;..}.
b840: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d }.. /* Resum
b850: 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a e session id */.
b860: 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f if (session_
b870: 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 id && strlen(ses
b880: 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f sion_id) <= SSL_
b890: 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 MAX_SID_CTX_LENG
b8a0: 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 TH) {../* SSL_se
b8b0: 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 t_session() */..
b8c0: 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e if (!SSL_SESSION
b8d0: 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 _set1_id_context
b8e0: 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e (SSL_get_session
b8f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
b900: 0a 09 09 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e ...(const unsign
b910: 65 64 20 63 68 61 72 20 2a 29 20 73 65 73 73 69 ed char *) sessi
b920: 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 on_id, (unsigned
b930: 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 int) strlen(ses
b940: 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 sion_id))) {..
b950: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
b960: 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 lt(interp, "Resu
b970: 6d 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 me session faile
b980: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 d: ", GET_ERR_RE
b990: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
b9a0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c NULL);.. Tcl
b9b0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
b9c0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
b9d0: 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 PORT", "SESSION"
b9e0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
b9f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
ba00: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 Tls_Free((tls_f
ba10: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 ree_type *) stat
ba20: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
ba30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
ba40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 . }.. /* E
ba50: 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f nable Applicatio
ba60: 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c n-Layer Protocol
ba70: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 Negotiation. Ex
ba80: 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 amples are: http
ba90: 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c /1.0,..http/1.1,
baa0: 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d h2, h3, ftp, im
bab0: 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 ap, pop3, xmpp-c
bac0: 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 lient, xmpp-serv
bad0: 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 er, mqtt, irc, e
bae0: 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 tc. */. if (a
baf0: 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 lpn) {../* Conve
bb00: 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e rt a TCL list in
bb10: 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 to a protocol-li
bb20: 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 st in wire-forma
bb30: 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 t */..unsigned c
bb40: 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b har *protos, *p;
bb50: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 ..unsigned int p
bb60: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 rotos_len = 0;..
bb70: 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b Tcl_Size cnt, i;
bb80: 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 ..int j;..Tcl_Ob
bb90: 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 j **list;...if (
bba0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c Tcl_ListObjGetEl
bbb0: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 ements(interp, a
bbc0: 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 lpn, &cnt, &list
bbd0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
bbe0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c Tls_Free((tl
bbf0: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 s_free_type *) s
bc00: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
bc10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
bc20: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 ..}.../* Determi
bc30: 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 ne the memory re
bc40: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 quired for the p
bc50: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a rotocol-list */.
bc60: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c .for (i = 0; i <
bc70: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 cnt; i++) {..
bc80: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 Tcl_GetStringF
bc90: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 romObj(list[i],
bca0: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 &len);.. if (
bcb0: 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 len > 255) {...T
bcc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
bcd0: 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 interp, "ALPN pr
bce0: 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f otocol names too
bcf0: 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 long", (char *)
bd00: 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 NULL);...Tcl_Se
bd10: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
bd20: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
bd30: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 T", "ALPN", "FAI
bd40: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
bd50: 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 ULL);...Tls_Free
bd60: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 ((tls_free_type
bd70: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 *) statePtr);...
bd80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
bd90: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 ;.. }.. pr
bda0: 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 otos_len += 1 +
bdb0: 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 (int) len;..}...
bdc0: 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d /* Build the com
bdd0: 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c plete protocol-l
bde0: 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d ist */..protos =
bdf0: 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f ckalloc(protos_
be00: 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 len);../* protoc
be10: 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 ol-lists consist
be20: 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 of 8-bit length
be30: 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 -prefixed, byte
be40: 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 strings */..for
be50: 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 (j = 0, p = prot
be60: 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b os; j < cnt; j++
be70: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 ) {.. char *s
be80: 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 tr = Tcl_GetStri
be90: 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a ngFromObj(list[j
bea0: 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a ], &len);.. *
beb0: 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 p++ = (unsigned
bec0: 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 char) len;..
bed0: 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28 memcpy(p, str, (
bee0: 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 size_t) len);..
bef0: 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a p += len;..}.
bf00: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 ../* SSL_set_alp
bf10: 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 n_protos makes a
bf20: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f copy of the pro
bf30: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f tocol-list */../
bf40: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e * Note: This fun
bf50: 63 74 69 6f 6e 20 72 65 76 65 72 73 65 73 20 74 ction reverses t
bf60: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 he return value
bf70: 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 convention */..i
bf80: 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f f (SSL_set_alpn_
bf90: 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d protos(statePtr-
bfa0: 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 >ssl, protos, pr
bfb0: 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 otos_len)) {..
bfc0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
bfd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
bfe0: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 ALPN protocols f
bff0: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 ailed: ", GET_ER
c000: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
c010: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
c020: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
c030: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
c040: 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e "IMPORT", "ALPN
c050: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
c060: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
c070: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f Tls_Free((tls_
c080: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 free_type *) sta
c090: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 tePtr);.. ckf
c0a0: 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 ree(protos);..
c0b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
c0c0: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 OR;..}.../* Stor
c0d0: 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 e protocols list
c0e0: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 */..statePtr->p
c0f0: 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a rotos = protos;.
c100: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
c110: 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c s_len = protos_l
c120: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b en;. } else {
c130: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
c140: 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 os = NULL;..stat
c150: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
c160: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 = 0;. }..
c170: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 /*. * SSL C
c180: 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f allbacks. */
c190: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 . SSL_set_app
c1a0: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e _data(statePtr->
c1b0: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ssl, (void *)sta
c1c0: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 tePtr);./* point
c1d0: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 back to us */.
c1e0: 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 SSL_set_verif
c1f0: 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c y(statePtr->ssl,
c200: 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 verify, VerifyC
c210: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 allback);. SS
c220: 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 L_set_info_callb
c230: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ack(statePtr->ss
c240: 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 l, InfoCallback)
c250: 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 ;.. /* Callba
c260: 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 ck for observing
c270: 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 protocol messag
c280: 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 es */.#ifndef OP
c290: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 ENSSL_NO_SSL_TRA
c2a0: 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 CE. /* void S
c2b0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 SL_CTX_set_msg_c
c2c0: 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 allback_arg(stat
c2d0: 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 ePtr->ctx, (void
c2e0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 *)statePtr);.
c2f0: 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 void SSL_CTX_s
c300: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 et_msg_callback(
c310: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d statePtr->ctx, M
c320: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b essageCallback);
c330: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f */. SSL_set_
c340: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 msg_callback_arg
c350: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c360: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c370: 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d );. SSL_set_m
c380: 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 sg_callback(stat
c390: 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 ePtr->ssl, Messa
c3a0: 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e geCallback);.#en
c3b0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 dif.. /* Crea
c3c0: 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 te Tcl_Channel B
c3d0: 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 IO Handler */.
c3e0: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 statePtr->p_bi
c3f0: 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 o.= BIO_new_tcl(
c400: 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f statePtr, BIO_NO
c410: 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 CLOSE);. stat
c420: 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f ePtr->bio.= BIO_
c430: 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 new(BIO_f_ssl())
c440: 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 ;.. if (serve
c450: 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 r) {../* Server
c460: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 callbacks */..SS
c470: 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 L_CTX_set_tlsext
c480: 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 _servername_arg(
c490: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 statePtr->ctx, (
c4a0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
c4b0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 ;..SSL_CTX_set_t
c4c0: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 lsext_servername
c4d0: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 _callback(stateP
c4e0: 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c tr->ctx, SNICall
c4f0: 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f back);..SSL_CTX_
c500: 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f set_client_hello
c510: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
c520: 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b x, HelloCallback
c530: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
c540: 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 tr);..if (stateP
c550: 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 tr->protos != NU
c560: 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 LL) {.. SSL_C
c570: 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 TX_set_alpn_sele
c580: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ct_cb(statePtr->
c590: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 ctx, ALPNCallbac
c5a0: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
c5b0: 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 Ptr);.#ifdef USE
c5c0: 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c _NPN.. if (tl
c5d0: 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 s1_2 == 0 && tls
c5e0: 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 1_3 == 0) {...SS
c5f0: 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 L_CTX_set_next_p
c600: 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 rotos_advertised
c610: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
c620: 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 x, NPNCallback,
c630: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c640: 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 );.. }.#endif
c650: 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 ..}.../* Enable
c660: 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 server to send c
c670: 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65 ert request afte
c680: 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 r handshake (TLS
c690: 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 1.3 only) */../
c6a0: 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 * A write operat
c6b0: 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c ion must take pl
c6c0: 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 ace for the Cert
c6d0: 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20 ificate Request
c6e0: 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 to be.. sent t
c6f0: 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 o the client, th
c700: 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 is can be done w
c710: 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 ith SSL_do_hands
c720: 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 hake(). */..if (
c730: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f request && post_
c740: 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73 handshake && tls
c750: 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 1_3) {.. SSL_
c760: 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f verify_client_po
c770: 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 st_handshake(sta
c780: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a tePtr->ssl);..}.
c790: 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 ../* set automat
c7a0: 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 ic curve selecti
c7b0: 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 on */..SSL_set_e
c7c0: 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74 cdh_auto(statePt
c7d0: 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a r->ssl, 1);.../*
c7e0: 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 Set server mode
c7f0: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 */..statePtr->f
c800: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f lags |= TLS_TCL_
c810: 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 SERVER;..SSL_set
c820: 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 _accept_state(st
c830: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
c840: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 } else {../* C
c850: 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 lient callbacks
c860: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 */.#ifdef USE_NP
c870: 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d N..if (statePtr-
c880: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 >protos != NULL
c890: 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 && tls1_2 == 0 &
c8a0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b & tls1_3 == 0) {
c8b0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
c8c0: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c t_next_proto_sel
c8d0: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d ect_cb(statePtr-
c8e0: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 >ctx, ALPNCallba
c8f0: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
c900: 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 ePtr);..}.#endif
c910: 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 .../* Session ca
c920: 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 ching */..SSL_CT
c930: 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 X_set_session_ca
c940: 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 che_mode(statePt
c950: 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 r->ctx, SSL_SESS
c960: 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 _CACHE_CLIENT |
c970: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e SSL_SESS_CACHE_N
c980: 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 O_INTERNAL_STORE
c990: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 );..SSL_CTX_sess
c9a0: 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 _set_new_cb(stat
c9b0: 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 ePtr->ctx, Sessi
c9c0: 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f onCallback);.../
c9d0: 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 * Enable post ha
c9e0: 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 ndshake Authenti
c9f0: 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e cation extension
ca00: 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 . TLS 1.3 only,
ca10: 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 not http/2. */..
ca20: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 if (request && p
ca30: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b ost_handshake) {
ca40: 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f .. SSL_set_po
ca50: 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 st_handshake_aut
ca60: 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c h(statePtr->ssl,
ca70: 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 1);..}.../* Set
ca80: 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a client mode */.
ca90: 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 .SSL_set_connect
caa0: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d _state(statePtr-
cab0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 >ssl);. }.
cac0: 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 SSL_set_bio(sta
cad0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 tePtr->ssl, stat
cae0: 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 ePtr->p_bio, sta
caf0: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 tePtr->p_bio);.
cb00: 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 BIO_set_ssl(s
cb10: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 tatePtr->bio, st
cb20: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f atePtr->ssl, BIO
cb30: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 _NOCLOSE);..
cb40: 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 /*. * End of
cb50: 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a SSL Init. *
cb60: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 /. dprintf("R
cb70: 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 eturning %s", Tc
cb80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
cb90: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
cba0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 );. Tcl_SetRe
cbb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 sult(interp, (ch
cbc0: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 ar *) Tcl_GetCha
cbd0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
cbe0: 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f r->self), TCL_VO
cbf0: 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 LATILE);.. re
cc00: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
cc10: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
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 0a 20 2a 0a 20 2a 20 ---------. *. *
cc60: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d UnimportObjCmd -
cc70: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
cc80: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
cc90: 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 d to remove the
cca0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
ccb0: 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 filter.. *. * Re
ccc0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
ccd0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
cce0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
ccf0: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 cts:. *.May modi
cd00: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 fy the behavior
cd10: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c of an IO channel
cd20: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
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 0a 20 2a 2f 0a 73 ----------. */.s
cd70: 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f tatic int.Unimpo
cd80: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 rtObjCmd(ClientD
cd90: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
cda0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
cdb0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
cdc0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
cdd0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
cde0: 68 61 6e 6e 65 6c 20 63 68 61 6e 2c 20 63 68 69 hannel chan, chi
cdf0: 6c 64 3b 09 2f 2a 20 54 68 65 20 73 74 61 63 6b ld;./* The stack
ce00: 65 64 20 61 6e 64 20 75 6e 64 65 72 6c 79 69 6e ed and underlyin
ce10: 67 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 g channels */.
ce20: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 Tcl_DString up
ce30: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
ce40: 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e ation, upperChan
ce50: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 nelBlocking, upp
ce60: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
ce70: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 g, upperChannelE
ce80: 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 OFChar;. int
ce90: 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 res = TCL_OK;.
cea0: 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 (void) clientD
ceb0: 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ata;.. dprint
cec0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
ced0: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 if (objc != 2)
cee0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
cef0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
cf00: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 objv, "channel")
cf10: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
cf20: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
cf30: 2f 2a 20 56 61 6c 69 64 61 74 65 20 63 68 61 6e /* Validate chan
cf40: 6e 65 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 nel name */.
cf50: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
cf60: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
cf70: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
cf80: 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 [1]), NULL);.
cf90: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
cfa0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
cfb0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
cfc0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
cfd0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
cfe0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
cff0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
d000: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
d010: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
d020: 63 68 61 6e 29 3b 0a 20 20 20 20 63 68 69 6c 64 chan);. child
d030: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 = Tcl_GetStacke
d040: 64 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a dChannel(chan);.
d050: 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 69 . /* Verify i
d060: 73 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e s a stacked chan
d070: 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 nel */. if (c
d080: 68 69 6c 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a hild == NULL) {.
d090: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
d0a0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
d0b0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
d0c0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
d0d0: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 han),..."\": not
d0e0: 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e a stacked chann
d0f0: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 el", (char *) NU
d100: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
d110: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
d120: 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 p, "TLS", "UNIMP
d130: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c ORT", "CHANNEL",
d140: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
d150: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
d160: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
d170: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6c 75 }.. /* Flu
d180: 73 68 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 64 sh any pending d
d190: 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 ata */. if (T
d1a0: 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 29 20 21 cl_Flush(chan) !
d1b0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
d1c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
d1d0: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
d1e0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
d1f0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
d200: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 on);. Tcl_DSt
d210: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
d220: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b hannelBlocking);
d230: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d240: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
d250: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 elEOFChar);.
d260: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
d270: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
d280: 6f 64 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 oding);.. /*
d290: 47 65 74 20 63 75 72 72 65 6e 74 20 63 6f 6e 66 Get current conf
d2a0: 69 67 20 2d 20 45 4f 4c 20 74 72 61 6e 73 6c 61 ig - EOL transla
d2b0: 74 69 6f 6e 2c 20 65 6e 63 6f 64 69 6e 67 20 61 tion, encoding a
d2c0: 6e 64 20 62 75 66 66 65 72 69 6e 67 20 6f 70 74 nd buffering opt
d2d0: 69 6f 6e 73 20 61 72 65 20 73 68 61 72 65 64 20 ions are shared
d2e0: 62 65 74 77 65 65 6e 20 61 6c 6c 20 63 68 61 6e between all chan
d2f0: 6e 65 6c 73 20 69 6e 20 74 68 65 20 73 74 61 63 nels in the stac
d300: 6b 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 47 65 74 k */. Tcl_Get
d310: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
d320: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c terp, chan, "-bl
d330: 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 ocking", &upperC
d340: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b hannelBlocking);
d350: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
d360: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
d370: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 , chan, "-encodi
d380: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e ng", &upperChann
d390: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 elEncoding);.
d3a0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
d3b0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
d3c0: 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 an, "-eofchar",
d3d0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
d3e0: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 Char);. Tcl_G
d3f0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
d400: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
d410: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 translation", &u
d420: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
d430: 6c 61 74 69 6f 6e 29 3b 0a 0a 20 20 20 20 2f 2a lation);.. /*
d440: 20 55 6e 73 74 61 63 6b 20 74 68 65 20 63 68 61 Unstack the cha
d450: 6e 6e 65 6c 20 61 6e 64 20 72 65 73 74 6f 72 65 nnel and restore
d460: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e underlying chan
d470: 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 nel config */.
d480: 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 if (Tcl_Unstac
d490: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c kChannel(interp,
d4a0: 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 4f 4b chan) == TCL_OK
d4b0: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e ) {..Tcl_SetChan
d4c0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
d4d0: 2c 20 63 68 69 6c 64 2c 20 22 2d 65 6e 63 6f 64 , child, "-encod
d4e0: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e ing", Tcl_DStrin
d4f0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
d500: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a nnelEncoding));.
d510: 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f .Tcl_SetChannelO
d520: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
d530: 69 6c 64 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c ild, "-eofchar",
d540: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
d550: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 e(&upperChannelE
d560: 4f 46 43 68 61 72 29 29 3b 0a 09 54 63 6c 5f 53 OFChar));..Tcl_S
d570: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
d580: 69 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 interp, child, "
d590: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 -translation", T
d5a0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
d5b0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
d5c0: 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 09 54 63 6c nslation));..Tcl
d5d0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
d5e0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c n(interp, child,
d5f0: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 "-blocking", Tc
d600: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
d610: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
d620: 6b 69 6e 67 29 29 3b 0a 20 20 20 20 7d 20 65 6c king));. } el
d630: 73 65 20 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f se {..res = TCL_
d640: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
d650: 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f /* Clean-up */
d660: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d670: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
d680: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
d690: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
d6a0: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 ree(&upperChanne
d6b0: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 lEncoding);.
d6c0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
d6d0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
d6e0: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 Char);. Tcl_D
d6f0: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
d700: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
d710: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
d720: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d s;.}.../*. *----
d730: 2d 2d 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 0a ---------------.
d770: 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d *. * CTX_Init -
d780: 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 - construct a SS
d790: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 L_CTX instance.
d7a0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
d7b0: 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 .A valid SSL_CTX
d7c0: 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c instance or NUL
d7d0: 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 L.. *. * Side ef
d7e0: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 fects:. *.constr
d7f0: 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 ucts SSL context
d800: 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d (CTX). *. *----
d810: 2d 2d 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 0a ---------------.
d850: 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 */.static SSL_C
d860: 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 TX *.CTX_Init(St
d870: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 ate *statePtr, i
d880: 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 nt isServer, int
d890: 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 proto, char *ke
d8a0: 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 yfile, char *cer
d8b0: 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 tfile,. unsig
d8c0: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 ned char *key, u
d8d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
d8e0: 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c rt, int key_len,
d8f0: 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 int cert_len, c
d900: 68 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 har *CApath,.
d910: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 char *CAfile, c
d920: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 har *ciphers, ch
d930: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 ar *ciphersuites
d940: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 , int level, cha
d950: 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 r *DHparams) {.
d960: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
d970: 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 nterp = statePtr
d980: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 ->interp;. SS
d990: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c L_CTX *ctx = NUL
d9a0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 L;. Tcl_DStri
d9b0: 6e 67 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f ng ds;. int o
d9c0: 66 66 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 ff = 0, abort =
d9d0: 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 0;. int load_
d9e0: 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 private_key;.
d9f0: 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f const SSL_METHO
da00: 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 D *method;..
da10: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
da20: 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f );.. if (!pro
da30: 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e to) {..Tcl_Appen
da40: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
da50: 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 "no valid protoc
da60: 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 ol selected", (c
da70: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
da80: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
da90: 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 }.. /* create
daa0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
dab0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
dac0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 ION_NUMBER >= 0x
dad0: 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 10100000L || def
dae0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c ined(NO_SSL2) ||
daf0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
db00: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 _NO_SSL2). if
db10: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
db20: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 TLS_PROTO_SSL2)
db30: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
db40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
db50: 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 SL2 protocol not
db60: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
db70: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
db80: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
db90: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
dba0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 ned(NO_SSL3) ||
dbb0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
dbc0: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 NO_SSL3). if
dbd0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
dbe0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 TLS_PROTO_SSL3))
dbf0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
dc00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 sult(interp, "SS
dc10: 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 L3 protocol not
dc20: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
dc30: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
dc40: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
dc50: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
dc60: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 ed(NO_TLS1) || d
dc70: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
dc80: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 O_TLS1). if (
dc90: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
dca0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 LS_PROTO_TLS1))
dcb0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
dcc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
dcd0: 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.0 protocol no
dce0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 t supported", (c
dcf0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
dd00: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
dd10: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
dd20: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
dd30: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
dd40: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 SL_NO_TLS1_1).
dd50: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
dd60: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
dd70: 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 LS1_1)) {..Tcl_A
dd80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
dd90: 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f rp, "TLS 1.1 pro
dda0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
ddb0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
ddc0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
ddd0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
dde0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
ddf0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e TLS1_2) || defin
de00: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
de10: 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e S1_2). if (EN
de20: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
de30: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 _PROTO_TLS1_2))
de40: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
de50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
de60: 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.2 protocol no
de70: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 t supported", (c
de80: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
de90: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
dea0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
deb0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
dec0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
ded0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
dee0: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
def0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
df00: 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 LS1_3)) {..Tcl_A
df10: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
df20: 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f rp, "TLS 1.3 pro
df30: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
df40: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
df50: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
df60: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
df70: 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d . if (proto =
df80: 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 = 0) {../* Use f
df90: 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 ull range */..SS
dfa0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 L_CTX_set_min_pr
dfb0: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
dfc0: 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 0);..SSL_CTX_se
dfd0: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 t_max_proto_vers
dfe0: 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 ion(ctx, 0);.
dff0: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 }.. switch (
e000: 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 proto) {.#if OPE
e010: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
e020: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 BER < 0x10100000
e030: 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f L && !defined(NO
e040: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e _SSL2) && !defin
e050: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
e060: 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 L2). case TLS
e070: 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 _PROTO_SSL2:..me
e080: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
e090: 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d ? SSLv2_server_m
e0a0: 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f ethod() : SSLv2_
e0b0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
e0c0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
e0d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
e0e0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
e0f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
e100: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
e110: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d PENSSL_NO_SSL3_M
e120: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 ETHOD). case
e130: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a TLS_PROTO_SSL3:.
e140: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
e150: 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 er ? SSLv3_serve
e160: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c r_method() : SSL
e170: 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 v3_client_method
e180: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
e190: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
e1a0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
e1b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e1c0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
e1d0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e1e0: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 1_METHOD). ca
e1f0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
e200: 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 1:..method = isS
e210: 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 erver ? TLSv1_se
e220: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
e230: 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 TLSv1_client_met
e240: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
e250: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
e260: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
e270: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
e280: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 L_NO_TLS1_1) &&
e290: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e2a0: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f _NO_TLS1_1_METHO
e2b0: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
e2c0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d PROTO_TLS1_1:..m
e2d0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
e2e0: 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 ? TLSv1_1_serve
e2f0: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 r_method() : TLS
e300: 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 v1_1_client_meth
e310: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 od();..break;.#e
e320: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
e330: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 d(NO_TLS1_2) &&
e340: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e350: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 _NO_TLS1_2) && !
e360: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e370: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 NO_TLS1_2_METHOD
e380: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
e390: 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 ROTO_TLS1_2:..me
e3a0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
e3b0: 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 ? TLSv1_2_server
e3c0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 _method() : TLSv
e3d0: 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 1_2_client_metho
e3e0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e d();..break;.#en
e3f0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e400: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 (NO_TLS1_3) && !
e410: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e420: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 NO_TLS1_3). c
e430: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
e440: 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 S1_3:../* Use th
e450: 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 e generic method
e460: 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 and constraint
e470: 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 range after cont
e480: 65 78 74 20 69 73 20 63 72 65 61 74 65 64 20 2a ext is created *
e490: 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 /..method = isSe
e4a0: 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 rver ? TLS_serve
e4b0: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 r_method() : TLS
e4c0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 _client_method()
e4d0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
e4e0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f . default:../
e4f0: 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 * Negotiate high
e500: 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 est available SS
e510: 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f L/TLS version */
e520: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
e530: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 ver ? TLS_server
e540: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f _method() : TLS_
e550: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
e560: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
e570: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
e580: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 10100000L && !de
e590: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 fined(NO_SSL2) &
e5a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e5b0: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 SL_NO_SSL2)..off
e5c0: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
e5d0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
e5e0: 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f L2) ? 0 : SSL_
e5f0: 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 OP_NO_SSLv2);.#e
e600: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
e610: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 d(NO_SSL3) && !d
e620: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
e630: 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 O_SSL3)..off |=
e640: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
e650: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 TLS_PROTO_SSL3)
e660: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ? 0 : SSL_OP_N
e670: 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 O_SSLv3);.#endif
e680: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
e690: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
e6a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e6b0: 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 S1)..off |= (ENA
e6c0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
e6d0: 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 PROTO_TLS1) ?
e6e0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 0 : SSL_OP_NO_TL
e6f0: 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 Sv1);.#endif.#if
e700: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
e710: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
e720: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
e730: 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 _1)..off |= (ENA
e740: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
e750: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 PROTO_TLS1_1) ?
e760: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 0 : SSL_OP_NO_TL
e770: 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 Sv1_1);.#endif.#
e780: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
e790: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
e7a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e7b0: 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 S1_2)..off |= (E
e7c0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
e7d0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 S_PROTO_TLS1_2)
e7e0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
e7f0: 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 TLSv1_2);.#endif
e800: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
e810: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 _TLS1_3) && !def
e820: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e830: 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 TLS1_3)..off |=
e840: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
e850: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
e860: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ) ? 0 : SSL_OP_N
e870: 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 O_TLSv1_3);.#end
e880: 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d if..break;. }
e890: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
e8a0: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 error();.. ct
e8b0: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
e8c0: 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 method);. if
e8d0: 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e (!ctx) {..return
e8e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
e8f0: 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c if (getenv(SSL
e900: 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 KEYLOGFILE)) {..
e910: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c SSL_CTX_set_keyl
e920: 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c og_callback(ctx,
e930: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 KeyLogCallback)
e940: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 ;. }..#if !de
e950: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
e960: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e970: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
e980: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d if (proto ==
e990: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
e9a0: 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 3) {..SSL_CTX_se
e9b0: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
e9c0: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
e9d0: 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 VERSION);..SSL_C
e9e0: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f TX_set_max_proto
e9f0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
ea00: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 S1_3_VERSION);.
ea10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 }.#endif..
ea20: 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 /* Force cipher
ea30: 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 selection order
ea40: 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 by server */.
ea50: 20 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29 if (!isServer)
ea60: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f {..SSL_CTX_set_
ea70: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c options(ctx, SSL
ea80: 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 _OP_CIPHER_SERVE
ea90: 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 R_PREFERENCE);.
eaa0: 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 }..#if OPENSS
eab0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
eac0: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 < 0x10100000L.
ead0: 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 OpenSSL_add_a
eae0: 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b ll_algorithms();
eaf0: 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 /* Load ciphers
eb00: 20 61 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a and digests */.
eb10: 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f #endif.. SSL_
eb20: 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 CTX_set_app_data
eb30: 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 (ctx, (void*)int
eb40: 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 erp);./* remembe
eb50: 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 r the interprete
eb60: 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 r */. SSL_CTX
eb70: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 _set_options(ctx
eb80: 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f , SSL_OP_ALL);./
eb90: 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f * all SSL bug wo
eba0: 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 rkarounds */.
ebb0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 SSL_CTX_set_opt
ebc0: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 ions(ctx, SSL_OP
ebd0: 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 _NO_COMPRESSION)
ebe0: 3b 09 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d ;./* disable com
ebf0: 70 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 pression even if
ec00: 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 supported */.
ec10: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
ec20: 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b tions(ctx, off);
ec30: 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f ../* disable pro
ec40: 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a tocol versions *
ec50: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 /.#if OPENSSL_VE
ec60: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
ec70: 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 x10101000L. S
ec80: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 SL_CTX_set_mode(
ec90: 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 ctx, SSL_MODE_AU
eca0: 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 TO_RETRY);./* ha
ecb0: 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 ndle new handsha
ecc0: 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e kes in backgroun
ecd0: 64 2e 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 d. On by default
ece0: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e in OpenSSL 1.1.
ecf0: 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 1. */.#endif.
ed00: 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 SSL_CTX_sess_se
ed10: 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 t_cache_size(ctx
ed20: 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 , 128);.. /*
ed30: 53 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 Set user defined
ed40: 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 ciphers, cipher
ed50: 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 suites, and sec
ed60: 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 urity level */.
ed70: 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20 if ((ciphers
ed80: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c != NULL) && !SSL
ed90: 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f _CTX_set_cipher_
eda0: 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 list(ctx, cipher
edb0: 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e s)) {..Tcl_Appen
edc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
edd0: 22 53 65 74 20 63 69 70 68 65 72 73 20 66 61 69 "Set ciphers fai
ede0: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 led: No valid ci
edf0: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 phers", (char *)
ee00: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
ee10: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
ee20: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
ee30: 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 if ((ciphers
ee40: 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 uites != NULL) &
ee50: 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 & !SSL_CTX_set_c
ee60: 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c iphersuites(ctx,
ee70: 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29 20 ciphersuites))
ee80: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
ee90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
eea0: 20 63 69 70 68 65 72 20 73 75 69 74 65 73 20 66 cipher suites f
eeb0: 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 ailed: No valid
eec0: 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 ciphers", (char
eed0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 *) NULL);..SSL_C
eee0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 TX_free(ctx);..r
eef0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
ef00: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 }.. /* Set se
ef10: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a curity level */.
ef20: 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 if (level >
ef30: 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 -1 && level < 6)
ef40: 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 {../* SSL_set_s
ef50: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f ecurity_level */
ef60: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 ..SSL_CTX_set_se
ef70: 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 curity_level(ctx
ef80: 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a , level);. }.
ef90: 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 . /* set some
efa0: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 callbacks */.
efb0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 SSL_CTX_set_de
efc0: 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 fault_passwd_cb(
efd0: 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c ctx, PasswordCal
efe0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f lback);. SSL_
eff0: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
f000: 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 passwd_cb_userda
f010: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 ta(ctx, (void *)
f020: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
f030: 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65 /* read a Diffie
f040: 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 -Hellman paramet
f050: 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 ers file, or use
f060: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e the built-in on
f070: 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 e */. Tcl_DSt
f080: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 23 ringInit(&ds);.#
f090: 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f ifdef OPENSSL_NO
f0a0: 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 _DH. if (DHpa
f0b0: 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a rams != NULL) {.
f0c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
f0d0: 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 t(interp, "DH pa
f0e0: 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 rameter support
f0f0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 not available",
f100: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
f110: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
f120: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c x);..return NULL
f130: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 ;. }.#else.
f140: 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 {..DH* dh;..if
f150: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
f160: 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a LL) {.. BIO *
f170: 62 69 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20 3d bio;... bio =
f180: 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 BIO_new_file(F2
f190: 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 N(DHparams, &ds)
f1a0: 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 , "r");.. if
f1b0: 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 (!bio) {...Tcl_D
f1c0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
f1d0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
f1e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 ult(interp, "Cou
f1f0: 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 ld not find DH p
f200: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c arameters file",
f210: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
f220: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ...SSL_CTX_free(
f230: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e ctx);...return N
f240: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ULL;.. }...
f250: 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f dh = PEM_read_
f260: 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f bio_DHparams(bio
f270: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 , NULL, NULL, NU
f280: 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 LL);.. BIO_fr
f290: 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 ee(bio);.. Tc
f2a0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
f2b0: 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 s);.. if (!dh
f2c0: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
f2d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
f2e0: 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 Could not read D
f2f0: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f H parameters fro
f300: 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a m file", (char *
f310: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
f320: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
f330: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 return NULL;..
f340: 20 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 }.. SSL_CTX
f350: 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c _set_tmp_dh(ctx,
f360: 20 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 dh);.. DH_fr
f370: 65 65 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 ee(dh);...} else
f380: 20 7b 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 {.. /* Use w
f390: 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 ell known DH par
f3a0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 68 61 76 ameters that hav
f3b0: 65 20 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f e built-in suppo
f3c0: 72 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f rt in OpenSSL */
f3d0: 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 .. if (!SSL_C
f3e0: 54 58 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 TX_set_dh_auto(c
f3f0: 74 78 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f tx, 1)) {...Tcl_
f400: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f410: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 erp, "Could not
f420: 65 6e 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 enable set DH au
f430: 74 6f 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 to: ", GET_ERR_R
f440: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
f450: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
f460: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
f470: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 return NULL;..
f480: 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e }..}. }.#en
f490: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 dif.. /* set
f4a0: 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 our certificate
f4b0: 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 */. load_priv
f4c0: 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 ate_key = 0;.
f4d0: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d if (certfile !=
f4e0: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 NULL) {..load_p
f4f0: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a rivate_key = 1;.
f500: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 ..if (SSL_CTX_us
f510: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 e_certificate_fi
f520: 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 le(ctx, F2N(cert
f530: 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f file, &ds), SSL_
f540: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d FILETYPE_PEM) <=
f550: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 0) {.. Tcl_D
f560: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
f570: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
f580: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
f590: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 unable to set ce
f5a0: 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 rtificate file "
f5b0: 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 , certfile, ": "
f5c0: 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 ,...GET_ERR_REAS
f5d0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
f5e0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
f5f0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
f600: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
f610: 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 .}..Tcl_DStringF
f620: 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d ree(&ds);.. }
f630: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 else if (cert !
f640: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f = NULL) {..load_
f650: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b private_key = 1;
f660: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 ..if (SSL_CTX_us
f670: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 e_certificate_AS
f680: 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e N1(ctx, cert_len
f690: 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a , cert) <= 0) {.
f6a0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
f6b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
f6c0: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 nable to set cer
f6d0: 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 47 tificate: ",...G
f6e0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
f6f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
f700: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
f710: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
f720: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 turn NULL;..}.
f730: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 } else {..cert
f740: 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 file = (char*)X5
f750: 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 09_get_default_c
f760: 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 ert_file();...if
f770: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 (SSL_CTX_use_ce
f780: 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 rtificate_file(c
f790: 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 tx, certfile, SS
f7a0: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 L_FILETYPE_PEM)
f7b0: 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 <= 0) {.#if 0..
f7c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
f7d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 ult(interp, "una
f7e0: 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 ble to use defau
f7f0: 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 lt certificate f
f800: 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c ile ", certfile,
f810: 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 ": ",...GET_ERR
f820: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
f830: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
f840: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
f850: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
f860: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 ULL;.#endif..}.
f870: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 }.. /* set
f880: 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 our private key
f890: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 */. if (load
f8a0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a _private_key) {.
f8b0: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 .if (keyfile ==
f8c0: 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e NULL && key == N
f8d0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 ULL) {.. keyf
f8e0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
f8f0: 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 .}...if (keyfile
f900: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
f910: 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 /* get the priv
f920: 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 ate key associat
f930: 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 ed with this cer
f940: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
f950: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 if (keyfile ==
f960: 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c NULL) {...keyfil
f970: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 e = certfile;..
f980: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 }... if (S
f990: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 SL_CTX_use_Priva
f9a0: 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 teKey_file(ctx,
f9b0: 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 F2N(keyfile, &ds
f9c0: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ), SSL_FILETYPE_
f9d0: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 PEM) <= 0) {...T
f9e0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
f9f0: 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 ds);.../* flush
fa00: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 the passphrase w
fa10: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 hich might be le
fa20: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 ft in the result
fa30: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 */...Tcl_SetRes
fa40: 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c ult(interp, NULL
fa50: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 , TCL_STATIC);..
fa60: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
fa70: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
fa80: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 e to set public
fa90: 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 key file ", keyf
faa0: 69 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20 20 20 ile, " ",...
fab0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
fac0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
fad0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
fae0: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
faf0: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 NULL;.. }..
fb00: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
fb10: 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 e(&ds);...} else
fb20: 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c if (key != NULL
fb30: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c ) {.. if (SSL
fb40: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 _CTX_use_Private
fb50: 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 Key_ASN1(EVP_PKE
fb60: 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c Y_RSA, ctx, key,
fb70: 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b key_len) <= 0) {
fb80: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 .../* flush the
fb90: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 passphrase which
fba0: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 might be left i
fbb0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a n the result */.
fbc0: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
fbd0: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 interp, NULL, TC
fbe0: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c L_STATIC);...Tcl
fbf0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
fc00: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
fc10: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a set public key:
fc20: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
fc30: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
fc40: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
fc50: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
fc60: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
fc70: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b ..}../* Now we k
fc80: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 now that a key a
fc90: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 nd cert have bee
fca0: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 n set against..
fcb0: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 * the SSL contex
fcc0: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 t */..if (!SSL_C
fcd0: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 TX_check_private
fce0: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 _key(ctx)) {..
fcf0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
fd00: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 lt(interp, "priv
fd10: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 ate key does not
fd20: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 match the certi
fd30: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 ficate public ke
fd40: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 y",.... (cha
fd50: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
fd60: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
fd70: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
fd80: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a NULL;..}. }..
fd90: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 /* Set to us
fda0: 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 e default locati
fdb0: 6f 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 on and file for
fdc0: 43 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 Certificate Auth
fdd0: 6f 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 ority (CA) certi
fde0: 66 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20 20 ficates. The.
fdf0: 20 20 2a 20 76 65 72 69 66 79 20 70 61 74 68 20 * verify path
fe00: 61 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65 and store can be
fe10: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 overridden by t
fe20: 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 he SSL_CERT_DIR
fe30: 65 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65 72 env var. The ver
fe40: 69 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 ify file can.
fe50: 20 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64 65 * be overridde
fe60: 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 n by the SSL_CER
fe70: 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 T_FILE env var.
fe80: 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f */. if (!SSL_
fe90: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
fea0: 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 verify_paths(ctx
feb0: 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 )) {..abort++;.
fec0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 }.. /* Ove
fed0: 72 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43 rrides for the C
fee0: 41 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e A verify path an
fef0: 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a d file */. {.
ff00: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
ff10: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
ff20: 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41 0000000L..if (CA
ff30: 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 path != NULL ||
ff40: 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 CAfile != NULL)
ff50: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 {.. Tcl_DStri
ff60: 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c ng ds1;.. Tcl
ff70: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
ff80: 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53 1);... if (!S
ff90: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 SL_CTX_load_veri
ffa0: 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 fy_locations(ctx
ffb0: 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 , F2N(CAfile, &d
ffc0: 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 s), F2N(CApath,
ffd0: 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 &ds1))) {...abor
ffe0: 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 t++;.. }..
fff0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
10000 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
10010 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 DStringFree(&ds1
10020 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 );... /* Set
10030 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 list of CAs to s
10040 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 end to client wh
10050 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 en requesting a
10060 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 client certifica
10070 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 te */.. /* ht
10080 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 tps://sourceforg
10090 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 e.net/p/tls/bugs
100a0 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 /57/ */.. /*
100b0 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 XXX:TODO: Let th
100c0 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 e user supply va
100d0 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 lues here instea
100e0 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 d of something t
100f0 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 hat exists on th
10100 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a e filesystem */.
10110 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 . STACK_OF(X5
10120 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 09_NAME) *certNa
10130 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 mes = SSL_load_c
10140 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 lient_CA_file(F2
10150 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b N(CAfile, &ds));
10160 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 .. if (certNa
10170 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 mes != NULL) {..
10180 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 .SSL_CTX_set_cli
10190 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c ent_CA_list(ctx,
101a0 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 certNames);..
101b0 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
101c0 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
101d0 7d 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 41 }..#else..if (CA
101e0 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a path != NULL) {.
101f0 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
10200 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 X_load_verify_di
10210 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 r(ctx, F2N(CApat
10220 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 h, &ds))) {...ab
10230 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 ort++;.. }..
10240 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
10250 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 ee(&ds);..}..if
10260 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 (CAfile != NULL)
10270 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c {.. if (!SSL
10280 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 _CTX_load_verify
10290 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 _file(ctx, F2N(C
102a0 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a Afile, &ds))) {.
102b0 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 ..abort++;..
102c0 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
102d0 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 ngFree(&ds);...
102e0 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f /* Set list o
102f0 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f f CAs to send to
10300 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 client when req
10310 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 uesting a client
10320 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
10330 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 . STACK_OF(X5
10340 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 09_NAME) *certNa
10350 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 mes = SSL_load_c
10360 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 lient_CA_file(F2
10370 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b N(CAfile, &ds));
10380 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 .. if (certNa
10390 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 mes != NULL) {..
103a0 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 .SSL_CTX_set_cli
103b0 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c ent_CA_list(ctx,
103c0 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 certNames);..
103d0 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
103e0 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
103f0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a }.#endif. }..
10400 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a return ctx;.
10410 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
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 0a 20 2a 0a ------------. *.
10460 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 * StatusObjCmd
10470 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 -- return certif
10480 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 icate for connec
10490 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 ted peer.. *. *
104a0 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
104b0 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
104c0 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
104d0 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
104e0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
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 0a 20 2a 2f 0a 73 74 61 --------. */.sta
10530 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 tic int.StatusOb
10540 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
10550 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
10560 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
10570 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
10580 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
10590 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
105a0 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 atePtr;. X509
105b0 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f *peer;. Tcl_
105c0 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 Obj *objPtr;.
105d0 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
105e0 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 n;. char *cha
105f0 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 nnelName, *ciphe
10600 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 rs;. int mode
10610 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
10620 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f gned char *proto
10630 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 ;. unsigned i
10640 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 nt len;. int
10650 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 76 nid, res;. (v
10660 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b oid) clientData;
10670 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
10680 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
10690 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 (objc < 2 || ob
106a0 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 jc > 3 || (objc
106b0 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 == 3 && !strcmp(
106c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
106d0 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 jv[1]), "-local"
106e0 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 ))) {..Tcl_Wrong
106f0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
10700 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 1, objv, "?-loca
10710 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 l? channel");..r
10720 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
10730 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 . }.. /* G
10740 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f et channel Id */
10750 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 . channelName
10760 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
10770 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 (objv[(objc == 2
10780 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20 ? 1 : 2)]);.
10790 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
107a0 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 hannel(interp, c
107b0 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 hannelName, &mod
107c0 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e e);. if (chan
107d0 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
107e0 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
107f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
10800 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
10810 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
10820 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
10830 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
10840 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
10850 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 hannel(chan);.
10860 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
10870 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
10880 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
10890 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 e()) {..Tcl_Appe
108a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
108b0 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
108c0 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
108d0 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 lName(chan),..."
108e0 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
108f0 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 annel", (char *)
10900 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 NULL);..Tcl_Set
10910 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
10920 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 , "TLS", "STATUS
10930 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
10940 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
10950 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
10960 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
10970 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d }. statePtr =
10980 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 (State *) Tcl_G
10990 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
109a0 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 eData(chan);..
109b0 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 /* Get certifi
109c0 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 cate for peer or
109d0 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 self */. if
109e0 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 (objc == 2) {..p
109f0 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 eer = SSL_get_pe
10a00 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 er_certificate(s
10a10 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
10a20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 } else {..pee
10a30 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 r = SSL_get_cert
10a40 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 ificate(statePtr
10a50 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 ->ssl);. }.
10a60 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 /* Get X509 ce
10a70 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a rtificate info *
10a80 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 20 /. if (peer)
10a90 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f {..objPtr = Tls_
10aa0 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 NewX509Obj(inter
10ab0 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f p, peer);..if (o
10ac0 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 bjc == 2) {..
10ad0 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 X509_free(peer)
10ae0 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 ;.. peer = NU
10af0 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 LL;..}. } els
10b00 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 e {..objPtr = Tc
10b10 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
10b20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL);. }..
10b30 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a /* Peer name *
10b40 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 /. LAPPEND_ST
10b50 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
10b60 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 , "peername", SS
10b70 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 L_get0_peername(
10b80 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 statePtr->ssl),
10b90 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 -1);. LAPPEND
10ba0 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
10bb0 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 Ptr, "sbits", SS
10bc0 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 L_get_cipher_bit
10bd0 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c s(statePtr->ssl,
10be0 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 NULL));.. ci
10bf0 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 phers = (char*)S
10c00 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 SL_get_cipher(st
10c10 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
10c20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
10c30 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
10c40 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c ipher", ciphers,
10c50 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 -1);.. /* Ve
10c60 72 69 66 79 20 74 68 65 20 58 35 30 39 20 63 65 rify the X509 ce
10c70 72 74 69 66 69 63 61 74 65 20 70 72 65 73 65 6e rtificate presen
10c80 74 65 64 20 62 79 20 74 68 65 20 70 65 65 72 20 ted by the peer
10c90 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 */. LAPPEND_S
10ca0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10cb0 72 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 r, "verifyResult
10cc0 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f ",..X509_verify_
10cd0 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e cert_error_strin
10ce0 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 g(SSL_get_verify
10cf0 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 _result(statePtr
10d00 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 ->ssl)), -1);..
10d10 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 /* Verify mod
10d20 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 e */. mode =
10d30 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d SSL_get_verify_m
10d40 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ode(statePtr->ss
10d50 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 l);. if (mode
10d60 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e && SSL_VERIFY_N
10d70 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f ONE) {..LAPPEND_
10d80 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
10d90 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 tr, "verifyMode"
10da0 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 , "none", -1);.
10db0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c } else {..Tcl
10dc0 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 _Obj *listObjPtr
10dd0 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
10de0 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 j(0, NULL);..if
10df0 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 (mode && SSL_VER
10e00 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 IFY_PEER) {..
10e10 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
10e20 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
10e30 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 , listObjPtr, Tc
10e40 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
10e50 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a peer", -1));..}.
10e60 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c .if (mode && SSL
10e70 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f _VERIFY_FAIL_IF_
10e80 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a NO_PEER_CERT) {.
10e90 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
10ea0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
10eb0 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 terp, listObjPtr
10ec0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10ed0 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 bj("fail if no p
10ee0 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b eer cert", -1));
10ef0 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 ..}..if (mode &&
10f00 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 SSL_VERIFY_CLIE
10f10 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 NT_ONCE) {..
10f20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
10f30 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
10f40 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
10f50 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 _NewStringObj("c
10f60 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 lient once", -1)
10f70 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 );..}..if (mode
10f80 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f && SSL_VERIFY_PO
10f90 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a ST_HANDSHAKE) {.
10fa0 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
10fb0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
10fc0 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 terp, listObjPtr
10fd0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
10fe0 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 bj("post handsha
10ff0 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c ke", -1));..}..L
11000 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 APPEND_OBJ(inter
11010 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 p, objPtr, "veri
11020 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a fyMode", listObj
11030 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 Ptr). }..
11040 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 /* Verify mode d
11050 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 epth */. LAPP
11060 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 END_INT(interp,
11070 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 objPtr, "verifyD
11080 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 epth", SSL_get_v
11090 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 erify_depth(stat
110a0 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 ePtr->ssl));..
110b0 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 /* Report the
110c0 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f selected protoco
110d0 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 l as a result of
110e0 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e the negotiation
110f0 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 */. SSL_get0
11100 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 _alpn_selected(s
11110 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 tatePtr->ssl, &p
11120 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 roto, &len);.
11130 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
11140 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c erp, objPtr, "al
11150 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f pn", (char *)pro
11160 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c to, (Tcl_Size) l
11170 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 en);. LAPPEND
11180 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11190 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c Ptr, "protocol",
111a0 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e SSL_get_version
111b0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
111c0 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 -1);.. /* Va
111d0 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 lid for non-RSA
111e0 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c signature and TL
111f0 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 S 1.3 */. if
11200 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 (objc == 2) {..r
11210 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 es = SSL_get_pee
11220 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 r_signature_nid(
11230 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
11240 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 nid);. } else
11250 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 {..res = SSL_ge
11260 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 t_signature_nid(
11270 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
11280 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 nid);. }.
11290 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d if (!res) {nid =
112a0 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 0;}. LAPPEND
112b0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
112c0 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 Ptr, "signatureH
112d0 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f ashAlgorithm", O
112e0 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 BJ_nid2ln(nid),
112f0 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 -1);.. /* Add
11300 65 64 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e ed in OpenSSL 1.
11310 31 2e 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 1.1a */.#if OPEN
11320 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
11330 45 52 20 3e 20 30 78 31 30 31 30 31 30 30 30 4c ER > 0x10101000L
11340 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d . if (objc ==
11350 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 2) {..res = SSL
11360 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 _get_peer_signat
11370 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 ure_type_nid(sta
11380 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
11390 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
113a0 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 .res = SSL_get_s
113b0 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 ignature_type_ni
113c0 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
113d0 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 &nid);. }.
113e0 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 if (!res) {nid
113f0 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 = 0;}. LAPPE
11400 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11410 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 bjPtr, "signatur
11420 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 eType", OBJ_nid2
11430 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23 65 ln(nid), -1);.#e
11440 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 ndif.. Tcl_Se
11450 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
11460 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
11470 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
11480 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
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 0a 20 2a 0a 20 -----------. *.
114d0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f * ConnectionInfo
114e0 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
114f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f connection info
11500 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 from OpenSSL..
11510 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
11520 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 .A list of conne
11530 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 ction info. *.
11540 2a 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
11590 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 int ConnectionI
115a0 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 nfoObjCmd(Client
115b0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
115c0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
115d0 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
115e0 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
115f0 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
11600 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
11610 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
11620 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a set a mode on *
11630 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
11640 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e tePtr;../* clien
11650 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
11660 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 socket */. Tc
11670 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a l_Obj *objPtr, *
11680 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e listPtr;. con
11690 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 st SSL *ssl;.
116a0 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 const SSL_CIPHE
116b0 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 R *cipher;. c
116c0 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e onst SSL_SESSION
116d0 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 *session;. c
116e0 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b onst EVP_MD *md;
116f0 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
11700 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 ntData;.. if
11710 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
11720 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
11730 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
11740 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
11750 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
11760 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 }.. chan
11770 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
11780 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
11790 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c String(objv[1]),
117a0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
117b0 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
117c0 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
117d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
117e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
117f0 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
11800 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
11810 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
11820 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
11830 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
11840 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 ;. if (Tcl_Ge
11850 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
11860 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
11870 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
11880 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
11890 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
118a0 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
118b0 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
118c0 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 .. "\": not a
118d0 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 TLS channel", (
118e0 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
118f0 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
11900 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
11910 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 "CONNECTION", "C
11920 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
11930 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
11940 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
11950 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
11960 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
11970 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
11980 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e L);.. /* Conn
11990 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 ection info */.
119a0 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
119b0 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
119c0 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
119d0 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c a(chan);. ssl
119e0 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c = statePtr->ssl
119f0 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d ;. if (ssl !=
11a00 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e NULL) {../* con
11a10 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f nection state */
11a20 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
11a30 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11a40 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 tate", SSL_state
11a50 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c _string_long(ssl
11a60 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 ), -1);.../* Get
11a70 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 SNI requested s
11a80 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c erver name */..L
11a90 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11aa0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 p, objPtr, "serv
11ab0 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 ername", SSL_get
11ac0 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c _servername(ssl,
11ad0 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 TLSEXT_NAMETYPE
11ae0 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 _host_name), -1)
11af0 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f ;.../* Get proto
11b00 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f col */..LAPPEND_
11b10 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11b20 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 tr, "protocol",
11b30 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 SSL_get_version(
11b40 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 ssl), -1);.../*
11b50 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c Renegotiation al
11b60 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e lowed */..LAPPEN
11b70 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
11b80 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 bjPtr, "renegoti
11b90 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 ation_allowed",
11ba0 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 SSL_get_secure_r
11bb0 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 enegotiation_sup
11bc0 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c port((SSL *) ssl
11bd0 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 ));.../* Get sec
11be0 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 urity level */..
11bf0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
11c00 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 rp, objPtr, "sec
11c10 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 urity_level", SS
11c20 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c L_get_security_l
11c30 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a evel(ssl));.../*
11c40 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f Session info */
11c50 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
11c60 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11c70 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c session_reused",
11c80 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 SSL_session_reu
11c90 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 sed(ssl));.../*
11ca0 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a Is server info *
11cb0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
11cc0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11cd0 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c "is_server", SSL
11ce0 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 _is_server(ssl))
11cf0 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a ;.../* Is DTLS *
11d00 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
11d10 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11d20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 "is_dtls", SSL_i
11d30 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20 s_dtls(ssl));.
11d40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 }.. /* Ciph
11d50 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 er info */. c
11d60 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f ipher = SSL_get_
11d70 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 current_cipher(s
11d80 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 sl);. if (cip
11d90 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 her != NULL) {..
11da0 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d char buf[BUFSIZ]
11db0 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 = {0};..int bit
11dc0 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f s, alg_bits;.../
11dd0 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f * Cipher name */
11de0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
11df0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
11e00 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 ipher", SSL_CIPH
11e10 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 ER_get_name(ciph
11e20 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 er), -1);.../* R
11e30 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 FC name of ciphe
11e40 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 r */..LAPPEND_ST
11e50 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11e60 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 , "standard_name
11e70 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 ", SSL_CIPHER_st
11e80 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 andard_name(ciph
11e90 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f er), -1);.../* O
11ea0 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 penSSL name of c
11eb0 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e ipher */..LAPPEN
11ec0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11ed0 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e jPtr, "openssl_n
11ee0 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 ame", OPENSSL_ci
11ef0 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 pher_name(SSL_CI
11f00 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 PHER_standard_na
11f10 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 me(cipher)), -1)
11f20 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 ;.../* number of
11f30 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73 65 secret bits use
11f40 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a d for cipher */.
11f50 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 .bits = SSL_CIPH
11f60 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 ER_get_bits(ciph
11f70 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a er, &alg_bits);.
11f80 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 .LAPPEND_INT(int
11f90 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
11fa0 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 cret_bits", bits
11fb0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 );..LAPPEND_INT(
11fc0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11fd0 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 "algorithm_bits"
11fe0 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a , alg_bits);../*
11ff0 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 alg_bits is act
12000 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 ual key secret b
12010 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 its. If use bits
12020 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 and secret (alg
12030 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 orithm) bits dif
12040 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 fer,.. the res
12050 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 t of the bits ar
12060 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f e fixed, i.e. fo
12070 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 r limited export
12080 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c ciphers (bits <
12090 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 56) */.../* Ind
120a0 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53 4c icates which SSL
120b0 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 /TLS protocol ve
120c0 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 rsion first defi
120d0 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20 2a ned the cipher *
120e0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
120f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12100 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 min_version", SS
12110 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 L_CIPHER_get_ver
12120 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 sion(cipher), -1
12130 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e );.../* Cipher N
12140 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 ID */..LAPPEND_S
12150 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12160 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20 r, "cipherNID",
12170 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 (char *)OBJ_nid2
12180 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ln(SSL_CIPHER_ge
12190 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70 t_cipher_nid(cip
121a0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 her)), -1);..LAP
121b0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
121c0 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74 objPtr, "digest
121d0 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 NID", (char *)OB
121e0 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 J_nid2ln(SSL_CIP
121f0 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e HER_get_digest_n
12200 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 id(cipher)), -1)
12210 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
12220 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12230 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c keyExchangeNID",
12240 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 (char *)OBJ_nid
12250 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 2ln(SSL_CIPHER_g
12260 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 et_kx_nid(cipher
12270 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e )), -1);..LAPPEN
12280 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
12290 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63 jPtr, "authentic
122a0 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 ationNID", (char
122b0 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 *)OBJ_nid2ln(SS
122c0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74 L_CIPHER_get_aut
122d0 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 h_nid(cipher)),
122e0 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 -1);.../* messag
122f0 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e e authentication
12300 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69 code - Cipher i
12310 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d s AEAD (e.g. GCM
12320 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c or ChaCha20/Pol
12330 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f y1305) or not */
12340 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74 ../* Authenticat
12350 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 ed Encryption wi
12360 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 th associated da
12370 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b 20 ta (AEAD) check
12380 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
12390 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
123a0 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64 "cipher_is_aead
123b0 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 ", SSL_CIPHER_is
123c0 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a _aead(cipher));.
123d0 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64 ../* Digest used
123e0 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f during the SSL/
123f0 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68 TLS handshake wh
12400 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 70 en using the cip
12410 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 her. */..md = SS
12420 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e L_CIPHER_get_han
12430 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69 dshake_digest(ci
12440 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f pher);..LAPPEND_
12450 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12460 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 tr, "handshake_d
12470 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 igest", (char *)
12480 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c EVP_MD_name(md),
12490 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f -1);.../* Get O
124a0 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 penSSL-specific
124b0 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 ID, not IANA ID
124c0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 */..LAPPEND_INT(
124d0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
124e0 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e "cipher_id", (in
124f0 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 t) SSL_CIPHER_ge
12500 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a t_id(cipher));..
12510 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20 ./* Two-byte ID
12520 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20 used in the TLS
12530 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 protocol of the
12540 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a given cipher */.
12550 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 .LAPPEND_INT(int
12560 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 erp, objPtr, "pr
12570 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 otocol_id", (int
12580 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 ) SSL_CIPHER_get
12590 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 _protocol_id(cip
125a0 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 her));.../* Text
125b0 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 ual description
125c0 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f of the cipher */
125d0 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 ..if (SSL_CIPHER
125e0 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 _description(cip
125f0 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 her, buf, sizeof
12600 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 (buf)) != NULL)
12610 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 {.. LAPPEND_S
12620 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12630 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 r, "description"
12640 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 , buf, -1);..}.
12650 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 }.. /* Ses
12660 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 sion info */.
12670 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 session = SSL_g
12680 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b et_session(ssl);
12690 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e . if (session
126a0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e != NULL) {..con
126b0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
126c0 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f *ticket;..size_
126d0 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 t len2;..unsigne
126e0 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e d int ulen;..con
126f0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
12700 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 *session_id, *p
12710 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 roto;..unsigned
12720 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f char buffer[SSL_
12730 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c MAX_MASTER_KEY_L
12740 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 ENGTH];.../* Rep
12750 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 ort the selected
12760 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 protocol as a r
12770 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 esult of the ALP
12780 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f N negotiation */
12790 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 ..SSL_SESSION_ge
127a0 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 t0_alpn_selected
127b0 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f (session, &proto
127c0 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 , &len2);..LAPPE
127d0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
127e0 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 bjPtr, "alpn", (
127f0 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 char *) proto, (
12800 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b Tcl_Size) len2);
12810 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 .../* Report the
12820 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 selected protoc
12830 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f ol as a result o
12840 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 f the NPN negoti
12850 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 ation */.#ifdef
12860 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 USE_NPN..SSL_get
12870 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 0_next_proto_neg
12880 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 otiated(ssl, &pr
12890 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 oto, &ulen);..LA
128a0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
128b0 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c , objPtr, "npn",
128c0 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c (char *) proto,
128d0 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e (Tcl_Size) ulen
128e0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 );.#endif.../* R
128f0 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e esumable session
12900 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
12910 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
12920 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 , "resumable", S
12930 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 SL_SESSION_is_re
12940 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 sumable(session)
12950 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
12960 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f start time (seco
12970 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 nds since epoch)
12980 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e */..LAPPEND_LON
12990 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 G(interp, objPtr
129a0 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 , "start_time",
129b0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
129c0 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a time(session));.
129d0 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c ../* Timeout val
129e0 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 ue - SSL_CTX_get
129f0 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 _timeout (in sec
12a00 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e onds) */..LAPPEN
12a10 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f D_LONG(interp, o
12a20 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 bjPtr, "timeout"
12a30 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 , SSL_SESSION_ge
12a40 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f t_timeout(sessio
12a50 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f n));.../* Sessio
12a60 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 n id - TLSv1.2 a
12a70 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f nd below only */
12a80 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 ..session_id = S
12a90 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 SL_SESSION_get_i
12aa0 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e d(session, &ulen
12ab0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
12ac0 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
12ad0 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c r, "session_id",
12ae0 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 session_id, (Tc
12af0 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a l_Size) ulen);..
12b00 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 ./* Session cont
12b10 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f ext */..session_
12b20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e id = SSL_SESSION
12b30 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 _get0_id_context
12b40 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 (session, &ulen)
12b50 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 ;..LAPPEND_BARRA
12b60 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 Y(interp, objPtr
12b70 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 , "session_conte
12b80 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c xt", session_id,
12b90 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e (Tcl_Size) ulen
12ba0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
12bb0 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 ticket - client
12bc0 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 only */..SSL_SES
12bd0 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
12be0 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 (session, &ticke
12bf0 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 t, &len2);..LAPP
12c00 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 END_BARRAY(inter
12c10 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 p, objPtr, "sess
12c20 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 ion_ticket", tic
12c30 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 ket, (Tcl_Size)
12c40 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 len2);.../* Sess
12c50 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 ion ticket lifet
12c60 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 ime hint (in sec
12c70 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e onds) */..LAPPEN
12c80 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f D_LONG(interp, o
12c90 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 bjPtr, "lifetime
12ca0 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 ", SSL_SESSION_g
12cb0 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 et_ticket_lifeti
12cc0 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 me_hint(session)
12cd0 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 );.../* Ticket a
12ce0 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f pp data */.#if O
12cf0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
12d00 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
12d10 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 00L..SSL_SESSION
12d20 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 _get0_ticket_app
12d30 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49 4f data((SSL_SESSIO
12d40 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 74 N *) session, &t
12d50 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 icket, &len2);..
12d60 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
12d70 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12d80 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 ticket_app_data"
12d90 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 , ticket, (Tcl_S
12da0 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 ize) len2);.#end
12db0 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 if.../* Get mast
12dc0 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 er key */..len2
12dd0 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
12de0 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 t_master_key(ses
12df0 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 sion, buffer, SS
12e00 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 L_MAX_MASTER_KEY
12e10 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 _LENGTH);..LAPPE
12e20 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 ND_BARRAY(interp
12e30 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 , objPtr, "maste
12e40 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 r_key", buffer,
12e50 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
12e60 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 ;.../* Compressi
12e70 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e on id */..unsign
12e80 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f ed int id = SSL_
12e90 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 SESSION_get_comp
12ea0 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 ress_id(session)
12eb0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
12ec0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12ed0 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c compression_id",
12ee0 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 id == 1 ? "zlib
12ef0 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b " : "none", -1);
12f00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
12f10 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 ompression info
12f20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 */. if (ssl !
12f30 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 = NULL) {.#ifdef
12f40 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 HAVE_SSL_COMPRE
12f50 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d SSION..const COM
12f60 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 P_METHOD *comp,
12f70 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 *expn;..comp = S
12f80 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 SL_get_current_c
12f90 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b ompression(ssl);
12fa0 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 ..expn = SSL_get
12fb0 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 _current_expansi
12fc0 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 on(ssl);...LAPPE
12fd0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
12fe0 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 bjPtr, "compress
12ff0 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c ion", comp ? SSL
13000 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 _COMP_get_name(c
13010 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d omp) : "none", -
13020 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 1);..LAPPEND_STR
13030 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
13040 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 "expansion", ex
13050 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 pn ? SSL_COMP_ge
13060 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 t_name(expn) : "
13070 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 none", -1);.#els
13080 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 e..LAPPEND_STR(i
13090 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
130a0 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e compression", "n
130b0 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 one", -1);..LAPP
130c0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
130d0 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 objPtr, "expansi
130e0 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 on", "none", -1)
130f0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a ;.#endif. }..
13100 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e /* Server in
13110 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e fo */. {..lon
13120 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 g mode = SSL_CTX
13130 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 _get_session_cac
13140 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 he_mode(statePtr
13150 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d ->ctx);..char *m
13160 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 sg;...if (mode &
13170 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
13180 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 OFF) {.. msg
13190 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 = "off";..} else
131a0 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
131b0 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e SESS_CACHE_CLIEN
131c0 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 T) {.. msg =
131d0 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 "client";..} els
131e0 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c e if (mode & SSL
131f0 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 _SESS_CACHE_SERV
13200 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d ER) {.. msg =
13210 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c "server";..} el
13220 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
13230 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 L_SESS_CACHE_BOT
13240 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 H) {.. msg =
13250 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 "both";..} else
13260 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e {.. msg = "un
13270 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 known";..}..LAPP
13280 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
13290 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
132a0 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 _cache_mode", ms
132b0 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 g, -1);. }..
132c0 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f /* CA List */
132d0 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 . /* IF not a
132e0 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 server, same as
132f0 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 SSL_get0_peer_C
13300 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 A_list. If serve
13310 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 r same as SSL_CT
13320 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f X_get_client_CA_
13330 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 list */. list
13340 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
13350 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 tObj(0, NULL);.
13360 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 STACK_OF(X509
13370 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b _NAME) *ca_list;
13380 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 . if ((ca_lis
13390 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 t = SSL_get_clie
133a0 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 nt_CA_list(ssl))
133b0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 != NULL) {..cha
133c0 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d r buffer[BUFSIZ]
133d0 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 ;..for (int i =
133e0 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 0; i < sk_X509_N
133f0 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 AME_num(ca_list)
13400 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 ; i++) {.. X5
13410 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 09_NAME *name =
13420 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c sk_X509_NAME_val
13430 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a ue(ca_list, i);.
13440 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b . if (name) {
13450 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 ...X509_NAME_one
13460 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 line(name, buffe
13470 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 r, BUFSIZ);...Tc
13480 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
13490 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
134a0 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 istPtr, Tcl_NewS
134b0 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c tringObj(buffer,
134c0 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d -1));.. }..}
134d0 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 . }. LAPPE
134e0 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f ND_OBJ(interp, o
134f0 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c bjPtr, "caList",
13500 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c listPtr);. L
13510 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 APPEND_INT(inter
13520 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 p, objPtr, "caLi
13530 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 stCount", sk_X50
13540 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 9_NAME_num(ca_li
13550 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 st));.. Tcl_S
13560 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
13570 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
13580 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
13590 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
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 0a 20 2a 0a ------------. *.
135e0 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 * VersionObjCmd
135f0 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 -- return versi
13600 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f on string from O
13610 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 penSSL.. *. * Re
13620 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
13630 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
13640 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
13650 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
13660 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
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 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
136b0 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a c int.VersionObj
136c0 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
136d0 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
136e0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
136f0 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
13700 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
13710 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f {. Tcl_Obj *o
13720 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 bjPtr;. (void
13730 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 ) clientData;.
13740 20 20 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a 20 (void) objc;.
13750 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b 0a (void) objv;.
13760 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
13770 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a lled");.. obj
13780 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 Ptr = Tcl_NewStr
13790 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 ingObj(OPENSSL_V
137a0 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 ERSION_TEXT, -1)
137b0 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
137c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
137d0 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 bjPtr);.. ret
137e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
137f0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 4d --------. *. * M
13840 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 iscObjCmd -- mis
13850 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a c commands. *. *
13860 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
13870 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
13880 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
13890 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
138a0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
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 0a 20 2a 2f 0a 73 74 ---------. */.st
138f0 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a atic int.MiscObj
13900 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
13910 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
13920 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
13930 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
13940 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
13950 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e {. static con
13960 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 st char *command
13970 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 s [] = { "req",
13980 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d "strreq", NULL }
13990 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 ;. enum comma
139a0 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 nd { C_REQ, C_ST
139b0 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b RREQ, C_DUMMY };
139c0 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d . Tcl_Size cm
139d0 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 74 72 d;. int isStr
139e0 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 65 ;. char buffe
139f0 72 5b 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 76 r[16384];. (v
13a00 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b oid) clientData;
13a10 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
13a20 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
13a30 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 (objc < 2) {..T
13a40 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
13a50 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
13a60 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 "subcommand ?ar
13a70 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 gs?");..return T
13a80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
13a90 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 if (Tcl_GetI
13aa0 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 ndexFromObj(inte
13ab0 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d rp, objv[1], com
13ac0 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 mands, "command"
13ad0 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 , 0, &cmd) != TC
13ae0 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
13af0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
13b00 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
13b10 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 error();.. is
13b20 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f Str = (cmd == C_
13b30 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 STRREQ);. swi
13b40 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 tch ((enum comma
13b50 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 nd) cmd) {..case
13b60 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f C_REQ:..case C_
13b70 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 STRREQ: {.. E
13b80 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 VP_PKEY *pkey=NU
13b90 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 LL;.. X509 *c
13ba0 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 ert=NULL;.. X
13bb0 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 509_NAME *name=N
13bc0 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 ULL;.. Tcl_Ob
13bd0 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 j **listv;..
13be0 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a Tcl_Size listc;.
13bf0 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 . int i;...
13c00 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b BIO *out=NULL;
13c10 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 ... char *k_C
13c20 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f ="",*k_ST="",*k_
13c30 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f L="",*k_O="",*k_
13c40 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a OU="",*k_CN="",*
13c50 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 k_Email="";..
13c60 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 char *keyout,*p
13c70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 emout,*str;..
13c80 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 int keysize,ser
13c90 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a ial=0,days=365;.
13ca0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
13cb0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
13cc0 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 30000000L.. B
13cd0 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c IGNUM *bne = NUL
13ce0 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 L;.. RSA *rsa
13cf0 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 = NULL;.#else..
13d00 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 EVP_PKEY_CTX
13d10 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 *ctx = NULL;.#e
13d20 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 ndif... if ((
13d30 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 objc<5) || (objc
13d40 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f >6)) {...Tcl_Wro
13d50 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
13d60 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 , 2, objv, "keys
13d70 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 ize keyfile cert
13d80 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 file ?info?");..
13d90 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
13da0 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 R;.. }...
13db0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 if (Tcl_GetIntFr
13dc0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
13dd0 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 jv[2], &keysize)
13de0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 != TCL_OK) {...
13df0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
13e00 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 ;.. }.. ke
13e10 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 yout=Tcl_GetStri
13e20 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 ng(objv[3]);..
13e30 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 pemout=Tcl_Get
13e40 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b String(objv[4]);
13e50 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29 .. if (isStr)
13e60 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 {...Tcl_SetVar(
13e70 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 interp,keyout,""
13e80 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 ,0);...Tcl_SetVa
13e90 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c r(interp,pemout,
13ea0 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 "",0);.. }...
13eb0 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 if (objc>=6)
13ec0 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 {...if (Tcl_Lis
13ed0 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
13ee0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c interp, objv[5],
13ef0 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 &listc, &listv)
13f00 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 != TCL_OK) {...
13f10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
13f20 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 RROR;...}....if
13f30 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 ((listc%2) != 0)
13f40 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 {... Tcl_Set
13f50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 Result(interp,"I
13f60 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 nformation list
13f70 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e must have even n
13f80 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e umber of argumen
13f90 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ts",NULL);...
13fa0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
13fb0 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d R;...}...for (i=
13fc0 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 0; i<listc; i+=2
13fd0 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 ) {... str=Tc
13fe0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
13ff0 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 v[i]);... if
14000 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 (strcmp(str,"day
14010 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 s")==0) {....if
14020 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
14030 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b bj(interp,listv[
14040 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c i+1],&days)!=TCL
14050 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 _OK).... retu
14060 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
14070 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
14080 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 trcmp(str,"seria
14090 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 l")==0) {....if
140a0 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
140b0 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b bj(interp,listv[
140c0 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 i+1],&serial)!=T
140d0 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 CL_OK).... re
140e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
140f0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
14100 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 (strcmp(str,"C")
14110 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 ==0) {....k_C=Tc
14120 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
14130 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
14140 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
14150 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b (str,"ST")==0) {
14160 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 ....k_ST=Tcl_Get
14170 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
14180 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
14190 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
141a0 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "L")==0) {....k_
141b0 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 L=Tcl_GetString(
141c0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
141d0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
141e0 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 rcmp(str,"O")==0
141f0 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 ) {....k_O=Tcl_G
14200 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
14210 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
14220 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
14230 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"OU")==0) {...
14240 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 .k_OU=Tcl_GetStr
14250 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
14260 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
14270 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e (strcmp(str,"CN
14280 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e ")==0) {....k_CN
14290 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
142a0 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
142b0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
142c0 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 cmp(str,"Email")
142d0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 ==0) {....k_Emai
142e0 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 l=Tcl_GetString(
142f0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
14300 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 } else {....T
14310 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
14320 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 erp,"Unknown par
14330 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 ameter",NULL);..
14340 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
14350 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a OR;... }...}.
14360 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e . }..#if OPEN
14370 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
14380 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
14390 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e .. bne = BN_n
143a0 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d ew();.. rsa =
143b0 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 RSA_new();..
143c0 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 pkey = EVP_PKEY
143d0 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 _new();.. if
143e0 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 (bne == NULL ||
143f0 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 rsa == NULL || p
14400 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 key == NULL || !
14410 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c BN_set_word(bne,
14420 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 RSA_F4) ||...!RS
14430 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 A_generate_key_e
14440 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 x(rsa, keysize,
14450 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 bne, NULL) || !E
14460 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 VP_PKEY_assign_R
14470 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b SA(pkey, rsa)) {
14480 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
14490 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 (pkey);.../* RSA
144a0 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 _free(rsa); free
144b0 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 d by EVP_PKEY_fr
144c0 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 ee */...BN_free(
144d0 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 bne);.#else..
144e0 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f pkey = EVP_RSA_
144f0 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e gen((unsigned in
14500 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 t) keysize);..
14510 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 ctx = EVP_PKEY
14520 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 _CTX_new(pkey,NU
14530 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b LL);.. if (pk
14540 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 ey == NULL || ct
14550 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 x == NULL || !EV
14560 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e P_PKEY_keygen_in
14570 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 it(ctx) ||...!EV
14580 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 P_PKEY_CTX_set_r
14590 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 sa_keygen_bits(c
145a0 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 tx, keysize) ||
145b0 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e !EVP_PKEY_keygen
145c0 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a (ctx, &pkey)) {.
145d0 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 ..EVP_PKEY_free(
145e0 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 pkey);...EVP_PKE
145f0 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b Y_CTX_free(ctx);
14600 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 .#endif...Tcl_Se
14610 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
14620 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 Error generating
14630 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 private key",NU
14640 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 LL);...return TC
14650 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 L_ERROR;.. }
14660 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 else {...if (isS
14670 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d tr) {... out=
14680 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 BIO_new(BIO_s_me
14690 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f m());... PEM_
146a0 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 write_bio_Privat
146b0 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 eKey(out,pkey,NU
146c0 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e LL,NULL,0,NULL,N
146d0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 ULL);... i=BI
146e0 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 O_read(out,buffe
146f0 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 r,sizeof(buffer)
14700 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c -1);... i=(i<
14710 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 0) ? 0 : i;...
14720 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 buffer[i]='\0'
14730 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 ;... Tcl_SetV
14740 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 ar(interp,keyout
14750 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 ,buffer,0);...
14760 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 BIO_flush(out)
14770 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 ;... BIO_free
14780 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 (out);...} else
14790 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f {... out=BIO_
147a0 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 new(BIO_s_file()
147b0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 );... BIO_wri
147c0 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c te_filename(out,
147d0 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 keyout);... P
147e0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 EM_write_bio_Pri
147f0 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 vateKey(out,pkey
14800 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c ,NULL,NULL,0,NUL
14810 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f L,NULL);... /
14820 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f * PEM_write_bio_
14830 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 RSAPrivateKey(ou
14840 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 t, rsa, NULL, NU
14850 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c LL, 0, NULL, NUL
14860 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f L); */... BIO
14870 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a _free_all(out);.
14880 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 . .}....if ((cer
14890 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e t=X509_new())==N
148a0 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c ULL) {... Tcl
148b0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
148c0 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 p,"Error generat
148d0 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20 ing certificate
148e0 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a request",NULL);.
148f0 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 .. EVP_PKEY_f
14900 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
14910 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
14920 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
14930 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 00L... BN_fre
14940 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 e(bne);.#endif..
14950 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
14960 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 ERROR;...}....X5
14970 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 09_set_version(c
14980 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 ert,2);...ASN1_I
14990 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f NTEGER_set(X509_
149a0 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 get_serialNumber
149b0 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a (cert),serial);.
149c0 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 ..X509_gmtime_ad
149d0 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 j(X509_getm_notB
149e0 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a efore(cert),0);.
149f0 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 ..X509_gmtime_ad
14a00 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 j(X509_getm_notA
14a10 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 fter(cert),(long
14a20 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b )60*60*24*days);
14a30 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b ...X509_set_pubk
14a40 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a ey(cert,pkey);..
14a50 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f ..name=X509_get_
14a60 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 subject_name(cer
14a70 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 t);....X509_NAME
14a80 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
14a90 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 t(name,"C", MBST
14aa0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
14ab0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
14ac0 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 ) k_C, -1, -1, 0
14ad0 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
14ae0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
14af0 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 name,"ST", MBSTR
14b00 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
14b10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
14b20 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 k_ST, -1, -1, 0
14b30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
14b40 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
14b50 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 name,"L", MBSTRI
14b60 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
14b70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
14b80 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b k_L, -1, -1, 0);
14b90 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
14ba0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
14bb0 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 me,"O", MBSTRING
14bc0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
14bd0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
14be0 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 O, -1, -1, 0);..
14bf0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
14c00 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
14c10 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f ,"OU", MBSTRING_
14c20 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
14c30 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f gned char *) k_O
14c40 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 U, -1, -1, 0);..
14c50 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
14c60 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
14c70 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f ,"CN", MBSTRING_
14c80 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
14c90 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 gned char *) k_C
14ca0 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 N, -1, -1, 0);..
14cb0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
14cc0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
14cd0 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 ,"Email", MBSTRI
14ce0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
14cf0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
14d00 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c k_Email, -1, -1,
14d10 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 0);....X509_set
14d20 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 _subject_name(ce
14d30 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 rt,name);....if
14d40 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 (!X509_sign(cert
14d50 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 ,pkey,EVP_sha256
14d60 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 ())) {... X50
14d70 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 9_free(cert);...
14d80 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 EVP_PKEY_fre
14d90 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 e(pkey);.#if OPE
14da0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
14db0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
14dc0 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 L... BN_free(
14dd0 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 bne);.#endif...
14de0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
14df0 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 (interp,"Error s
14e00 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 igning certifica
14e10 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 te",NULL);...
14e20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
14e30 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 R;...}....if (is
14e40 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 Str) {... out
14e50 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d =BIO_new(BIO_s_m
14e60 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d em());... PEM
14e70 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 _write_bio_X509(
14e80 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 out,cert);...
14e90 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c i=BIO_read(out,
14ea0 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 buffer,sizeof(bu
14eb0 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 ffer)-1);...
14ec0 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b i=(i<0) ? 0 : i;
14ed0 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d ... buffer[i]
14ee0 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c ='\0';... Tcl
14ef0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 _SetVar(interp,p
14f00 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b emout,buffer,0);
14f10 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 ... BIO_flush
14f20 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f (out);... BIO
14f30 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 _free(out);...}
14f40 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 else {... out
14f50 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 =BIO_new(BIO_s_f
14f60 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 ile());... BI
14f70 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 O_write_filename
14f80 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 (out,pemout);...
14f90 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
14fa0 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 o_X509(out,cert)
14fb0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 ;... BIO_free
14fc0 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a _all(out);...}..
14fd0 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 ..X509_free(cert
14fe0 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 );...EVP_PKEY_fr
14ff0 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 ee(pkey);.#if OP
15000 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
15010 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
15020 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 0L...BN_free(bne
15030 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d );.#endif.. }
15040 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 ..}..break;.
15050 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b default:..break;
15060 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
15070 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
15080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15090 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 ***/./* Init
150a0 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a */./***
150b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
150c0 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d */../*. *-------
150d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150f0 2d 2d 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 0a 20 2a 0a ------------. *.
15110 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 * Tls_Free --.
15120 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
15130 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 ure cleans up wh
15140 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 en a SSL socket
15150 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a based channel. *
15160 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 .is closed and i
15170 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 ts reference cou
15180 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 nt falls below 1
15190 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
151a0 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
151b0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
151c0 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
151d0 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
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 0a 20 2a 2f 0a -----------. */.
15220 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 74 6c void.Tls_Free(tl
15230 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 62 6c 6f s_free_type *blo
15240 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 ckPtr) {. Sta
15250 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
15260 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 State *)blockPtr
15270 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
15280 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 Called");.. T
15290 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 ls_Clean(statePt
152a0 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 r);. ckfree(b
152b0 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a lockPtr);.}.../*
152c0 0a 20 2a 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
15310 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 _Clean --. *. *.
15320 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 This procedure c
15330 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 leans up when a
15340 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 SSL socket based
15350 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 channel. *.is c
15360 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 losed and its re
15370 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 ference count fa
15380 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 lls below 1. Th
15390 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 is should. *.be
153a0 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f called synchrono
153b0 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 usly by the Clos
153c0 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 eProc, not in th
153d0 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 e. *.EventuallyF
153e0 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a ree callback.. *
153f0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
15400 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 none. *. * Side
15410 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 effects:. *.Free
15420 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a s all the state.
15430 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
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 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
15480 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 d Tls_Clean(Stat
15490 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 e *statePtr) {.
154a0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
154b0 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ed");.. /*.
154c0 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d * we're assum
154d0 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65 ing here that we
154e0 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 're single-threa
154f0 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ded. */.
15500 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 if (statePtr->ti
15510 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 mer != (Tcl_Time
15520 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a rToken) NULL) {.
15530 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 .Tcl_DeleteTimer
15540 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 Handler(statePtr
15550 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 ->timer);..state
15560 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c Ptr->timer = NUL
15570 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 L;. }.. if
15580 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 (statePtr->prot
15590 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 os) {..ckfree(st
155a0 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b atePtr->protos);
155b0 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
155c0 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d os = NULL;. }
155d0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
155e0 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 r->bio) {../* Th
155f0 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c is will call SSL
15600 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 _shutdown. Bug 1
15610 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 414045 */..dprin
15620 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c tf("BIO_free_all
15630 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
15640 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 >bio);..BIO_free
15650 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 _all(statePtr->b
15660 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e io);..statePtr->
15670 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 bio = NULL;.
15680 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
15690 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 tr->ssl) {..dpri
156a0 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 ntf("SSL_free(%p
156b0 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 )", statePtr->ss
156c0 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 l);..SSL_free(st
156d0 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 atePtr->ssl);..s
156e0 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e tatePtr->ssl = N
156f0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
15700 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 f (statePtr->ctx
15710 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 ) {..SSL_CTX_fre
15720 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 e(statePtr->ctx)
15730 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ;..statePtr->ctx
15740 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
15750 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
15760 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 >callback) {..Tc
15770 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
15780 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
15790 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 k);..statePtr->c
157a0 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a allback = NULL;.
157b0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
157c0 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
157d0 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
157e0 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
157f0 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 password);..stat
15800 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
15810 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
15820 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
15830 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 cmd) {..Tcl_Decr
15840 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
15850 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 r->vcmd);..state
15860 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c Ptr->vcmd = NULL
15870 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
15880 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 intf("Returning"
15890 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
158a0 2d 2d 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 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 --. *. * Build I
158f0 6e 66 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 nfo Command --.
15900 2a 0a 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d *. *.Create comm
15910 61 6e 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75 and to return bu
15920 69 6c 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 ild info for pac
15930 6b 61 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 kage.. *. * Resu
15940 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
15950 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a rd Tcl result. *
15960 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
15970 3a 0a 20 2a 09 43 72 65 61 74 65 64 20 62 75 69 :. *.Created bui
15980 6c 64 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e ld-info command.
15990 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
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 0a 20 2a 2f ------------. */
159e0 0a 0a 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 ..#ifndef STRING
159f0 49 46 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 IFY.# define ST
15a00 52 49 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e RINGIFY(x) STRIN
15a10 47 49 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 GIFY1(x).# defi
15a20 6e 65 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 ne STRINGIFY1(x)
15a30 20 23 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a #x.#endif..int.
15a40 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 BuildInfoCommand
15a50 28 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 (Tcl_Interp* int
15a60 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 erp) {. Tcl_C
15a70 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 mdInfo info;..
15a80 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d if (Tcl_GetCom
15a90 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c mandInfo(interp,
15aa0 20 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 "::tcl::build-i
15ab0 6e 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a nfo", &info)) {.
15ac0 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f .Tcl_CreateObjCo
15ad0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
15ae0 3a 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f :tls::build-info
15af0 22 2c 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c ", info.objProc,
15b00 20 28 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 (void *)(...PAC
15b10 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 KAGE_VERSION "+"
15b20 20 53 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 STRINGIFY(TLS_V
15b30 45 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 ERSION_UUID).#if
15b40 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 defined(__clang
15b50 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f __) && defined(_
15b60 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a _clang_major__).
15b70 09 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 ... ".clang-"
15b80 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 STRINGIFY(__cla
15b90 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 ng_major__).#if
15ba0 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 __clang_minor__
15bb0 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a < 10.... "0".
15bc0 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 #endif.... ST
15bd0 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f RINGIFY(__clang_
15be0 6d 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a minor__).#endif.
15bf0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 #if defined(__cp
15c00 6c 75 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 lusplus) && !def
15c10 69 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 ined(__OBJC__)..
15c20 09 09 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 .. ".cplusplu
15c30 73 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 s".#endif.#ifnde
15c40 66 20 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 f NDEBUG....
15c50 22 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a ".debug".#endif.
15c60 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 #if !defined(__c
15c70 6c 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 lang__) && !defi
15c80 6e 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 ned(__INTEL_COMP
15c90 49 4c 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 ILER) && defined
15ca0 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 (__GNUC__)....
15cb0 20 20 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 ".gcc-" STRING
15cc0 49 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 IFY(__GNUC__).#i
15cd0 66 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f f __GNUC_MINOR__
15ce0 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 < 10.... "0"
15cf0 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 .#endif.... S
15d00 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f TRINGIFY(__GNUC_
15d10 4d 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a MINOR__).#endif.
15d20 23 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 #ifdef __INTEL_C
15d30 4f 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 OMPILER.... "
15d40 2e 69 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 .icc-" STRINGIFY
15d50 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 (__INTEL_COMPILE
15d60 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 R).#endif.#ifdef
15d70 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 TCL_MEM_DEBUG..
15d80 09 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 .. ".memdebug
15d90 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ".#endif.#if def
15da0 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 ined(_MSC_VER)..
15db0 09 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 .. ".msvc-" S
15dc0 54 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 TRINGIFY(_MSC_VE
15dd0 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 R).#endif.#ifdef
15de0 20 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 USE_NMAKE....
15df0 20 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 ".nmake".#endi
15e00 66 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 f.#ifndef TCL_CF
15e10 47 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 G_OPTIMIZED....
15e20 20 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 ".no-optimize
15e30 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ".#endif.#ifdef
15e40 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 __OBJC__....
15e50 22 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 ".objective-c".#
15e60 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c if defined(__cpl
15e70 75 73 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 usplus).... "
15e80 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 plusplus".#endif
15e90 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 .#endif.#ifdef T
15ea0 43 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a CL_CFG_PROFILED.
15eb0 09 09 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 ... ".profile
15ec0 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ".#endif.#ifdef
15ed0 50 55 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e PURIFY.... ".
15ee0 70 75 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 purify".#endif.#
15ef0 69 66 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 ifdef STATIC_BUI
15f00 4c 44 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 LD.... ".stat
15f10 69 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 ic".#endif...),
15f20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL);. }.
15f30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
15f40 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
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 0a 20 2a 0a ------------. *.
15f90 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 * Tls_Init --.
15fa0 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 *. *.This is a p
15fb0 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a ackage initializ
15fc0 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c ation procedure,
15fd0 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 which is called
15fe0 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 . *.by Tcl when
15ff0 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 this package is
16000 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 to be added to a
16010 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 n interpreter..
16020 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 *. * Results: S
16030 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e sl configured an
16040 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 d loaded. *. * S
16050 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
16060 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 create the ssl
16070 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c command, initial
16080 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a ize ssl context.
16090 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
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 0a 20 2a 2f 0a 0a 23 69 --------. */..#i
160e0 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 f TCL_MAJOR_VERS
160f0 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 ION > 8.#define
16100 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 MIN_VERSION "9.0
16110 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 ".#else.#define
16120 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 MIN_VERSION "8.5
16130 22 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 ".#endif..static
16140 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 const char tlsT
16150 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d clInitScript[] =
16160 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 {.#include "tls
16170 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 .tcl.h"..0x00.
16180 20 20 7d 3b 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 };..DLLEXPORT
16190 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c int Tls_Init(Tcl
161a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 _Interp *interp)
161b0 20 7b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
161c0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64 "Called");..#ifd
161d0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 ef USE_TCL_STUBS
161e0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 . if (Tcl_Ini
161f0 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d tStubs(interp, M
16200 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d IN_VERSION, 0) =
16210 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
16220 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
16230 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 }.#endif. if
16240 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 (Tcl_PkgRequire
16250 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 (interp, "Tcl",
16260 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 MIN_VERSION, 0)
16270 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
16280 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
16290 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 }.. if (Tls
162a0 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 LibInit(0) != TC
162b0 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 L_OK) {..Tcl_App
162c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
162d0 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 , "could not ini
162e0 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 tialize SSL libr
162f0 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ary", (char *) N
16300 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
16310 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
16320 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
16330 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
16340 20 22 3a 3a 74 6c 73 3a 3a 63 69 70 68 65 72 73 "::tls::ciphers
16350 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 ", CiphersObjCmd
16360 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e , (ClientData) N
16370 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ULL, (Tcl_CmdDel
16380 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
16390 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
163a0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
163b0 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 p, "::tls::conne
163c0 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 ction", Connecti
163d0 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 onInfoObjCmd, (C
163e0 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c lientData) NULL,
163f0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
16400 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
16410 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
16420 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
16430 3a 3a 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 ::tls::handshake
16440 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 ", HandshakeObjC
16450 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
16460 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
16470 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
16480 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
16490 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
164a0 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70 erp, "::tls::imp
164b0 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 ort", ImportObjC
164c0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
164d0 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
164e0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
164f0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
16500 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
16510 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 69 erp, "::tls::uni
16520 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 mport", Unimport
16530 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
16540 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f ata) NULL, (Tcl_
16550 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
16560 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
16570 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
16580 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a (interp, "::tls:
16590 3a 75 6e 73 74 61 63 6b 22 2c 20 55 6e 69 6d 70 :unstack", Unimp
165a0 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 ortObjCmd, (Clie
165b0 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
165c0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
165d0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
165e0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
165f0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
16600 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 ls::status", Sta
16610 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 tusObjCmd, (Clie
16620 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
16630 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
16640 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
16650 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
16660 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
16670 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 ls::version", Ve
16680 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c rsionObjCmd, (Cl
16690 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
166a0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
166b0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
166c0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
166d0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
166e0 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 :tls::misc", Mis
166f0 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 cObjCmd, (Client
16700 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
16710 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
16720 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
16730 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
16740 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
16750 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 ::protocols", Pr
16760 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 otocolsObjCmd, (
16770 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
16780 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
16790 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a Proc *) NULL);..
167a0 20 20 20 20 42 75 69 6c 64 49 6e 66 6f 43 6f 6d BuildInfoCom
167b0 6d 61 6e 64 28 69 6e 74 65 72 70 29 3b 0a 0a 20 mand(interp);..
167c0 20 20 20 69 66 20 28 69 6e 74 65 72 70 20 26 26 if (interp &&
167d0 20 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 Tcl_Eval(interp
167e0 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 , tlsTclInitScri
167f0 70 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b pt) != TCL_OK) {
16800 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
16810 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 OR;. }.. r
16820 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f eturn Tcl_PkgPro
16830 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43 vide(interp, PAC
16840 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 KAGE_NAME, PACKA
16850 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a GE_VERSION);.}..
16860 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 0a -----------*. *.
168a0 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 *.Tls_SafeInit
168b0 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d --. *. *.-------
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 2a 0a 20 2a 09 53 74 ---------*. *.St
168f0 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 andard procedure
16900 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f required by 'lo
16910 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 ad'.. *.Initiali
16920 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 zes this extensi
16930 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e on for a safe in
16940 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d terpreter.. *.--
16950 2d 2d 2d 2d 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 2a 0a --------------*.
16980 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 *. *.Side effec
16990 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 ts:. *..As of 'T
169a0 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 ls_Init'. *. *.R
169b0 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 esult:. *..A sta
169c0 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 ndard Tcl error
169d0 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d code.. *. *-----
169e0 2d 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 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 -*. */.DLLEXPORT
16a20 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 int Tls_SafeIni
16a30 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e t(Tcl_Interp *in
16a40 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 terp) {. dpri
16a50 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 ntf("Called");.
16a60 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 49 6e return Tls_In
16a70 69 74 28 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 2f it(interp);.}../
16a80 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 0a 20 ----------*. *.
16ac0 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a *.TlsLibInit --.
16ad0 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.----------
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 2a 0a 20 2a 09 49 6e 69 74 69 ------*. *.Initi
16b10 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 alizes SSL libra
16b20 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c ry once per appl
16b30 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d ication. *.-----
16b40 2d 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 2a 0a 20 2a 0a -----------*. *.
16b70 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a *.Side effects:
16b80 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 . *..initializes
16b90 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a SSL library. *.
16ba0 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e *.Result:. *..n
16bb0 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
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 2a ---------------*
16bf0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
16c00 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 TlsLibInit(int u
16c10 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 ninitialize) {.
16c20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e static int in
16c30 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 itialized = 0;.
16c40 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 int status =
16c50 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 TCL_OK;.#if defi
16c60 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
16c70 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
16c80 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 TCL_THREADS).
16c90 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b size_t num_lock
16ca0 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 s;.#endif.. i
16cb0 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 f (uninitialize)
16cc0 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c {..if (!initial
16cd0 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72 ized) {.. dpr
16ce0 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 intf("Asked to u
16cf0 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 ninitialize, but
16d00 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 we are not init
16d10 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 ialized");...
16d20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
16d30 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73 .}...dprintf("As
16d40 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c ked to uninitial
16d50 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 ize");..#if defi
16d60 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
16d70 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
16d80 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 TCL_THREADS)..Tc
16d90 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 l_MutexLock(&ini
16da0 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 t_mx);...if (loc
16db0 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28 ks) {.. free(
16dc0 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63 locks);.. loc
16dd0 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 ks = NULL;..
16de0 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a locksCount = 0;.
16df0 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69 .}.#endif..initi
16e00 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 alized = 0;..#if
16e10 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
16e20 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
16e30 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
16e40 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f )..Tcl_MutexUnlo
16e50 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 ck(&init_mx);.#e
16e60 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 20 54 43 ndif...return TC
16e70 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 L_OK;. }..
16e80 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 if (initialized
16e90 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61 ) {..dprintf("Ca
16ea0 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20 lled, but using
16eb0 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a cached value");.
16ec0 09 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a .return status;.
16ed0 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
16ee0 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 tf("Called");..#
16ef0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
16f00 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
16f10 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
16f20 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 DS). Tcl_Mute
16f30 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b xLock(&init_mx);
16f40 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 .#endif. init
16f50 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 ialized = 1;..#i
16f60 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
16f70 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
16f80 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
16f90 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 S). num_locks
16fa0 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 = 1;. locksC
16fb0 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d ount = (int) num
16fc0 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b _locks;. lock
16fd0 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f s = malloc(sizeo
16fe0 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f f(*locks) * num_
16ff0 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 locks);. mems
17000 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a et(locks, 0, siz
17010 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 eof(*locks) * nu
17020 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 m_locks);.#endif
17030 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c .. /* Initial
17040 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 ize BOTH libcryp
17050 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a to and libssl. *
17060 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e /. OPENSSL_in
17070 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 it_ssl(OPENSSL_I
17080 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 NIT_LOAD_SSL_STR
17090 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 INGS | OPENSSL_I
170a0 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f NIT_LOAD_CRYPTO_
170b0 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 STRINGS..| OPENS
170c0 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f SL_INIT_ADD_ALL_
170d0 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 CIPHERS | OPENSS
170e0 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 L_INIT_ADD_ALL_D
170f0 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a IGESTS, NULL);..
17100 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 BIO_new_tcl(
17110 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 64 NULL, 0);..#if d
17120 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
17130 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
17140 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
17150 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b .Tcl_MutexUnlock
17160 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 (&init_mx);.#end
17170 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 73 if.. return s
17180 74 61 74 75 73 3b 0a 7d 0a tatus;.}.