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 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
10cc0 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
10cd0 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f _peer_signature_
10ce0 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 type_nid(statePt
10cf0 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 r->ssl, &nid);.
10d00 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 } else {..res
10d10 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 = SSL_get_signa
10d20 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 ture_type_nid(st
10d30 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
10d40 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 d);. }. if
10d50 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 (!res) {nid = 0
10d60 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 ;}. LAPPEND_S
10d70 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10d80 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 70 r, "signatureTyp
10d90 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e e", OBJ_nid2ln(n
10da0 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 id), -1);.. T
10db0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
10dc0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
10dd0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
10de0 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
10df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e30 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f . *. * Connectio
10e40 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 nInfoObjCmd -- r
10e50 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e eturn connection
10e60 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 info from OpenS
10e70 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 SL.. *. * Result
10e80 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 s:. *.A list of
10e90 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a connection info.
10ea0 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *----------
10eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
10ef0 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 tatic int Connec
10f00 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 tionInfoObjCmd(C
10f10 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
10f20 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
10f30 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
10f40 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
10f50 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
10f60 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
10f70 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
10f80 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 el to set a mode
10f90 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on */. State
10fa0 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 *statePtr;../*
10fb0 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
10fc0 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
10fd0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
10fe0 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 tr, *listPtr;.
10ff0 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c const SSL *ssl
11000 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
11010 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a CIPHER *cipher;.
11020 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 const SSL_SE
11030 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a SSION *session;.
11040 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 const EVP_MD
11050 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64 29 *md;. (void)
11060 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
11070 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 if (objc != 2)
11080 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
11090 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
110a0 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 objv, "channel")
110b0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
110c0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
110d0 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
110e0 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
110f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
11100 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 [1]), NULL);.
11110 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
11120 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
11130 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
11140 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
11150 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
11160 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
11170 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
11180 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
11190 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
111a0 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
111b0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
111c0 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
111d0 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
111e0 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
111f0 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
11200 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
11210 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
11220 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 han),.. "\":
11230 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
11240 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c l", (char *) NUL
11250 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f L);..Tcl_SetErro
11260 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
11270 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e LS", "CONNECTION
11280 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
11290 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
112a0 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
112b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
112c0 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 }.. objPtr =
112d0 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
112e0 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a , NULL);.. /*
112f0 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f Connection info
11300 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
11310 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f = (State *)Tcl_
11320 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
11330 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 ceData(chan);.
11340 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72 ssl = statePtr
11350 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 ->ssl;. if (s
11360 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f sl != NULL) {../
11370 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 * connection sta
11380 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 te */..LAPPEND_S
11390 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
113a0 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 4c 5f r, "state", SSL_
113b0 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e state_string_lon
113c0 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f g(ssl), -1);.../
113d0 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 73 * Get SNI reques
113e0 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 ted server name
113f0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
11400 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11410 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 "servername", SS
11420 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 L_get_servername
11430 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d (ssl, TLSEXT_NAM
11440 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
11450 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
11460 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 protocol */..LAP
11470 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11480 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
11490 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 ol", SSL_get_ver
114a0 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a sion(ssl), -1);.
114b0 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 ../* Renegotiati
114c0 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c on allowed */..L
114d0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
114e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e rp, objPtr, "ren
114f0 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 egotiation_allow
11500 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 ed", SSL_get_sec
11510 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f ure_renegotiatio
11520 6e 5f 73 75 70 70 6f 72 74 28 28 53 53 4c 20 2a n_support((SSL *
11530 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 ) ssl));.../* Ge
11540 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c t security level
11550 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
11560 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11570 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c "security_level
11580 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 ", SSL_get_secur
11590 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b ity_level(ssl));
115a0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e .../* Session in
115b0 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 fo */..LAPPEND_B
115c0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
115d0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 tr, "session_reu
115e0 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f sed", SSL_sessio
115f0 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a n_reused(ssl));.
11600 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 ../* Is server i
11610 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f nfo */..LAPPEND_
11620 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
11630 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22 Ptr, "is_server"
11640 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 , SSL_is_server(
11650 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 ssl));.../* Is D
11660 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f TLS */..LAPPEND_
11670 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
11680 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 Ptr, "is_dtls",
11690 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 SSL_is_dtls(ssl)
116a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
116b0 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a Cipher info */.
116c0 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c cipher = SSL
116d0 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 _get_current_cip
116e0 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 her(ssl);. if
116f0 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c (cipher != NULL
11700 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 ) {..char buf[BU
11710 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e FSIZ] = {0};..in
11720 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 t bits, alg_bits
11730 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 ;.../* Cipher na
11740 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 me */..LAPPEND_S
11750 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11760 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 4c r, "cipher", SSL
11770 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 _CIPHER_get_name
11780 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
11790 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 ./* RFC name of
117a0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 cipher */..LAPPE
117b0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
117c0 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 64 bjPtr, "standard
117d0 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 _name", SSL_CIPH
117e0 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
117f0 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
11800 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 ./* OpenSSL name
11810 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c of cipher */..L
11820 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11830 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e p, objPtr, "open
11840 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 ssl_name", OPENS
11850 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 SL_cipher_name(S
11860 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 SL_CIPHER_standa
11870 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 29 rd_name(cipher))
11880 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 , -1);.../* numb
11890 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 74 er of secret bit
118a0 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 65 s used for ciphe
118b0 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c r */..bits = SSL
118c0 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 _CIPHER_get_bits
118d0 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 (cipher, &alg_bi
118e0 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e ts);..LAPPEND_IN
118f0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
11900 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c , "secret_bits",
11910 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 bits);..LAPPEND
11920 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
11930 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f Ptr, "algorithm_
11940 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 bits", alg_bits)
11950 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 ;../* alg_bits i
11960 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 s actual key sec
11970 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 ret bits. If use
11980 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 bits and secret
11990 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 (algorithm) bit
119a0 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68 s differ,.. th
119b0 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 e rest of the bi
119c0 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e ts are fixed, i.
119d0 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 e. for limited e
119e0 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 xport ciphers (b
119f0 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f its < 56) */.../
11a00 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 63 * Indicates whic
11a10 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 h SSL/TLS protoc
11a20 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 74 ol version first
11a30 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 70 defined the cip
11a40 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
11a50 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11a60 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e tr, "min_version
11a70 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ", SSL_CIPHER_ge
11a80 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 t_version(cipher
11a90 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 ), -1);.../* Cip
11aa0 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 her NID */..LAPP
11ab0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11ac0 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e objPtr, "cipherN
11ad0 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
11ae0 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
11af0 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 ER_get_cipher_ni
11b00 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b d(cipher)), -1);
11b10 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
11b20 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 terp, objPtr, "d
11b30 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72 igestNID", (char
11b40 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 *)OBJ_nid2ln(SS
11b50 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67 L_CIPHER_get_dig
11b60 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29 est_nid(cipher))
11b70 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
11b80 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11b90 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65 tr, "keyExchange
11ba0 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 NID", (char *)OB
11bb0 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 J_nid2ln(SSL_CIP
11bc0 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 HER_get_kx_nid(c
11bd0 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c ipher)), -1);..L
11be0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11bf0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 p, objPtr, "auth
11c00 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 enticationNID",
11c10 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 (char *)OBJ_nid2
11c20 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ln(SSL_CIPHER_ge
11c30 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65 t_auth_nid(ciphe
11c40 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d r)), -1);.../* m
11c50 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 essage authentic
11c60 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 ation code - Cip
11c70 68 65 72 20 69 73 20 41 45 41 44 20 28 65 2e 67 her is AEAD (e.g
11c80 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32 . GCM or ChaCha2
11c90 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 0/Poly1305) or n
11ca0 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e ot */../* Authen
11cb0 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 69 ticated Encrypti
11cc0 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 on with associat
11cd0 65 64 20 64 61 74 61 20 28 41 45 41 44 29 20 63 ed data (AEAD) c
11ce0 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 heck */..LAPPEND
11cf0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
11d00 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73 jPtr, "cipher_is
11d10 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 _aead", SSL_CIPH
11d20 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65 ER_is_aead(ciphe
11d30 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74 r));.../* Digest
11d40 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 65 used during the
11d50 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 SSL/TLS handsha
11d60 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 ke when using th
11d70 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 e cipher. */..md
11d80 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 = SSL_CIPHER_ge
11d90 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 t_handshake_dige
11da0 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 st(cipher);..LAP
11db0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11dc0 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 objPtr, "handsh
11dd0 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 68 ake_digest", (ch
11de0 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 ar *)EVP_MD_name
11df0 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 (md), -1);.../*
11e00 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 Get OpenSSL-spec
11e10 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e ific ID, not IAN
11e20 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 A ID */..LAPPEND
11e30 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
11e40 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 22 Ptr, "cipher_id"
11e50 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 , (int) SSL_CIPH
11e60 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 ER_get_id(cipher
11e70 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 ));.../* Two-byt
11e80 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 65 e ID used in the
11e90 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 TLS protocol of
11ea0 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 65 the given ciphe
11eb0 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e r */..LAPPEND_IN
11ec0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
11ed0 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c , "protocol_id",
11ee0 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 (int) SSL_CIPHE
11ef0 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 R_get_protocol_i
11f00 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a d(cipher));.../*
11f10 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 Textual descrip
11f20 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 tion of the ciph
11f30 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 er */..if (SSL_C
11f40 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f IPHER_descriptio
11f50 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 n(cipher, buf, s
11f60 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e izeof(buf)) != N
11f70 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 ULL) {.. LAPP
11f80 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11f90 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70 objPtr, "descrip
11fa0 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b tion", buf, -1);
11fb0 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
11fc0 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a * Session info *
11fd0 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 /. session =
11fe0 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_get_session(
11ff0 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 ssl);. if (se
12000 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b ssion != NULL) {
12010 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
12020 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 char *ticket;..
12030 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e size_t len2;..un
12040 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
12050 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
12060 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
12070 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 d, *proto;..unsi
12080 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65 72 gned char buffer
12090 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f [SSL_MAX_MASTER_
120a0 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f KEY_LENGTH];.../
120b0 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c * Report the sel
120c0 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
120d0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 s a result of th
120e0 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 e ALPN negotiati
120f0 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 on */..SSL_SESSI
12100 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c ON_get0_alpn_sel
12110 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 ected(session, &
12120 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 proto, &len2);..
12130 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12140 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 rp, objPtr, "alp
12150 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f n", (char *) pro
12160 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c to, (Tcl_Size) l
12170 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 en2);.../* Repor
12180 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 t the selected p
12190 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 rotocol as a res
121a0 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e ult of the NPN n
121b0 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 egotiation */.#i
121c0 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 fdef USE_NPN..SS
121d0 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 L_get0_next_prot
121e0 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c o_negotiated(ssl
121f0 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 , &proto, &ulen)
12200 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
12210 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12220 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 npn", (char *) p
12230 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 roto, (Tcl_Size)
12240 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a ulen);.#endif..
12250 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 ./* Resumable se
12260 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e ssion */..LAPPEN
12270 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
12280 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 6c bjPtr, "resumabl
12290 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f e", SSL_SESSION_
122a0 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 is_resumable(ses
122b0 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 sion));.../* Ses
122c0 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20 sion start time
122d0 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 (seconds since e
122e0 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e poch) */..LAPPEN
122f0 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f D_LONG(interp, o
12300 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 69 bjPtr, "start_ti
12310 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e me", SSL_SESSION
12320 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f _get_time(sessio
12330 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 n));.../* Timeou
12340 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 t value - SSL_CT
12350 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 X_get_timeout (i
12360 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c n seconds) */..L
12370 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 APPEND_LONG(inte
12380 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d rp, objPtr, "tim
12390 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 eout", SSL_SESSI
123a0 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 ON_get_timeout(s
123b0 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 ession));.../* S
123c0 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 ession id - TLSv
123d0 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 1.2 and below on
123e0 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 ly */..session_i
123f0 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f d = SSL_SESSION_
12400 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 get_id(session,
12410 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 &ulen);..LAPPEND
12420 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
12430 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
12440 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 _id", session_id
12450 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
12460 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e n);.../* Session
12470 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 context */..ses
12480 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 sion_id = SSL_SE
12490 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f SSION_get0_id_co
124a0 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 ntext(session, &
124b0 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f ulen);..LAPPEND_
124c0 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f BARRAY(interp, o
124d0 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f bjPtr, "session_
124e0 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 6f context", sessio
124f0 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 n_id, (Tcl_Size)
12500 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 ulen);.../* Ses
12510 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c sion ticket - cl
12520 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 ient only */..SS
12530 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 L_SESSION_get0_t
12540 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 icket(session, &
12550 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a ticket, &len2);.
12560 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
12570 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12580 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 "session_ticket"
12590 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 , ticket, (Tcl_S
125a0 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a ize) len2);.../*
125b0 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 Session ticket
125c0 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69 lifetime hint (i
125d0 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c n seconds) */..L
125e0 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 APPEND_LONG(inte
125f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 rp, objPtr, "lif
12600 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 etime", SSL_SESS
12610 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c ION_get_ticket_l
12620 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 ifetime_hint(ses
12630 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 sion));.../* Tic
12640 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a ket app data */.
12650 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
12660 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
12670 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f 53 45 0000000L..SSL_SE
12680 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 SSION_get0_ticke
12690 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c 5f 53 t_appdata((SSL_S
126a0 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 69 6f ESSION *) sessio
126b0 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e n, &ticket, &len
126c0 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 2);..LAPPEND_BAR
126d0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 RAY(interp, objP
126e0 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f tr, "ticket_app_
126f0 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 data", ticket, (
12700 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b Tcl_Size) len2);
12710 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 74 .#endif.../* Get
12720 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 master key */..
12730 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 len2 = SSL_SESSI
12740 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 ON_get_master_ke
12750 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 y(session, buffe
12760 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 r, SSL_MAX_MASTE
12770 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 R_KEY_LENGTH);..
12780 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
12790 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
127a0 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 master_key", buf
127b0 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 fer, (Tcl_Size)
127c0 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 len2);.../* Comp
127d0 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 ression id */..u
127e0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 3d nsigned int id =
127f0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
12800 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 73 _compress_id(ses
12810 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f sion);..LAPPEND_
12820 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12830 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e tr, "compression
12840 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 _id", id == 1 ?
12850 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c "zlib" : "none",
12860 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 -1);. }..
12870 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 /* Compression
12880 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 info */. if (
12890 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 ssl != NULL) {.#
128a0 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 ifdef HAVE_SSL_C
128b0 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 OMPRESSION..cons
128c0 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 t COMP_METHOD *c
128d0 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d omp, *expn;..com
128e0 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 p = SSL_get_curr
128f0 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 ent_compression(
12900 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 ssl);..expn = SS
12910 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 L_get_current_ex
12920 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 pansion(ssl);...
12930 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12940 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d rp, objPtr, "com
12950 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 pression", comp
12960 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e ? SSL_COMP_get_n
12970 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e ame(comp) : "non
12980 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e e", -1);..LAPPEN
12990 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
129a0 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e jPtr, "expansion
129b0 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f ", expn ? SSL_CO
129c0 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e MP_get_name(expn
129d0 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b ) : "none", -1);
129e0 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f .#else..LAPPEND_
129f0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12a00 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e tr, "compression
12a10 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a ", "none", -1);.
12a20 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12a30 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 erp, objPtr, "ex
12a40 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 pansion", "none"
12a50 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 , -1);.#endif.
12a60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 }.. /* Serv
12a70 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b er info */. {
12a80 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 ..long mode = SS
12a90 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f L_CTX_get_sessio
12aa0 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 n_cache_mode(sta
12ab0 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 tePtr->ctx);..ch
12ac0 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d ar *msg;...if (m
12ad0 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 ode & SSL_SESS_C
12ae0 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 ACHE_OFF) {..
12af0 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d msg = "off";..}
12b00 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 else if (mode &
12b10 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
12b20 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d CLIENT) {.. m
12b30 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 sg = "client";..
12b40 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 } else if (mode
12b50 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
12b60 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 _SERVER) {..
12b70 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a msg = "server";.
12b80 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 .} else if (mode
12b90 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
12ba0 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d E_BOTH) {.. m
12bb0 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 sg = "both";..}
12bc0 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 else {.. msg
12bd0 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a = "unknown";..}.
12be0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
12bf0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
12c00 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 ssion_cache_mode
12c10 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 ", msg, -1);.
12c20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 }.. /* CA Li
12c30 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 st */. /* IF
12c40 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 61 not a server, sa
12c50 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 me as SSL_get0_p
12c60 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 eer_CA_list. If
12c70 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 53 server same as S
12c80 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e SL_CTX_get_clien
12c90 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 t_CA_list */.
12ca0 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e listPtr = Tcl_N
12cb0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
12cc0 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 L);. STACK_OF
12cd0 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f (X509_NAME) *ca_
12ce0 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63 list;. if ((c
12cf0 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 a_list = SSL_get
12d00 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 _client_CA_list(
12d10 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b ssl)) != NULL) {
12d20 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 55 ..char buffer[BU
12d30 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 FSIZ];..for (int
12d40 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 i = 0; i < sk_X
12d50 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 509_NAME_num(ca_
12d60 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 list); i++) {..
12d70 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 X509_NAME *na
12d80 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d me = sk_X509_NAM
12d90 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c E_value(ca_list,
12da0 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 i);.. if (na
12db0 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d me) {...X509_NAM
12dc0 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 E_oneline(name,
12dd0 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b buffer, BUFSIZ);
12de0 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
12df0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
12e00 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c rp, listPtr, Tcl
12e10 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 _NewStringObj(bu
12e20 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 ffer, -1));..
12e30 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 }..}. }.
12e40 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
12e50 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c rp, objPtr, "caL
12e60 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a ist", listPtr);.
12e70 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 LAPPEND_INT(
12e80 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12e90 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 "caListCount", s
12ea0 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 k_X509_NAME_num(
12eb0 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20 ca_list));..
12ec0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
12ed0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
12ee0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
12ef0 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
12f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f40 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f -. *. * VersionO
12f50 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 bjCmd -- return
12f60 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 version string f
12f70 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a rom OpenSSL.. *.
12f80 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
12f90 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
12fa0 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
12fb0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
12fc0 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
12fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
13010 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 static int.Versi
13020 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 onObjCmd(ClientD
13030 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
13040 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
13050 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
13060 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
13070 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f v[]) {. Tcl_O
13080 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 bj *objPtr;.
13090 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 (void) clientDat
130a0 61 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 6f 62 a;. (void) ob
130b0 6a 63 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 6f jc;. (void) o
130c0 62 6a 76 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 bjv;.. dprint
130d0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
130e0 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
130f0 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e ewStringObj(OPEN
13100 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 SSL_VERSION_TEXT
13110 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 , -1);. Tcl_S
13120 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
13130 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 rp, objPtr);..
13140 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
13150 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
13160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
131a0 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d . * MiscObjCmd -
131b0 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a - misc commands.
131c0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
131d0 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
131e0 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
131f0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
13200 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
13210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
13250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 */.static int.Mi
13260 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 scObjCmd(ClientD
13270 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
13280 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
13290 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
132a0 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
132b0 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 v[]) {. stati
132c0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f c const char *co
132d0 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 mmands [] = { "r
132e0 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e eq", "strreq", N
132f0 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 ULL };. enum
13300 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c command { C_REQ,
13310 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d C_STRREQ, C_DUM
13320 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 69 MY };. Tcl_Si
13330 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e 74 20 ze cmd;. int
13340 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 isStr;. char
13350 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 20 buffer[16384];.
13360 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 (void) client
13370 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e Data;.. dprin
13380 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
13390 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 if (objc < 2)
133a0 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
133b0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
133c0 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e objv, "subcomman
133d0 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 d ?args?");..ret
133e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
133f0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c }. if (Tcl
13400 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a _GetIndexFromObj
13410 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d (interp, objv[1]
13420 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d , commands, "com
13430 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 20 mand", 0, &cmd)
13440 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
13450 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13460 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 }.. ERR_c
13470 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 lear_error();..
13480 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 isStr = (cmd
13490 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 == C_STRREQ);.
134a0 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 switch ((enum
134b0 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a command) cmd) {.
134c0 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 .case C_REQ:..ca
134d0 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 se C_STRREQ: {..
134e0 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b EVP_PKEY *pk
134f0 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 ey=NULL;.. X5
13500 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 09 *cert=NULL;..
13510 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e X509_NAME *n
13520 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 ame=NULL;.. T
13530 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a cl_Obj **listv;.
13540 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69 . Tcl_Size li
13550 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20 69 3b stc;.. int i;
13560 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d ... BIO *out=
13570 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 NULL;... char
13580 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 *k_C="",*k_ST="
13590 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 ",*k_L="",*k_O="
135a0 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e ",*k_OU="",*k_CN
135b0 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b ="",*k_Email="";
135c0 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f .. char *keyo
135d0 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b ut,*pemout,*str;
135e0 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a .. int keysiz
135f0 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d e,serial=0,days=
13600 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 365;..#if OPENSS
13610 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
13620 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
13630 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 BIGNUM *bne
13640 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 = NULL;.. RSA
13650 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 *rsa = NULL;.#e
13660 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 lse.. EVP_PKE
13670 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c Y_CTX *ctx = NUL
13680 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 L;.#endif...
13690 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 if ((objc<5) ||
136a0 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 (objc>6)) {...Tc
136b0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
136c0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 nterp, 2, objv,
136d0 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 "keysize keyfile
136e0 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f certfile ?info?
136f0 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c ");...return TCL
13700 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a _ERROR;.. }..
13710 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
13720 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 IntFromObj(inter
13730 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 p, objv[2], &key
13740 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 size) != TCL_OK)
13750 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f {...return TCL_
13760 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 ERROR;.. }..
13770 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 keyout=Tcl_Ge
13780 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 tString(objv[3])
13790 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 ;.. pemout=Tc
137a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
137b0 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 [4]);.. if (i
137c0 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 sStr) {...Tcl_Se
137d0 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f tVar(interp,keyo
137e0 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f ut,"",0);...Tcl_
137f0 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 SetVar(interp,pe
13800 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 mout,"",0);..
13810 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a }... if (obj
13820 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 c>=6) {...if (Tc
13830 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d l_ListObjGetElem
13840 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a ents(interp, obj
13850 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 26 6c v[5], &listc, &l
13860 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 istv) != TCL_OK)
13870 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 {... return
13880 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
13890 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 ..if ((listc%2)
138a0 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 != 0) {... Tc
138b0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
138c0 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 rp,"Information
138d0 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 list must have e
138e0 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 ven number of ar
138f0 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a guments",NULL);.
13900 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
13910 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f _ERROR;...}...fo
13920 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b r (i=0; i<listc;
13930 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 i+=2) {... s
13940 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 tr=Tcl_GetString
13950 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 (listv[i]);...
13960 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 if (strcmp(str
13970 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 ,"days")==0) {..
13980 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 ..if (Tcl_GetInt
13990 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c FromObj(interp,l
139a0 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 istv[i+1],&days)
139b0 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 !=TCL_OK)....
139c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
139d0 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 R;... } else
139e0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
139f0 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 serial")==0) {..
13a00 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 ..if (Tcl_GetInt
13a10 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c FromObj(interp,l
13a20 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 istv[i+1],&seria
13a30 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 l)!=TCL_OK)....
13a40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
13a50 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
13a60 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
13a70 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"C")==0) {....k
13a80 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _C=Tcl_GetString
13a90 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
13aa0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
13ab0 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d trcmp(str,"ST")=
13ac0 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 =0) {....k_ST=Tc
13ad0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
13ae0 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
13af0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
13b00 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a (str,"L")==0) {.
13b10 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 ...k_L=Tcl_GetSt
13b20 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
13b30 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
13b40 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f f (strcmp(str,"O
13b50 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d ")==0) {....k_O=
13b60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
13b70 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
13b80 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
13b90 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 mp(str,"OU")==0)
13ba0 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 {....k_OU=Tcl_G
13bb0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
13bc0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
13bd0 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
13be0 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"CN")==0) {...
13bf0 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 .k_CN=Tcl_GetStr
13c00 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
13c10 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
13c20 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d (strcmp(str,"Em
13c30 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ail")==0) {....k
13c40 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 _Email=Tcl_GetSt
13c50 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
13c60 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b ;... } else {
13c70 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c ....Tcl_SetResul
13c80 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 t(interp,"Unknow
13c90 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c n parameter",NUL
13ca0 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 L);....return TC
13cb0 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d L_ERROR;... }
13cc0 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 ...}.. }..#if
13cd0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
13ce0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
13cf0 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 0000L.. bne =
13d00 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 BN_new();..
13d10 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b rsa = RSA_new();
13d20 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 .. pkey = EVP
13d30 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 _PKEY_new();..
13d40 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c if (bne == NUL
13d50 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c L || rsa == NULL
13d60 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c || pkey == NULL
13d70 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 || !BN_set_word
13d80 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a (bne,RSA_F4) ||.
13d90 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f ..!RSA_generate_
13da0 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 key_ex(rsa, keys
13db0 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 ize, bne, NULL)
13dc0 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 || !EVP_PKEY_ass
13dd0 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 ign_RSA(pkey, rs
13de0 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 a)) {...EVP_PKEY
13df0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f _free(pkey);.../
13e00 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b * RSA_free(rsa);
13e10 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b freed by EVP_PK
13e20 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f EY_free */...BN_
13e30 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 free(bne);.#else
13e40 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 .. pkey = EVP
13e50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e _RSA_gen((unsign
13e60 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 ed int) keysize)
13e70 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 ;.. ctx = EVP
13e80 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b _PKEY_CTX_new(pk
13e90 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 ey,NULL);.. i
13ea0 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 f (pkey == NULL
13eb0 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c || ctx == NULL |
13ec0 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 | !EVP_PKEY_keyg
13ed0 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a en_init(ctx) ||.
13ee0 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f ..!EVP_PKEY_CTX_
13ef0 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 set_rsa_keygen_b
13f00 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 its(ctx, keysize
13f10 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b ) || !EVP_PKEY_k
13f20 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 eygen(ctx, &pkey
13f30 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f )) {...EVP_PKEY_
13f40 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 free(pkey);...EV
13f50 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 P_PKEY_CTX_free(
13f60 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 ctx);.#endif...T
13f70 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
13f80 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 erp,"Error gener
13f90 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 ating private ke
13fa0 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 y",NULL);...retu
13fb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
13fc0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 } else {...if
13fd0 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 (isStr) {...
13fe0 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f out=BIO_new(BIO
13ff0 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 _s_mem());...
14000 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 PEM_write_bio_P
14010 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b rivateKey(out,pk
14020 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e ey,NULL,NULL,0,N
14030 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ULL,NULL);...
14040 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c i=BIO_read(out,
14050 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 buffer,sizeof(bu
14060 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 ffer)-1);...
14070 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b i=(i<0) ? 0 : i;
14080 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d ... buffer[i]
14090 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c ='\0';... Tcl
140a0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b _SetVar(interp,k
140b0 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b eyout,buffer,0);
140c0 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 ... BIO_flush
140d0 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f (out);... BIO
140e0 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 _free(out);...}
140f0 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 else {... out
14100 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 =BIO_new(BIO_s_f
14110 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 ile());... BI
14120 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 O_write_filename
14130 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 (out,keyout);...
14140 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
14150 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 o_PrivateKey(out
14160 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c ,pkey,NULL,NULL,
14170 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 0,NULL,NULL);...
14180 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 /* PEM_write
14190 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b _bio_RSAPrivateK
141a0 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c ey(out, rsa, NUL
141b0 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c L, NULL, 0, NULL
141c0 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 , NULL); */...
141d0 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f BIO_free_all(o
141e0 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 ut);.. .}....if
141f0 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 ((cert=X509_new(
14200 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 ))==NULL) {...
14210 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
14220 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 interp,"Error ge
14230 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 nerating certifi
14240 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 cate request",NU
14250 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 LL);... EVP_P
14260 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
14270 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
14280 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
14290 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 0000000L... B
142a0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e N_free(bne);.#en
142b0 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e dif... return
142c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a TCL_ERROR;...}.
142d0 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 ...X509_set_vers
142e0 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 ion(cert,2);...A
142f0 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 SN1_INTEGER_set(
14300 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e X509_get_serialN
14310 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 umber(cert),seri
14320 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 al);...X509_gmti
14330 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d me_adj(X509_getm
14340 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 _notBefore(cert)
14350 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 ,0);...X509_gmti
14360 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d me_adj(X509_getm
14370 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c _notAfter(cert),
14380 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 (long)60*60*24*d
14390 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 ays);...X509_set
143a0 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 _pubkey(cert,pke
143b0 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 y);....name=X509
143c0 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d _get_subject_nam
143d0 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 e(cert);....X509
143e0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
143f0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c by_txt(name,"C",
14400 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
14410 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
14420 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 har *) k_C, -1,
14430 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
14440 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
14450 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 _txt(name,"ST",
14460 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
14470 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
14480 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 ar *) k_ST, -1,
14490 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
144a0 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
144b0 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d _txt(name,"L", M
144c0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
144d0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
144e0 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 r *) k_L, -1, -1
144f0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
14500 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
14510 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 xt(name,"O", MBS
14520 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
14530 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
14540 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 *) k_O, -1, -1,
14550 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
14560 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
14570 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 (name,"OU", MBST
14580 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
14590 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
145a0 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_OU, -1, -1,
145b0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
145c0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
145d0 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 (name,"CN", MBST
145e0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
145f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
14600 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_CN, -1, -1,
14610 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
14620 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
14630 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d (name,"Email", M
14640 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
14650 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
14660 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 r *) k_Email, -1
14670 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 , -1, 0);....X50
14680 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 9_set_subject_na
14690 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a me(cert,name);..
146a0 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e ..if (!X509_sign
146b0 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 (cert,pkey,EVP_s
146c0 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 ha256())) {...
146d0 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 X509_free(cert
146e0 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 );... EVP_PKE
146f0 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 Y_free(pkey);.#i
14700 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
14710 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
14720 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 00000L... BN_
14730 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 free(bne);.#endi
14740 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 f... Tcl_SetR
14750 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 esult(interp,"Er
14760 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 ror signing cert
14770 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a ificate",NULL);.
14780 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
14790 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 _ERROR;...}....i
147a0 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 f (isStr) {...
147b0 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
147c0 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 O_s_mem());...
147d0 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f PEM_write_bio_
147e0 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a X509(out,cert);.
147f0 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 .. i=BIO_read
14800 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 (out,buffer,size
14810 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 of(buffer)-1);..
14820 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 . i=(i<0) ? 0
14830 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 : i;... buff
14840 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 er[i]='\0';...
14850 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 Tcl_SetVar(int
14860 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 erp,pemout,buffe
14870 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f r,0);... BIO_
14880 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 flush(out);...
14890 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b BIO_free(out);
148a0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
148b0 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 out=BIO_new(BI
148c0 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 O_s_file());...
148d0 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c BIO_write_fil
148e0 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 ename(out,pemout
148f0 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
14900 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c te_bio_X509(out,
14910 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f cert);... BIO
14920 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a _free_all(out);.
14930 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 ..}....X509_free
14940 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b (cert);...EVP_PK
14950 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
14960 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
14970 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
14980 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 000000L...BN_fre
14990 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 e(bne);.#endif..
149a0 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b }..}..break;
149b0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 . default:..b
149c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
149d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
149e0 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
149f0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 ********/./* Ini
14a00 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f t */
14a10 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
14a20 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d ******/../*. *--
14a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a70 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 -. *. * Tls_Free
14a80 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
14a90 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 rocedure cleans
14aa0 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f up when a SSL so
14ab0 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e cket based chann
14ac0 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 el. *.is closed
14ad0 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 and its referenc
14ae0 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 e count falls be
14af0 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 low 1. *. * Resu
14b00 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a lts:. *.none. *.
14b10 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
14b20 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 . *.Frees all th
14b30 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d e state. *. *---
14b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b80 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 . */.void.Tls_Fr
14b90 65 65 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 ee(tls_free_type
14ba0 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 *blockPtr) {.
14bb0 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
14bc0 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f r = (State *)blo
14bd0 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 ckPtr;.. dpri
14be0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
14bf0 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 Tls_Clean(st
14c00 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 atePtr);. ckf
14c10 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d ree(blockPtr);.}
14c20 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
14c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
14c70 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 * Tls_Clean --.
14c80 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
14c90 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 ure cleans up wh
14ca0 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 en a SSL socket
14cb0 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a based channel. *
14cc0 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 .is closed and i
14cd0 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 ts reference cou
14ce0 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 nt falls below 1
14cf0 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 . This should.
14d00 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 *.be called sync
14d10 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 hronously by the
14d20 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 CloseProc, not
14d30 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 in the. *.Eventu
14d40 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 allyFree callbac
14d50 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 k.. *. * Results
14d60 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.none. *. *
14d70 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
14d80 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 .Frees all the s
14d90 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d tate. *. *------
14da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
14de0 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e /.void Tls_Clean
14df0 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 (State *statePtr
14e00 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ) {. dprintf(
14e10 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
14e20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 /*. * we're
14e30 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 assuming here th
14e40 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d at we're single-
14e50 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f threaded. */
14e60 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
14e70 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c r->timer != (Tcl
14e80 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c _TimerToken) NUL
14e90 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 L) {..Tcl_Delete
14ea0 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 TimerHandler(sta
14eb0 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 tePtr->timer);..
14ec0 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
14ed0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 = NULL;. }..
14ee0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
14ef0 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 >protos) {..ckfr
14f00 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ee(statePtr->pro
14f10 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d tos);..statePtr-
14f20 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a >protos = NULL;.
14f30 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
14f40 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 atePtr->bio) {..
14f50 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c /* This will cal
14f60 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 l SSL_shutdown.
14f70 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 Bug 1414045 */..
14f80 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 dprintf("BIO_fre
14f90 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 e_all(%p)", stat
14fa0 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f ePtr->bio);..BIO
14fb0 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 _free_all(stateP
14fc0 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 tr->bio);..state
14fd0 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b Ptr->bio = NULL;
14fe0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
14ff0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a tatePtr->ssl) {.
15000 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 .dprintf("SSL_fr
15010 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 ee(%p)", statePt
15020 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 r->ssl);..SSL_fr
15030 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ee(statePtr->ssl
15040 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 );..statePtr->ss
15050 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a l = NULL;. }.
15060 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
15070 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 ->ctx) {..SSL_CT
15080 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d X_free(statePtr-
15090 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 >ctx);..statePtr
150a0 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->ctx = NULL;.
150b0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
150c0 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 ePtr->callback)
150d0 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f {..Tcl_DecrRefCo
150e0 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 unt(statePtr->ca
150f0 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 llback);..stateP
15100 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e tr->callback = N
15110 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
15120 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 f (statePtr->pas
15130 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 sword) {..Tcl_De
15140 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
15150 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a Ptr->password);.
15160 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 .statePtr->passw
15170 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ord = NULL;.
15180 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
15190 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c tr->vcmd) {..Tcl
151a0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _DecrRefCount(st
151b0 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 atePtr->vcmd);..
151c0 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
151d0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
151e0 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 dprintf("Retur
151f0 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ning");.}.../*.
15200 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
15210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15240 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 75 -------. *. * Bu
15250 69 6c 64 20 49 6e 66 6f 20 43 6f 6d 6d 61 6e 64 ild Info Command
15260 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 --. *. *.Create
15270 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 65 74 75 command to retu
15280 72 6e 20 62 75 69 6c 64 20 69 6e 66 6f 20 66 6f rn build info fo
15290 72 20 70 61 63 6b 61 67 65 2e 0a 20 2a 0a 20 2a r package.. *. *
152a0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
152b0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
152c0 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 lt. *. * Side ef
152d0 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 fects:. *.Create
152e0 64 20 62 75 69 6c 64 2d 69 6e 66 6f 20 63 6f 6d d build-info com
152f0 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d mand.. *. *-----
15300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15340 2d 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 -. */..#ifndef S
15350 54 52 49 4e 47 49 46 59 0a 23 20 20 64 65 66 69 TRINGIFY.# defi
15360 6e 65 20 53 54 52 49 4e 47 49 46 59 28 78 29 20 ne STRINGIFY(x)
15370 53 54 52 49 4e 47 49 46 59 31 28 78 29 0a 23 20 STRINGIFY1(x).#
15380 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49 46 define STRINGIF
15390 59 31 28 78 29 20 23 78 0a 23 65 6e 64 69 66 0a Y1(x) #x.#endif.
153a0 0a 69 6e 74 0a 42 75 69 6c 64 49 6e 66 6f 43 6f .int.BuildInfoCo
153b0 6d 6d 61 6e 64 28 54 63 6c 5f 49 6e 74 65 72 70 mmand(Tcl_Interp
153c0 2a 20 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 * interp) {.
153d0 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 69 6e 66 6f Tcl_CmdInfo info
153e0 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 ;.. if (Tcl_G
153f0 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e etCommandInfo(in
15400 74 65 72 70 2c 20 22 3a 3a 74 63 6c 3a 3a 62 75 terp, "::tcl::bu
15410 69 6c 64 2d 69 6e 66 6f 22 2c 20 26 69 6e 66 6f ild-info", &info
15420 29 29 20 7b 0a 09 54 63 6c 5f 43 72 65 61 74 65 )) {..Tcl_Create
15430 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
15440 70 2c 20 22 3a 3a 74 6c 73 3a 3a 62 75 69 6c 64 p, "::tls::build
15450 2d 69 6e 66 6f 22 2c 20 69 6e 66 6f 2e 6f 62 6a -info", info.obj
15460 50 72 6f 63 2c 20 28 76 6f 69 64 20 2a 29 28 0a Proc, (void *)(.
15470 09 09 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f ..PACKAGE_VERSIO
15480 4e 20 22 2b 22 20 53 54 52 49 4e 47 49 46 59 28 N "+" STRINGIFY(
15490 54 4c 53 5f 56 45 52 53 49 4f 4e 5f 55 55 49 44 TLS_VERSION_UUID
154a0 29 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f ).#if defined(__
154b0 63 6c 61 6e 67 5f 5f 29 20 26 26 20 64 65 66 69 clang__) && defi
154c0 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f ned(__clang_majo
154d0 72 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63 6c r__).... ".cl
154e0 61 6e 67 2d 22 20 53 54 52 49 4e 47 49 46 59 28 ang-" STRINGIFY(
154f0 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 __clang_major__)
15500 0a 23 69 66 20 5f 5f 63 6c 61 6e 67 5f 6d 69 6e .#if __clang_min
15510 6f 72 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 or__ < 10....
15520 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 "0".#endif....
15530 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 STRINGIFY(__c
15540 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 29 0a 23 65 lang_minor__).#e
15550 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
15560 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 20 26 26 (__cplusplus) &&
15570 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 42 4a 43 !defined(__OBJC
15580 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63 70 6c __).... ".cpl
15590 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 usplus".#endif.#
155a0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 09 09 ifndef NDEBUG...
155b0 09 20 20 20 20 22 2e 64 65 62 75 67 22 0a 23 65 . ".debug".#e
155c0 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
155d0 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 d(__clang__) &&
155e0 21 64 65 66 69 6e 65 64 28 5f 5f 49 4e 54 45 4c !defined(__INTEL
155f0 5f 43 4f 4d 50 49 4c 45 52 29 20 26 26 20 64 65 _COMPILER) && de
15600 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a fined(__GNUC__).
15610 09 09 09 20 20 20 20 22 2e 67 63 63 2d 22 20 53 ... ".gcc-" S
15620 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f TRINGIFY(__GNUC_
15630 5f 29 0a 23 69 66 20 5f 5f 47 4e 55 43 5f 4d 49 _).#if __GNUC_MI
15640 4e 4f 52 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 NOR__ < 10....
15650 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 "0".#endif....
15660 20 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f 5f STRINGIFY(__
15670 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 29 0a 23 65 GNUC_MINOR__).#e
15680 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 49 4e ndif.#ifdef __IN
15690 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 0a 09 09 09 TEL_COMPILER....
156a0 20 20 20 20 22 2e 69 63 63 2d 22 20 53 54 52 49 ".icc-" STRI
156b0 4e 47 49 46 59 28 5f 5f 49 4e 54 45 4c 5f 43 4f NGIFY(__INTEL_CO
156c0 4d 50 49 4c 45 52 29 0a 23 65 6e 64 69 66 0a 23 MPILER).#endif.#
156d0 69 66 64 65 66 20 54 43 4c 5f 4d 45 4d 5f 44 45 ifdef TCL_MEM_DE
156e0 42 55 47 0a 09 09 09 20 20 20 20 22 2e 6d 65 6d BUG.... ".mem
156f0 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 debug".#endif.#i
15700 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 f defined(_MSC_V
15710 45 52 29 0a 09 09 09 20 20 20 20 22 2e 6d 73 76 ER).... ".msv
15720 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 4d c-" STRINGIFY(_M
15730 53 43 5f 56 45 52 29 0a 23 65 6e 64 69 66 0a 23 SC_VER).#endif.#
15740 69 66 64 65 66 20 55 53 45 5f 4e 4d 41 4b 45 0a ifdef USE_NMAKE.
15750 09 09 09 20 20 20 20 22 2e 6e 6d 61 6b 65 22 0a ... ".nmake".
15760 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 54 #endif.#ifndef T
15770 43 4c 5f 43 46 47 5f 4f 50 54 49 4d 49 5a 45 44 CL_CFG_OPTIMIZED
15780 0a 09 09 09 20 20 20 20 22 2e 6e 6f 2d 6f 70 74 .... ".no-opt
15790 69 6d 69 7a 65 22 0a 23 65 6e 64 69 66 0a 23 69 imize".#endif.#i
157a0 66 64 65 66 20 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 fdef __OBJC__...
157b0 09 20 20 20 20 22 2e 6f 62 6a 65 63 74 69 76 65 . ".objective
157c0 2d 63 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28 -c".#if defined(
157d0 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 09 09 09 __cplusplus)....
157e0 20 20 20 20 22 70 6c 75 73 70 6c 75 73 22 0a 23 "plusplus".#
157f0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 endif.#endif.#if
15800 64 65 66 20 54 43 4c 5f 43 46 47 5f 50 52 4f 46 def TCL_CFG_PROF
15810 49 4c 45 44 0a 09 09 09 20 20 20 20 22 2e 70 72 ILED.... ".pr
15820 6f 66 69 6c 65 22 0a 23 65 6e 64 69 66 0a 23 69 ofile".#endif.#i
15830 66 64 65 66 20 50 55 52 49 46 59 0a 09 09 09 20 fdef PURIFY....
15840 20 20 20 22 2e 70 75 72 69 66 79 22 0a 23 65 6e ".purify".#en
15850 64 69 66 0a 23 69 66 64 65 66 20 53 54 41 54 49 dif.#ifdef STATI
15860 43 5f 42 55 49 4c 44 0a 09 09 09 20 20 20 20 22 C_BUILD.... "
15870 2e 73 74 61 74 69 63 22 0a 23 65 6e 64 69 66 0a .static".#endif.
15880 09 09 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 ..), NULL);.
15890 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c }. return TCL
158a0 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
158b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158f0 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 -. *. * Tls_Init
15900 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 --. *. *.This i
15910 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 s a package init
15920 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 ialization proce
15930 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 dure, which is c
15940 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 alled. *.by Tcl
15950 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 when this packag
15960 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 e is to be added
15970 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 to an interpret
15980 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
15990 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 s: Ssl configur
159a0 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a ed and loaded. *
159b0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
159c0 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 :. *. create the
159d0 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e ssl command, in
159e0 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e itialize ssl con
159f0 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d text. *. *------
15a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
15a40 2f 0a 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 /..#if TCL_MAJOR
15a50 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 _VERSION > 8.#de
15a60 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e fine MIN_VERSION
15a70 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 "9.0".#else.#de
15a80 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e fine MIN_VERSION
15a90 20 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 73 "8.5".#endif..s
15aa0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
15ab0 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 tlsTclInitScrip
15ac0 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 t[] = {.#include
15ad0 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 "tls.tcl.h"..0x
15ae0 30 30 0a 20 20 20 20 7d 3b 0a 0a 44 4c 4c 45 58 00. };..DLLEX
15af0 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 PORT int Tls_Ini
15b00 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e t(Tcl_Interp *in
15b10 74 65 72 70 29 20 7b 0a 0a 20 20 20 20 64 70 72 terp) {.. dpr
15b20 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
15b30 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f .#ifdef USE_TCL_
15b40 53 54 55 42 53 0a 20 20 20 20 69 66 20 28 54 63 STUBS. if (Tc
15b50 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 l_InitStubs(inte
15b60 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c rp, MIN_VERSION,
15b70 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 0) == NULL) {..
15b80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
15b90 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 ;. }.#endif.
15ba0 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 if (Tcl_PkgRe
15bb0 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 quire(interp, "T
15bc0 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e cl", MIN_VERSION
15bd0 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a , 0) == NULL) {.
15be0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
15bf0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 R;. }.. if
15c00 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 (TlsLibInit(0)
15c10 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 != TCL_OK) {..Tc
15c20 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
15c30 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f nterp, "could no
15c40 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c t initialize SSL
15c50 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68 61 72 library", (char
15c60 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
15c70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
15c80 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 }.. Tcl_Cre
15c90 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
15ca0 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63 69 terp, "::tls::ci
15cb0 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f phers", CiphersO
15cc0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
15cd0 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
15ce0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
15cf0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
15d00 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
15d10 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a interp, "::tls::
15d20 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e connection", Con
15d30 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d nectionInfoObjCm
15d40 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
15d50 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
15d60 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
15d70 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
15d80 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
15d90 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61 6e 64 rp, "::tls::hand
15da0 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b shake", Handshak
15db0 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 eObjCmd, (Client
15dc0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
15dd0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
15de0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
15df0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
15e00 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
15e10 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 ::import", Impor
15e20 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 tObjCmd, (Client
15e30 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
15e40 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
15e50 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
15e60 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
15e70 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 d(interp, "::tls
15e80 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 ::unimport", Uni
15e90 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c mportObjCmd, (Cl
15ea0 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
15eb0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
15ec0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
15ed0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
15ee0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
15ef0 3a 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 :tls::status", S
15f00 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c tatusObjCmd, (Cl
15f10 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
15f20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
15f30 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
15f40 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
15f50 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
15f60 3a 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 :tls::version",
15f70 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 VersionObjCmd, (
15f80 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
15f90 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
15fa0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
15fb0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
15fc0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
15fd0 22 3a 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d "::tls::misc", M
15fe0 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 iscObjCmd, (Clie
15ff0 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
16000 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
16010 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
16020 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
16030 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
16040 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 ls::protocols",
16050 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c ProtocolsObjCmd,
16060 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
16070 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
16080 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
16090 0a 0a 20 20 20 20 42 75 69 6c 64 49 6e 66 6f 43 .. BuildInfoC
160a0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 29 3b 0a ommand(interp);.
160b0 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 20 . if (interp
160c0 26 26 20 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 && Tcl_Eval(inte
160d0 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 rp, tlsTclInitSc
160e0 72 69 70 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 ript) != TCL_OK)
160f0 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
16100 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
16110 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 return Tcl_PkgP
16120 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 rovide(interp, P
16130 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 ACKAGE_NAME, PAC
16140 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d KAGE_VERSION);.}
16150 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
16160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
16190 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 *. *.Tls_SafeIni
161a0 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d t --. *. *.-----
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 2a 0a 20 2a 09 -----------*. *.
161e0 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 Standard procedu
161f0 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 27 re required by '
16200 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 load'.. *.Initia
16210 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e lizes this exten
16220 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 sion for a safe
16230 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 interpreter.. *.
16240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16270 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 *. *. *.Side eff
16280 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 ects:. *..As of
16290 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 'Tls_Init'. *. *
162a0 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 .Result:. *..A s
162b0 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f tandard Tcl erro
162c0 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d r code.. *. *---
162d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
162e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
162f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16300 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f ---*. */.DLLEXPO
16310 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 RT int Tls_SafeI
16320 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a nit(Tcl_Interp *
16330 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 interp) {. dp
16340 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
16350 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f . return Tls_
16360 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 7d 0a Init(interp);.}.
16370 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
16380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
163b0 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d . *.TlsLibInit -
163c0 2d 0a 20 2a 0a 20 2a 09 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 2a 0a 20 2a 09 49 6e 69 --------*. *.Ini
16400 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 tializes SSL lib
16410 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 rary once per ap
16420 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d plication. *.---
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 2d 2d 2d 2d 2d 2d ----------------
16450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
16460 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 *. *.Side effect
16470 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a s:. *..initializ
16480 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 es SSL library.
16490 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 *. *.Result:. *.
164a0 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .none. *. *-----
164b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
164c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
164d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
164e0 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e -*. */.static in
164f0 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 t TlsLibInit(int
16500 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b uninitialize) {
16510 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 . static int
16520 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b initialized = 0;
16530 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 . int status
16540 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 = TCL_OK;.#if de
16550 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
16560 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
16570 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
16580 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f size_t num_lo
16590 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 cks;.#endif..
165a0 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a if (uninitializ
165b0 65 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 e) {..if (!initi
165c0 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 alized) {.. d
165d0 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f printf("Asked to
165e0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 uninitialize, b
165f0 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e ut we are not in
16600 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 itialized");...
16610 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
16620 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 ;..}...dprintf("
16630 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 Asked to uniniti
16640 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 alize");..#if de
16650 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
16660 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
16670 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 d(TCL_THREADS)..
16680 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 Tcl_MutexLock(&i
16690 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c nit_mx);...if (l
166a0 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 ocks) {.. fre
166b0 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c e(locks);.. l
166c0 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 ocks = NULL;..
166d0 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 locksCount = 0
166e0 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 ;..}.#endif..ini
166f0 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 tialized = 0;..#
16700 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
16710 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
16720 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
16730 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e DS)..Tcl_MutexUn
16740 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a lock(&init_mx);.
16750 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 20 #endif...return
16760 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 TCL_OK;. }..
16770 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a if (initializ
16780 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 ed) {..dprintf("
16790 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e Called, but usin
167a0 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 g cached value")
167b0 3b 0a 09 72 65 74 75 72 6e 20 73 74 61 74 75 73 ;..return status
167c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
167d0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
167e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
167f0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
16800 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
16810 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 EADS). Tcl_Mu
16820 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 texLock(&init_mx
16830 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e );.#endif. in
16840 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a itialized = 1;..
16850 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
16860 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
16870 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
16880 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 ADS). num_loc
16890 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b ks = 1;. lock
168a0 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e sCount = (int) n
168b0 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f um_locks;. lo
168c0 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a cks = malloc(siz
168d0 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 eof(*locks) * nu
168e0 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 m_locks);. me
168f0 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 mset(locks, 0, s
16900 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 izeof(*locks) *
16910 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 num_locks);.#end
16920 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 if.. /* Initi
16930 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 alize BOTH libcr
16940 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e ypto and libssl.
16950 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f */. OPENSSL_
16960 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c init_ssl(OPENSSL
16970 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 _INIT_LOAD_SSL_S
16980 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c TRINGS | OPENSSL
16990 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 _INIT_LOAD_CRYPT
169a0 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 O_STRINGS..| OPE
169b0 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c NSSL_INIT_ADD_AL
169c0 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e L_CIPHERS | OPEN
169d0 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c SSL_INIT_ADD_ALL
169e0 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b _DIGESTS, NULL);
169f0 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 .. BIO_new_tc
16a00 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 l(NULL, 0);..#if
16a10 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
16a20 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
16a30 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
16a40 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f )..Tcl_MutexUnlo
16a50 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 ck(&init_mx);.#e
16a60 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e ndif.. return
16a70 20 73 74 61 74 75 73 3b 0a 7d 0a status;.}.