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 20 57 65 d up).. * We
abe0: 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 only want to ad
abf0: 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69 just the bufferi
ac00: 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 ng in pre-v2 cha
ac10: 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 nnels, where.
ac20: 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c * each channel
ac30: 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 in the stack ma
ac40: 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e intained its own
ac50: 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a buffers.. *
ac60: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e /. Tcl_DStrin
ac70: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
ac80: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b nelTranslation);
ac90: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
aca0: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
acb0: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 elBlocking);.
acc0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
acd0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f (&upperChannelEO
ace0: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f FChar);. Tcl_
acf0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
ad00: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
ad10: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 g);. Tcl_GetC
ad20: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
ad30: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 erp, chan, "-eof
ad40: 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 char", &upperCha
ad50: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 nnelEOFChar);.
ad60: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
ad70: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
ad80: 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 han, "-encoding"
ad90: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 , &upperChannelE
ada0: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 ncoding);. Tc
adb0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_GetChannelOpti
adc0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
add0: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c "-translation",
ade0: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 &upperChannelTr
adf0: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 anslation);.
ae00: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
ae10: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
ae20: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 n, "-blocking",
ae30: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
ae40: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f cking);. Tcl_
ae50: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
ae60: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
ae70: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 -translation", "
ae80: 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 binary");. Tc
ae90: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
aea0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
aeb0: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 "-blocking", "t
aec0: 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e rue");. dprin
aed0: 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 tf("Consuming Tc
aee0: 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 l channel %s", T
aef0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
af00: 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 e(chan));. st
af10: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 atePtr->self = T
af20: 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 cl_StackChannel(
af30: 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e interp, Tls_Chan
af40: 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 nelType(), (Clie
af50: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
af60: 2c 0a 09 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 ,..(TCL_READABLE
af70: 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 | TCL_WRITABLE)
af80: 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 , chan);. dpr
af90: 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 68 intf("Created ch
afa0: 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c annel named %s",
afb0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
afc0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
afd0: 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 lf));. if (st
afe0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
aff0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
b000: 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f LL) {../*.. * No
b010: 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e use of Tcl_Even
b020: 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 tuallyFree becau
b030: 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 se no possible T
b040: 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a cl_Preserve... *
b050: 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 /..Tls_Free((tls
b060: 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 _free_type *) st
b070: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e atePtr);..return
b080: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
b090: 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 }.. Tcl_SetCh
b0a0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
b0b0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
b0c0: 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f lf, "-translatio
b0d0: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 n", Tcl_DStringV
b0e0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
b0f0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b elTranslation));
b100: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
b110: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
b120: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
b130: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 , "-encoding", T
b140: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
b150: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
b160: 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c oding));. Tcl
b170: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
b180: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
b190: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 tr->self, "-eofc
b1a0: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e har", Tcl_DStrin
b1b0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
b1c0: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 nnelEOFChar));.
b1d0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
b1e0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
b1f0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 statePtr->self,
b200: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c "-blocking", Tcl
b210: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
b220: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
b230: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44 ing));. Tcl_D
b240: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
b250: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
b260: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ion);. Tcl_DS
b270: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
b280: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
b290: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
b2a0: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e gFree(&upperChan
b2b0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
b2c0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
b2d0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
b2e0: 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a ocking);.. /*
b2f0: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 . * SSL Init
b300: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 ialization.
b310: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
b320: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 >ssl = SSL_new(s
b330: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 tatePtr->ctx);.
b340: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72 if (!statePtr
b350: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c ->ssl) {../* SSL
b360: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a library error *
b370: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 /..Tcl_AppendRes
b380: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 ult(interp, "cou
b390: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 ldn't construct
b3a0: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 ssl session: ",
b3b0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
b3c0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b3d0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
b3e0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
b3f0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
b400: 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 "INIT", "FAILED
b410: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
b420: 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 74 6c );..Tls_Free((tl
b430: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 s_free_type *) s
b440: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 tatePtr);..retur
b450: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
b460: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 }.. /* Set h
b470: 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 ost server name
b480: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 */. if (serve
b490: 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 rname) {../* Set
b4a0: 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d s the server nam
b4b0: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e e indication (SN
b4c0: 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c I) in ClientHell
b4d0: 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 o extension */..
b4e0: 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 2c /* Per RFC 6066,
b4f0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 hostname is a A
b500: 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 SCII encoded str
b510: 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 ing, though RFC
b520: 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 4366 says UTF-8.
b530: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 */..if (!SSL_se
b540: 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 t_tlsext_host_na
b550: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c me(statePtr->ssl
b560: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 , servername) &&
b570: 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 require) {..
b580: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
b590: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 53 t(interp, "Set S
b5a0: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 NI extension fai
b5b0: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f led: ", GET_ERR_
b5c0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
b5d0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b5e0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
b5f0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
b600: 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 IMPORT", "SNI",
b610: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
b620: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
b630: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 ls_Free((tls_fre
b640: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 e_type *) stateP
b650: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
b660: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
b670: 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 ./* Set hostname
b680: 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 for peer certif
b690: 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 icate hostname v
b6a0: 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 erification in c
b6b0: 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 lients... Don'
b6c0: 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 t use SSL_set1_h
b6d0: 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 ost since it has
b6e0: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f limitations. */
b6f0: 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f ..if (!SSL_add1_
b700: 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 host(statePtr->s
b710: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 sl, servername))
b720: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
b730: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b740: 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 "Set DNS hostna
b750: 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 me failed: ", GE
b760: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
b770: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
b780: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
b790: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
b7a0: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 LS", "IMPORT", "
b7b0: 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c HOSTNAME", "FAIL
b7c0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
b7d0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
b7e0: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 ee((tls_free_typ
b7f0: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a e *) statePtr);.
b800: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
b810: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
b820: 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 . /* Resume s
b830: 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 ession id */.
b840: 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 if (session_id
b850: 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f && strlen(sessio
b860: 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 n_id) <= SSL_MAX
b870: 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 _SID_CTX_LENGTH)
b880: 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 {../* SSL_set_s
b890: 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 ession() */..if
b8a0: 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 (!SSL_SESSION_se
b8b0: 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 t1_id_context(SS
b8c0: 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 L_get_session(st
b8d0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 0a 09 09 atePtr->ssl),...
b8e0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
b8f0: 63 68 61 72 20 2a 29 20 73 65 73 73 69 6f 6e 5f char *) session_
b900: 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e id, (unsigned in
b910: 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f t) strlen(sessio
b920: 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54 n_id))) {.. T
b930: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
b940: 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 interp, "Resume
b950: 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 session failed:
b960: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ", GET_ERR_REASO
b970: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
b980: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
b990: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
b9a0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
b9b0: 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 T", "SESSION", "
b9c0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
b9d0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c ) NULL);.. Tl
b9e0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
b9f0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
ba00: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
ba10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
ba20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 }.. /* Enab
ba30: 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c le Application-L
ba40: 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 ayer Protocol Ne
ba50: 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 gotiation. Examp
ba60: 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e les are: http/1.
ba70: 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 0,..http/1.1, h2
ba80: 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c , h3, ftp, imap,
ba90: 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 pop3, xmpp-clie
baa0: 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c nt, xmpp-server,
bab0: 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e mqtt, irc, etc.
bac0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e */. if (alpn
bad0: 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 ) {../* Convert
bae0: 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 a TCL list into
baf0: 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 a protocol-list
bb00: 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a in wire-format *
bb10: 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 /..unsigned char
bb20: 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 *protos, *p;..u
bb30: 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 nsigned int prot
bb40: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c os_len = 0;..Tcl
bb50: 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 _Size cnt, i;..i
bb60: 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a nt j;..Tcl_Obj *
bb70: 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c *list;...if (Tcl
bb80: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
bb90: 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e nts(interp, alpn
bba0: 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 , &cnt, &list) !
bbb0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
bbc0: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 Tls_Free((tls_f
bbd0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 ree_type *) stat
bbe0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
bbf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
bc00: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 .../* Determine
bc10: 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 the memory requi
bc20: 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 red for the prot
bc30: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f ocol-list */..fo
bc40: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e r (i = 0; i < cn
bc50: 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 t; i++) {.. T
bc60: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
bc70: 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 Obj(list[i], &le
bc80: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e n);.. if (len
bc90: 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f > 255) {...Tcl_
bca0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
bcb0: 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f erp, "ALPN proto
bcc0: 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f col names too lo
bcd0: 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ng", (char *) NU
bce0: 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 LL);...Tcl_SetEr
bcf0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
bd00: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
bd10: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 "ALPN", "FAILED
bd20: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
bd30: 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 74 );...Tls_Free((t
bd40: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 ls_free_type *)
bd50: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 statePtr);...ret
bd60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
bd70: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f }.. proto
bd80: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e s_len += 1 + (in
bd90: 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 t) len;..}.../*
bda0: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 Build the comple
bdb0: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 te protocol-list
bdc0: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b */..protos = ck
bdd0: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e alloc(protos_len
bde0: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d );../* protocol-
bdf0: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 lists consist of
be00: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 8-bit length-pr
be10: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 efixed, byte str
be20: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 ings */..for (j
be30: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b = 0, p = protos;
be40: 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b j < cnt; j++) {
be50: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 .. char *str
be60: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
be70: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 romObj(list[j],
be80: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b &len);.. *p++
be90: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 = (unsigned cha
bea0: 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d r) len;.. mem
beb0: 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a cpy(p, str, (siz
bec0: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 e_t) len);..
bed0: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f p += len;..}.../
bee0: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 * SSL_set_alpn_p
bef0: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f rotos makes a co
bf00: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 py of the protoc
bf10: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e ol-list */../* N
bf20: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 ote: This functi
bf30: 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68 65 20 on reverses the
bf40: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e return value con
bf50: 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 vention */..if (
bf60: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f SSL_set_alpn_pro
bf70: 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 tos(statePtr->ss
bf80: 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f l, protos, proto
bf90: 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 s_len)) {.. T
bfa0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
bfb0: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c 50 interp, "Set ALP
bfc0: 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c N protocols fail
bfd0: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 ed: ", GET_ERR_R
bfe0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
bff0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
c000: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
c010: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
c020: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 MPORT", "ALPN",
c030: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
c040: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *) NULL);.. T
c050: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 ls_Free((tls_fre
c060: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 e_type *) stateP
c070: 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 tr);.. ckfree
c080: 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 (protos);.. r
c090: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
c0a0: 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 ..}.../* Store p
c0b0: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f rotocols list */
c0c0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
c0d0: 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 os = protos;..st
c0e0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
c0f0: 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b en = protos_len;
c100: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 . } else {..s
c110: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
c120: 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 = NULL;..statePt
c130: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 r->protos_len =
c140: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0;. }.. /*
c150: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c . * SSL Call
c160: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 backs. */.
c170: 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 SSL_set_app_da
c180: 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ta(statePtr->ssl
c190: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
c1a0: 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 tr);./* point ba
c1b0: 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 ck to us */.
c1c0: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 SSL_set_verify(s
c1d0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 tatePtr->ssl, ve
c1e0: 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c rify, VerifyCall
c1f0: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 back);. SSL_s
c200: 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b et_info_callback
c210: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c220: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a InfoCallback);..
c230: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 /* Callback
c240: 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72 for observing pr
c250: 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 otocol messages
c260: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 */.#ifndef OPENS
c270: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a SL_NO_SSL_TRACE.
c280: 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f /* void SSL_
c290: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c CTX_set_msg_call
c2a0: 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 back_arg(statePt
c2b0: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 r->ctx, (void *)
c2c0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76 statePtr);. v
c2d0: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f oid SSL_CTX_set_
c2e0: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 msg_callback(sta
c2f0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 tePtr->ctx, Mess
c300: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f ageCallback); */
c310: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 . SSL_set_msg
c320: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 _callback_arg(st
c330: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f atePtr->ssl, (vo
c340: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
c350: 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f SSL_set_msg_
c360: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
c370: 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 r->ssl, MessageC
c380: 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 allback);.#endif
c390: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
c3a0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 Tcl_Channel BIO
c3b0: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 Handler */. s
c3c0: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d tatePtr->p_bio.=
c3d0: 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 BIO_new_tcl(sta
c3e0: 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f tePtr, BIO_NOCLO
c3f0: 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 SE);. statePt
c400: 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 r->bio.= BIO_new
c410: 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a (BIO_f_ssl());..
c420: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20 if (server)
c430: 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c {../* Server cal
c440: 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 lbacks */..SSL_C
c450: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 TX_set_tlsext_se
c460: 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 rvername_arg(sta
c470: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 tePtr->ctx, (voi
c480: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 d *)statePtr);..
c490: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 SSL_CTX_set_tlse
c4a0: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 xt_servername_ca
c4b0: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d llback(statePtr-
c4c0: 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 >ctx, SNICallbac
c4d0: 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 k);..SSL_CTX_set
c4e0: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 _client_hello_cb
c4f0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c500: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 HelloCallback, (
c510: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
c520: 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d ;..if (statePtr-
c530: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 >protos != NULL)
c540: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f {.. SSL_CTX_
c550: 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f set_alpn_select_
c560: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 cb(statePtr->ctx
c570: 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 , ALPNCallback,
c580: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c590: 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 );.#ifdef USE_NP
c5a0: 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f N.. if (tls1_
c5b0: 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 2 == 0 && tls1_3
c5c0: 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 == 0) {...SSL_C
c5d0: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 TX_set_next_prot
c5e0: 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62 os_advertised_cb
c5f0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c600: 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f NPNCallback, (vo
c610: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
c620: 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d . }.#endif..}
c630: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 .../* Enable ser
c640: 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 ver to send cert
c650: 20 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68 request after h
c660: 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e andshake (TLS 1.
c670: 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 3 only) */../* A
c680: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e write operation
c690: 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65 must take place
c6a0: 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 69 for the Certifi
c6b0: 63 61 74 65 20 52 65 71 75 65 73 74 20 74 6f 20 cate Request to
c6c0: 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74 be.. sent to t
c6d0: 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 he client, this
c6e0: 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68 can be done with
c6f0: 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b SSL_do_handshak
c700: 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 e(). */..if (req
c710: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e uest && post_han
c720: 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 dshake && tls1_3
c730: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 ) {.. SSL_ver
c740: 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f ify_client_post_
c750: 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 handshake(stateP
c760: 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f tr->ssl);..}.../
c770: 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 * set automatic
c780: 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 curve selection
c790: 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 */..SSL_set_ecdh
c7a0: 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e _auto(statePtr->
c7b0: 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 ssl, 1);.../* Se
c7c0: 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f t server mode */
c7d0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
c7e0: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 s |= TLS_TCL_SER
c7f0: 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 VER;..SSL_set_ac
c800: 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 cept_state(state
c810: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
c820: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 else {../* Clie
c830: 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a nt callbacks */.
c840: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
c850: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 if (statePtr->pr
c860: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 otos != NULL &&
c870: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 tls1_2 == 0 && t
c880: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 ls1_3 == 0) {..
c890: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e SSL_CTX_set_n
c8a0: 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 ext_proto_select
c8b0: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
c8c0: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c x, ALPNCallback,
c8d0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c8e0: 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 r);..}.#endif...
c8f0: 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69 /* Session cachi
c900: 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ng */..SSL_CTX_s
c910: 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 et_session_cache
c920: 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e _mode(statePtr->
c930: 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 ctx, SSL_SESS_CA
c940: 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c CHE_CLIENT | SSL
c950: 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 _SESS_CACHE_NO_I
c960: 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a NTERNAL_STORE);.
c970: 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 .SSL_CTX_sess_se
c980: 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 t_new_cb(statePt
c990: 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 r->ctx, SessionC
c9a0: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 allback);.../* E
c9b0: 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 nable post hands
c9c0: 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74 hake Authenticat
c9d0: 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 ion extension. T
c9e0: 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 LS 1.3 only, not
c9f0: 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 http/2. */..if
ca00: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 (request && post
ca10: 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 _handshake) {..
ca20: 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f SSL_set_post_
ca30: 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73 handshake_auth(s
ca40: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 tatePtr->ssl, 1)
ca50: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c ;..}.../* Set cl
ca60: 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 ient mode */..SS
ca70: 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 L_set_connect_st
ca80: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
ca90: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 l);. }. SS
caa0: 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 L_set_bio(stateP
cab0: 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 tr->ssl, statePt
cac0: 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 r->p_bio, stateP
cad0: 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 tr->p_bio);.
cae0: 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 BIO_set_ssl(stat
caf0: 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 ePtr->bio, state
cb00: 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f Ptr->ssl, BIO_NO
cb10: 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a CLOSE);.. /*.
cb20: 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 * End of SS
cb30: 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 L Init. */.
cb40: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
cb50: 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 rning %s", Tcl_G
cb60: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
cb70: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a atePtr->self));.
cb80: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
cb90: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 t(interp, (char
cba0: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *) Tcl_GetChanne
cbb0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
cbc0: 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 self), TCL_VOLAT
cbd0: 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 ILE);.. retur
cbe0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
cbf0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc10: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 55 6e 69 ------. *. * Uni
cc40: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 mportObjCmd --.
cc50: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
cc60: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ure is invoked t
cc70: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 o remove the top
cc80: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c most channel fil
cc90: 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ter.. *. * Resul
cca0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
ccb0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
ccc0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
ccd0: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 :. *.May modify
cce0: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 the behavior of
ccf0: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 an IO channel..
cd00: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
cd50: 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f ic int.UnimportO
cd60: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
cd70: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
cd80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
cd90: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
cda0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
cdb0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ) {. Tcl_Chan
cdc0: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 nel chan;../* Th
cdd0: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
cde0: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 a mode on. */.
cdf0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 (void) client
ce00: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e Data;.. dprin
ce10: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
ce20: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 if (objc != 2
ce30: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
ce40: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
ce50: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 objv, "channel"
ce60: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
ce70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
ce80: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
ce90: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
cea0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
ceb0: 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 v[1]), NULL);.
cec0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
ced0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
cee0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
cef0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
cf00: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
cf10: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
cf20: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
cf30: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
cf40: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
cf50: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 (chan);.. if
cf60: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
cf70: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
cf80: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
cf90: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
cfa0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
cfb0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
cfc0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
cfd0: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
cfe0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
cff0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
d000: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
d010: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
d020: 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 "TLS", "UNIMPOR
d030: 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 T", "CHANNEL", "
d040: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
d050: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
d060: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
d070: 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f }.. if (Tcl_
d080: 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 UnstackChannel(i
d090: 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 nterp, chan) ==
d0a0: 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 TCL_ERROR) {..re
d0b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
d0c0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 }.. retur
d0d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
d0e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
d0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d120: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 ------. *. * CTX
d130: 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 _Init -- constru
d140: 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 ct a SSL_CTX ins
d150: 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 tance. *. * Resu
d160: 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 lts:. *.A valid
d170: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 SSL_CTX instance
d180: 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 or NULL.. *. *
d190: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
d1a0: 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 .constructs SSL
d1b0: 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a context (CTX). *
d1c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
d1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d200: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
d210: 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f c SSL_CTX *.CTX_
d220: 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 Init(State *stat
d230: 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 ePtr, int isServ
d240: 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 er, int proto, c
d250: 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 har *keyfile, ch
d260: 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 ar *certfile,.
d270: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
d280: 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 *key, unsigned c
d290: 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b har *cert, int k
d2a0: 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 ey_len, int cert
d2b0: 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 _len, char *CApa
d2c0: 74 68 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 th,. char *CA
d2d0: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 file, char *ciph
d2e0: 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 ers, char *ciphe
d2f0: 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 rsuites, int lev
d300: 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 el, char *DHpara
d310: 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e ms) {. Tcl_In
d320: 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 terp *interp = s
d330: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
d340: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
d350: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 x = NULL;. Tc
d360: 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 l_DString ds;.
d370: 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 2c 20 61 int off = 0, a
d380: 62 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e bort = 0;. in
d390: 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b t load_private_k
d3a0: 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 ey;. const SS
d3b0: 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 L_METHOD *method
d3c0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
d3d0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
d3e0: 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 f (!proto) {..Tc
d3f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d400: 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 nterp, "no valid
d410: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 protocol select
d420: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
d430: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
d440: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a L;. }.. /*
d450: 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 create SSL cont
d460: 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 ext */.#if OPENS
d470: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
d480: 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c R >= 0x10100000L
d490: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 || defined(NO_S
d4a0: 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 SL2) || defined(
d4b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 OPENSSL_NO_SSL2)
d4c0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
d4d0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d4e0: 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f O_SSL2)) {..Tcl_
d4f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d500: 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f erp, "SSL2 proto
d510: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
d520: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
d530: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
d540: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ;. }.#endif.#
d550: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 if defined(NO_SS
d560: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f L3) || defined(O
d570: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a PENSSL_NO_SSL3).
d580: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
d590: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
d5a0: 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 _SSL3)) {..Tcl_A
d5b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
d5c0: 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 rp, "SSL3 protoc
d5d0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
d5e0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
d5f0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
d600: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
d610: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
d620: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 1) || defined(OP
d630: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 ENSSL_NO_TLS1).
d640: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
d650: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
d660: 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 TLS1)) {..Tcl_Ap
d670: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
d680: 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 p, "TLS 1.0 prot
d690: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
d6a0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
d6b0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
d6c0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
d6d0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
d6e0: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
d6f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d700: 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 1_1). if (ENA
d710: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
d720: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b PROTO_TLS1_1)) {
d730: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d740: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
d750: 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.1 protocol not
d760: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
d770: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
d780: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
d790: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
d7a0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c ned(NO_TLS1_2) |
d7b0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
d7c0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 L_NO_TLS1_2).
d7d0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
d7e0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
d7f0: 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 S1_2)) {..Tcl_Ap
d800: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
d810: 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 p, "TLS 1.2 prot
d820: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
d830: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
d840: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
d850: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
d860: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
d870: 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_3) || define
d880: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d890: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 1_3). if (ENA
d8a0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
d8b0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b PROTO_TLS1_3)) {
d8c0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
d8d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 lt(interp, "TLS
d8e0: 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 1.3 protocol not
d8f0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
d900: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
d910: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
d920: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 .#endif. if (
d930: 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f proto == 0) {../
d940: 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 * Use full range
d950: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 */..SSL_CTX_set
d960: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _min_proto_versi
d970: 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c on(ctx, 0);..SSL
d980: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f _CTX_set_max_pro
d990: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
d9a0: 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 0);. }.. s
d9b0: 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a witch (proto) {.
d9c0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
d9d0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
d9e0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
d9f0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
da00: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
da10: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 L_NO_SSL2). c
da20: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 ase TLS_PROTO_SS
da30: 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 L2:..method = is
da40: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 Server ? SSLv2_s
da50: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a erver_method() :
da60: 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 SSLv2_client_me
da70: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
da80: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
da90: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
daa0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
dab0: 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 _NO_SSL3) && !de
dac0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
dad0: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 _SSL3_METHOD).
dae0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
daf0: 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d _SSL3:..method =
db00: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 isServer ? SSLv
db10: 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 3_server_method(
db20: 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 ) : SSLv3_client
db30: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
db40: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
db50: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
db60: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
db70: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 SSL_NO_TLS1) &&
db80: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
db90: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 _NO_TLS1_METHOD)
dba0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
dbb0: 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f OTO_TLS1:..metho
dbc0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
dbd0: 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 LSv1_server_meth
dbe0: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 od() : TLSv1_cli
dbf0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
dc00: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
dc10: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
dc20: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
dc30: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
dc40: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
dc50: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
dc60: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 1_METHOD). ca
dc70: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
dc80: 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 1_1:..method = i
dc90: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f sServer ? TLSv1_
dca0: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 1_server_method(
dcb0: 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 ) : TLSv1_1_clie
dcc0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
dcd0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
dce0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
dcf0: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
dd00: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
dd10: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
dd20: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
dd30: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 _METHOD). cas
dd40: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
dd50: 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 _2:..method = is
dd60: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 Server ? TLSv1_2
dd70: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
dd80: 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e : TLSv1_2_clien
dd90: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
dda0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
ddb0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
ddc0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
ddd0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
dde0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
ddf0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a ROTO_TLS1_3:../*
de00: 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 69 63 Use the generic
de10: 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 method and cons
de20: 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74 traint range aft
de30: 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 er context is cr
de40: 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 eated */..method
de50: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
de60: 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 S_server_method(
de70: 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d ) : TLS_client_m
de80: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b ethod();..break;
de90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 .#endif. defa
dea0: 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 ult:../* Negotia
deb0: 74 65 20 68 69 67 68 65 73 74 20 61 76 61 69 6c te highest avail
dec0: 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 able SSL/TLS ver
ded0: 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 sion */..method
dee0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
def0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
df00: 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 : TLS_client_me
df10: 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e thod();.#if OPEN
df20: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
df30: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
df40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
df50: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 SSL2) && !define
df60: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
df70: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 2)..off |= (ENAB
df80: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
df90: 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 ROTO_SSL2) ? 0
dfa0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c : SSL_OP_NO_SSL
dfb0: 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 v2);.#endif.#if
dfc0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 !defined(NO_SSL3
dfd0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
dfe0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 ENSSL_NO_SSL3)..
dff0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
e000: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
e010: 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 _SSL3) ? 0 : S
e020: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b SL_OP_NO_SSLv3);
e030: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
e040: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 ined(NO_TLS1) &&
e050: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
e060: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 L_NO_TLS1)..off
e070: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
e080: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
e090: 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 1) ? 0 : SSL_O
e0a0: 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e P_NO_TLSv1);.#en
e0b0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
e0c0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 (NO_TLS1_1) && !
e0d0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
e0e0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 NO_TLS1_1)..off
e0f0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
e100: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
e110: 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 1_1) ? 0 : SSL_O
e120: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 P_NO_TLSv1_1);.#
e130: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
e140: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 ed(NO_TLS1_2) &&
e150: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
e160: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 L_NO_TLS1_2)..of
e170: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
e180: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
e190: 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c LS1_2) ? 0 : SSL
e1a0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b _OP_NO_TLSv1_2);
e1b0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
e1c0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 ined(NO_TLS1_3)
e1d0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e1e0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 SSL_NO_TLS1_3)..
e1f0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
e200: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
e210: 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 _TLS1_3) ? 0 : S
e220: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 SL_OP_NO_TLSv1_3
e230: 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b );.#endif..break
e240: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
e250: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
e260: 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 . ctx = SSL_C
e270: 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a TX_new(method);.
e280: 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a if (!ctx) {.
e290: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
e2a0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 }.. if (get
e2b0: 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c env(SSLKEYLOGFIL
e2c0: 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 E)) {..SSL_CTX_s
e2d0: 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 et_keylog_callba
e2e0: 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 ck(ctx, KeyLogCa
e2f0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a llback);. }..
e300: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
e310: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
e320: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
e330: 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 LS1_3). if (p
e340: 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 roto == TLS_PROT
e350: 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c O_TLS1_3) {..SSL
e360: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f _CTX_set_min_pro
e370: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
e380: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b TLS1_3_VERSION);
e390: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 ..SSL_CTX_set_ma
e3a0: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 x_proto_version(
e3b0: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
e3c0: 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 ION);. }.#end
e3d0: 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 if.. /* Force
e3e0: 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f cipher selectio
e3f0: 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 n order by serve
e400: 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 r */. if (!is
e410: 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 Server) {..SSL_C
e420: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 TX_set_options(c
e430: 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 tx, SSL_OP_CIPHE
e440: 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 R_SERVER_PREFERE
e450: 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 NCE);. }..#if
e460: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
e470: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
e480: 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 0000L. OpenSS
e490: 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 L_add_all_algori
e4a0: 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 thms(); /* Load
e4b0: 63 69 70 68 65 72 73 20 61 6e 64 20 64 69 67 65 ciphers and dige
e4c0: 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 sts */.#endif..
e4d0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 SSL_CTX_set_a
e4e0: 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f pp_data(ctx, (vo
e4f0: 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 id*)interp);./*
e500: 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 remember the int
e510: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 erpreter */.
e520: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
e530: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f ons(ctx, SSL_OP_
e540: 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c ALL);./* all SSL
e550: 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 bug workarounds
e560: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
e570: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c set_options(ctx,
e580: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 SSL_OP_NO_COMPR
e590: 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 ESSION);./* disa
e5a0: 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 ble compression
e5b0: 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 even if supporte
e5c0: 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 d */. SSL_CTX
e5d0: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 _set_options(ctx
e5e0: 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 , off);../* disa
e5f0: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 ble protocol ver
e600: 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 sions */.#if OPE
e610: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
e620: 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 BER < 0x10101000
e630: 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 L. SSL_CTX_se
e640: 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f t_mode(ctx, SSL_
e650: 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 MODE_AUTO_RETRY)
e660: 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 ;./* handle new
e670: 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61 handshakes in ba
e680: 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 ckground. On by
e690: 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 default in OpenS
e6a0: 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e SL 1.1.1. */.#en
e6b0: 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f dif. SSL_CTX_
e6c0: 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 sess_set_cache_s
e6d0: 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a ize(ctx, 128);..
e6e0: 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 /* Set user
e6f0: 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c defined ciphers,
e700: 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 cipher suites,
e710: 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 and security lev
e720: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 el */. if ((c
e730: 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 iphers != NULL)
e740: 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f && !SSL_CTX_set_
e750: 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c cipher_list(ctx,
e760: 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 54 63 ciphers)) {..Tc
e770: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e780: 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 nterp, "Set ciph
e790: 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 ers failed: No v
e7a0: 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 alid ciphers", (
e7b0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
e7c0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
e7d0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
e7e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
e7f0: 63 69 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 ciphersuites !=
e800: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 NULL) && !SSL_CT
e810: 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 X_set_ciphersuit
e820: 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 es(ctx, ciphersu
e830: 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ites)) {..Tcl_Ap
e840: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
e850: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 20 73 p, "Set cipher s
e860: 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f uites failed: No
e870: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c valid ciphers",
e880: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
e890: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e8a0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
e8b0: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a L;. }.. /*
e8c0: 20 53 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 Set security le
e8d0: 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c vel */. if (l
e8e0: 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 evel > -1 && lev
e8f0: 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 el < 6) {../* SS
e900: 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c L_set_security_l
e910: 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 evel */..SSL_CTX
e920: 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _set_security_le
e930: 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b vel(ctx, level);
e940: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 . }.. /* s
e950: 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b et some callback
e960: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 s */. SSL_CTX
e970: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 _set_default_pas
e980: 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 swd_cb(ctx, Pass
e990: 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 wordCallback);.
e9a0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 SSL_CTX_set_d
e9b0: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 efault_passwd_cb
e9c0: 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 _userdata(ctx, (
e9d0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
e9e0: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 ;.. /* read a
e9f0: 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 Diffie-Hellman
ea00: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c parameters file,
ea10: 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 6c or use the buil
ea20: 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 t-in one */.
ea30: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
ea40: 26 64 73 29 3b 0a 23 69 66 64 65 66 20 4f 50 45 &ds);.#ifdef OPE
ea50: 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 NSSL_NO_DH. i
ea60: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e f (DHparams != N
ea70: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
ea80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ea90: 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 "DH parameter s
eaa0: 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c upport not avail
eab0: 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 able", (char *)
eac0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
ead0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
eae0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 rn NULL;. }.#
eaf0: 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 else. {..DH*
eb00: 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d dh;..if (DHparam
eb10: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 s != NULL) {..
eb20: 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20 BIO *bio;...
eb30: 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f bio = BIO_new_
eb40: 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d file(F2N(DHparam
eb50: 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 s, &ds), "r");..
eb60: 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a if (!bio) {.
eb70: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
eb80: 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 e(&ds);...Tcl_Ap
eb90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
eba0: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 p, "Could not fi
ebb0: 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 nd DH parameters
ebc0: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 file", (char *)
ebd0: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
ebe0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
ebf0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
ec00: 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45 }... dh = PE
ec10: 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 M_read_bio_DHpar
ec20: 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e ams(bio, NULL, N
ec30: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ULL, NULL);..
ec40: 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a BIO_free(bio);.
ec50: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
ec60: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
ec70: 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c if (!dh) {...Tcl
ec80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
ec90: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 terp, "Could not
eca0: 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 read DH paramet
ecb0: 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 ers from file",
ecc0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
ecd0: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
ece0: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
ecf0: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 LL;.. }..
ed00: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f SSL_CTX_set_tmp_
ed10: 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 dh(ctx, dh);..
ed20: 20 20 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 0a DH_free(dh);..
ed30: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f .} else {.. /
ed40: 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e * Use well known
ed50: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 74 DH parameters t
ed60: 68 61 74 20 68 61 76 65 20 62 75 69 6c 74 2d 69 hat have built-i
ed70: 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 n support in Ope
ed80: 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 nSSL */.. if
ed90: 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 (!SSL_CTX_set_dh
eda0: 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 29 20 7b _auto(ctx, 1)) {
edb0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
edc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 ult(interp, "Cou
edd0: 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 ld not enable se
ede0: 74 20 44 48 20 61 75 74 6f 3a 20 22 2c 20 47 45 t DH auto: ", GE
edf0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
ee00: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
ee10: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
ee20: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
ee30: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 LL;.. }..}.
ee40: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
ee50: 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 /* set our certi
ee60: 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f ficate */. lo
ee70: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
ee80: 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 0;. if (cert
ee90: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
eea0: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 .load_private_ke
eeb0: 79 20 3d 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c y = 1;...if (SSL
eec0: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 _CTX_use_certifi
eed0: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 cate_file(ctx, F
eee0: 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 2N(certfile, &ds
eef0: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ), SSL_FILETYPE_
ef00: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 PEM) <= 0) {..
ef10: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
ef20: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c e(&ds);.. Tcl
ef30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
ef40: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
ef50: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 set certificate
ef60: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c file ", certfil
ef70: 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 e, ": ",...GET_E
ef80: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
ef90: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
efa0: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
efb0: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
efc0: 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 NULL;..}..Tcl_D
efd0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
efe0: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
eff0: 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b (cert != NULL) {
f000: 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b ..load_private_k
f010: 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c ey = 1;..if (SSL
f020: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 _CTX_use_certifi
f030: 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 cate_ASN1(ctx, c
f040: 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c ert_len, cert) <
f050: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
f060: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f070: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
f080: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a set certificate:
f090: 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 ",...GET_ERR_RE
f0a0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
f0b0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
f0c0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
f0d0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
f0e0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
f0f0: 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 {..certfile = (c
f100: 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 har*)X509_get_de
f110: 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 fault_cert_file(
f120: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 );...if (SSL_CTX
f130: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
f140: 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 _file(ctx, certf
f150: 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ile, SSL_FILETYP
f160: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 E_PEM) <= 0) {.#
f170: 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 if 0.. Tcl_Ap
f180: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f190: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 p, "unable to us
f1a0: 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 e default certif
f1b0: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 icate file ", ce
f1c0: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 rtfile, ": ",...
f1d0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
f1e0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
f1f0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
f200: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
f210: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 eturn NULL;.#end
f220: 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 if..}. }..
f230: 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 /* set our priv
f240: 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 ate key */. i
f250: 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f f (load_private_
f260: 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 key) {..if (keyf
f270: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b ile == NULL && k
f280: 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ey == NULL) {..
f290: 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 keyfile = cer
f2a0: 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 tfile;..}...if (
f2b0: 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 keyfile != NULL)
f2c0: 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 {.. /* get t
f2d0: 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 he private key a
f2e0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 ssociated with t
f2f0: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 his certificate
f300: 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 */.. if (keyf
f310: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile == NULL) {..
f320: 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 .keyfile = certf
f330: 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ile;.. }...
f340: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 if (SSL_CTX_us
f350: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c e_PrivateKey_fil
f360: 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 e(ctx, F2N(keyfi
f370: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 le, &ds), SSL_FI
f380: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
f390: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
f3a0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a gFree(&ds);.../*
f3b0: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
f3c0: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
f3d0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
f3e0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
f3f0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
f400: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
f410: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
f420: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
f430: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
f440: 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 public key file
f450: 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c ", keyfile, " ",
f460: 0a 09 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 ... GET_ERR_R
f470: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
f480: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
f490: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
f4a0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 return NULL;..
f4b0: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
f4c0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a ringFree(&ds);..
f4d0: 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 .} else if (key
f4e0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
f4f0: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
f500: 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 PrivateKey_ASN1(
f510: 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 EVP_PKEY_RSA, ct
f520: 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 x, key,key_len)
f530: 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 6c 75 <= 0) {.../* flu
f540: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 sh the passphras
f550: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 e which might be
f560: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 left in the res
f570: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 ult */...Tcl_Set
f580: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e Result(interp, N
f590: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 ULL, TCL_STATIC)
f5a0: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 ;...Tcl_AppendRe
f5b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e sult(interp, "un
f5c0: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c able to set publ
f5d0: 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f 45 ic key: ", GET_E
f5e0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
f5f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 ar *) NULL);...S
f600: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f610: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
f620: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e .. }..}../* N
f630: 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 ow we know that
f640: 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 a key and cert h
f650: 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 ave been set aga
f660: 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c inst.. * the SSL
f670: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 context */..if
f680: 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f (!SSL_CTX_check_
f690: 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 private_key(ctx)
f6a0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
f6b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
f6c0: 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 , "private key d
f6d0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 oes not match th
f6e0: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 e certificate pu
f6f0: 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 blic key",....
f700: 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c (char *) NULL
f710: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
f720: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 free(ctx);..
f730: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a return NULL;..}.
f740: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
f750: 74 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 t to use default
f760: 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 66 69 location and fi
f770: 6c 65 20 66 6f 72 20 43 65 72 74 69 66 69 63 61 le for Certifica
f780: 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 te Authority (CA
f790: 29 20 63 65 72 74 69 66 69 63 61 74 65 73 2e 20 ) certificates.
f7a0: 54 68 65 0a 20 20 20 20 20 2a 20 76 65 72 69 66 The. * verif
f7b0: 79 20 70 61 74 68 20 61 6e 64 20 73 74 6f 72 65 y path and store
f7c0: 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 can be overridd
f7d0: 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 en by the SSL_CE
f7e0: 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 RT_DIR env var.
f7f0: 54 68 65 20 76 65 72 69 66 79 20 66 69 6c 65 20 The verify file
f800: 63 61 6e 0a 20 20 20 20 20 2a 20 62 65 20 6f 76 can. * be ov
f810: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 erridden by the
f820: 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e SSL_CERT_FILE en
f830: 76 20 76 61 72 2e 20 2a 2f 0a 20 20 20 20 69 66 v var. */. if
f840: 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 (!SSL_CTX_set_d
f850: 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 efault_verify_pa
f860: 74 68 73 28 63 74 78 29 29 20 7b 0a 09 61 62 6f ths(ctx)) {..abo
f870: 72 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 rt++;. }..
f880: 20 2f 2a 20 4f 76 65 72 72 69 64 65 73 20 66 6f /* Overrides fo
f890: 72 20 74 68 65 20 43 41 20 76 65 72 69 66 79 20 r the CA verify
f8a0: 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 2a 2f path and file */
f8b0: 0a 20 20 20 20 7b 0a 23 69 66 20 4f 50 45 4e 53 . {.#if OPENS
f8c0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
f8d0: 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
f8e0: 09 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e .if (CApath != N
f8f0: 55 4c 4c 20 7c 7c 20 43 41 66 69 6c 65 20 21 3d ULL || CAfile !=
f900: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 NULL) {.. Tc
f910: 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 09 l_DString ds1;..
f920: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
f930: 6e 69 74 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 nit(&ds1);...
f940: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f if (!SSL_CTX_lo
f950: 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 ad_verify_locati
f960: 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 ons(ctx, F2N(CAf
f970: 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 ile, &ds), F2N(C
f980: 41 70 61 74 68 2c 20 26 64 73 31 29 29 29 20 7b Apath, &ds1))) {
f990: 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 ...abort++;..
f9a0: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 }.. Tcl_DStr
f9b0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
f9c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
f9d0: 65 65 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 ee(&ds1);...
f9e0: 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 /* Set list of C
f9f0: 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c As to send to cl
fa00: 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 ient when reques
fa10: 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 ting a client ce
fa20: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 rtificate */..
fa30: 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 /* https://sou
fa40: 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 rceforge.net/p/t
fa50: 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09 ls/bugs/57/ */..
fa60: 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a /* XXX:TODO:
fa70: 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 Let the user su
fa80: 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 pply values here
fa90: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 instead of some
faa0: 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 thing that exist
fab0: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 s on the filesys
fac0: 74 65 6d 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 tem */.. STAC
fad0: 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 K_OF(X509_NAME)
fae0: 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c *certNames = SSL
faf0: 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f _load_client_CA_
fb00: 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c file(F2N(CAfile,
fb10: 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 &ds));.. if
fb20: 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 (certNames != NU
fb30: 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f LL) {...SSL_CTX_
fb40: 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 set_client_CA_li
fb50: 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 st(ctx, certName
fb60: 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 s);.. }..
fb70: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
fb80: 26 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65 0a &ds);..}..#else.
fb90: 09 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e .if (CApath != N
fba0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 ULL) {.. if (
fbb0: 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 !SSL_CTX_load_ve
fbc0: 72 69 66 79 5f 64 69 72 28 63 74 78 2c 20 46 32 rify_dir(ctx, F2
fbd0: 4e 28 43 41 70 61 74 68 2c 20 26 64 73 29 29 29 N(CApath, &ds)))
fbe0: 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 {...abort++;..
fbf0: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
fc00: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
fc10: 09 7d 0a 09 69 66 20 28 43 41 66 69 6c 65 20 21 .}..if (CAfile !
fc20: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 = NULL) {.. i
fc30: 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 f (!SSL_CTX_load
fc40: 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 63 74 78 _verify_file(ctx
fc50: 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 , F2N(CAfile, &d
fc60: 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b s))) {...abort++
fc70: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
fc80: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
fc90: 73 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 s);... /* Set
fca0: 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 list of CAs to
fcb0: 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 send to client w
fcc0: 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 hen requesting a
fcd0: 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 client certific
fce0: 61 74 65 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 ate */.. STAC
fcf0: 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 K_OF(X509_NAME)
fd00: 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c *certNames = SSL
fd10: 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f _load_client_CA_
fd20: 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c file(F2N(CAfile,
fd30: 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 &ds));.. if
fd40: 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 (certNames != NU
fd50: 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f LL) {...SSL_CTX_
fd60: 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 set_client_CA_li
fd70: 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 st(ctx, certName
fd80: 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 s);.. }..
fd90: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
fda0: 26 64 73 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a &ds);..}.#endif.
fdb0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 }.. retur
fdc0: 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a n ctx;.}.../*. *
fdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe10: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 ---. *. * Status
fe20: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
fe30: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 certificate for
fe40: 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e connected peer.
fe50: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
fe60: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
fe70: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
fe80: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
fe90: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
fea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
feb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
fee0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
fef0: 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 tatusObjCmd(Clie
ff00: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
ff10: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
ff20: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
ff30: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
ff40: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 objv[]) {. St
ff50: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 ate *statePtr;.
ff60: 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 X509 *peer;.
ff70: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
ff80: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e tr;. Tcl_Chan
ff90: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 nel chan;. ch
ffa0: 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c ar *channelName,
ffb0: 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 *ciphers;. i
ffc0: 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e nt mode;. con
ffd0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
ffe0: 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 *proto;. uns
fff0: 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 igned int len;.
10000 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b int nid, res;
10010 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
10020 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ntData;.. dpr
10030 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
10040 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
10050 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 2 || objc > 3 ||
10060 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 (objc == 3 && !
10070 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 strcmp(Tcl_GetSt
10080 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 ring(objv[1]), "
10090 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 -local"))) {..Tc
100a0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
100b0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
100c0 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 "?-local? channe
100d0 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
100e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
100f0 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 /* Get channe
10100 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e l Id */. chan
10110 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 nelName = Tcl_Ge
10120 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28 6f 62 tString(objv[(ob
10130 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 jc == 2 ? 1 : 2)
10140 5d 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 ]);. chan = T
10150 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
10160 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d terp, channelNam
10170 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 e, &mode);. i
10180 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
10190 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
101a0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
101b0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
101c0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
101d0 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
101e0 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
101f0 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
10200 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
10210 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
10220 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
10230 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
10240 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
10250 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
10260 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
10270 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
10280 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
10290 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 n),..."\": not a
102a0 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 TLS channel", (
102b0 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
102c0 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
102d0 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
102e0 22 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e "STATUS", "CHANN
102f0 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
10300 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
10310 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
10320 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 R;. }. sta
10330 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
10340 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c ) Tcl_GetChannel
10350 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
10360 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 n);.. /* Get
10370 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 certificate for
10380 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a peer or self */.
10390 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
103a0 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 2) {..peer = SSL
103b0 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 _get_peer_certif
103c0 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e icate(statePtr->
103d0 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ssl);. } else
103e0 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 {..peer = SSL_g
103f0 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 et_certificate(s
10400 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
10410 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 }. /* Get
10420 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 X509 certificate
10430 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 info */. if
10440 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 (peer) {..objPtr
10450 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 = Tls_NewX509Ob
10460 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b j(interp, peer);
10470 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 ..if (objc == 2)
10480 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65 {.. X509_fre
10490 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65 e(peer);.. pe
104a0 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 er = NULL;..}.
104b0 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 } else {..objP
104c0 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
104d0 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 Obj(0, NULL);.
104e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 }.. /* Peer
104f0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 name */. LAP
10500 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10510 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 objPtr, "peerna
10520 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 me", SSL_get0_pe
10530 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d ername(statePtr-
10540 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 >ssl), -1);.
10550 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
10560 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 rp, objPtr, "sbi
10570 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 ts", SSL_get_cip
10580 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74 her_bits(statePt
10590 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a r->ssl, NULL));.
105a0 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 . ciphers = (
105b0 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 char*)SSL_get_ci
105c0 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 pher(statePtr->s
105d0 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 sl);. LAPPEND
105e0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
105f0 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 63 Ptr, "cipher", c
10600 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 iphers, -1);..
10610 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 /* Verify the
10620 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 X509 certificate
10630 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 presented by th
10640 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 e peer */. LA
10650 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
10660 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 , objPtr, "verif
10670 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f yResult",..X509_
10680 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f verify_cert_erro
10690 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 r_string(SSL_get
106a0 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 _verify_result(s
106b0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 tatePtr->ssl)),
106c0 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 -1);.. /* Ver
106d0 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 ify mode */.
106e0 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 mode = SSL_get_v
106f0 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 erify_mode(state
10700 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 Ptr->ssl);. i
10710 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 f (mode && SSL_V
10720 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c ERIFY_NONE) {..L
10730 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10740 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 p, objPtr, "veri
10750 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c fyMode", "none",
10760 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 -1);. } else
10770 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 {..Tcl_Obj *lis
10780 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 tObjPtr = Tcl_Ne
10790 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
107a0 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 );..if (mode &&
107b0 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29 SSL_VERIFY_PEER)
107c0 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
107d0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
107e0 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a (interp, listObj
107f0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
10800 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 ngObj("peer", -1
10810 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 ));..}..if (mode
10820 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 && SSL_VERIFY_F
10830 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 AIL_IF_NO_PEER_C
10840 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ERT) {.. Tcl_
10850 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10860 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
10870 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
10880 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 StringObj("fail
10890 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22 if no peer cert"
108a0 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
108b0 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
108c0 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 FY_CLIENT_ONCE)
108d0 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
108e0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
108f0 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 interp, listObjP
10900 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
10910 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 gObj("client onc
10920 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 e", -1));..}..if
10930 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
10940 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 RIFY_POST_HANDSH
10950 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f AKE) {.. Tcl_
10960 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10970 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
10980 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
10990 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 StringObj("post
109a0 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 handshake", -1))
109b0 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 ;..}..LAPPEND_OB
109c0 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 J(interp, objPtr
109d0 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 , "verifyMode",
109e0 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 listObjPtr).
109f0 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 }.. /* Verify
10a00 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 mode depth */.
10a10 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 LAPPEND_INT(i
10a20 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10a30 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 53 53 verifyDepth", SS
10a40 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70 L_get_verify_dep
10a50 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c th(statePtr->ssl
10a60 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f ));.. /* Repo
10a70 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 rt the selected
10a80 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 protocol as a re
10a90 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f sult of the nego
10aa0 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 tiation */. S
10ab0 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c SL_get0_alpn_sel
10ac0 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e ected(statePtr->
10ad0 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 ssl, &proto, &le
10ae0 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f n);. LAPPEND_
10af0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
10b00 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 tr, "alpn", (cha
10b10 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f r *)proto, (Tcl_
10b20 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 Size) len);.
10b30 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
10b40 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f rp, objPtr, "pro
10b50 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f tocol", SSL_get_
10b60 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 version(statePtr
10b70 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 ->ssl), -1);..
10b80 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e /* Valid for n
10b90 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 on-RSA signature
10ba0 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a and TLS 1.3 */.
10bb0 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
10bc0 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 2) {..res = SSL_
10bd0 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 get_peer_signatu
10be0 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d re_nid(statePtr-
10bf0 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 >ssl, &nid);.
10c00 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
10c10 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 SSL_get_signatu
10c20 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d re_nid(statePtr-
10c30 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 >ssl, &nid);.
10c40 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 }. if (!res)
10c50 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 {nid = 0;}.
10c60 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
10c70 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 rp, objPtr, "sig
10c80 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 natureHashAlgori
10c90 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e thm", OBJ_nid2ln
10ca0 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 (nid), -1);..
10cb0 20 2f 2a 20 41 64 64 65 64 20 69 6e 20 4f 70 65 /* Added in Ope
10cc0 6e 53 53 4c 20 31 2e 31 2e 31 61 20 2a 2f 0a 23 nSSL 1.1.1a */.#
10cd0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
10ce0 4f 4e 5f 4e 55 4d 42 45 52 20 3e 20 30 78 31 30 ON_NUMBER > 0x10
10cf0 31 30 31 30 30 30 4c 0a 20 20 20 20 69 66 20 28 101000L. if (
10d00 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 objc == 2) {..re
10d10 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 s = SSL_get_peer
10d20 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f _signature_type_
10d30 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
10d40 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 l, &nid);. }
10d50 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 else {..res = SS
10d60 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f L_get_signature_
10d70 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 type_nid(statePt
10d80 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 r->ssl, &nid);.
10d90 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 }. if (!re
10da0 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 s) {nid = 0;}.
10db0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
10dc0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
10dd0 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20 4f ignatureType", O
10de0 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 BJ_nid2ln(nid),
10df0 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 -1);.#endif..
10e00 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
10e10 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10e20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
10e30 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
10e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e80 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 --. *. * Connect
10e90 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d ionInfoObjCmd --
10ea0 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 return connecti
10eb0 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 on info from Ope
10ec0 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nSSL.. *. * Resu
10ed0 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f lts:. *.A list o
10ee0 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 f connection inf
10ef0 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d o. *. *--------
10f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
10f40 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e .static int Conn
10f50 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 ectionInfoObjCmd
10f60 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
10f70 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
10f80 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
10f90 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
10fa0 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
10fb0 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
10fc0 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
10fd0 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
10fe0 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 de on */. Sta
10ff0 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f te *statePtr;../
11000 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
11010 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
11020 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
11030 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a jPtr, *listPtr;.
11040 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 const SSL *s
11050 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 sl;. const SS
11060 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 L_CIPHER *cipher
11070 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
11080 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
11090 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f ;. const EVP_
110a0 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 MD *md;. (voi
110b0 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
110c0 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 if (objc !=
110d0 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
110e0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
110f0 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c , objv, "channel
11100 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
11110 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
11120 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
11130 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
11140 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
11150 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 jv[1]), NULL);.
11160 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
11170 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
11180 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
11190 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
111a0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
111b0 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
111c0 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
111d0 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
111e0 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
111f0 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 l(chan);. if
11200 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
11210 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
11220 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
11230 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
11240 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
11250 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
11260 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
11270 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 (chan),.. "\"
11280 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
11290 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e nel", (char *) N
112a0 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
112b0 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
112c0 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 "TLS", "CONNECTI
112d0 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 ON", "CHANNEL",
112e0 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
112f0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
11300 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
11310 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 }.. objPtr
11320 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
11330 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 (0, NULL);..
11340 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e /* Connection in
11350 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 fo */. stateP
11360 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
11370 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
11380 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
11390 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 ssl = stateP
113a0 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 tr->ssl;. if
113b0 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl != NULL) {.
113c0 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 ./* connection s
113d0 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 tate */..LAPPEND
113e0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
113f0 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 Ptr, "state", SS
11400 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c L_state_string_l
11410 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a ong(ssl), -1);..
11420 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 ./* Get SNI requ
11430 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d ested server nam
11440 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 e */..LAPPEND_ST
11450 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11460 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 , "servername",
11470 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 SSL_get_serverna
11480 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e me(ssl, TLSEXT_N
11490 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d AMETYPE_host_nam
114a0 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 e), -1);.../* Ge
114b0 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c t protocol */..L
114c0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
114d0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 p, objPtr, "prot
114e0 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 ocol", SSL_get_v
114f0 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 ersion(ssl), -1)
11500 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 ;.../* Renegotia
11510 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a tion allowed */.
11520 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
11530 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 terp, objPtr, "r
11540 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c enegotiation_all
11550 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 owed", SSL_get_s
11560 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 ecure_renegotiat
11570 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53 53 4c ion_support((SSL
11580 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 *) ssl));.../*
11590 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 Get security lev
115a0 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 el */..LAPPEND_I
115b0 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
115c0 72 2c 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76 r, "security_lev
115d0 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 el", SSL_get_sec
115e0 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 urity_level(ssl)
115f0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
11600 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 info */..LAPPEND
11610 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
11620 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 jPtr, "session_r
11630 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 eused", SSL_sess
11640 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 ion_reused(ssl))
11650 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 ;.../* Is server
11660 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e info */..LAPPEN
11670 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
11680 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 bjPtr, "is_serve
11690 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 r", SSL_is_serve
116a0 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 r(ssl));.../* Is
116b0 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e DTLS */..LAPPEN
116c0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
116d0 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 bjPtr, "is_dtls"
116e0 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 , SSL_is_dtls(ss
116f0 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 l));. }..
11700 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a /* Cipher info *
11710 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 /. cipher = S
11720 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 SL_get_current_c
11730 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 ipher(ssl);.
11740 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 if (cipher != NU
11750 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b LL) {..char buf[
11760 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 BUFSIZ] = {0};..
11770 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 int bits, alg_bi
11780 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 ts;.../* Cipher
11790 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 name */..LAPPEND
117a0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
117b0 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 Ptr, "cipher", S
117c0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 SL_CIPHER_get_na
117d0 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b me(cipher), -1);
117e0 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f .../* RFC name o
117f0 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 f cipher */..LAP
11800 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11810 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 objPtr, "standa
11820 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 rd_name", SSL_CI
11830 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 PHER_standard_na
11840 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b me(cipher), -1);
11850 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 .../* OpenSSL na
11860 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a me of cipher */.
11870 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11880 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 erp, objPtr, "op
11890 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 enssl_name", OPE
118a0 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 NSSL_cipher_name
118b0 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e (SSL_CIPHER_stan
118c0 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 dard_name(cipher
118d0 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 )), -1);.../* nu
118e0 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 mber of secret b
118f0 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 its used for cip
11900 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 her */..bits = S
11910 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 SL_CIPHER_get_bi
11920 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f ts(cipher, &alg_
11930 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f bits);..LAPPEND_
11940 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
11950 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 tr, "secret_bits
11960 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 ", bits);..LAPPE
11970 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
11980 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 bjPtr, "algorith
11990 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 m_bits", alg_bit
119a0 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 s);../* alg_bits
119b0 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 is actual key s
119c0 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 ecret bits. If u
119d0 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 se bits and secr
119e0 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 et (algorithm) b
119f0 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 its differ,..
11a00 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 the rest of the
11a10 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 bits are fixed,
11a20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 i.e. for limited
11a30 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 export ciphers
11a40 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a (bits < 56) */..
11a50 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 ./* Indicates wh
11a60 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 ich SSL/TLS prot
11a70 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 ocol version fir
11a80 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 st defined the c
11a90 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e ipher */..LAPPEN
11aa0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11ab0 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 jPtr, "min_versi
11ac0 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f on", SSL_CIPHER_
11ad0 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 get_version(ciph
11ae0 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 er), -1);.../* C
11af0 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 ipher NID */..LA
11b00 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11b10 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
11b20 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f rNID", (char *)O
11b30 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
11b40 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f PHER_get_cipher_
11b50 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
11b60 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
11b70 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11b80 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 "digestNID", (ch
11b90 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 ar *)OBJ_nid2ln(
11ba0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 SSL_CIPHER_get_d
11bb0 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 igest_nid(cipher
11bc0 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e )), -1);..LAPPEN
11bd0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11be0 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e jPtr, "keyExchan
11bf0 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 geNID", (char *)
11c00 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 OBJ_nid2ln(SSL_C
11c10 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 IPHER_get_kx_nid
11c20 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
11c30 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11c40 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 erp, objPtr, "au
11c50 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 thenticationNID"
11c60 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
11c70 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
11c80 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 get_auth_nid(cip
11c90 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a her)), -1);.../*
11ca0 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 message authent
11cb0 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 ication code - C
11cc0 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65 ipher is AEAD (e
11cd0 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 .g. GCM or ChaCh
11ce0 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 a20/Poly1305) or
11cf0 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 not */../* Auth
11d00 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 enticated Encryp
11d10 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 tion with associ
11d20 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29 ated data (AEAD)
11d30 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 check */..LAPPE
11d40 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
11d50 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f objPtr, "cipher_
11d60 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 is_aead", SSL_CI
11d70 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 PHER_is_aead(cip
11d80 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 her));.../* Dige
11d90 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 st used during t
11da0 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 he SSL/TLS hands
11db0 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 hake when using
11dc0 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 the cipher. */..
11dd0 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f md = SSL_CIPHER_
11de0 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 get_handshake_di
11df0 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c gest(cipher);..L
11e00 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11e10 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 p, objPtr, "hand
11e20 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 shake_digest", (
11e30 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 char *)EVP_MD_na
11e40 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f me(md), -1);.../
11e50 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 * Get OpenSSL-sp
11e60 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 ecific ID, not I
11e70 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 ANA ID */..LAPPE
11e80 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
11e90 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 bjPtr, "cipher_i
11ea0 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 d", (int) SSL_CI
11eb0 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 PHER_get_id(ciph
11ec0 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 er));.../* Two-b
11ed0 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 yte ID used in t
11ee0 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 he TLS protocol
11ef0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 of the given cip
11f00 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
11f10 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
11f20 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 tr, "protocol_id
11f30 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 ", (int) SSL_CIP
11f40 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c HER_get_protocol
11f50 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 _id(cipher));...
11f60 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 /* Textual descr
11f70 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 iption of the ci
11f80 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c pher */..if (SSL
11f90 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 _CIPHER_descript
11fa0 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c ion(cipher, buf,
11fb0 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d sizeof(buf)) !=
11fc0 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 NULL) {.. LA
11fd0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11fe0 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 , objPtr, "descr
11ff0 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 iption", buf, -1
12000 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
12010 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f /* Session info
12020 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 */. session
12030 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f = SSL_get_sessio
12040 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 n(ssl);. if (
12050 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 session != NULL)
12060 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e {..const unsign
12070 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
12080 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 ..size_t len2;..
12090 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 unsigned int ule
120a0 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n;..const unsign
120b0 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
120c0 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e _id, *proto;..un
120d0 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 signed char buff
120e0 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 er[SSL_MAX_MASTE
120f0 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a R_KEY_LENGTH];..
12100 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 ./* Report the s
12110 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
12120 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
12130 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 the ALPN negotia
12140 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 tion */..SSL_SES
12150 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 SION_get0_alpn_s
12160 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c elected(session,
12170 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b &proto, &len2);
12180 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
12190 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 terp, objPtr, "a
121a0 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 lpn", (char *) p
121b0 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 roto, (Tcl_Size)
121c0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 len2);.../* Rep
121d0 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 ort the selected
121e0 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 protocol as a r
121f0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e esult of the NPN
12200 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
12210 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
12220 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 SSL_get0_next_pr
12230 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 oto_negotiated(s
12240 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 sl, &proto, &ule
12250 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 n);..LAPPEND_STR
12260 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12270 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 "npn", (char *)
12280 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a proto, (Tcl_Siz
12290 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 e) ulen);.#endif
122a0 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 .../* Resumable
122b0 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 session */..LAPP
122c0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
122d0 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 objPtr, "resuma
122e0 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f ble", SSL_SESSIO
122f0 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 N_is_resumable(s
12300 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 ession));.../* S
12310 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d ession start tim
12320 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 e (seconds since
12330 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 epoch) */..LAPP
12340 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c END_LONG(interp,
12350 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f objPtr, "start_
12360 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 time", SSL_SESSI
12370 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 ON_get_time(sess
12380 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 ion));.../* Time
12390 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f out value - SSL_
123a0 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 CTX_get_timeout
123b0 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a (in seconds) */.
123c0 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e .LAPPEND_LONG(in
123d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 terp, objPtr, "t
123e0 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 imeout", SSL_SES
123f0 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 SION_get_timeout
12400 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a (session));.../*
12410 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c Session id - TL
12420 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 Sv1.2 and below
12430 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e only */..session
12440 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f _id = SSL_SESSIO
12450 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e N_get_id(session
12460 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 , &ulen);..LAPPE
12470 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 ND_BARRAY(interp
12480 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 , objPtr, "sessi
12490 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f on_id", session_
124a0 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 id, (Tcl_Size) u
124b0 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 len);.../* Sessi
124c0 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 on context */..s
124d0 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
124e0 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f SESSION_get0_id_
124f0 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c context(session,
12500 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ulen);..LAPPEN
12510 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
12520 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
12530 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 n_context", sess
12540 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a ion_id, (Tcl_Siz
12550 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 e) ulen);.../* S
12560 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 ession ticket -
12570 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 client only */..
12580 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
12590 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c _ticket(session,
125a0 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 &ticket, &len2)
125b0 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 ;..LAPPEND_BARRA
125c0 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 Y(interp, objPtr
125d0 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 , "session_ticke
125e0 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c t", ticket, (Tcl
125f0 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 _Size) len2);...
12600 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
12610 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 t lifetime hint
12620 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a (in seconds) */.
12630 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e .LAPPEND_LONG(in
12640 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c terp, objPtr, "l
12650 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 ifetime", SSL_SE
12660 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 SSION_get_ticket
12670 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 _lifetime_hint(s
12680 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 ession));.../* T
12690 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a icket app data *
126a0 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 /.#if OPENSSL_VE
126b0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
126c0 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f x30000000L..SSL_
126d0 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 SESSION_get0_tic
126e0 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c ket_appdata((SSL
126f0 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 _SESSION *) sess
12700 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
12710 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 en2);..LAPPEND_B
12720 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
12730 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 jPtr, "ticket_ap
12740 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c p_data", ticket,
12750 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
12760 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 );.#endif.../* G
12770 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f et master key */
12780 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 ..len2 = SSL_SES
12790 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f SION_get_master_
127a0 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 key(session, buf
127b0 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 fer, SSL_MAX_MAS
127c0 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b TER_KEY_LENGTH);
127d0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
127e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
127f0 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 "master_key", b
12800 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 uffer, (Tcl_Size
12810 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f ) len2);.../* Co
12820 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a mpression id */.
12830 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 .unsigned int id
12840 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
12850 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 et_compress_id(s
12860 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e ession);..LAPPEN
12870 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
12880 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 jPtr, "compressi
12890 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 on_id", id == 1
128a0 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 ? "zlib" : "none
128b0 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 ", -1);. }..
128c0 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f /* Compressio
128d0 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 n info */. if
128e0 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b (ssl != NULL) {
128f0 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c .#ifdef HAVE_SSL
12900 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f _COMPRESSION..co
12910 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 nst COMP_METHOD
12920 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 *comp, *expn;..c
12930 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 omp = SSL_get_cu
12940 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f rrent_compressio
12950 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 n(ssl);..expn =
12960 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
12970 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a expansion(ssl);.
12980 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
12990 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
129a0 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d ompression", com
129b0 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 p ? SSL_COMP_get
129c0 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e _name(comp) : "n
129d0 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 one", -1);..LAPP
129e0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
129f0 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 objPtr, "expansi
12a00 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f on", expn ? SSL_
12a10 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 COMP_get_name(ex
12a20 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 pn) : "none", -1
12a30 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e );.#else..LAPPEN
12a40 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
12a50 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 jPtr, "compressi
12a60 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 on", "none", -1)
12a70 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
12a80 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12a90 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e expansion", "non
12aa0 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a e", -1);.#endif.
12ab0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
12ac0 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 rver info */.
12ad0 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 {..long mode =
12ae0 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 SSL_CTX_get_sess
12af0 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 ion_cache_mode(s
12b00 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 tatePtr->ctx);..
12b10 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 char *msg;...if
12b20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
12b30 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 _CACHE_OFF) {..
12b40 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a msg = "off";.
12b50 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 .} else if (mode
12b60 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
12b70 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 E_CLIENT) {..
12b80 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b msg = "client";
12b90 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 ..} else if (mod
12ba0 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 e & SSL_SESS_CAC
12bb0 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 HE_SERVER) {..
12bc0 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 msg = "server"
12bd0 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f ;..} else if (mo
12be0 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
12bf0 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 CHE_BOTH) {..
12c00 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 msg = "both";..
12c10 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 } else {.. ms
12c20 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 g = "unknown";..
12c30 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 }..LAPPEND_STR(i
12c40 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12c50 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
12c60 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 de", msg, -1);.
12c70 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 }.. /* CA
12c80 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 List */. /* I
12c90 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 F not a server,
12ca0 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 same as SSL_get0
12cb0 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 _peer_CA_list. I
12cc0 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 f server same as
12cd0 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 SSL_CTX_get_cli
12ce0 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 ent_CA_list */.
12cf0 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c listPtr = Tcl
12d00 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
12d10 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f ULL);. STACK_
12d20 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 OF(X509_NAME) *c
12d30 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 a_list;. if (
12d40 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 (ca_list = SSL_g
12d50 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
12d60 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 t(ssl)) != NULL)
12d70 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b {..char buffer[
12d80 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 BUFSIZ];..for (i
12d90 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
12da0 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 _X509_NAME_num(c
12db0 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a a_list); i++) {.
12dc0 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a . X509_NAME *
12dd0 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e name = sk_X509_N
12de0 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 AME_value(ca_lis
12df0 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 t, i);.. if (
12e00 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e name) {...X509_N
12e10 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 AME_oneline(name
12e20 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a , buffer, BUFSIZ
12e30 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a );...Tcl_ListObj
12e40 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
12e50 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 terp, listPtr, T
12e60 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
12e70 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 buffer, -1));..
12e80 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 }..}. }.
12e90 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e LAPPEND_OBJ(in
12ea0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
12eb0 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 aList", listPtr)
12ec0 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e ;. LAPPEND_IN
12ed0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
12ee0 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c , "caListCount",
12ef0 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 sk_X509_NAME_nu
12f00 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 m(ca_list));..
12f10 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
12f20 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
12f30 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
12f40 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
12f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f90 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f ---. *. * Versio
12fa0 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 nObjCmd -- retur
12fb0 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 n version string
12fc0 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 from OpenSSL..
12fd0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
12fe0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
12ff0 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
13000 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
13010 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
13020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
13060 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 /.static int.Ver
13070 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e sionObjCmd(Clien
13080 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
13090 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
130a0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
130b0 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
130c0 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
130d0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 _Obj *objPtr;.
130e0 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 (void) clientD
130f0 61 74 61 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 ata;. (void)
13100 6f 62 6a 63 3b 0a 20 20 20 20 28 76 6f 69 64 29 objc;. (void)
13110 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 64 70 72 69 objv;.. dpri
13120 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
13130 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
13140 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 _NewStringObj(OP
13150 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 ENSSL_VERSION_TE
13160 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c XT, -1);. Tcl
13170 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
13180 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a terp, objPtr);..
13190 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
131a0 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
131b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
131f0 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 *. * MiscObjCmd
13200 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 -- misc command
13210 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
13220 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
13230 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
13240 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
13250 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
13260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
132a0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
132b0 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e MiscObjCmd(Clien
132c0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
132d0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
132e0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
132f0 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
13300 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 bjv[]) {. sta
13310 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
13320 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 commands [] = {
13330 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c "req", "strreq",
13340 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 NULL };. enu
13350 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 m command { C_RE
13360 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 Q, C_STRREQ, C_D
13370 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f UMMY };. Tcl_
13380 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e Size cmd;. in
13390 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 t isStr;. cha
133a0 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b r buffer[16384];
133b0 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
133c0 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ntData;.. dpr
133d0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
133e0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
133f0 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
13400 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
13410 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d , objv, "subcomm
13420 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 and ?args?");..r
13430 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
13440 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 . }. if (T
13450 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f cl_GetIndexFromO
13460 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
13470 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 1], commands, "c
13480 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 ommand", 0, &cmd
13490 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
134a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
134b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
134c0 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
134d0 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d . isStr = (cm
134e0 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a d == C_STRREQ);.
134f0 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 switch ((enu
13500 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 m command) cmd)
13510 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 {..case C_REQ:..
13520 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b case C_STRREQ: {
13530 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a .. EVP_PKEY *
13540 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 pkey=NULL;..
13550 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b X509 *cert=NULL;
13560 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 .. X509_NAME
13570 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 *name=NULL;..
13580 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 Tcl_Obj **listv
13590 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 ;.. Tcl_Size
135a0 6c 69 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20 listc;.. int
135b0 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 i;... BIO *ou
135c0 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 t=NULL;... ch
135d0 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 ar *k_C="",*k_ST
135e0 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f ="",*k_L="",*k_O
135f0 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f ="",*k_OU="",*k_
13600 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 CN="",*k_Email="
13610 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 ";.. char *ke
13620 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 yout,*pemout,*st
13630 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 r;.. int keys
13640 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 ize,serial=0,day
13650 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e s=365;..#if OPEN
13660 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
13670 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
13680 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e .. BIGNUM *bn
13690 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 e = NULL;.. R
136a0 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a SA *rsa = NULL;.
136b0 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 #else.. EVP_P
136c0 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e KEY_CTX *ctx = N
136d0 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 ULL;.#endif...
136e0 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c if ((objc<5) |
136f0 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 | (objc>6)) {...
13700 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
13710 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 (interp, 2, objv
13720 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 , "keysize keyfi
13730 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 le certfile ?inf
13740 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 o?");...return T
13750 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
13760 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 ... if (Tcl_G
13770 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
13780 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b erp, objv[2], &k
13790 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f eysize) != TCL_O
137a0 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 K) {...return TC
137b0 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
137c0 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f . keyout=Tcl_
137d0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 GetString(objv[3
137e0 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d ]);.. pemout=
137f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
13800 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 jv[4]);.. if
13810 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f (isStr) {...Tcl_
13820 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 SetVar(interp,ke
13830 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 yout,"",0);...Tc
13840 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
13850 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 pemout,"",0);..
13860 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f }... if (o
13870 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 bjc>=6) {...if (
13880 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c Tcl_ListObjGetEl
13890 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f ements(interp, o
138a0 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 bjv[5], &listc,
138b0 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f &listv) != TCL_O
138c0 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 K) {... retur
138d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
138e0 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 ....if ((listc%2
138f0 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 ) != 0) {...
13900 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
13910 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f terp,"Informatio
13920 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 n list must have
13930 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 even number of
13940 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 arguments",NULL)
13950 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
13960 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 CL_ERROR;...}...
13970 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 for (i=0; i<list
13980 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 c; i+=2) {...
13990 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 str=Tcl_GetStri
139a0 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 ng(listv[i]);...
139b0 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 if (strcmp(s
139c0 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b tr,"days")==0) {
139d0 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
139e0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
139f0 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 ,listv[i+1],&day
13a00 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 s)!=TCL_OK)....
13a10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
13a20 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
13a30 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
13a40 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b ,"serial")==0) {
13a50 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
13a60 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
13a70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 ,listv[i+1],&ser
13a80 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 ial)!=TCL_OK)...
13a90 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
13aa0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 ERROR;... } e
13ab0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
13ac0 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"C")==0) {...
13ad0 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_C=Tcl_GetStri
13ae0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
13af0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
13b00 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 (strcmp(str,"ST"
13b10 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d )==0) {....k_ST=
13b20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
13b30 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
13b40 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
13b50 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 mp(str,"L")==0)
13b60 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 {....k_L=Tcl_Get
13b70 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
13b80 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
13b90 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
13ba0 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "O")==0) {....k_
13bb0 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 O=Tcl_GetString(
13bc0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
13bd0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13be0 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d rcmp(str,"OU")==
13bf0 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 0) {....k_OU=Tcl
13c00 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
13c10 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
13c20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
13c30 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a str,"CN")==0) {.
13c40 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 ...k_CN=Tcl_GetS
13c50 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13c60 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
13c70 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
13c80 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 Email")==0) {...
13c90 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 .k_Email=Tcl_Get
13ca0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
13cb0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
13cc0 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 {....Tcl_SetRes
13cd0 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e ult(interp,"Unkn
13ce0 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e own parameter",N
13cf0 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 ULL);....return
13d00 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
13d10 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 }...}.. }..#
13d20 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
13d30 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
13d40 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 000000L.. bne
13d50 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 = BN_new();..
13d60 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 rsa = RSA_new(
13d70 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 );.. pkey = E
13d80 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 VP_PKEY_new();..
13d90 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e if (bne == N
13da0 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 ULL || rsa == NU
13db0 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 LL || pkey == NU
13dc0 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f LL || !BN_set_wo
13dd0 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c rd(bne,RSA_F4) |
13de0 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 |...!RSA_generat
13df0 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 e_key_ex(rsa, ke
13e00 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c ysize, bne, NULL
13e10 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 ) || !EVP_PKEY_a
13e20 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 ssign_RSA(pkey,
13e30 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b rsa)) {...EVP_PK
13e40 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 EY_free(pkey);..
13e50 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 ./* RSA_free(rsa
13e60 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f ); freed by EVP_
13e70 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 PKEY_free */...B
13e80 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c N_free(bne);.#el
13e90 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 se.. pkey = E
13ea0 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 VP_RSA_gen((unsi
13eb0 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a gned int) keysiz
13ec0 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 e);.. ctx = E
13ed0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 VP_PKEY_CTX_new(
13ee0 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 pkey,NULL);..
13ef0 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c if (pkey == NUL
13f00 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c L || ctx == NULL
13f10 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 || !EVP_PKEY_ke
13f20 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c ygen_init(ctx) |
13f30 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 |...!EVP_PKEY_CT
13f40 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e X_set_rsa_keygen
13f50 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 _bits(ctx, keysi
13f60 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 ze) || !EVP_PKEY
13f70 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b _keygen(ctx, &pk
13f80 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 ey)) {...EVP_PKE
13f90 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
13fa0 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 EVP_PKEY_CTX_fre
13fb0 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 e(ctx);.#endif..
13fc0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
13fd0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
13fe0 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 erating private
13ff0 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 key",NULL);...re
14000 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
14010 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
14020 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
14030 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
14040 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
14050 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
14060 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c _PrivateKey(out,
14070 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 pkey,NULL,NULL,0
14080 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ,NULL,NULL);...
14090 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
140a0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
140b0 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
140c0 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
140d0 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
140e0 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
140f0 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
14100 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,keyout,buffer,0
14110 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
14120 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
14130 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
14140 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
14150 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
14160 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
14170 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
14180 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a me(out,keyout);.
14190 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
141a0 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f bio_PrivateKey(o
141b0 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c ut,pkey,NULL,NUL
141c0 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a L,0,NULL,NULL);.
141d0 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 .. /* PEM_wri
141e0 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 te_bio_RSAPrivat
141f0 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e eKey(out, rsa, N
14200 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 ULL, NULL, 0, NU
14210 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 LL, NULL); */...
14220 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c BIO_free_all
14230 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 (out);.. .}....i
14240 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 f ((cert=X509_ne
14250 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 w())==NULL) {...
14260 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
14270 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
14280 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 generating certi
14290 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c ficate request",
142a0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 NULL);... EVP
142b0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
142c0 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
142d0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
142e0 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
142f0 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
14300 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 endif... retu
14310 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
14320 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 }....X509_set_ve
14330 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 rsion(cert,2);..
14340 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 .ASN1_INTEGER_se
14350 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 t(X509_get_seria
14360 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 lNumber(cert),se
14370 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d rial);...X509_gm
14380 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 time_adj(X509_ge
14390 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 tm_notBefore(cer
143a0 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d t),0);...X509_gm
143b0 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 time_adj(X509_ge
143c0 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 tm_notAfter(cert
143d0 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 ),(long)60*60*24
143e0 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 *days);...X509_s
143f0 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 et_pubkey(cert,p
14400 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 key);....name=X5
14410 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 09_get_subject_n
14420 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 ame(cert);....X5
14430 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
14440 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 y_by_txt(name,"C
14450 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
14460 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
14470 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 char *) k_C, -1
14480 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
14490 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
144a0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 by_txt(name,"ST"
144b0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
144c0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
144d0 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 char *) k_ST, -1
144e0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
144f0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
14500 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c by_txt(name,"L",
14510 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
14520 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
14530 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 har *) k_L, -1,
14540 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
14550 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
14560 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d _txt(name,"O", M
14570 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
14580 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
14590 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 r *) k_O, -1, -1
145a0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
145b0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
145c0 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 xt(name,"OU", MB
145d0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
145e0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
145f0 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 *) k_OU, -1, -1
14600 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
14610 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
14620 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 xt(name,"CN", MB
14630 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
14640 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
14650 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 *) k_CN, -1, -1
14660 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
14670 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
14680 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c xt(name,"Email",
14690 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
146a0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
146b0 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 har *) k_Email,
146c0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 -1, -1, 0);....X
146d0 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 509_set_subject_
146e0 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b name(cert,name);
146f0 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 ....if (!X509_si
14700 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 gn(cert,pkey,EVP
14710 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 _sha256())) {...
14720 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 X509_free(ce
14730 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 rt);... EVP_P
14740 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
14750 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
14760 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
14770 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 0000000L... B
14780 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e N_free(bne);.#en
14790 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 dif... Tcl_Se
147a0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
147b0 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 Error signing ce
147c0 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 rtificate",NULL)
147d0 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
147e0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 CL_ERROR;...}...
147f0 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 .if (isStr) {...
14800 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
14810 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 BIO_s_mem());...
14820 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
14830 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 o_X509(out,cert)
14840 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 ;... i=BIO_re
14850 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 ad(out,buffer,si
14860 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b zeof(buffer)-1);
14870 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f ... i=(i<0) ?
14880 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 0 : i;... bu
14890 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 ffer[i]='\0';...
148a0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 Tcl_SetVar(i
148b0 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 nterp,pemout,buf
148c0 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 fer,0);... BI
148d0 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 O_flush(out);...
148e0 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 BIO_free(out
148f0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
14900 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
14910 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 BIO_s_file());..
14920 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 . BIO_write_f
14930 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f ilename(out,pemo
14940 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ut);... PEM_w
14950 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 rite_bio_X509(ou
14960 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 t,cert);... B
14970 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 IO_free_all(out)
14980 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 ;...}....X509_fr
14990 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f ee(cert);...EVP_
149a0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
149b0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
149c0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
149d0 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 30000000L...BN_f
149e0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 ree(bne);.#endif
149f0 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 .. }..}..brea
14a00 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a k;. default:.
14a10 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 .break;. }.
14a20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
14a30 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .}.../**********
14a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 **********/./* I
14a50 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 nit
14a60 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./************
14a70 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a ********/../*. *
14a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ac0 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 ---. *. * Tls_Fr
14ad0 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 ee --. *. *.This
14ae0 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e procedure clean
14af0 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 s up when a SSL
14b00 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
14b10 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 nnel. *.is close
14b20 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 d and its refere
14b30 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 nce count falls
14b40 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 below 1. *. * Re
14b50 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 sults:. *.none.
14b60 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
14b70 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 s:. *.Frees all
14b80 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d the state. *. *-
14b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14bd0 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f --. */.void.Tls_
14be0 46 72 65 65 28 74 6c 73 5f 66 72 65 65 5f 74 79 Free(tls_free_ty
14bf0 70 65 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a pe *blockPtr) {.
14c00 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
14c10 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 Ptr = (State *)b
14c20 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 lockPtr;.. dp
14c30 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
14c40 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 .. Tls_Clean(
14c50 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 statePtr);. c
14c60 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b kfree(blockPtr);
14c70 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
14c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
14cc0 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d . * Tls_Clean --
14cd0 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
14ce0 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
14cf0 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
14d00 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
14d10 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
14d20 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
14d30 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
14d40 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 1. This should
14d50 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 . *.be called sy
14d60 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 nchronously by t
14d70 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f he CloseProc, no
14d80 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e t in the. *.Even
14d90 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 tuallyFree callb
14da0 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ack.. *. * Resul
14db0 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
14dc0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
14dd0 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 *.Frees all the
14de0 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d state. *. *----
14df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
14e30 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 */.void Tls_Cle
14e40 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 an(State *stateP
14e50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 tr) {. dprint
14e60 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
14e70 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 /*. * we'r
14e80 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 e assuming here
14e90 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c that we're singl
14ea0 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 e-threaded.
14eb0 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
14ec0 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 Ptr->timer != (T
14ed0 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
14ee0 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 ULL) {..Tcl_Dele
14ef0 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 teTimerHandler(s
14f00 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b tatePtr->timer);
14f10 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
14f20 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a r = NULL;. }.
14f30 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
14f40 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b r->protos) {..ck
14f50 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 free(statePtr->p
14f60 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 rotos);..statePt
14f70 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c r->protos = NULL
14f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
14f90 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b statePtr->bio) {
14fa0 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 ../* This will c
14fb0 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e all SSL_shutdown
14fc0 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f . Bug 1414045 */
14fd0 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 ..dprintf("BIO_f
14fe0 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 ree_all(%p)", st
14ff0 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 atePtr->bio);..B
15000 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 IO_free_all(stat
15010 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 ePtr->bio);..sta
15020 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c tePtr->bio = NUL
15030 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
15040 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 (statePtr->ssl)
15050 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f {..dprintf("SSL_
15060 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 free(%p)", state
15070 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f Ptr->ssl);..SSL_
15080 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 free(statePtr->s
15090 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e sl);..statePtr->
150a0 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ssl = NULL;.
150b0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
150c0 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f tr->ctx) {..SSL_
150d0 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 CTX_free(statePt
150e0 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 r->ctx);..stateP
150f0 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a tr->ctx = NULL;.
15100 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
15110 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
15120 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
15130 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
15140 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 callback);..stat
15150 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
15160 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
15170 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
15180 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f assword) {..Tcl_
15190 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
151a0 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
151b0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 ;..statePtr->pas
151c0 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 sword = NULL;.
151d0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
151e0 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 ePtr->vcmd) {..T
151f0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
15200 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
15210 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 ..statePtr->vcmd
15220 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a = NULL;. }..
15230 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
15240 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a urning");.}.../*
15250 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
15260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15290 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
152a0 42 75 69 6c 64 20 49 6e 66 6f 20 43 6f 6d 6d 61 Build Info Comma
152b0 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 nd --. *. *.Crea
152c0 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 65 te command to re
152d0 74 75 72 6e 20 62 75 69 6c 64 20 69 6e 66 6f 20 turn build info
152e0 66 6f 72 20 70 61 63 6b 61 67 65 2e 0a 20 2a 0a for package.. *.
152f0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
15300 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
15310 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 sult. *. * Side
15320 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 effects:. *.Crea
15330 74 65 64 20 62 75 69 6c 64 2d 69 6e 66 6f 20 63 ted build-info c
15340 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d ommand.. *. *---
15350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15390 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 ---. */..#ifndef
153a0 20 53 54 52 49 4e 47 49 46 59 0a 23 20 20 64 65 STRINGIFY.# de
153b0 66 69 6e 65 20 53 54 52 49 4e 47 49 46 59 28 78 fine STRINGIFY(x
153c0 29 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 0a ) STRINGIFY1(x).
153d0 23 20 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 # define STRING
153e0 49 46 59 31 28 78 29 20 23 78 0a 23 65 6e 64 69 IFY1(x) #x.#endi
153f0 66 0a 0a 69 6e 74 0a 42 75 69 6c 64 49 6e 66 6f f..int.BuildInfo
15400 43 6f 6d 6d 61 6e 64 28 54 63 6c 5f 49 6e 74 65 Command(Tcl_Inte
15410 72 70 2a 20 69 6e 74 65 72 70 29 20 7b 0a 20 20 rp* interp) {.
15420 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 69 6e Tcl_CmdInfo in
15430 66 6f 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c fo;.. if (Tcl
15440 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 _GetCommandInfo(
15450 69 6e 74 65 72 70 2c 20 22 3a 3a 74 63 6c 3a 3a interp, "::tcl::
15460 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 26 69 6e build-info", &in
15470 66 6f 29 29 20 7b 0a 09 54 63 6c 5f 43 72 65 61 fo)) {..Tcl_Crea
15480 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
15490 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 62 75 69 erp, "::tls::bui
154a0 6c 64 2d 69 6e 66 6f 22 2c 20 69 6e 66 6f 2e 6f ld-info", info.o
154b0 62 6a 50 72 6f 63 2c 20 28 76 6f 69 64 20 2a 29 bjProc, (void *)
154c0 28 0a 09 09 50 41 43 4b 41 47 45 5f 56 45 52 53 (...PACKAGE_VERS
154d0 49 4f 4e 20 22 2b 22 20 53 54 52 49 4e 47 49 46 ION "+" STRINGIF
154e0 59 28 54 4c 53 5f 56 45 52 53 49 4f 4e 5f 55 55 Y(TLS_VERSION_UU
154f0 49 44 29 0a 23 69 66 20 64 65 66 69 6e 65 64 28 ID).#if defined(
15500 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 64 65 __clang__) && de
15510 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 6d 61 fined(__clang_ma
15520 6a 6f 72 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e jor__).... ".
15530 63 6c 61 6e 67 2d 22 20 53 54 52 49 4e 47 49 46 clang-" STRINGIF
15540 59 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f Y(__clang_major_
15550 5f 29 0a 23 69 66 20 5f 5f 63 6c 61 6e 67 5f 6d _).#if __clang_m
15560 69 6e 6f 72 5f 5f 20 3c 20 31 30 0a 09 09 09 20 inor__ < 10....
15570 20 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09 "0".#endif...
15580 09 20 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f . STRINGIFY(_
15590 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 29 0a _clang_minor__).
155a0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
155b0 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 20 ed(__cplusplus)
155c0 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 42 && !defined(__OB
155d0 4a 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63 JC__).... ".c
155e0 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 plusplus".#endif
155f0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a .#ifndef NDEBUG.
15600 09 09 09 20 20 20 20 22 2e 64 65 62 75 67 22 0a ... ".debug".
15610 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
15620 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 ned(__clang__) &
15630 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 49 4e 54 & !defined(__INT
15640 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 20 26 26 20 EL_COMPILER) &&
15650 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f defined(__GNUC__
15660 29 0a 09 09 09 20 20 20 20 22 2e 67 63 63 2d 22 ).... ".gcc-"
15670 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 STRINGIFY(__GNU
15680 43 5f 5f 29 0a 23 69 66 20 5f 5f 47 4e 55 43 5f C__).#if __GNUC_
15690 4d 49 4e 4f 52 5f 5f 20 3c 20 31 30 0a 09 09 09 MINOR__ < 10....
156a0 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 "0".#endif..
156b0 09 09 20 20 20 20 53 54 52 49 4e 47 49 46 59 28 .. STRINGIFY(
156c0 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 29 0a __GNUC_MINOR__).
156d0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f #endif.#ifdef __
156e0 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 0a 09 INTEL_COMPILER..
156f0 09 09 20 20 20 20 22 2e 69 63 63 2d 22 20 53 54 .. ".icc-" ST
15700 52 49 4e 47 49 46 59 28 5f 5f 49 4e 54 45 4c 5f RINGIFY(__INTEL_
15710 43 4f 4d 50 49 4c 45 52 29 0a 23 65 6e 64 69 66 COMPILER).#endif
15720 0a 23 69 66 64 65 66 20 54 43 4c 5f 4d 45 4d 5f .#ifdef TCL_MEM_
15730 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e 6d DEBUG.... ".m
15740 65 6d 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a emdebug".#endif.
15750 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 #if defined(_MSC
15760 5f 56 45 52 29 0a 09 09 09 20 20 20 20 22 2e 6d _VER).... ".m
15770 73 76 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 svc-" STRINGIFY(
15780 5f 4d 53 43 5f 56 45 52 29 0a 23 65 6e 64 69 66 _MSC_VER).#endif
15790 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 4d 41 4b .#ifdef USE_NMAK
157a0 45 0a 09 09 09 20 20 20 20 22 2e 6e 6d 61 6b 65 E.... ".nmake
157b0 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 ".#endif.#ifndef
157c0 20 54 43 4c 5f 43 46 47 5f 4f 50 54 49 4d 49 5a TCL_CFG_OPTIMIZ
157d0 45 44 0a 09 09 09 20 20 20 20 22 2e 6e 6f 2d 6f ED.... ".no-o
157e0 70 74 69 6d 69 7a 65 22 0a 23 65 6e 64 69 66 0a ptimize".#endif.
157f0 23 69 66 64 65 66 20 5f 5f 4f 42 4a 43 5f 5f 0a #ifdef __OBJC__.
15800 09 09 09 20 20 20 20 22 2e 6f 62 6a 65 63 74 69 ... ".objecti
15810 76 65 2d 63 22 0a 23 69 66 20 64 65 66 69 6e 65 ve-c".#if define
15820 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 09 d(__cplusplus)..
15830 09 09 20 20 20 20 22 70 6c 75 73 70 6c 75 73 22 .. "plusplus"
15840 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 .#endif.#endif.#
15850 69 66 64 65 66 20 54 43 4c 5f 43 46 47 5f 50 52 ifdef TCL_CFG_PR
15860 4f 46 49 4c 45 44 0a 09 09 09 20 20 20 20 22 2e OFILED.... ".
15870 70 72 6f 66 69 6c 65 22 0a 23 65 6e 64 69 66 0a profile".#endif.
15880 23 69 66 64 65 66 20 50 55 52 49 46 59 0a 09 09 #ifdef PURIFY...
15890 09 20 20 20 20 22 2e 70 75 72 69 66 79 22 0a 23 . ".purify".#
158a0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 54 41 endif.#ifdef STA
158b0 54 49 43 5f 42 55 49 4c 44 0a 09 09 09 20 20 20 TIC_BUILD....
158c0 20 22 2e 73 74 61 74 69 63 22 0a 23 65 6e 64 69 ".static".#endi
158d0 66 0a 09 09 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 f...), NULL);.
158e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }. return T
158f0 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
15900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15940 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e ---. *. * Tls_In
15950 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 it --. *. *.This
15960 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e is a package in
15970 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f itialization pro
15980 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 cedure, which is
15990 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 called. *.by Tc
159a0 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b l when this pack
159b0 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 age is to be add
159c0 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 ed to an interpr
159d0 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 eter.. *. * Resu
159e0 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 lts: Ssl config
159f0 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a ured and loaded.
15a00 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
15a10 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 ts:. *. create t
15a20 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 he ssl command,
15a30 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 initialize ssl c
15a40 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d ontext. *. *----
15a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
15a90 20 2a 2f 0a 0a 23 69 66 20 54 43 4c 5f 4d 41 4a */..#if TCL_MAJ
15aa0 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 OR_VERSION > 8.#
15ab0 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 define MIN_VERSI
15ac0 4f 4e 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23 ON "9.0".#else.#
15ad0 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 define MIN_VERSI
15ae0 4f 4e 20 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a ON "8.5".#endif.
15af0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 .static const ch
15b00 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 ar tlsTclInitScr
15b10 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 ipt[] = {.#inclu
15b20 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 de "tls.tcl.h"..
15b30 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 44 4c 4c 0x00. };..DLL
15b40 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 EXPORT int Tls_I
15b50 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a nit(Tcl_Interp *
15b60 69 6e 74 65 72 70 29 20 7b 0a 0a 20 20 20 20 64 interp) {.. d
15b70 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
15b80 3b 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 ;..#ifdef USE_TC
15b90 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 28 L_STUBS. if (
15ba0 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e Tcl_InitStubs(in
15bb0 74 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f terp, MIN_VERSIO
15bc0 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b N, 0) == NULL) {
15bd0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
15be0 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 OR;. }.#endif
15bf0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 . if (Tcl_Pkg
15c00 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 Require(interp,
15c10 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 "Tcl", MIN_VERSI
15c20 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 ON, 0) == NULL)
15c30 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
15c40 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
15c50 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 if (TlsLibInit(0
15c60 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
15c70 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
15c80 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 (interp, "could
15c90 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 not initialize S
15ca0 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68 SL library", (ch
15cb0 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
15cc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
15cd0 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 }.. Tcl_C
15ce0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
15cf0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a interp, "::tls::
15d00 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 ciphers", Cipher
15d10 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
15d20 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
15d30 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
15d40 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
15d50 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
15d60 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
15d70 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 ::connection", C
15d80 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
15d90 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
15da0 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
15db0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
15dc0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
15dd0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
15de0 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61 terp, "::tls::ha
15df0 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 ndshake", Handsh
15e00 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 akeObjCmd, (Clie
15e10 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
15e20 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
15e30 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
15e40 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
15e50 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
15e60 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 ls::import", Imp
15e70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 ortObjCmd, (Clie
15e80 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
15e90 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
15ea0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
15eb0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
15ec0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
15ed0 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 ls::unimport", U
15ee0 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 nimportObjCmd, (
15ef0 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
15f00 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15f10 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15f20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15f30 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15f40 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c "::tls::status",
15f50 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 StatusObjCmd, (
15f60 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
15f70 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15f80 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15f90 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15fa0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15fb0 22 3a 3a 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 "::tls::version"
15fc0 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c , VersionObjCmd,
15fd0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
15fe0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
15ff0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
16000 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
16010 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
16020 2c 20 22 3a 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c , "::tls::misc",
16030 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c MiscObjCmd, (Cl
16040 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
16050 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
16060 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
16070 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
16080 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
16090 3a 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 :tls::protocols"
160a0 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d , ProtocolsObjCm
160b0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
160c0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
160d0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
160e0 29 3b 0a 0a 20 20 20 20 42 75 69 6c 64 49 6e 66 );.. BuildInf
160f0 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 29 oCommand(interp)
16100 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 ;.. if (inter
16110 70 20 26 26 20 54 63 6c 5f 45 76 61 6c 28 69 6e p && Tcl_Eval(in
16120 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 terp, tlsTclInit
16130 53 63 72 69 70 74 29 20 21 3d 20 54 43 4c 5f 4f Script) != TCL_O
16140 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
16150 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
16160 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b return Tcl_Pk
16170 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c gProvide(interp,
16180 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 PACKAGE_NAME, P
16190 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b ACKAGE_VERSION);
161a0 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
161b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
161c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
161d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
161e0 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 . *. *.Tls_SafeI
161f0 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d nit --. *. *.---
16200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
16230 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 *.Standard proce
16240 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 dure required by
16250 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 'load'.. *.Init
16260 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 ializes this ext
16270 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 ension for a saf
16280 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 e interpreter..
16290 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
162a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
162b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
162c0 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 --*. *. *.Side e
162d0 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f ffects:. *..As o
162e0 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a f 'Tls_Init'. *.
162f0 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 *.Result:. *..A
16300 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 standard Tcl er
16310 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d ror code.. *. *-
16320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16350 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 -----*. */.DLLEX
16360 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 PORT int Tls_Saf
16370 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 eInit(Tcl_Interp
16380 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
16390 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
163a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c );. return Tl
163b0 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a s_Init(interp);.
163c0 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
163d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
16400 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 *. *.TlsLibInit
16410 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d --. *. *.------
16420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 ----------*. *.I
16450 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c nitializes SSL l
16460 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 ibrary once per
16470 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d application. *.-
16480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
164a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
164b0 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 . *. *.Side effe
164c0 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c cts:. *..initial
164d0 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 izes SSL library
164e0 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 . *. *.Result:.
164f0 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *..none. *. *---
16500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16530 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ---*. */.static
16540 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 int TlsLibInit(i
16550 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 nt uninitialize)
16560 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e {. static in
16570 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 t initialized =
16580 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 0;. int statu
16590 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 s = TCL_OK;.#if
165a0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
165b0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
165c0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
165d0 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f . size_t num_
165e0 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 locks;.#endif..
165f0 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c if (uninitial
16600 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 ize) {..if (!ini
16610 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 tialized) {..
16620 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 dprintf("Asked
16630 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c to uninitialize,
16640 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 but we are not
16650 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a initialized");..
16660 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
16670 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 OK;..}...dprintf
16680 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 ("Asked to unini
16690 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 tialize");..#if
166a0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
166b0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
166c0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
166d0 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 ..Tcl_MutexLock(
166e0 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 &init_mx);...if
166f0 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 (locks) {.. f
16700 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 ree(locks);..
16710 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 locks = NULL;..
16720 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d locksCount =
16730 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 0;..}.#endif..i
16740 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a nitialized = 0;.
16750 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
16760 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
16770 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
16780 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 EADS)..Tcl_Mutex
16790 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 Unlock(&init_mx)
167a0 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 ;.#endif...retur
167b0 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a n TCL_OK;. }.
167c0 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c . if (initial
167d0 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 ized) {..dprintf
167e0 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 ("Called, but us
167f0 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 ing cached value
16800 22 29 3b 0a 09 72 65 74 75 72 6e 20 73 74 61 74 ");..return stat
16810 75 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 us;. }.. d
16820 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
16830 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
16840 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
16850 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
16860 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f HREADS). Tcl_
16870 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f MutexLock(&init_
16880 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 mx);.#endif.
16890 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b initialized = 1;
168a0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
168b0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
168c0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
168d0 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c READS). num_l
168e0 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f ocks = 1;. lo
168f0 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 cksCount = (int)
16900 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 num_locks;.
16910 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 locks = malloc(s
16920 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 izeof(*locks) *
16930 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 num_locks);.
16940 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c memset(locks, 0,
16950 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 sizeof(*locks)
16960 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 * num_locks);.#e
16970 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 ndif.. /* Ini
16980 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 tialize BOTH lib
16990 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 crypto and libss
169a0 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 l. */. OPENSS
169b0 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 L_init_ssl(OPENS
169c0 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c SL_INIT_LOAD_SSL
169d0 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 _STRINGS | OPENS
169e0 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 SL_INIT_LOAD_CRY
169f0 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f PTO_STRINGS..| O
16a00 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f PENSSL_INIT_ADD_
16a10 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 ALL_CIPHERS | OP
16a20 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 ENSSL_INIT_ADD_A
16a30 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c LL_DIGESTS, NULL
16a40 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f );.. BIO_new_
16a50 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 tcl(NULL, 0);..#
16a60 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
16a70 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
16a80 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
16a90 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e DS)..Tcl_MutexUn
16aa0 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a lock(&init_mx);.
16ab0 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 #endif.. retu
16ac0 72 6e 20 73 74 61 74 75 73 3b 0a 7d 0a rn status;.}.