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 3b 20 char *major;
1090: 63 68 61 72 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 char *minor;..
10a0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
10b0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
10c0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
10d0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
10e0: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 LL)..return;..
10f0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 if (where & SS
1100: 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 L_CB_HANDSHAKE_S
1110: 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d TART) {..major =
1120: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d "handshake";..m
1130: 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 3b 0a inor = "start";.
1140: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 } else if (w
1150: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 here & SSL_CB_HA
1160: 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a NDSHAKE_DONE) {.
1170: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 .major = "handsh
1180: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 ake";..minor = "
1190: 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 done";. } els
11a0: 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65 20 26 e {..if (where &
11b0: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 SSL_CB_ALERT)..
11c0: 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b major = "alert";
11d0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 ..else if (where
11e0: 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 & SSL_ST_CONNEC
11f0: 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e T).major = "conn
1200: 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 ect";..else if (
1210: 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 where & SSL_ST_A
1220: 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 CCEPT)..major =
1230: 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 "accept";..else.
1240: 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b ....major = "unk
1250: 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 nown";...if (whe
1260: 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 re & SSL_CB_READ
1270: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 )..minor = "read
1280: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 ";..else if (whe
1290: 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 re & SSL_CB_WRIT
12a0: 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 E)..minor = "wri
12b0: 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 te";..else if (w
12c0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f here & SSL_CB_LO
12d0: 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f OP)..minor = "lo
12e0: 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 op";..else if (w
12f0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 here & SSL_CB_EX
1300: 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 IT)..minor = "ex
1310: 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d it";..else.....m
1320: 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 inor = "unknown"
1330: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
1340: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
1350: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
1360: 63 68 61 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e chan, major, min
1370: 6f 72 2c 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 or, message, and
1380: 20 74 79 70 65 20 61 72 67 73 20 2a 2f 0a 20 20 type args */.
1390: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
13a0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
13b0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
13c0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
13d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
13e0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
13f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
1400: 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 info", -1));.
1410: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
1420: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1430: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
1440: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1450: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
1460: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
1470: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 f), -1));. Tc
1480: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1490: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
14a0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
14b0: 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d ringObj(major, -
14c0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
14d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
14e0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
14f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
1500: 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a bj(minor, -1));.
1510: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 . if (where &
1520: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b SSL_CB_ALERT) {
1530: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
1540: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1550: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
1560: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1570: 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f (SSL_alert_desc_
1580: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 string_long(ret)
1590: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
15a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
15b0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
15c0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
15d0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 ringObj(SSL_aler
15e0: 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f t_type_string_lo
15f0: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 ng(ret), -1));.
1600: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c } else {..Tcl
1610: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1620: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
1630: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
1640: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
1650: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e state_string_lon
1660: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 g(ssl), -1));..T
1670: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1680: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1690: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
16a0: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c tringObj("info",
16b0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 -1));. }..
16c0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
16d0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
16e0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
16f0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
1700: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
1710: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
1720: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
1730: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
1740: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Ptr);.}.../*. *-
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 2d 2d 2d ----------------
1790: 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 --. *. * Message
17a0: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 Callback --. *.
17b0: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 *.Monitors SSL p
17c0: 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 rotocol messages
17d0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
17e0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
17f0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
1800: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
1810: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
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 2d 2d ----------------
1860: 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 ---. */.#ifndef
1870: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 OPENSSL_NO_SSL_T
1880: 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 RACE.static void
1890: 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b .MessageCallback
18a0: 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e (int write_p, in
18b0: 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 t version, int c
18c0: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e ontent_type, con
18d0: 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 st void *buf, si
18e0: 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 ze_t len, SSL *s
18f0: 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b sl, void *arg) {
1900: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
1910: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
1920: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
1930: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
1940: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
1950: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
1960: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65 tr;. char *ve
1970: 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 r, *type;. BI
1980: 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 O *bio;. char
1990: 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a buffer[15000];.
19a0: 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 buffer[0] =
19b0: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
19c0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
19d0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
19e0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f llback == (Tcl_O
19f0: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 bj*)NULL)..retur
1a00: 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76 n;.. switch(v
1a10: 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f 50 ersion) {.#if OP
1a20: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
1a30: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
1a40: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
1a50: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
1a60: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
1a70: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 53 SL2). case SS
1a80: 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 L2_VERSION:..ver
1a90: 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65 = "SSLv2";..bre
1aa0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
1ab0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
1ac0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
1ad0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 NSSL_NO_SSL3).
1ae0: 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53 case SSL3_VERS
1af0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c ION:..ver = "SSL
1b00: 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e v3";..break;.#en
1b10: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53 dif. case TLS
1b20: 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 1_VERSION:..ver
1b30: 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61 = "TLSv1";..brea
1b40: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 k;. case TLS1
1b50: 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 _1_VERSION:..ver
1b60: 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62 = "TLSv1.1";..b
1b70: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
1b80: 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 LS1_2_VERSION:..
1b90: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b ver = "TLSv1.2";
1ba0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1bb0: 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e e TLS1_3_VERSION
1bc0: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e :..ver = "TLSv1.
1bd0: 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 3";..break;.
1be0: 63 61 73 65 20 30 3a 0a 09 76 65 72 20 3d 20 22 case 0:..ver = "
1bf0: 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 none";..break;.
1c00: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 72 default:..ver
1c10: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 = "unknown";..b
1c20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
1c30: 20 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e 74 switch (content
1c40: 5f 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73 _type) {. cas
1c50: 65 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 52 e SSL3_RT_HEADER
1c60: 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64 65 :..type = "Heade
1c70: 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 r";..break;.
1c80: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e case SSL3_RT_INN
1c90: 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a ER_CONTENT_TYPE:
1ca0: 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20 ..type = "Inner
1cb0: 43 6f 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 09 Content Type";..
1cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1cd0: 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47 45 5f 43 SSL3_RT_CHANGE_C
1ce0: 49 50 48 45 52 5f 53 50 45 43 3a 0a 09 74 79 70 IPHER_SPEC:..typ
1cf0: 65 20 3d 20 22 43 68 61 6e 67 65 20 43 69 70 68 e = "Change Ciph
1d00: 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 er";..break;.
1d10: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 4c case SSL3_RT_AL
1d20: 45 52 54 3a 0a 09 74 79 70 65 20 3d 20 22 41 6c ERT:..type = "Al
1d30: 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 ert";..break;.
1d40: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 case SSL3_RT_H
1d50: 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 70 65 20 ANDSHAKE:..type
1d60: 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 3b 0a 09 = "Handshake";..
1d70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1d80: 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43 41 54 SSL3_RT_APPLICAT
1d90: 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70 65 20 ION_DATA:..type
1da0: 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a 09 62 = "App Data";..b
1db0: 72 65 61 6b 3b 0a 23 69 66 20 4f 50 45 4e 53 53 reak;.#if OPENSS
1dc0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
1dd0: 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 20 < 0x30000000L.
1de0: 20 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54 case DTLS1_RT
1df0: 5f 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70 _HEARTBEAT:..typ
1e00: 65 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b e = "Heartbeat";
1e10: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
1e20: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79 default:..ty
1e30: 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a pe = "unknown";.
1e40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65 }.. /* Ne
1e50: 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 eds compile time
1e60: 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d option "enable-
1e70: 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20 ssl-trace". */.
1e80: 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49 if ((bio = BI
1e90: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 O_new(BIO_s_mem(
1ea0: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ))) != NULL) {..
1eb0: 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63 int n;..SSL_trac
1ec0: 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69 e(write_p, versi
1ed0: 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 on, content_type
1ee0: 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c , buf, len, ssl,
1ef0: 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09 (void *)bio);..
1f00: 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f n = BIO_read(bio
1f10: 2c 20 62 75 66 66 65 72 2c 20 42 49 4f 5f 70 65 , buffer, BIO_pe
1f20: 6e 64 69 6e 67 28 62 69 6f 29 20 3c 20 31 35 30 nding(bio) < 150
1f30: 30 30 20 3f 20 42 49 4f 5f 70 65 6e 64 69 6e 67 00 ? BIO_pending
1f40: 28 62 69 6f 29 20 3a 20 31 34 39 39 39 29 3b 0a (bio) : 14999);.
1f50: 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20 3a .n = (n<0) ? 0 :
1f60: 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20 3d n;..buffer[n] =
1f70: 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66 0;..(void)BIO_f
1f80: 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42 49 4f 5f lush(bio);..BIO_
1f90: 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 7d 0a free(bio);. }.
1fa0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
1fb0: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
1fc0: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 69 ith fn, chan, di
1fd0: 72 65 63 74 69 6f 6e 2c 20 76 65 72 73 69 6f 6e rection, version
1fe0: 2c 20 74 79 70 65 2c 20 61 6e 64 20 6d 65 73 73 , type, and mess
1ff0: 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 age args */.
2000: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
2010: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
2020: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 tr->callback);.
2030: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2040: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2050: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
2060: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65 NewStringObj("me
2070: 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20 ssage", -1));.
2080: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2090: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
20a0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
20b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
20c0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
20d0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
20e0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
20f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2100: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2110: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
2120: 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 5f 70 tringObj(write_p
2130: 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 65 63 ? "Sent" : "Rec
2140: 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20 eived", -1));.
2150: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2160: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2170: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2180: 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 72 2c ewStringObj(ver,
2190: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
21a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
21b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
21c0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
21d0: 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 29 3b gObj(type, -1));
21e0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
21f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2200: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
2210: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 l_NewStringObj(b
2220: 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 uffer, -1));..
2230: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
2240: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
2250: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
2260: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
2270: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
2280: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
2290: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
22a0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
22b0: 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c Ptr);.}.#endif..
22c0: 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2310: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d VerifyCallback -
2320: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 -. *. *.Monitors
2330: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65 SSL certificate
2340: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63 validation proc
2350: 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e ess. Used to con
2360: 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61 trol the. *.beha
2370: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53 vior when the SS
2380: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c L_VERIFY_PEER fl
2390: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 ag is set. This
23a0: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65 is called. *.whe
23b0: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63 never a certific
23c0: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 ate is inspected
23d0: 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61 or decided inva
23e0: 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f 72 0a lid. Called for.
23f0: 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 69 63 *.each certific
2400: 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 74 20 ate in the cert
2410: 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65 chain.. *. * Che
2420: 63 6b 73 3a 0a 20 2a 09 54 68 65 20 63 65 72 74 cks:. *.The cert
2430: 69 66 69 63 61 74 65 20 63 68 61 69 6e 20 69 73 ificate chain is
2440: 20 63 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e checked startin
2450: 67 20 77 69 74 68 20 74 68 65 20 64 65 65 70 65 g with the deepe
2460: 73 74 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c st nesting level
2470: 0a 20 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20 . *. (the root
2480: 43 41 20 63 65 72 74 69 66 69 63 61 74 65 29 20 CA certificate)
2490: 61 6e 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72 and worked upwar
24a0: 64 20 74 6f 20 74 68 65 20 70 65 65 72 27 73 20 d to the peer's
24b0: 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 certificate.. *.
24c0: 41 6c 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61 All signatures a
24d0: 72 65 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e re valid, curren
24e0: 74 20 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e t time is within
24f0: 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 first and last
2500: 76 61 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20 validity time..
2510: 2a 09 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 *.Check that the
2520: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 certificate is
2530: 69 73 73 75 65 64 20 62 79 20 74 68 65 20 69 73 issued by the is
2540: 73 75 65 72 20 63 65 72 74 69 66 69 63 61 74 65 suer certificate
2550: 20 69 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63 issuer.. *.Chec
2560: 6b 20 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e k the revocation
2570: 20 73 74 61 74 75 73 20 66 6f 72 20 65 61 63 68 status for each
2580: 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a certificate.. *
2590: 09 43 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64 .Check the valid
25a0: 69 74 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e ity of the given
25b0: 20 43 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72 CRL and the cer
25c0: 74 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 t revocation sta
25d0: 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 tus.. *.Check th
25e0: 65 20 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c e policies of al
25f0: 6c 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 l the certificat
2600: 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a es. *. * Args. *
2610: 09 70 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e .preverify_ok in
2620: 64 69 63 61 74 65 73 20 77 68 65 74 68 65 72 20 dicates whether
2630: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
2640: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73 verification pas
2650: 73 65 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28 sed (1) or not (
2660: 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 0). *. * Results
2670: 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 :. *.A callback
2680: 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 bound to the soc
2690: 6b 65 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f ket may return o
26a0: 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 ne of:. *. 0.
26b0: 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 ..- the certific
26c0: 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e ate is deemed in
26d0: 76 61 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69 valid, send veri
26e0: 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20 fication. *....
26f0: 20 66 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74 failure alert t
2700: 6f 20 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d o peer, and term
2710: 69 6e 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e inate handshake.
2720: 0a 20 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68 . *. 1...- th
2730: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 e certificate is
2740: 20 64 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63 deemed valid, c
2750: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e ontinue with han
2760: 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65 dshake.. *. e
2770: 6d 70 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f mpty string.- no
2780: 20 63 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 change to certi
2790: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f ficate validatio
27a0: 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 n. *. * Side eff
27b0: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 ects:. *.The err
27c0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 field of the cu
27d0: 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 rrently operativ
27e0: 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 e State is set.
27f0: 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 *. to a string
2800: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 describing the S
2810: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 SL negotiation f
2820: 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a ailure reason. *
2830: 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
2880: 63 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c c int.VerifyCall
2890: 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 back(int ok, X50
28a0: 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 9_STORE_CTX *ctx
28b0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ) {. Tcl_Obj
28c0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c *cmdPtr;. SSL
28d0: 20 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a *ssl..= (SSL*
28e0: 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f )X509_STORE_CTX_
28f0: 67 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c get_ex_data(ctx,
2900: 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 SSL_get_ex_data
2910: 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f _X509_STORE_CTX_
2920: 69 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 idx());. X509
2930: 20 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f *cert..= X509_
2940: 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 STORE_CTX_get_cu
2950: 72 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b rrent_cert(ctx);
2960: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
2970: 65 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 ePtr.= (State*)S
2980: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_get_app_data(
2990: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e ssl);. Tcl_In
29a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
29b0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
29c0: 0a 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 . int depth..
29d0: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 = X509_STORE_CTX
29e0: 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 _get_error_depth
29f0: 28 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 (ctx);. int e
2a00: 72 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 rr..= X509_STORE
2a10: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 _CTX_get_error(c
2a20: 74 78 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 tx);.. dprint
2a30: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 f("Called");.
2a40: 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 dprintf("Verify
2a50: 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 6f Callback: %d", o
2a60: 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 k);.. if (sta
2a70: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 tePtr->vcmd == (
2a80: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b Tcl_Obj*)NULL) {
2a90: 0a 09 2f 2a 20 55 73 65 20 6f 6b 20 76 61 6c 75 ../* Use ok valu
2aa0: 65 20 69 66 20 76 65 72 69 66 69 63 61 74 69 6f e if verificatio
2ab0: 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f n is required */
2ac0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e ..if (statePtr->
2ad0: 76 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 vflags & SSL_VER
2ae0: 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 IFY_FAIL_IF_NO_P
2af0: 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 EER_CERT) {..
2b00: 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 return ok;..} e
2b10: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 lse {.. retur
2b20: 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c n 1;..}. } el
2b30: 73 65 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e se if (cert == N
2b40: 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 ULL || ssl == NU
2b50: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b LL) {..return 0;
2b60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
2b70: 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 ntf("VerifyCallb
2b80: 61 63 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61 ack: eval callba
2b90: 63 6b 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 ck");.. /* Cr
2ba0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
2bb0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 eval with fn, ch
2bc0: 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 an, depth, cert
2bd0: 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 info list, statu
2be0: 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 s, and error arg
2bf0: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
2c00: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
2c10: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d bj(statePtr->vcm
2c20: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
2c30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2c40: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2c50: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2c60: 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29 j("verify", -1))
2c70: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2c80: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2c90: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
2ca0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2cb0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
2cc0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
2cd0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 lf), -1));. T
2ce0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2cf0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2d00: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 cmdPtr, Tcl_NewI
2d10: 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 ntObj(depth));.
2d20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2d30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2d40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f rp, cmdPtr, Tls_
2d50: 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 NewX509Obj(inter
2d60: 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 54 p, cert));. T
2d70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2d80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2d90: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 cmdPtr, Tcl_NewI
2da0: 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 ntObj(ok));.
2db0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2dc0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2dd0: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 cmdPtr,..Tcl_Ne
2de0: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 wStringObj((char
2df0: 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 *)X509_verify_ce
2e00: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
2e10: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 err), -1));..
2e20: 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20 /* Prevent I/O
2e30: 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69 while callback i
2e40: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f s in progress */
2e50: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 . /* statePtr
2e60: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 ->flags |= TLS_T
2e70: 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a CL_CALLBACK; */.
2e80: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
2e90: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
2ea0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
2eb0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
2ec0: 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c ok = EvalCall
2ed0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
2ee0: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
2ef0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2f00: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
2f10: 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 dprintf("Veri
2f20: 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63 6f 6d 6d fyCallback: comm
2f30: 61 6e 64 20 72 65 73 75 6c 74 20 3d 20 25 64 22 and result = %d"
2f40: 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 , ok);.. /* s
2f50: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
2f60: 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c = ~(TLS_TCL_CALL
2f70: 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 BACK); */. re
2f80: 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20 42 79 20 64 turn ok;./* By d
2f90: 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 efault, leave ve
2fa0: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 rification uncha
2fb0: 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a nged. */.}.../*.
2fc0: 20 2a 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: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
3010: 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 Error --. *. *.C
3020: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 alls callback wi
3030: 74 68 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 th error message
3040: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
3050: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 ects:. *.The err
3060: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 field of the cu
3070: 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 rrently operativ
3080: 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 e State is set.
3090: 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 *. to a string
30a0: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 describing the S
30b0: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 SL negotiation f
30c0: 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a ailure reason. *
30d0: 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a ------. */.void.
3120: 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 Tls_Error(State
3130: 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 *statePtr, char
3140: 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f *msg) {. Tcl_
3150: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
3160: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
3170: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
3180: 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 cmdPtr, *listPtr
3190: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c ;. unsigned l
31a0: 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74 61 ong err;. sta
31b0: 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67 tePtr->err = msg
31c0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
31d0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
31e0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
31f0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
3200: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e j*)NULL)..return
3210: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 ;.. /* Create
3220: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
3230: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 with fn, chan,
3240: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 and message args
3250: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
3260: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
3270: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c j(statePtr->call
3280: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c back);. Tcl_L
3290: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
32a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
32b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
32c0: 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 gObj("error", -1
32d0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
32e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
32f0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3300: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
3310: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
3320: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
3330: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
3340: 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d 20 . if (msg !=
3350: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 NULL) {..Tcl_Lis
3360: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3370: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3380: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
3390: 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 bj(msg, -1));..
33a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 6d } else if ((m
33b0: 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 sg = Tcl_GetStri
33c0: 6e 67 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 ng(Tcl_GetObjRes
33d0: 75 6c 74 28 69 6e 74 65 72 70 29 29 29 20 21 3d ult(interp))) !=
33e0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 NULL) {..Tcl_Li
33f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3400: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
3410: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
3420: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a Obj(msg, -1));..
3430: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 } else {..li
3440: 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c stPtr = Tcl_NewL
3450: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
3460: 0a 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 ..while ((err =
3470: 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 ERR_get_error())
3480: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 != 0) {.. Tc
3490: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
34a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
34b0: 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 istPtr, Tcl_NewS
34c0: 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 tringObj(ERR_rea
34d0: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 son_error_string
34e0: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a (err), -1));..}.
34f0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
3500: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3510: 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 , cmdPtr, listPt
3520: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f r);. }.. /
3530: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
3540: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
3550: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
3560: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 cmdPtr);. Eva
3570: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
3580: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
3590: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 tr);. Tcl_Dec
35a0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
35b0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a ---------------.
3600: 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c *. * KeyLogCall
3610: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 back --. *. *.Wr
3620: 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 ite received key
3630: 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c data to log fil
3640: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
3650: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 fects:. *.none.
3660: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
36b0: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 KeyLogCallback(
36c0: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 const SSL *ssl,
36d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 const char *line
36e0: 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 ) {. char *st
36f0: 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 r = getenv(SSLKE
3700: 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 YLOGFILE);. F
3710: 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 ILE *fd;.. dp
3720: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
3730: 0a 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b .. if (str) {
3740: 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 ..fd = fopen(str
3750: 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 , "a");..fprintf
3760: 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 (fd, "%s\n",line
3770: 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a );..fclose(fd);.
3780: 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d ----------------
37d0: 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 --. *. * Passwor
37e0: 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a d Callback --. *
37f0: 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 . *.Called when
3800: 61 20 70 61 73 73 77 6f 72 64 20 69 73 20 6e 65 a password is ne
3810: 65 64 65 64 20 66 6f 72 20 61 20 70 72 69 76 61 eded for a priva
3820: 74 65 20 6b 65 79 20 77 68 65 6e 20 6c 6f 61 64 te key when load
3830: 69 6e 67 0a 20 2a 09 6f 72 20 73 74 6f 72 69 6e ing. *.or storin
3840: 67 20 61 20 50 45 4d 20 63 65 72 74 69 66 69 63 g a PEM certific
3850: 61 74 65 20 77 69 74 68 20 65 6e 63 72 79 70 74 ate with encrypt
3860: 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 ion. Evals callb
3870: 61 63 6b 0a 20 2a 09 73 63 72 69 70 74 20 61 6e ack. *.script an
3880: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 d returns the re
3890: 73 75 6c 74 20 61 73 20 74 68 65 20 70 61 73 73 sult as the pass
38a0: 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20 62 word string in b
38b0: 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 uf.. *. * Result
38c0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
38d0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
38e0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
38f0: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
3900: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
3910: 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69 6e Password size in
3920: 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 bytes or -1 for
3930: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a an error.. *. *
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 2d 2d ----------------
3980: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
3990: 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 nt.PasswordCallb
39a0: 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 ack(char *buf, i
39b0: 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 nt size, int rwf
39c0: 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 lag, void *udata
39d0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
39e0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 tatePtr.= (State
39f0: 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54 *) udata;. T
3a00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3a10: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
3a20: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
3a30: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
3a40: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 54 63 6c nt code;. Tcl
3a50: 5f 53 69 7a 65 20 6c 65 6e 3b 0a 0a 20 20 20 20 _Size len;..
3a60: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
3a70: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f );.. /* If no
3a80: 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 callback, use d
3a90: 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 efault callback
3aa0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
3ab0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d Ptr->password ==
3ac0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 NULL) {..if (Tc
3ad0: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c l_EvalEx(interp,
3ae0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 "tls::password"
3af0: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 , -1, TCL_EVAL_G
3b00: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b LOBAL) == TCL_OK
3b10: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 ) {.. char *r
3b20: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 et = (char *) Tc
3b30: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
3b40: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 bj(Tcl_GetObjRes
3b50: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c 65 ult(interp), &le
3b60: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e n);.. if (len
3b70: 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 > (Tcl_Size) si
3b80: 7a 65 2d 31 29 20 7b 0a 09 09 6c 65 6e 20 3d 20 ze-1) {...len =
3b90: 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d (Tcl_Size) size-
3ba0: 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 1;.. }.. s
3bb0: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c trncpy(buf, ret,
3bc0: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a (size_t) len);.
3bd0: 09 20 20 20 20 62 75 66 5b 6c 65 6e 5d 20 3d 20 . buf[len] =
3be0: 27 5c 30 27 3b 0a 09 20 20 20 20 72 65 74 75 72 '\0';.. retur
3bf0: 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 20 n (int) len;..}
3c00: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 else {.. retu
3c10: 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a rn -1;..}. }.
3c20: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
3c30: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
3c40: 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20 ith fn, rwflag,
3c50: 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f and size args */
3c60: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
3c70: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
3c80: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
3c90: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
3ca0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3cb0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3cc0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3cd0: 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 j("password", -1
3ce0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
3cf0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3d00: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3d10: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 Tcl_NewIntObj(r
3d20: 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c wflag));. Tcl
3d30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3d40: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3d50: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 dPtr, Tcl_NewInt
3d60: 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 Obj(size));..
3d70: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 Tcl_Preserve((C
3d80: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 lientData) inter
3d90: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 p);. Tcl_Pres
3da0: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
3db0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 ) statePtr);..
3dc0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
3dd0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
3de0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
3df0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
3e00: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f code = Tcl_EvalO
3e10: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 bjEx(interp, cmd
3e20: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c Ptr, TCL_EVAL_GL
3e30: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 OBAL);. if (c
3e40: 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ode != TCL_OK) {
3e50: 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f .#if (TCL_MAJOR_
3e60: 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 VERSION == 8) &&
3e70: 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 (TCL_MINOR_VERS
3e80: 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 ION < 6)..Tcl_Ba
3e90: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e ckgroundError(in
3ea0: 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 terp);.#else..Tc
3eb0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 l_BackgroundExce
3ec0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f ption(interp, co
3ed0: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 de);.#endif.
3ee0: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 }. Tcl_DecrRe
3ef0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
3f00: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
3f10: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
3f20: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a atePtr);.. /*
3f30: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 If successful,
3f40: 70 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f pass back passwo
3f50: 72 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 rd string and tr
3f60: 75 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f uncate if too lo
3f70: 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f ng */. if (co
3f80: 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a de == TCL_OK) {.
3f90: 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 .char *ret = (ch
3fa0: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 ar *) Tcl_GetStr
3fb0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 ingFromObj(Tcl_G
3fc0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
3fd0: 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 rp), &len);..if
3fe0: 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 (len > (Tcl_Size
3ff0: 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 ) size-1) {..
4000: 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 len = (Tcl_Size
4010: 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 ) size-1;..}..st
4020: 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 rncpy(buf, ret,
4030: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 (size_t) len);..
4040: 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b buf[len] = '\0';
4050: 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 ..Tcl_Release((C
4060: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 lientData) inter
4070: 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e 74 p);..return (int
4080: 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 ) len;. }.
4090: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c Tcl_Release((Cl
40a0: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 ientData) interp
40b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 );. return -1
40c0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 --------------.
4110: 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c *. * Session Cal
4120: 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 lback for Client
4130: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 s --. *. *.Calle
4140: 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 d when a new ses
4150: 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f sion is added to
4160: 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 the cache. In T
4170: 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d LS 1.3. *.this m
4180: 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20 6d ay be received m
4190: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 ultiple times af
41a0: 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b ter the handshak
41b0: 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 e. For. *.earlie
41c0: 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 r versions, this
41d0: 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 will be receive
41e0: 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e d during the han
41f0: 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 dshake.. *.This
4200: 69 73 20 74 68 65 20 70 72 65 66 65 72 72 65 64 is the preferred
4210: 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 way to obtain a
4220: 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 resumable sessi
4230: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 on.. *. * Result
4240: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
4250: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
4260: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
4270: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
4280: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 . * Return codes
4290: 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 :. *.0 = error w
42a0: 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c here session wil
42b0: 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 l be immediately
42c0: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 removed from th
42d0: 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 e internal cache
42e0: 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 .. *.1 = success
42f0: 20 77 68 65 72 65 20 61 70 70 20 72 65 74 61 69 where app retai
4300: 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 ns session in se
4310: 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 ssion cache, and
4320: 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 must call SSL_S
4330: 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 ESSION_free() wh
4340: 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d en done.. *. *--
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4390: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
43a0: 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b .SessionCallback
43b0: 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 (SSL *ssl, SSL_S
43c0: 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 ESSION *session)
43d0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
43e0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a atePtr = (State*
43f0: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 )SSL_get_app_dat
4400: 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 a((SSL *)ssl);.
4410: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
4420: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
4430: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
4440: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
4450: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 const unsigne
4460: 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a d char *ticket;.
4470: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
4480: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
4490: 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 _id;. size_t
44a0: 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e len2;. unsign
44b0: 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 ed int ulen;..
44c0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
44d0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
44e0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
44f0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
4500: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
4510: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
4520: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
4530: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl == NULL) {..
4540: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
4550: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
4560: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
4570: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
4580: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c l with fn, chan,
4590: 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65 73 session id, ses
45a0: 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e 64 sion ticket, and
45b0: 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20 2a lifetime args *
45c0: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
45d0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
45e0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
45f0: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 ck);. Tcl_Lis
4600: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4610: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4620: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
4630: 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 bj("session", -1
4640: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
4650: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
4660: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
4670: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
4680: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
4690: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
46a0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
46b0: 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e .. /* Session
46c0: 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 id */. sessi
46d0: 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 on_id = SSL_SESS
46e0: 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 ION_get_id(sessi
46f0: 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 on, &ulen);.
4700: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
4710: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
4720: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
4730: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 ByteArrayObj(ses
4740: 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 sion_id, (Tcl_Si
4750: 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 ze) ulen));..
4760: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b /* Session tick
4770: 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 et */. SSL_SE
4780: 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 SSION_get0_ticke
4790: 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b t(session, &tick
47a0: 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 et, &len2);.
47b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
47c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
47d0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
47e0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 ByteArrayObj(tic
47f0: 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 ket, (Tcl_Size)
4800: 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 len2));.. /*
4810: 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 Lifetime - numbe
4820: 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a r of seconds */.
4830: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4840: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4850: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 erp, cmdPtr,..Tc
4860: 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f l_NewLongObj((lo
4870: 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f ng) SSL_SESSION_
4880: 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 get_ticket_lifet
4890: 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e ime_hint(session
48a0: 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 )));.. /* Eva
48b0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
48c0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
48d0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
48e0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
48f0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
4900: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
4910: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
4920: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
4930: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30 20 66 /* Return 0 f
4940: 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73 65 73 or now until ses
4950: 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 69 73 sion handling is
4960: 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 20 complete */.
4970: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f return 0;.}.../
4980: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c -------. *. * AL
49d0: 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 PN Callback for
49e0: 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 Servers and NPN
49f0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 Callback for Cli
4a00: 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 ents --. *. *.Pe
4a10: 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 rform protocol (
4a20: 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 http/1.1, h2, h3
4a30: 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f , etc.) selectio
4a40: 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 n for the. *.inc
4a50: 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e oming connection
4a60: 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 . Called after H
4a70: 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 ello and server
4a80: 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 callbacks.. *.Wh
4a90: 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c ere 'out' is sel
4aa0: 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
4ab0: 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 nd 'in' is the p
4ac0: 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20 6c eer advertised l
4ad0: 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ist.. *. * Resul
4ae0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
4af0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
4b00: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
4b10: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
4b20: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 *. * Return code
4b30: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s:. *.SSL_TLSEXT
4b40: 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 _ERR_OK: ALPN pr
4b50: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e otocol selected.
4b60: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
4b70: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
4b80: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 L_TLSEXT_ERR_ALE
4b90: 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 RT_FATAL: There
4ba0: 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 was no overlap b
4bb0: 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e etween the clien
4bc0: 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c t's. *. suppl
4bd0: 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 ied list and the
4be0: 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 server configur
4bf0: 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 ation. The conne
4c00: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 ction will be ab
4c10: 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c orted.. *.SSL_TL
4c20: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
4c30: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f ALPN protocol no
4c40: 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e t selected, e.g.
4c50: 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 , because no ALP
4c60: 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f N. *. protoco
4c70: 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 ls are configure
4c80: 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 d for this conne
4c90: 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 ction. The conne
4ca0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
4cb0: 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
4d00: 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c atic int.ALPNCal
4d10: 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 lback(SSL *ssl,
4d20: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
4d30: 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 har **out, unsig
4d40: 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e ned char *outlen
4d50: 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 ,..const unsigne
4d60: 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 d char *in, unsi
4d70: 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 gned int inlen,
4d80: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 void *arg) {.
4d90: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
4da0: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a = (State*)arg;.
4db0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
4dc0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
4dd0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
4de0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
4df0: 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 int code, re
4e00: 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 s;.. dprintf(
4e10: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
4e20: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 if (ssl == NULL
4e30: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 || arg == NULL)
4e40: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
4e50: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4e60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
4e70: 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f lect protocol */
4e80: 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65 6c . if (SSL_sel
4e90: 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 28 ect_next_proto((
4ea0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a unsigned char **
4eb0: 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 ) out, outlen, s
4ec0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c tatePtr->protos,
4ed0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
4ee0: 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 s_len,..in, inle
4ef0: 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 n) == OPENSSL_NP
4f00: 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a N_NEGOTIATED) {.
4f10: 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20 ./* Match found
4f20: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c */..res = SSL_TL
4f30: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
4f40: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 } else {../* OP
4f50: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 ENSSL_NPN_NO_OVE
4f60: 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 RLAP = No overla
4f70: 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 20 p, so use first
4f80: 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74 item from client
4f90: 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a protocol list *
4fa0: 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 /..res = SSL_TLS
4fb0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
4fc0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
4fd0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 atePtr->vcmd ==
4fe0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
4ff0: 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 {..return res;.
5000: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
5010: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
5020: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 val with fn, cha
5030: 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 69 n, depth, cert i
5040: 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 73 nfo list, status
5050: 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 73 , and error args
5060: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
5070: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
5080: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 j(statePtr->vcmd
5090: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
50a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
50b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
50c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
50d0: 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 ("alpn", -1));.
50e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
50f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5100: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
5110: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
5120: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
5130: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
5140: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 elf), -1));.
5150: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
5160: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
5170: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
5180: 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 74 StringObj((const
5190: 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20 2d char *) *out, -
51a0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
51b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
51c0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
51d0: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e , Tcl_NewBoolean
51e0: 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 Obj(res == SSL_T
51f0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a LSEXT_ERR_OK));.
5200: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
5210: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
5220: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
5230: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
5240: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
5250: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
5260: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
5270: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
5280: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
5290: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
52a0: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d else if (code =
52b0: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 1) {..res = SS
52c0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
52d0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 . } else {..r
52e0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
52f0: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b ERR_ALERT_FATAL;
5300: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
5310: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
5320: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
5330: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d res;.}.../*. *--
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5380: 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 -. *. * Advertis
5390: 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c e Protocols Call
53a0: 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 back for Next Pr
53b0: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 otocol Negotiati
53c0: 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 on (NPN) in Serv
53d0: 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a erHello --. *. *
53e0: 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 .called when a T
53f0: 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 20 LS server needs
5400: 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72 a list of suppor
5410: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f ted protocols fo
5420: 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 r Next. *.Protoc
5430: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a ol Negotiation..
5440: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
5450: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
5460: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a e effects:. *. *
5470: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
5480: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
5490: 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f _OK: NPN protoco
54a0: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 l selected. The
54b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
54c0: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
54d0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e EXT_ERR_NOACK: N
54e0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 PN protocol not
54f0: 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f selected. The co
5500: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
5510: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d es.. *. *-------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
5560: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a .#ifdef USE_NPN.
5570: 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 static int.NPNCa
5580: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
5590: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 *ssl, const uns
55a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 igned char **out
55b0: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a , unsigned int *
55c0: 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 outlen, void *ar
55d0: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a g) {. State *
55e0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
55f0: 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 e*)arg;.. dpr
5600: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
5610: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 . if (ssl ==
5620: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e NULL || arg == N
5630: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 ULL) {..return S
5640: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
5650: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ACK;. }..
5660: 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 /* Set protocols
5670: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 list */. if
5680: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
5690: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f s != NULL) {..*o
56a0: 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 ut = statePtr->p
56b0: 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 rotos;..*outlen
56c0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 = statePtr->prot
56d0: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c os_len;. } el
56e0: 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c se {..*out = NUL
56f0: 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b L;..*outlen = 0;
5700: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
5710: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
5720: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
5730: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
5740: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a K;.}.#endif.../*
5750: 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 ------. *. * SNI
57a0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 Callback for Se
57b0: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 rvers --. *. *.P
57c0: 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 erform server-si
57d0: 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 de SNI hostname
57e0: 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20 selection after
57f0: 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78 receiving SNI ex
5800: 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c tension. *.in Cl
5810: 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c ient Hello. Call
5820: 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 ed after hello c
5830: 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f allback but befo
5840: 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b re ALPN callback
5850: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
5860: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
5870: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
5880: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
5890: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
58a0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
58b0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
58c0: 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 R_OK: SNI hostna
58d0: 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e 20 me is accepted.
58e0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
58f0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c ontinues.. *.SSL
5900: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 _TLSEXT_ERR_ALER
5910: 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 T_FATAL: SNI hos
5920: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 tname is not acc
5930: 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 epted. The conne
5940: 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 ction. *. is
5950: 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74 aborted. Default
5960: 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53 for alert is SS
5970: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 L_AD_UNRECOGNIZE
5980: 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 D_NAME.. *.SSL_T
5990: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
59a0: 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 WARNING: SNI hos
59b0: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 tname is not acc
59c0: 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 epted, warning a
59d0: 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 lert. *. sent
59e0: 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 (not supported
59f0: 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 in TLSv1.3). The
5a00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
5a10: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
5a20: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 SEXT_ERR_NOACK:
5a30: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 SNI hostname is
5a40: 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 not accepted and
5a50: 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 not acknowledge
5a60: 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 d,. *. e.g. i
5a70: 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 f SNI has not be
5a80: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 en configured. T
5a90: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
5aa0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5af0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
5b00: 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e .SNICallback(con
5b10: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 st SSL *ssl, int
5b20: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 *alert, void *a
5b30: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
5b40: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
5b50: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c te*)arg;. Tcl
5b60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
5b70: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
5b80: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
5b90: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 *cmdPtr;. int
5ba0: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 code, res;.
5bb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76 const char *serv
5bc0: 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a ername = NULL;..
5bd0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
5be0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
5bf0: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 ssl == NULL || a
5c00: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 rg == NULL) {..r
5c10: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
5c20: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
5c30: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 }.. /* Only w
5c40: 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 orks for TLS 1.2
5c50: 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a and earlier */.
5c60: 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d servername =
5c70: 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e SSL_get_servern
5c80: 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f ame(ssl, TLSEXT_
5c90: 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 NAMETYPE_host_na
5ca0: 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 me);. if (!se
5cb0: 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 rvername || serv
5cc0: 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 ername[0] == '\0
5cd0: 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c ') {..return SSL
5ce0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 _TLSEXT_ERR_NOAC
5cf0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 K;. }.. if
5d00: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 (statePtr->vcmd
5d10: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
5d20: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
5d30: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
5d40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
5d50: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
5d60: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 eval with fn, c
5d70: 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 han, and server
5d80: 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 name args */.
5d90: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
5da0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
5db0: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
5dc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
5dd0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
5de0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
5df0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c StringObj("sni",
5e00: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
5e10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5e20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5e30: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
5e40: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 StringObj(Tcl_Ge
5e50: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
5e60: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
5e70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
5e80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
5e90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
5ea0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
5eb0: 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d j(servername , -
5ec0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 1));.. /* Eva
5ed0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
5ee0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
5ef0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
5f00: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 r);. if ((cod
5f10: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b e = EvalCallback
5f20: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
5f30: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 r, cmdPtr)) > 1)
5f40: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
5f50: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 SEXT_ERR_ALERT_W
5f60: 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 ARNING;..*alert
5f70: 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 = SSL_AD_UNRECOG
5f80: 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e NIZED_NAME; /* N
5f90: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 ot supported by
5fa0: 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d TLS 1.3 */. }
5fb0: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d else if (code =
5fc0: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 1) {..res = SS
5fd0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b L_TLSEXT_ERR_OK;
5fe0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 . } else {..r
5ff0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
6000: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b ERR_ALERT_FATAL;
6010: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 ..*alert = SSL_A
6020: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e D_UNRECOGNIZED_N
6030: 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 AME; /* Not supp
6040: 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33 orted by TLS 1.3
6050: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 */. }. Tc
6060: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
6070: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 mdPtr);. retu
6080: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 rn res;.}.../*.
6090: 2a 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 2d ----------------
60d0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e ----. *. * Clien
60e0: 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65 tHello Handshake
60f0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 Callback for Se
6100: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 rvers --. *. *.U
6110: 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 6f sed by server to
6120: 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 72 examine the ser
6130: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 ver name indicat
6140: 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e 73 ion (SNI) extens
6150: 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 ion. *.provided
6160: 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 6e by the client in
6170: 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 74 order to select
6180: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 an appropriate
6190: 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a 20 certificate to.
61a0: 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d *.present, and m
61b0: 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 67 ake other config
61c0: 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65 uration adjustme
61d0: 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 nts relevant to
61e0: 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 6e that server. *.n
61f0: 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 66 ame and its conf
6200: 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 iguration. This
6210: 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 6e includes swappin
6220: 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 69 g out the associ
6230: 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20 ated. *.SSL_CTX
6240: 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69 pointer, modifyi
6250: 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20 ng the server's
6260: 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 65 list of permitte
6270: 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a d TLS versions,.
6280: 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 20 *.changing the
6290: 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 20 server's cipher
62a0: 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 65 list in response
62b0: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 73 to the client's
62c0: 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 74 cipher list, et
62d0: 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 66 c.. *.Called bef
62e0: 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 4e ore SNI and ALPN
62f0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 callbacks.. *.
6300: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
6310: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
6320: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
6330: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
6340: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 ined). *. * Retu
6350: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c rn codes:. *.SSL
6360: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 _CLIENT_HELLO_RE
6370: 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 65 TRY: suspend the
6380: 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20 handshake, and
6390: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75 the handshake fu
63a0: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 nction will retu
63b0: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 rn immediately.
63c0: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c *.SSL_CLIENT_HEL
63d0: 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 72 LO_ERROR: failur
63e0: 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e e, terminate con
63f0: 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65 nection. Set ale
6400: 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 65 rt to error code
6410: 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f .. *.SSL_CLIENT_
6420: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 73 HELLO_SUCCESS: s
6430: 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d uccess. *. *----
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
6480: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 */.static int.H
6490: 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53 4c elloCallback(SSL
64a0: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 *ssl, int *aler
64b0: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a t, void *arg) {.
64c0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
64d0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
64e0: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
64f0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
6500: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
6510: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
6520: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c r;. int code,
6530: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 res;. const
6540: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 char *servername
6550: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 ;. const unsi
6560: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 gned char *p;.
6570: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 size_t len, re
6580: 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 maining;.. dp
6590: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
65a0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
65b0: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c tr->vcmd == (Tcl
65c0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 _Obj*)NULL) {..r
65d0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
65e0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a _HELLO_SUCCESS;.
65f0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
6600: 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c sl == (const SSL
6610: 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d *)NULL || arg =
6620: 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20 = (void *)NULL)
6630: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c {..return SSL_CL
6640: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
6650: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
6660: 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 Get names */.
6670: 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 if (!SSL_client
6680: 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 _hello_get0_ext(
6690: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 ssl, TLSEXT_TYPE
66a0: 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 _server_name, &p
66b0: 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c , &remaining) ||
66c0: 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 remaining <= 2)
66d0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
66e0: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 _R_SSLV3_ALERT_I
66f0: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 LLEGAL_PARAMETER
6700: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
6710: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
6720: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
6730: 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67 Extract the leng
6740: 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 th of the suppli
6750: 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 ed list of names
6760: 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28 . */. len = (
6770: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 *(p++) << 8);.
6780: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b len += *(p++);
6790: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 . if (len + 2
67a0: 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b != remaining) {
67b0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
67c0: 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c _SSLV3_ALERT_ILL
67d0: 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a EGAL_PARAMETER;.
67e0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
67f0: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
6800: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e }. remain
6810: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 ing = len;..
6820: 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70 /* The list in p
6830: 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 ractice only has
6840: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e a single elemen
6850: 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f t, so we only co
6860: 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74 nsider the first
6870: 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 one. */. if
6880: 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 (remaining == 0
6890: 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 || *p++ != TLSEX
68a0: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f T_NAMETYPE_host_
68b0: 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20 name) {..*alert
68c0: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c = SSL_R_TLSV1_AL
68d0: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 ERT_INTERNAL_ERR
68e0: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f OR;..return SSL_
68f0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6900: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
6910: 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 maining--;..
6920: 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 /* Now we can fi
6930: 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 nally pull out t
6940: 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 69 he byte array wi
6950: 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f th the actual ho
6960: 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 stname. */. i
6970: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 f (remaining <=
6980: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 2) {..*alert = S
6990: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
69a0: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b _INTERNAL_ERROR;
69b0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
69c0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
69d0: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d . }. len =
69e0: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a (*(p++) << 8);.
69f0: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b len += *(p++
6a00: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b );. if (len +
6a10: 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 > remaining)
6a20: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
6a30: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e R_TLSV1_ALERT_IN
6a40: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 TERNAL_ERROR;..r
6a50: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6a60: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
6a70: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
6a80: 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 g = len;. ser
6a90: 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 vername = (const
6aa0: 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 char *)p;..
6ab0: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
6ac0: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 d to eval with f
6ad0: 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 n, chan, and ser
6ae0: 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f ver name args */
6af0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
6b00: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
6b10: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a tatePtr->vcmd);.
6b20: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
6b30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6b40: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
6b50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 _NewStringObj("h
6b60: 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 ello", -1));.
6b70: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
6b80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
6b90: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
6ba0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
6bb0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
6bc0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
6bd0: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 f), -1));. Tc
6be0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
6bf0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
6c00: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
6c10: 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 ringObj(serverna
6c20: 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c me, (Tcl_Size) l
6c30: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 en));.. /* Ev
6c40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
6c50: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
6c60: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
6c70: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f tr);. if ((co
6c80: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 de = EvalCallbac
6c90: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
6ca0: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 tr, cmdPtr)) > 1
6cb0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 ) {..res = SSL_C
6cc0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 LIENT_HELLO_RETR
6cd0: 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c Y;..*alert = SSL
6ce0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 _R_TLSV1_ALERT_U
6cf0: 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 SER_CANCELLED;.
6d00: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f } else if (co
6d10: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 de == 1) {..res
6d20: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c = SSL_CLIENT_HEL
6d30: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 LO_SUCCESS;.
6d40: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
6d50: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6d60: 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 _ERROR;..*alert
6d70: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c = SSL_R_TLSV1_AL
6d80: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 ERT_INTERNAL_ERR
6d90: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 OR;. }. Tc
6da0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
6db0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 mdPtr);. retu
6dc0: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a rn res;.}.../***
6dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6de0: 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 */./* Commands
6df0: 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a */./*****
6e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
6e10: 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
6e60: 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d CiphersObjCmd -
6e70: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 - list available
6e80: 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 ciphers. *. *.T
6e90: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
6ea0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
6eb0: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 ess the "tls::ci
6ec0: 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 phers" command.
6ed0: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 *.to list availa
6ee0: 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 ble ciphers, bas
6ef0: 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c ed upon protocol
6f00: 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a selected.. *. *
6f10: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
6f20: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
6f30: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 lt list.. *. * S
6f40: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
6f50: 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 constructs and d
6f60: 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 estroys SSL cont
6f70: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d ext (CTX). *. *-
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fc0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f --. */.static co
6fd0: 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 nst char *protoc
6fe0: 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 ols[] = {.."ssl2
6ff0: 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 ", "ssl3", "tls1
7000: 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c ", "tls1.1", "tl
7010: 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c s1.2", "tls1.3",
7020: 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 NULL.};.enum pr
7030: 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 otocol {. TLS
7040: 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c _SSL2, TLS_SSL3,
7050: 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 TLS_TLS1, TLS_T
7060: 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f LS1_1, TLS_TLS1_
7070: 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 2, TLS_TLS1_3, T
7080: 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 LS_NONE.};..stat
7090: 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 ic int.CiphersOb
70a0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
70b0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
70c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
70d0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
70e0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
70f0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
7100: 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 objPtr = NULL;.
7110: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 SSL_CTX *ctx
7120: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 = NULL;. SSL
7130: 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ssl = NULL;.
7140: 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 STACK_OF(SSL_CI
7150: 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 PHER) *sk;. c
7160: 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b har buf[BUFSIZ];
7170: 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 . int index,
7180: 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 verbose = 0, use
7190: 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a _supported = 0;.
71a0: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 const SSL_ME
71b0: 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 20 20 THOD *method;.
71c0: 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 (void) clientD
71d0: 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ata;.. dprint
71e0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
71f0: 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 if ((objc < 2)
7200: 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 || (objc > 4))
7210: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
7220: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
7230: 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f bjv, "protocol ?
7240: 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 verbose? ?suppor
7250: 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 ted?");..return
7260: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7270: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
7280: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 IndexFromObj(int
7290: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 erp, objv[1], pr
72a0: 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 otocols, "protoc
72b0: 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 ol", 0, &index)
72c0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
72d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
72e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f }. if ((o
72f0: 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f bjc > 2) && Tcl_
7300: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 GetBooleanFromOb
7310: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 j(interp, objv[2
7320: 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 ], &verbose) !=
7330: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
7340: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
7350: 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 }. if ((objc
7360: 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 > 3) && Tcl_Get
7370: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 BooleanFromObj(i
7380: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 nterp, objv[3],
7390: 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 &use_supported)
73a0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
73b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
73c0: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 }.. ERR_c
73d0: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 lear_error();..
73e0: 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d switch ((enum
73f0: 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 protocol)index)
7400: 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c {..case TLS_SSL
7410: 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 2:.#if OPENSSL_V
7420: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d ERSION_NUMBER >=
7430: 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 0x10100000L ||
7440: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
7450: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7460: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 SSL_NO_SSL2)..
7470: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
7480: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f lt(interp, proto
7490: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 cols[index], ":
74a0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
74b0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
74c0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 ) NULL);.. re
74d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
74e0: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f #else.. metho
74f0: 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64 d = SSLv2_method
7500: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 (); break;.#endi
7510: 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 f..case TLS_SSL3
7520: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
7530: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
7540: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
7550: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
7560: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 ENSSL_NO_SSL3_ME
7570: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 THOD).. Tcl_A
7580: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7590: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
75a0: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
75b0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
75c0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
75d0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
75e0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
75f0: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c method = SSL
7600: 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 v3_method(); bre
7610: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
7620: 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 TLS_TLS1:.#if d
7630: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
7640: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
7650: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 SL_NO_TLS1) || d
7660: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7670: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 O_TLS1_METHOD)..
7680: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
7690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
76a0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
76b0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
76c0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
76d0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
76e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
76f0: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 ;.#else.. met
7700: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 hod = TLSv1_meth
7710: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e od(); break;.#en
7720: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c dif..case TLS_TL
7730: 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 S1_1:.#if define
7740: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 d(NO_TLS1_1) ||
7750: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7760: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
7770: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7780: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
7790: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
77a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
77b0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
77c0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
77d0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
77e0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
77f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
7800: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 R;.#else.. me
7810: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d thod = TLSv1_1_m
7820: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a ethod(); break;.
7830: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 #endif..case TLS
7840: 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 _TLS1_2:.#if def
7850: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
7860: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
7870: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c SL_NO_TLS1_2) ||
7880: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
7890: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f _NO_TLS1_2_METHO
78a0: 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 D).. Tcl_Appe
78b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
78c0: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 protocols[index
78d0: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e ], ": protocol n
78e0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
78f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
7900: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
7910: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 RROR;.#else..
7920: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f method = TLSv1_
7930: 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 2_method(); brea
7940: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
7950: 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 TLS_TLS1_3:.#if
7960: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
7970: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
7980: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
7990: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
79a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
79b0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
79c0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
79d0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
79e0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
79f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
7a00: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
7a10: 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 ethod = TLS_meth
7a20: 6f 64 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 od();.. SSL_C
7a30: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f TX_set_min_proto
7a40: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
7a50: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 S1_3_VERSION);..
7a60: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
7a70: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f max_proto_versio
7a80: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
7a90: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 RSION);.. bre
7aa0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 ak;.#endif..defa
7ab0: 75 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f 64 ult:.. method
7ac0: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b = TLS_method();
7ad0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 .. break;.
7ae0: 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 }.. ctx = SS
7af0: 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 L_CTX_new(method
7b00: 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d );. if (ctx =
7b10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
7b20: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7b30: 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 rp, GET_ERR_REAS
7b40: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
7b50: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
7b60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
7b70: 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 ssl = SSL_ne
7b80: 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 w(ctx);. if (
7b90: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl == NULL) {..
7ba0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7bb0: 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52 (interp, GET_ERR
7bc0: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
7bd0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f *) NULL);..SSL_
7be0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
7bf0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7c00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
7c10: 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 Use list and ord
7c20: 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 er as would be s
7c30: 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 ent in a ClientH
7c40: 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 ello or all avai
7c50: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f lable ciphers */
7c60: 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 70 . if (use_sup
7c70: 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 ported) {..sk =
7c80: 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 SSL_get1_support
7c90: 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b ed_ciphers(ssl);
7ca0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 . } else {..s
7cb0: 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 k = SSL_get_ciph
7cc0: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a ers(ssl);. }.
7cd0: 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e . if (sk != N
7ce0: 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72 ULL) {..if (!ver
7cf0: 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 63 6f 6e bose) {.. con
7d00: 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 09 20 20 st char *cp;..
7d10: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
7d20: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
7d30: 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e L);.. for (in
7d40: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
7d50: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 SSL_CIPHER_num(s
7d60: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e k); i++) {...con
7d70: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
7d80: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 = sk_SSL_CIPHER
7d90: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 _value(sk, i);..
7da0: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 .if (c == NULL)
7db0: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 continue;..../*
7dc0: 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 cipher name or (
7dd0: 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 NONE) */...cp =
7de0: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e SSL_CIPHER_get_n
7df0: 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 ame(c);...if (cp
7e00: 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b == NULL) break;
7e10: 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
7e20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
7e30: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
7e40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 NewStringObj((ch
7e50: 61 72 20 2a 29 20 63 70 2c 20 2d 31 29 29 3b 0a ar *) cp, -1));.
7e60: 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 . }...} else
7e70: 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 {.. objPtr =
7e80: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
7e90: 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 ("",0);.. for
7ea0: 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c (int i = 0; i <
7eb0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e sk_SSL_CIPHER_n
7ec0: 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 um(sk); i++) {..
7ed0: 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 .const SSL_CIPHE
7ee0: 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 R *c = sk_SSL_CI
7ef0: 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 PHER_value(sk, i
7f00: 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 );...if (c == NU
7f10: 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 LL) continue;...
7f20: 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 ./* textual desc
7f30: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 ription of the c
7f40: 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 ipher */...if (S
7f50: 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 SL_CIPHER_descri
7f60: 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 ption(c, buf, si
7f70: 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 zeof(buf)) != NU
7f80: 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f LL) {... Tcl_
7f90: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 AppendToObj(objP
7fa0: 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 tr, buf, (Tcl_Si
7fb0: 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 ze) strlen(buf))
7fc0: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
7fd0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f Tcl_AppendToO
7fe0: 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e bj(objPtr, "UNKN
7ff0: 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a OWN\n", 8);...}.
8000: 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 . }..}..if (u
8010: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a se_supported) {.
8020: 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 . sk_SSL_CIPH
8030: 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a ER_free(sk);..}.
8040: 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 }. SSL_fr
8050: 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c ee(ssl);. SSL
8060: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
8070: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
8080: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
8090: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
80a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
80b0: 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f ------. *. * Pro
8100: 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 tocolsObjCmd --
8110: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 list available p
8120: 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 rotocols. *. *.T
8130: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
8140: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
8150: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 ess the "tls::pr
8160: 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 otocols" command
8170: 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 . *.to list avai
8180: 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e lable protocols.
8190: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
81a0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
81b0: 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 l result list..
81c0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
81d0: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.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 2d 2d ----------------
8220: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
8230: 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 nt.ProtocolsObjC
8240: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
8250: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
8260: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
8270: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
8280: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
8290: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
82a0: 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 jPtr;. (void)
82b0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
82c0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
82d0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
82e0: 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f jc != 1) {..Tcl_
82f0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
8300: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 erp, 1, objv, ""
8310: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
8320: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
8330: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 ERR_clear_error
8340: 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 ();.. objPtr
8350: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
8360: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 (0, NULL);..#if
8370: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
8380: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 NUMBER < 0x10100
8390: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 000L && !defined
83a0: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 (NO_SSL2) && !de
83b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
83c0: 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c _SSL2). Tcl_L
83d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
83e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
83f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
8400: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
8410: 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a LS_SSL2], -1));.
8420: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
8430: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
8440: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
8450: 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 _NO_SSL3) && !de
8460: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8470: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 _SSL3_METHOD).
8480: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
8490: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
84a0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
84b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
84c0: 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c ocols[TLS_SSL3],
84d0: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 -1));.#endif.#i
84e0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
84f0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
8500: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
8510: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
8520: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 NSSL_NO_TLS1_MET
8530: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 HOD). Tcl_Lis
8540: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8550: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8560: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
8570: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
8580: 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 _TLS1], -1));.#e
8590: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
85a0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 d(NO_TLS1_1) &&
85b0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
85c0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 _NO_TLS1_1) && !
85d0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
85e0: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 NO_TLS1_1_METHOD
85f0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
8600: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
8610: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
8620: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8630: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
8640: 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e S1_1], -1));.#en
8650: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
8660: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 (NO_TLS1_2) && !
8670: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8680: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 NO_TLS1_2) && !d
8690: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
86a0: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 O_TLS1_2_METHOD)
86b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
86c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
86d0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
86e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
86f0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 rotocols[TLS_TLS
8700: 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 1_2], -1));.#end
8710: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
8720: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
8730: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8740: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 O_TLS1_3). Tc
8750: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
8760: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
8770: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
8780: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
8790: 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d s[TLS_TLS1_3], -
87a0: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 1));.#endif..
87b0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
87c0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
87d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
87e0: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
87f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8830: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 --. *. * Handsha
8840: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 keObjCmd --. *.
8850: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 *.This command i
8860: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 s used to verify
8870: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e whether the han
8880: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 dshake is comple
8890: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a te. *.or not.. *
88a0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
88b0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
88c0: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 esult. 1 means h
88d0: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 andshake complet
88e0: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 e, 0 means pendi
88f0: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ng.. *. * Side e
8900: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 ffects:. *.May f
8910: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 orce SSL negotia
8920: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 tion to take pla
8930: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ce.. *. *-------
8940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
8980: 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 .static int Hand
8990: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 shakeObjCmd(Clie
89a0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
89b0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
89c0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
89d0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
89e0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
89f0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 l_Channel chan;
8a00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 /* The ch
8a10: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
8a20: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
8a30: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 tate *statePtr;
8a40: 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 /* client
8a50: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
8a60: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e ocket */. con
8a70: 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 st char *errStr
8a80: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
8a90: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 ret = 1;. int
8aa0: 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20 28 76 err = 0;. (v
8ab0: 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b oid) clientData;
8ac0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
8ad0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
8ae0: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
8af0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
8b00: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
8b10: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
8b20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8b30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
8b40: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
8b50: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
8b60: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
8b70: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 , Tcl_GetString(
8b80: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b objv[1]), NULL);
8b90: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
8ba0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
8bb0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
8bc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
8bd0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
8be0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
8bf0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
8c00: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
8c10: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
8c20: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 nel(chan);. i
8c30: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
8c40: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
8c50: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
8c60: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
8c70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
8c80: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
8c90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
8ca0: 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 me(chan),.. "
8cb0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
8cc0: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 annel", (char *)
8cd0: 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 NULL);..Tcl_Set
8ce0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
8cf0: 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 , "TLS", "HANDSH
8d00: 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c AKE", "CHANNEL",
8d10: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
8d20: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
8d30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
8d40: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 }. statePt
8d50: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c r = (State *)Tcl
8d60: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
8d70: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a nceData(chan);..
8d80: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
8d90: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 ling Tls_WaitFor
8da0: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 Connect");. r
8db0: 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 et = Tls_WaitFor
8dc0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 Connect(statePtr
8dd0: 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 , &err, 1);.
8de0: 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 dprintf("Tls_Wai
8df0: 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 tForConnect retu
8e00: 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b rned: %i", ret);
8e10: 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 .. if (ret <
8e20: 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 0 && ((statePtr-
8e30: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c >flags & TLS_TCL
8e40: 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 _ASYNC) && (err
8e50: 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 == EAGAIN))) {..
8e60: 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 dprintf("Async s
8e70: 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 et and err = EAG
8e80: 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b AIN");..ret = 0;
8e90: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
8ea0: 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 ret < 0) {..long
8eb0: 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 result;..errStr
8ec0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 = statePtr->err
8ed0: 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 ;..Tcl_ResetResu
8ee0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c lt(interp);..Tcl
8ef0: 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a _SetErrno(err);.
8f00: 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c ..if (!errStr ||
8f10: 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 (*errStr == 0))
8f20: 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d {.. errStr =
8f30: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 Tcl_PosixError(
8f40: 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 interp);..}...Tc
8f50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
8f60: 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b nterp, "handshak
8f70: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 e failed: ", err
8f80: 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 Str, (char *) NU
8f90: 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c LL);..if ((resul
8fa0: 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 t = SSL_get_veri
8fb0: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 fy_result(stateP
8fc0: 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 tr->ssl)) != X50
8fd0: 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 9_V_OK) {.. T
8fe0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8ff0: 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f interp, " due to
9000: 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72 69 66 \"", X509_verif
9010: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 y_cert_error_str
9020: 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22 5c 22 ing(result), "\"
9030: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
9040: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 );..}..Tcl_SetEr
9050: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
9060: 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b "TLS", "HANDSHAK
9070: 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 E", "FAILED", (c
9080: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 har *) NULL);..d
9090: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
90a0: 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 g TCL_ERROR with
90b0: 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 handshake faile
90c0: 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b d: %s", errStr);
90d0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
90e0: 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b OR;. } else {
90f0: 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 ..if (err != 0)
9100: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
9110: 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 Got an error wit
9120: 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 h a completed ha
9130: 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 ndshake: err = %
9140: 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 i", err);..}..re
9150: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 t = 1;. }..
9160: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 dprintf("Retur
9170: 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 ning TCL_OK with
9180: 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 data \"%i\"", r
9190: 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 et);. Tcl_Set
91a0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
91b0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
91c0: 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 ret));. retur
91d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a n TCL_OK;.}../*.
91e0: 20 2a 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: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f -----. *. * Impo
9230: 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 rtObjCmd --. *.
9240: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
9250: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
9260: 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 rocess the "ssl"
9270: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 command. *. *.T
9280: 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 he ssl command p
9290: 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 ushes SSL over a
92a0: 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 (newly connecte
92b0: 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a d) tcp socket. *
92c0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
92d0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
92e0: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
92f0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 e effects:. *.Ma
9300: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 y modify the beh
9310: 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 avior of an IO c
9320: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d hannel.. *. *---
9330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9370: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
9380: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 ImportObjCmd(Cli
9390: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
93a0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
93b0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
93c0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
93d0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 objv[]) {. T
93e0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
93f0: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c ../* The channel
9400: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
9410: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 n. */. State
9420: 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 *statePtr;../* c
9430: 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 lient state for
9440: 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 ssl socket */.
9450: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 09 SSL_CTX *ctx..
9460: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
9470: 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d 20 4e Obj *script..= N
9480: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
9490: 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 4e 55 *password..= NU
94a0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
94b0: 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 *vcmd..= NULL;.
94c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 Tcl_DString u
94d0: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
94e0: 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 lation, upperCha
94f0: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 nnelBlocking, up
9500: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
9510: 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c ng, upperChannel
9520: 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 EOFChar;. int
9530: 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 idx;. Tcl_Si
9540: 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 ze len;. int
9550: 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54 43 flags...= TLS_TC
9560: 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 L_INIT;. int
9570: 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f 2a server...= 0;./*
9580: 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 is connection i
9590: 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f ncoming or outgo
95a0: 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 ing? */. char
95b0: 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55 4c *keyfile..= NUL
95c0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 L;. char *cer
95d0: 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 tfile..= NULL;.
95e0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
95f0: 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 *key..= NULL;.
9600: 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f Tcl_Size key_
9610: 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75 6e len..= 0;. un
9620: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 signed char *cer
9630: 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 t..= NULL;. T
9640: 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e cl_Size cert_len
9650: 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 ..= 0;. char
9660: 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c 4c *ciphers..= NULL
9670: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
9680: 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c 4c ersuites..= NULL
9690: 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 ;. char *CAfi
96a0: 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 le..= NULL;.
96b0: 63 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d 20 char *CApath..=
96c0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
96d0: 44 48 70 61 72 61 6d 73 09 09 3d 20 4e 55 4c 4c DHparams..= NULL
96e0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 ;. char *mode
96f0: 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 l...= NULL;.
9700: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 char *servername
9710: 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 ..= NULL;./* hos
9720: 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72 tname for Server
9730: 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e Name Indication
9740: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 73 65 */. char *se
9750: 73 73 69 6f 6e 5f 69 64 09 09 3d 20 4e 55 4c 4c ssion_id..= NULL
9760: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 ;. Tcl_Obj *a
9770: 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 lpn..= NULL;.
9780: 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 int ssl2 = 0, s
9790: 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 sl3 = 0;. int
97a0: 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f tls1 = 1, tls1_
97b0: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 1 = 1, tls1_2 =
97c0: 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 1, tls1_3 = 1;.
97d0: 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 int proto = 0
97e0: 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 , level = -1;.
97f0: 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 int verify = 0
9800: 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 , require = 0, r
9810: 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 equest = 1, post
9820: 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a _handshake = 0;.
9830: 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e (void) clien
9840: 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 tData;.. dpri
9850: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
9860: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
9870: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
9880: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
9890: 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 . tls1 = 0;.#
98a0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
98b0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 d(NO_TLS1_1) ||
98c0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
98d0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 NO_TLS1_1). t
98e0: 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 ls1_1 = 0;.#endi
98f0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
9900: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
9910: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
9920: 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f LS1_2). tls1_
9930: 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 2 = 0;.#endif.#i
9940: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
9950: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_3) || defined(
9960: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
9970: 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 3). tls1_3 =
9980: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 0;.#endif.. i
9990: 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 f (objc < 2) {..
99a0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
99b0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
99c0: 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 , "channel ?opti
99d0: 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 ons?");..return
99e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
99f0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
9a00: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 error();.. ch
9a10: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
9a20: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
9a30: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 GetString(objv[1
9a40: 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 ]), NULL);. i
9a50: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
9a60: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
9a70: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
9a80: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
9a90: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
9aa0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
9ab0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
9ac0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
9ad0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
9ae0: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 an);.. for (i
9af0: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 dx = 2; idx < ob
9b00: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 jc; idx++) {..ch
9b10: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 ar *opt = Tcl_Ge
9b20: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78 tString(objv[idx
9b30: 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d ]);...if (opt[0]
9b40: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 != '-').. br
9b50: 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d eak;...OPTOBJ("-
9b60: 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f alpn", alpn);..O
9b70: 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20 PTSTR("-cadir",
9b80: 43 41 70 61 74 68 29 3b 0a 09 4f 50 54 53 54 52 CApath);..OPTSTR
9b90: 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 ("-cafile", CAfi
9ba0: 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d le);..OPTBYTE("-
9bb0: 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 cert", cert, cer
9bc0: 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 t_len);..OPTSTR(
9bd0: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 "-certfile", cer
9be0: 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 tfile);..OPTSTR(
9bf0: 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 "-cipher", ciphe
9c00: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 rs);..OPTSTR("-c
9c10: 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 iphers", ciphers
9c20: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
9c30: 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 hersuites", ciph
9c40: 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f ersuites);..OPTO
9c50: 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 BJ("-command", s
9c60: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 cript);..OPTSTR(
9c70: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 "-dhparams", DHp
9c80: 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 arams);..OPTBYTE
9c90: 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 ("-key", key, ke
9ca0: 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 y_len);..OPTSTR(
9cb0: 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 "-keyfile", keyf
9cc0: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
9cd0: 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a model", model);.
9ce0: 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f .OPTOBJ("-passwo
9cf0: 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a rd", password);.
9d00: 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f .OPTBOOL("-post_
9d10: 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 handshake", post
9d20: 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 _handshake);..OP
9d30: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 TBOOL("-request"
9d40: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 , request);..OPT
9d50: 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c BOOL("-require",
9d60: 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 require);..OPTI
9d70: 4e 54 28 22 2d 73 65 63 75 72 69 74 79 5f 6c 65 NT("-security_le
9d80: 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f vel", level);..O
9d90: 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 PTBOOL("-server"
9da0: 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 , server);..OPTS
9db0: 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 TR("-servername"
9dc0: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 , servername);..
9dd0: 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e OPTSTR("-session
9de0: 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 _id", session_id
9df0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 );..OPTBOOL("-ss
9e00: 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 l2", ssl2);..OPT
9e10: 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 BOOL("-ssl3", ss
9e20: 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d l3);..OPTBOOL("-
9e30: 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f tls1", tls1);..O
9e40: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 PTBOOL("-tls1.1"
9e50: 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 , tls1_1);..OPTB
9e60: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 OOL("-tls1.2", t
9e70: 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c ls1_2);..OPTBOOL
9e80: 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 ("-tls1.3", tls1
9e90: 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 _3);..OPTOBJ("-v
9ea0: 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c alidatecommand",
9eb0: 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 vcmd);..OPTOBJ(
9ec0: 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a "-vcmd", vcmd);.
9ed0: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e ..OPTBAD("option
9ee0: 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 ", "-alpn, -cadi
9ef0: 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 r, -cafile, -cer
9f00: 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 t, -certfile, -c
9f10: 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 ipher, -ciphersu
9f20: 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 ites, -command,
9f30: 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c -dhparams, -key,
9f40: 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 -keyfile, -mode
9f50: 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 l, -password, -p
9f60: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d ost_handshake, -
9f70: 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 request, -requir
9f80: 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 e, -security_lev
9f90: 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 el, -server, -se
9fa0: 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 rvername, -sessi
9fb0: 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 on_id, -ssl2, -s
9fc0: 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 sl3, -tls1, -tls
9fd0: 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 1.1, -tls1.2, -t
9fe0: 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 ls1.3, or -valid
9ff0: 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 atecommand");...
a000: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
a020: 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66 79 request)..verify
a030: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 |= SSL_VERIFY_C
a040: 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c LIENT_ONCE | SSL
a050: 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 _VERIFY_PEER;.
a060: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 if (request &&
a070: 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66 79 require).verify
a080: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 |= SSL_VERIFY_F
a090: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 AIL_IF_NO_PEER_C
a0a0: 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 ERT;. if (req
a0b0: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e uest && post_han
a0c0: 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c dshake).verify |
a0d0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 = SSL_VERIFY_POS
a0e0: 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 T_HANDSHAKE;.
a0f0: 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 if (verify == 0
a100: 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f )..verify = SSL_
a110: 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 VERIFY_NONE;..
a120: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 proto |= (ssl2
a130: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ? TLS_PROTO_SSL
a140: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 2 : 0);. prot
a150: 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 o |= (ssl3 ? TLS
a160: 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 _PROTO_SSL3 : 0)
a170: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
a180: 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f tls1 ? TLS_PROTO
a190: 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 _TLS1 : 0);.
a1a0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 proto |= (tls1_1
a1b0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
a1c0: 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 1_1 : 0);. pr
a1d0: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f oto |= (tls1_2 ?
a1e0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
a1f0: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 2 : 0);. prot
a200: 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 o |= (tls1_3 ? T
a210: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 LS_PROTO_TLS1_3
a220: 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 : 0);.. /* re
a230: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 set to NULL if b
a240: 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 lank string prov
a250: 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 ided */. if (
a260: 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 cert && !*cert).
a270: 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 20 . cert.
a280: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
a290: 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b if (key && !*k
a2a0: 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 ey).. key
a2b0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a2c0: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c . if (certfil
a2d0: 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 e && !*certfile)
a2e0: 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 6c certfil
a2f0: 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 e.= NULL;. if
a300: 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b (keyfile && !*k
a310: 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 eyfile)..keyfile
a320: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a330: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 . if (ciphers
a340: 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 && !*ciphers).
a350: 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 20 ciphers.
a360: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
a370: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 69 if (ciphersui
a380: 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 tes && !*ciphers
a390: 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 69 uites) ciphersui
a3a0: 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 tes = NULL;.
a3b0: 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 if (CAfile &&
a3c0: 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 !*CAfile).
a3d0: 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 CAfile.
a3e0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
a3f0: 20 28 43 41 70 61 74 68 20 26 26 20 21 2a 43 41 (CApath && !*CA
a400: 70 61 74 68 29 09 20 20 20 20 20 20 20 20 43 41 path). CA
a410: 70 61 74 68 09 20 20 20 20 20 20 20 20 3d 20 4e path. = N
a420: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 ULL;. if (DHp
a430: 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 arams && !*DHpar
a440: 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 ams). DHp
a450: 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e arams = N
a460: 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 ULL;.. /* new
a470: 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 SSL state */.
a480: 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 statePtr..= (S
a490: 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 tate *) ckalloc(
a4a0: 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f (unsigned) sizeo
a4b0: 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d f(State));. m
a4c0: 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 emset(statePtr,
a4d0: 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 0, sizeof(State)
a4e0: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 );.. statePtr
a4f0: 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b ->flags.= flags;
a500: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 . statePtr->i
a510: 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a nterp.= interp;.
a520: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 statePtr->vf
a530: 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 lags.= verify;.
a540: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 statePtr->err
a550: 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 .= "";.. /* a
a560: 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a llocate script *
a570: 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 /. if (script
a580: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
a590: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
a5a0: 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a (script, &len);.
a5b0: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
a5c0: 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 statePtr->callb
a5d0: 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 ack = script;..
a5e0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
a5f0: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 unt(statePtr->ca
a600: 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 llback);..}.
a610: 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 }.. /* alloca
a620: 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 te password */.
a630: 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 if (password)
a640: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 {..(void) Tcl_G
a650: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
a660: 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b password, &len);
a670: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 ..if (len) {..
a680: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 statePtr->pass
a690: 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b word = password;
a6a0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
a6b0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
a6c0: 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 >password);..}.
a6d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
a6e0: 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 ocate validate c
a6f0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 ommand */. if
a700: 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 (vcmd) {..(void
a710: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
a720: 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 romObj(vcmd, &le
a730: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
a740: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 . statePtr->v
a750: 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 cmd = vcmd;..
a760: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
a770: 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 t(statePtr->vcmd
a780: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
a790: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 if (model != NU
a7a0: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b LL) {..int mode;
a7b0: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f ../* Get the "mo
a7c0: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a del" context */.
a7d0: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 .chan = Tcl_GetC
a7e0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d hannel(interp, m
a7f0: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 odel, &mode);..i
a800: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
a810: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
a820: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
a830: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
a840: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
a850: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
a860: 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 *.. * Make sure
a870: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
a880: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
a890: 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 l.. */..chan = T
a8a0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
a8b0: 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c (chan);..if (Tcl
a8c0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
a8d0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
a8e0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 nnelType()) {..
a8f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
a900: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
a910: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
a920: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
a930: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
a940: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
a950: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
a960: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
a970: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
a980: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
a990: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e , "CHANNEL", "IN
a9a0: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 VALID", (char *)
a9b0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 NULL);.. Tls
a9c0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
a9d0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
a9e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
a9f0: 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 ..}..ctx = ((Sta
aa00: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
aa10: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
aa20: 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 chan))->ctx;.
aa30: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 } else {..if ((
aa40: 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 ctx = CTX_Init(s
aa50: 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c tatePtr, server,
aa60: 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c proto, keyfile,
aa70: 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 certfile, key,
aa80: 63 65 72 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f cert, (int) key_
aa90: 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 len,.. (int)
aaa0: 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 cert_len, CApath
aab0: 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 , CAfile, cipher
aac0: 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c s, ciphersuites,
aad0: 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 level, DHparams
aae0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 )) == NULL) {..
aaf0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
ab00: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
ab10: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
ab20: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
ab30: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 . statePtr->c
ab40: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f tx = ctx;.. /
ab50: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 *. * We need
ab60: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 to make sure th
ab70: 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 at the channel w
ab80: 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 orks in binary (
ab90: 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 for the. * e
aba0: 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f ncryption not to
abb0: 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e get goofed up).
abc0: 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 . * We only
abd0: 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 want to adjust t
abe0: 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 he buffering in
abf0: 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c pre-v2 channels,
ac00: 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 where. * ea
ac10: 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 ch channel in th
ac20: 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e e stack maintain
ac30: 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 ed its own buffe
ac40: 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 rs.. */.
ac50: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
ac60: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
ac70: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
ac80: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
ac90: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
aca0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 king);. Tcl_D
acb0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
acc0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
acd0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
ace0: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e gInit(&upperChan
acf0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 nelEncoding);.
ad00: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c Tcl_GetChannel
ad10: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
ad20: 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c han, "-eofchar",
ad30: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f &upperChannelEO
ad40: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f FChar);. Tcl_
ad50: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
ad60: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
ad70: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 -encoding", &upp
ad80: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
ad90: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 g);. Tcl_GetC
ada0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
adb0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 erp, chan, "-tra
adc0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 nslation", &uppe
add0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
ade0: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ion);. Tcl_Ge
adf0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
ae00: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 nterp, chan, "-b
ae10: 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 locking", &upper
ae20: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 ChannelBlocking)
ae30: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
ae40: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
ae50: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 p, chan, "-trans
ae60: 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 lation", "binary
ae70: 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ");. Tcl_SetC
ae80: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
ae90: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f erp, chan, "-blo
aea0: 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b cking", "true");
aeb0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f . dprintf("Co
aec0: 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e nsuming Tcl chan
aed0: 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 nel %s", Tcl_Get
aee0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
aef0: 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 ));. statePtr
af00: 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 ->self = Tcl_Sta
af10: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 ckChannel(interp
af20: 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 , Tls_ChannelTyp
af30: 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 e(), (ClientData
af40: 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54 43 ) statePtr,..(TC
af50: 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c L_READABLE | TCL
af60: 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e _WRITABLE), chan
af70: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 );. dprintf("
af80: 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 Created channel
af90: 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 named %s", Tcl_G
afa0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
afb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a atePtr->self));.
afc0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
afd0: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 ->self == (Tcl_C
afe0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
aff0: 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f ./*.. * No use o
b000: 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 f Tcl_Eventually
b010: 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 Free because no
b020: 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 possible Tcl_Pre
b030: 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 serve... */..Tls
b040: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
b050: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 tatePtr);..retur
b060: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
b070: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 }.. Tcl_SetC
b080: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
b090: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
b0a0: 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 elf, "-translati
b0b0: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 on", Tcl_DString
b0c0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
b0d0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 nelTranslation))
b0e0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
b0f0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
b100: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
b110: 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 f, "-encoding",
b120: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
b130: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
b140: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 coding));. Tc
b150: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
b160: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
b170: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 Ptr->self, "-eof
b180: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 char", Tcl_DStri
b190: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
b1a0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a annelEOFChar));.
b1b0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
b1c0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
b1d0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
b1e0: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 "-blocking", Tc
b1f0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
b200: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
b210: 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f king));. Tcl_
b220: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 DStringFree(&upp
b230: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
b240: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 tion);. Tcl_D
b250: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
b260: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
b270: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
b280: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 ngFree(&upperCha
b290: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 nnelEOFChar);.
b2a0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
b2b0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 e(&upperChannelB
b2c0: 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f locking);.. /
b2d0: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 *. * SSL Ini
b2e0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 tialization.
b2f0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
b300: 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 ->ssl = SSL_new(
b310: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
b320: 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 if (!statePt
b330: 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 r->ssl) {../* SS
b340: 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 L library error
b350: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 */..Tcl_AppendRe
b360: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
b370: 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 uldn't construct
b380: 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c ssl session: ",
b390: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
b3a0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
b3b0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
b3c0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
b3d0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
b3e0: 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 , "INIT", "FAILE
b3f0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
b400: 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 L);..Tls_Free((c
b410: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
b420: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
b430: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
b440: 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 /* Set host serv
b450: 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 er name */. i
b460: 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b f (servername) {
b470: 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 ../* Sets the se
b480: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 rver name indica
b490: 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c tion (SNI) in Cl
b4a0: 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 ientHello extens
b4b0: 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 ion */../* Per R
b4c0: 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d FC 6066, hostnam
b4d0: 65 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 e is a ASCII enc
b4e0: 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f oded string, tho
b4f0: 75 67 68 20 52 46 43 20 34 33 36 36 20 73 61 79 ugh RFC 4366 say
b500: 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 s UTF-8. */..if
b510: 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 (!SSL_set_tlsext
b520: 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 _host_name(state
b530: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 Ptr->ssl, server
b540: 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 name) && require
b550: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
b560: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
b570: 2c 20 22 53 65 74 20 53 4e 49 20 65 78 74 65 6e , "Set SNI exten
b580: 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 sion failed: ",
b590: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
b5a0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b5b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
b5c0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
b5d0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
b5e0: 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 "SNI", "FAILED"
b5f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b600: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
b610: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
b620: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
b630: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
b640: 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 /* Set hostname
b650: 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69 for peer certifi
b660: 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 cate hostname ve
b670: 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c rification in cl
b680: 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 ients... Don't
b690: 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f use SSL_set1_ho
b6a0: 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 st since it has
b6b0: 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a limitations. */.
b6c0: 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 .if (!SSL_add1_h
b6d0: 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ost(statePtr->ss
b6e0: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 l, servername))
b6f0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
b700: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
b710: 22 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d "Set DNS hostnam
b720: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 e failed: ", GET
b730: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
b740: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b750: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
b760: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
b770: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 S", "IMPORT", "H
b780: 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 OSTNAME", "FAILE
b790: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
b7a0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
b7b0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
b7c0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
b7d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
b7e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 }.. /* Re
b7f0: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 sume session id
b800: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 */. if (sessi
b810: 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 on_id && strlen(
b820: 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 session_id) <= S
b830: 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c SL_MAX_SID_CTX_L
b840: 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c ENGTH) {../* SSL
b850: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a _set_session() *
b860: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 /..if (!SSL_SESS
b870: 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 ION_set1_id_cont
b880: 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 ext(SSL_get_sess
b890: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ion(statePtr->ss
b8a0: 6c 29 2c 0a 09 09 28 63 6f 6e 73 74 20 75 6e 73 l),...(const uns
b8b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 65 igned char *) se
b8c0: 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 ssion_id, (unsig
b8d0: 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 ned int) strlen(
b8e0: 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a session_id))) {.
b8f0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
b900: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 esult(interp, "R
b910: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 61 esume session fa
b920: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 iled: ", GET_ERR
b930: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
b940: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
b950: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
b960: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
b970: 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 "IMPORT", "SESSI
b980: 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 ON", "FAILED", (
b990: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b9a0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
b9b0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
b9c0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b9d0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
b9e0: 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 .. /* Enable
b9f0: 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 Application-Laye
ba00: 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 r Protocol Negot
ba10: 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 iation. Examples
ba20: 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a are: http/1.0,.
ba30: 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 .http/1.1, h2, h
ba40: 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 3, ftp, imap, po
ba50: 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c p3, xmpp-client,
ba60: 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 xmpp-server, mq
ba70: 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f tt, irc, etc. */
ba80: 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b . if (alpn) {
ba90: 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 ../* Convert a T
baa0: 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 CL list into a p
bab0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 rotocol-list in
bac0: 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 wire-format */..
bad0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
bae0: 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 rotos, *p;..unsi
baf0: 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f gned int protos_
bb00: 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 len = 0;..Tcl_Si
bb10: 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 ze cnt, i;..int
bb20: 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 j;..Tcl_Obj **li
bb30: 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 st;...if (Tcl_Li
bb40: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
bb50: 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 (interp, alpn, &
bb60: 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 cnt, &list) != T
bb70: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c CL_OK) {.. Tl
bb80: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
bb90: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
bba0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
bbb0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d ;..}.../* Determ
bbc0: 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 ine the memory r
bbd0: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 equired for the
bbe0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f protocol-list */
bbf0: 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 ..for (i = 0; i
bc00: 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 < cnt; i++) {..
bc10: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 Tcl_GetString
bc20: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c FromObj(list[i],
bc30: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 &len);.. if
bc40: 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 (len > 255) {...
bc50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
bc60: 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 (interp, "ALPN p
bc70: 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f rotocol names to
bc80: 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a o long", (char *
bc90: 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 ) NULL);...Tcl_S
bca0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
bcb0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
bcc0: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 RT", "ALPN", "FA
bcd0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
bce0: 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 NULL);...Tls_Fre
bcf0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
bd00: 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 Ptr);...return T
bd10: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
bd20: 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e .. protos_len
bd30: 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 += 1 + (int) le
bd40: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 n;..}.../* Build
bd50: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 the complete pr
bd60: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 otocol-list */..
bd70: 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 protos = ckalloc
bd80: 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f (protos_len);../
bd90: 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 * protocol-lists
bda0: 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 consist of 8-bi
bdb0: 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 t length-prefixe
bdc0: 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 d, byte strings
bdd0: 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 */..for (j = 0,
bde0: 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 p = protos; j <
bdf0: 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 cnt; j++) {..
be00: 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c char *str = Tcl
be10: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
be20: 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 j(list[j], &len)
be30: 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 ;.. *p++ = (u
be40: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65 nsigned char) le
be50: 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 n;.. memcpy(p
be60: 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 , str, (size_t)
be70: 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 len);.. p +=
be80: 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c len;..}.../* SSL
be90: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 _set_alpn_protos
bea0: 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 makes a copy of
beb0: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 the protocol-li
bec0: 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 st */../* Note:
bed0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 This function re
bee0: 76 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 verses the retur
bef0: 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 n value conventi
bf00: 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 on */..if (SSL_s
bf10: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 et_alpn_protos(s
bf20: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 tatePtr->ssl, pr
bf30: 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e otos, protos_len
bf40: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
bf50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
bf60: 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 72 6f p, "Set ALPN pro
bf70: 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22 tocols failed: "
bf80: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
bf90: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
bfa0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
bfb0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
bfc0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
bfd0: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c ", "ALPN", "FAIL
bfe0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
bff0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
c000: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
c010: 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 ePtr);.. ckfr
c020: 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 ee(protos);..
c030: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
c040: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 R;..}.../* Store
c050: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 protocols list
c060: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 */..statePtr->pr
c070: 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 otos = protos;..
c080: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
c090: 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 _len = protos_le
c0a0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a n;. } else {.
c0b0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
c0c0: 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 s = NULL;..state
c0d0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 Ptr->protos_len
c0e0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 = 0;. }..
c0f0: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 /*. * SSL Ca
c100: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a llbacks. */.
c110: 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f SSL_set_app_
c120: 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 data(statePtr->s
c130: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 sl, (void *)stat
c140: 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 ePtr);./* point
c150: 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 back to us */.
c160: 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 SSL_set_verify
c170: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c180: 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 verify, VerifyCa
c190: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c llback);. SSL
c1a0: 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 _set_info_callba
c1b0: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ck(statePtr->ssl
c1c0: 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b , InfoCallback);
c1d0: 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 .. /* Callbac
c1e0: 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 k for observing
c1f0: 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 protocol message
c200: 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 s */.#ifndef OPE
c210: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 NSSL_NO_SSL_TRAC
c220: 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 E. /* void SS
c230: 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 L_CTX_set_msg_ca
c240: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 llback_arg(state
c250: 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 Ptr->ctx, (void
c260: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 *)statePtr);.
c270: 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 void SSL_CTX_se
c280: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 t_msg_callback(s
c290: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 tatePtr->ctx, Me
c2a0: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 ssageCallback);
c2b0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d */. SSL_set_m
c2c0: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 sg_callback_arg(
c2d0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 statePtr->ssl, (
c2e0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
c2f0: 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 ;. SSL_set_ms
c300: 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 g_callback(state
c310: 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 Ptr->ssl, Messag
c320: 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 eCallback);.#end
c330: 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 if.. /* Creat
c340: 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 e Tcl_Channel BI
c350: 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 O Handler */.
c360: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
c370: 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 .= BIO_new_tcl(s
c380: 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 tatePtr, BIO_NOC
c390: 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 LOSE);. state
c3a0: 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e Ptr->bio.= BIO_n
c3b0: 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b ew(BIO_f_ssl());
c3c0: 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 .. if (server
c3d0: 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 ) {../* Server c
c3e0: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c allbacks */..SSL
c3f0: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f _CTX_set_tlsext_
c400: 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 servername_arg(s
c410: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 tatePtr->ctx, (v
c420: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
c430: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c ..SSL_CTX_set_tl
c440: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f sext_servername_
c450: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
c460: 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 r->ctx, SNICallb
c470: 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ack);..SSL_CTX_s
c480: 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f et_client_hello_
c490: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 cb(statePtr->ctx
c4a0: 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c , HelloCallback,
c4b0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c4c0: 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 r);..if (statePt
c4d0: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c r->protos != NUL
c4e0: 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 L) {.. SSL_CT
c4f0: 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 X_set_alpn_selec
c500: 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 t_cb(statePtr->c
c510: 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b tx, ALPNCallback
c520: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
c530: 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f tr);.#ifdef USE_
c540: 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 NPN.. if (tls
c550: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 1_2 == 0 && tls1
c560: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c _3 == 0) {...SSL
c570: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 _CTX_set_next_pr
c580: 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f otos_advertised_
c590: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 cb(statePtr->ctx
c5a0: 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 , NPNCallback, (
c5b0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
c5c0: 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a ;.. }.#endif.
c5d0: 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 .}.../* Enable s
c5e0: 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 erver to send ce
c5f0: 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65 72 rt request after
c600: 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 handshake (TLS
c610: 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 1.3 only) */../*
c620: 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 A write operati
c630: 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 on must take pla
c640: 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 ce for the Certi
c650: 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20 74 ficate Request t
c660: 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f o be.. sent to
c670: 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 the client, thi
c680: 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 s can be done wi
c690: 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 th SSL_do_handsh
c6a0: 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 ake(). */..if (r
c6b0: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 equest && post_h
c6c0: 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31 andshake && tls1
c6d0: 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 _3) {.. SSL_v
c6e0: 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 erify_client_pos
c6f0: 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 t_handshake(stat
c700: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a ePtr->ssl);..}..
c710: 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69 ./* set automati
c720: 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f c curve selectio
c730: 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 n */..SSL_set_ec
c740: 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72 dh_auto(statePtr
c750: 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 ->ssl, 1);.../*
c760: 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 Set server mode
c770: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c */..statePtr->fl
c780: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 ags |= TLS_TCL_S
c790: 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f ERVER;..SSL_set_
c7a0: 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 accept_state(sta
c7b0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
c7c0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c } else {../* Cl
c7d0: 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a ient callbacks *
c7e0: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e /.#ifdef USE_NPN
c7f0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e ..if (statePtr->
c800: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 protos != NULL &
c810: 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 & tls1_2 == 0 &&
c820: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a tls1_3 == 0) {.
c830: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
c840: 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 _next_proto_sele
c850: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ct_cb(statePtr->
c860: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 ctx, ALPNCallbac
c870: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
c880: 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a Ptr);..}.#endif.
c890: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 ../* Session cac
c8a0: 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 hing */..SSL_CTX
c8b0: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 _set_session_cac
c8c0: 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 he_mode(statePtr
c8d0: 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f ->ctx, SSL_SESS_
c8e0: 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 CACHE_CLIENT | S
c8f0: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f SL_SESS_CACHE_NO
c900: 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 _INTERNAL_STORE)
c910: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f ;..SSL_CTX_sess_
c920: 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 set_new_cb(state
c930: 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f Ptr->ctx, Sessio
c940: 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a nCallback);.../*
c950: 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e Enable post han
c960: 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 dshake Authentic
c970: 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e ation extension.
c980: 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e TLS 1.3 only, n
c990: 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 ot http/2. */..i
c9a0: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f f (request && po
c9b0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a st_handshake) {.
c9c0: 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 . SSL_set_pos
c9d0: 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 t_handshake_auth
c9e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c9f0: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 1);..}.../* Set
ca00: 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 client mode */..
ca10: 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f SSL_set_connect_
ca20: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e state(statePtr->
ca30: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ssl);. }.
ca40: 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 SSL_set_bio(stat
ca50: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 ePtr->ssl, state
ca60: 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 Ptr->p_bio, stat
ca70: 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 ePtr->p_bio);.
ca80: 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 BIO_set_ssl(st
ca90: 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 atePtr->bio, sta
caa0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f tePtr->ssl, BIO_
cab0: 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f NOCLOSE);.. /
cac0: 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 *. * End of
cad0: 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f SSL Init. */
cae0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 . dprintf("Re
caf0: 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c turning %s", Tcl
cb00: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
cb10: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 statePtr->self))
cb20: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 ;. Tcl_SetRes
cb30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 ult(interp, (cha
cb40: 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e r *) Tcl_GetChan
cb50: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
cb60: 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c ->self), TCL_VOL
cb70: 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 ATILE);.. ret
cb80: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
cb90: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
cba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbd0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 --------. *. * U
cbe0: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d nimportObjCmd --
cbf0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
cc00: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
cc10: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 to remove the t
cc20: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 opmost channel f
cc30: 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 ilter.. *. * Res
cc40: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
cc50: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
cc60: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
cc70: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 ts:. *.May modif
cc80: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f y the behavior o
cc90: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e f an IO channel.
cca0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
ccf0: 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 atic int.Unimpor
cd00: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 tObjCmd(ClientDa
cd10: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
cd20: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
cd30: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
cd40: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
cd50: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
cd60: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
cd70: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
cd80: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
cd90: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
cda0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ntData;.. dpr
cdb0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
cdc0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
cdd0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
cde0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
cdf0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
ce00: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
ce10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
ce20: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
ce30: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
ce40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
ce50: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a bjv[1]), NULL);.
ce60: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
ce70: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
ce80: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
ce90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
cea0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
ceb0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
cec0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
ced0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
cee0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
cef0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 el(chan);.. i
cf00: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
cf10: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
cf20: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
cf30: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
cf40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
cf50: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
cf60: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
cf70: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a me(chan),..."\":
cf80: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
cf90: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 el", (char *) NU
cfa0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
cfb0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
cfc0: 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 p, "TLS", "UNIMP
cfd0: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c ORT", "CHANNEL",
cfe0: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
cff0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
d000: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
d010: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 }.. if (Tc
d020: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c l_UnstackChannel
d030: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d (interp, chan) =
d040: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 = TCL_ERROR) {..
d050: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
d060: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ;. }.. ret
d070: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
d080: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
d090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
d0d0: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 TX_Init -- const
d0e0: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 ruct a SSL_CTX i
d0f0: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 nstance. *. * Re
d100: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 sults:. *.A vali
d110: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e d SSL_CTX instan
d120: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 ce or NULL.. *.
d130: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
d140: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 *.constructs SS
d150: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a L context (CTX).
d160: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
d170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
d1b0: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 tic SSL_CTX *.CT
d1c0: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 X_Init(State *st
d1d0: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 atePtr, int isSe
d1e0: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c rver, int proto,
d1f0: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 char *keyfile,
d200: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a char *certfile,.
d210: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
d220: 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 r *key, unsigned
d230: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 char *cert, int
d240: 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 key_len, int ce
d250: 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 rt_len, char *CA
d260: 70 61 74 68 2c 0a 20 20 20 20 63 68 61 72 20 2a path,. char *
d270: 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 CAfile, char *ci
d280: 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 phers, char *cip
d290: 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c hersuites, int l
d2a0: 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 evel, char *DHpa
d2b0: 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f rams) {. Tcl_
d2c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d Interp *interp =
d2d0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
d2e0: 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a p;. SSL_CTX *
d2f0: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
d300: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a Tcl_DString ds;.
d310: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 2c int off = 0,
d320: 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 abort = 0;.
d330: 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 int load_private
d340: 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 _key;. const
d350: 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 SSL_METHOD *meth
d360: 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 od;.. dprintf
d370: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
d380: 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 if (!proto) {..
d390: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d3a0: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c (interp, "no val
d3b0: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 id protocol sele
d3c0: 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 cted", (char *)
d3d0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d3e0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
d3f0: 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f /* create SSL co
d400: 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 ntext */.#if OPE
d410: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
d420: 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 BER >= 0x1010000
d430: 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 0L || defined(NO
d440: 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL2) || define
d450: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
d460: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 2). if (ENABL
d470: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d480: 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 OTO_SSL2)) {..Tc
d490: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d4a0: 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f nterp, "SSL2 pro
d4b0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
d4c0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
d4d0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
d4e0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
d4f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
d500: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
d510: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
d520: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
d530: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d540: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c TO_SSL3)) {..Tcl
d550: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d560: 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 terp, "SSL3 prot
d570: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
d580: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
d590: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
d5a0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
d5b0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
d5c0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
d5d0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
d5e0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
d5f0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
d600: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f O_TLS1)) {..Tcl_
d610: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d620: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 erp, "TLS 1.0 pr
d630: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d640: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
d650: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d660: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
d670: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
d680: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
d690: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d6a0: 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 LS1_1). if (E
d6b0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
d6c0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 S_PROTO_TLS1_1))
d6d0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
d6e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
d6f0: 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.1 protocol n
d700: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
d710: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
d720: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
d730: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
d740: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
d750: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
d760: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 SSL_NO_TLS1_2).
d770: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
d780: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
d790: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f TLS1_2)) {..Tcl_
d7a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d7b0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 erp, "TLS 1.2 pr
d7c0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d7d0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
d7e0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
d7f0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
d800: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
d810: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 _TLS1_3) || defi
d820: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d830: 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 LS1_3). if (E
d840: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
d850: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 S_PROTO_TLS1_3))
d860: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
d870: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
d880: 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.3 protocol n
d890: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
d8a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
d8b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
d8c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 }.#endif. if
d8d0: 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a (proto == 0) {.
d8e0: 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e ./* Use full ran
d8f0: 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ge */..SSL_CTX_s
d900: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 et_min_proto_ver
d910: 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 sion(ctx, 0);..S
d920: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
d930: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
d940: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 , 0);. }..
d950: 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 switch (proto)
d960: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 {.#if OPENSSL_VE
d970: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
d980: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
d990: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
d9a0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d9b0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
d9c0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
d9d0: 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 SSL2:..method =
d9e0: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 isServer ? SSLv2
d9f0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
da00: 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f : SSLv2_client_
da10: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
da20: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
da30: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
da40: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
da50: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 SL_NO_SSL3) && !
da60: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
da70: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
da80: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
da90: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 TO_SSL3:..method
daa0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 = isServer ? SS
dab0: 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f Lv3_server_metho
dac0: 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 d() : SSLv3_clie
dad0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
dae0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
daf0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
db00: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
db10: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
db20: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
db30: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
db40: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
db50: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 PROTO_TLS1:..met
db60: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
db70: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 TLSv1_server_me
db80: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 thod() : TLSv1_c
db90: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
dba0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
dbb0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
dbc0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
dbd0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
dbe0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
dbf0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
dc00: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_1_METHOD).
dc10: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
dc20: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_1:..method =
dc30: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
dc40: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_1_server_metho
dc50: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c d() : TLSv1_1_cl
dc60: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
dc70: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
dc80: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
dc90: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
dca0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
dcb0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
dcc0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
dcd0: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _2_METHOD). c
dce0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
dcf0: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_2:..method =
dd00: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
dd10: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 _2_server_method
dd20: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 () : TLSv1_2_cli
dd30: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
dd40: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
dd50: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
dd60: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
dd70: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
dd80: 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 _3). case TLS
dd90: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 _PROTO_TLS1_3:..
dda0: 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 /* Use the gener
ddb0: 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f ic method and co
ddc0: 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 nstraint range a
ddd0: 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 fter context is
dde0: 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 created */..meth
ddf0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
de00: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
de10: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
de20: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
de30: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 k;.#endif. de
de40: 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 fault:../* Negot
de50: 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61 iate highest ava
de60: 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 ilable SSL/TLS v
de70: 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f ersion */..metho
de80: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
de90: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 LS_server_method
dea0: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f () : TLS_client_
deb0: 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 method();.#if OP
dec0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
ded0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
dee0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
def0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
df00: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
df10: 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e SL2)..off |= (EN
df20: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
df30: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f _PROTO_SSL2) ?
df40: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 0 : SSL_OP_NO_S
df50: 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 SLv2);.#endif.#i
df60: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
df70: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
df80: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
df90: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
dfa0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
dfb0: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a TO_SSL3) ? 0 :
dfc0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 SSL_OP_NO_SSLv3
dfd0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
dfe0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
dff0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e000: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 SSL_NO_TLS1)..of
e010: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
e020: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
e030: 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c LS1) ? 0 : SSL
e040: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 _OP_NO_TLSv1);.#
e050: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
e060: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
e070: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
e080: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 L_NO_TLS1_1)..of
e090: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
e0a0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
e0b0: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c LS1_1) ? 0 : SSL
e0c0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b _OP_NO_TLSv1_1);
e0d0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
e0e0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
e0f0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e100: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 SSL_NO_TLS1_2)..
e110: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
e120: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
e130: 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 _TLS1_2) ? 0 : S
e140: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 SL_OP_NO_TLSv1_2
e150: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
e160: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
e170: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
e180: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
e190: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
e1a0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
e1b0: 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a TO_TLS1_3) ? 0 :
e1c0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
e1d0: 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 _3);.#endif..bre
e1e0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 ak;. }.. E
e1f0: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
e200: 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c ;.. ctx = SSL
e210: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 _CTX_new(method)
e220: 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20 ;. if (!ctx)
e230: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a {..return NULL;.
e240: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 }.. if (g
e250: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 etenv(SSLKEYLOGF
e260: 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 ILE)) {..SSL_CTX
e270: 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c _set_keylog_call
e280: 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 back(ctx, KeyLog
e290: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d Callback);. }
e2a0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e ..#if !defined(N
e2b0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 O_TLS1_3) && !de
e2c0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
e2d0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
e2e0: 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 (proto == TLS_PR
e2f0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 OTO_TLS1_3) {..S
e300: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 SL_CTX_set_min_p
e310: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
e320: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
e330: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
e340: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f max_proto_versio
e350: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
e360: 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 RSION);. }.#e
e370: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 ndif.. /* For
e380: 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 ce cipher select
e390: 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 ion order by ser
e3a0: 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 ver */. if (!
e3b0: 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c isServer) {..SSL
e3c0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
e3d0: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 (ctx, SSL_OP_CIP
e3e0: 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 HER_SERVER_PREFE
e3f0: 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 RENCE);. }..#
e400: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
e410: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
e420: 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e 100000L. Open
e430: 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f SSL_add_all_algo
e440: 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 rithms(); /* Loa
e450: 64 20 63 69 70 68 65 72 73 20 61 6e 64 20 64 69 d ciphers and di
e460: 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a gests */.#endif.
e470: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
e480: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 _app_data(ctx, (
e490: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f void*)interp);./
e4a0: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 * remember the i
e4b0: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 nterpreter */.
e4c0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
e4d0: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
e4e0: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 P_ALL);./* all S
e4f0: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e SL bug workaroun
e500: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 ds */. SSL_CT
e510: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
e520: 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d x, SSL_OP_NO_COM
e530: 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 PRESSION);./* di
e540: 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f sable compressio
e550: 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72 n even if suppor
e560: 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 ted */. SSL_C
e570: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 TX_set_options(c
e580: 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 tx, off);../* di
e590: 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 sable protocol v
e5a0: 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f ersions */.#if O
e5b0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
e5c0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 UMBER < 0x101010
e5d0: 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 00L. SSL_CTX_
e5e0: 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 set_mode(ctx, SS
e5f0: 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 L_MODE_AUTO_RETR
e600: 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 Y);./* handle ne
e610: 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 w handshakes in
e620: 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 background. On b
e630: 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 y default in Ope
e640: 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 nSSL 1.1.1. */.#
e650: 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 endif. SSL_CT
e660: 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 X_sess_set_cache
e670: 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b _size(ctx, 128);
e680: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 .. /* Set use
e690: 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 r defined cipher
e6a0: 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73 s, cipher suites
e6b0: 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c , and security l
e6c0: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 evel */. if (
e6d0: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c (ciphers != NULL
e6e0: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 ) && !SSL_CTX_se
e6f0: 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 t_cipher_list(ct
e700: 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 x, ciphers)) {..
e710: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
e720: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 (interp, "Set ci
e730: 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f phers failed: No
e740: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c valid ciphers",
e750: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
e760: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e770: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
e780: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
e790: 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21 ((ciphersuites !
e7a0: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f = NULL) && !SSL_
e7b0: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 CTX_set_ciphersu
e7c0: 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 ites(ctx, cipher
e7d0: 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f suites)) {..Tcl_
e7e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
e7f0: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 erp, "Set cipher
e800: 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 suites failed:
e810: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 No valid ciphers
e820: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
e830: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
e840: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e (ctx);..return N
e850: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
e860: 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20 /* Set security
e870: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 level */. if
e880: 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c (level > -1 && l
e890: 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 evel < 6) {../*
e8a0: 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 SSL_set_security
e8b0: 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 _level */..SSL_C
e8c0: 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f TX_set_security_
e8d0: 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c level(ctx, level
e8e0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
e8f0: 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 set some callba
e900: 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 cks */. SSL_C
e910: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 TX_set_default_p
e920: 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 asswd_cb(ctx, Pa
e930: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b sswordCallback);
e940: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
e950: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f _default_passwd_
e960: 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c cb_userdata(ctx,
e970: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
e980: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 r);.. /* read
e990: 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 a Diffie-Hellma
e9a0: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c n parameters fil
e9b0: 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 e, or use the bu
e9c0: 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 20 20 ilt-in one */.
e9d0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
e9e0: 74 28 26 64 73 29 3b 0a 23 69 66 64 65 66 20 4f t(&ds);.#ifdef O
e9f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 PENSSL_NO_DH.
ea00: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d if (DHparams !=
ea10: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
ea20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
ea30: 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 p, "DH parameter
ea40: 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 support not ava
ea50: 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a ilable", (char *
ea60: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
ea70: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
ea80: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
ea90: 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 .#else. {..DH
eaa0: 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 * dh;..if (DHpar
eab0: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ams != NULL) {..
eac0: 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 0a 09 BIO *bio;...
ead0: 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 bio = BIO_ne
eae0: 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 w_file(F2N(DHpar
eaf0: 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b ams, &ds), "r");
eb00: 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 .. if (!bio)
eb10: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 {...Tcl_DStringF
eb20: 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f ree(&ds);...Tcl_
eb30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
eb40: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 erp, "Could not
eb50: 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 find DH paramete
eb60: 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 rs file", (char
eb70: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f *) NULL);...SSL_
eb80: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
eb90: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 .return NULL;..
eba0: 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 }... dh =
ebb0: 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 PEM_read_bio_DHp
ebc0: 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c arams(bio, NULL,
ebd0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 NULL, NULL);..
ebe0: 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 BIO_free(bio)
ebf0: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ;.. Tcl_DStri
ec00: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 ngFree(&ds);..
ec10: 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 if (!dh) {...T
ec20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
ec30: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e interp, "Could n
ec40: 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 6d ot read DH param
ec50: 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 eters from file"
ec60: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
ec70: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
ec80: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
ec90: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 NULL;.. }..
eca0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d SSL_CTX_set_tm
ecb0: 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 p_dh(ctx, dh);..
ecc0: 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 29 3b DH_free(dh);
ecd0: 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ...} else {..
ece0: 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f /* Use well kno
ecf0: 77 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 wn DH parameters
ed00: 20 74 68 61 74 20 68 61 76 65 20 62 75 69 6c 74 that have built
ed10: 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 4f -in support in O
ed20: 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69 penSSL */.. i
ed30: 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f f (!SSL_CTX_set_
ed40: 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 29 dh_auto(ctx, 1))
ed50: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 {...Tcl_AppendR
ed60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 esult(interp, "C
ed70: 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20 ould not enable
ed80: 73 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c 20 set DH auto: ",
ed90: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
eda0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
edb0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
edc0: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
edd0: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a NULL;.. }..}.
ede0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 }.#endif..
edf0: 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 /* set our cer
ee00: 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 tificate */.
ee10: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 load_private_key
ee20: 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 = 0;. if (ce
ee30: 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 rtfile != NULL)
ee40: 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f {..load_private_
ee50: 6b 65 79 20 3d 20 31 3b 0a 0a 09 69 66 20 28 53 key = 1;...if (S
ee60: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 SL_CTX_use_certi
ee70: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c ficate_file(ctx,
ee80: 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 F2N(certfile, &
ee90: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ds), SSL_FILETYP
eea0: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 E_PEM) <= 0) {..
eeb0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
eec0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
eed0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
eee0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
eef0: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 to set certifica
ef00: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 te file ", certf
ef10: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 ile, ": ",...GET
ef20: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
ef30: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
ef40: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
ef50: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
ef60: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c rn NULL;..}..Tcl
ef70: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
ef80: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 );.. } else i
ef90: 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 f (cert != NULL)
efa0: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 {..load_private
efb0: 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 _key = 1;..if (S
efc0: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 SL_CTX_use_certi
efd0: 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c ficate_ASN1(ctx,
efe0: 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 cert_len, cert)
eff0: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 <= 0) {.. Tc
f000: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
f010: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
f020: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 o set certificat
f030: 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f e: ",...GET_ERR_
f040: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
f050: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
f060: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
f070: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
f080: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 LL;..}. } els
f090: 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 e {..certfile =
f0a0: 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f (char*)X509_get_
f0b0: 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c default_cert_fil
f0c0: 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 e();...if (SSL_C
f0d0: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 TX_use_certifica
f0e0: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 te_file(ctx, cer
f0f0: 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 tfile, SSL_FILET
f100: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b YPE_PEM) <= 0) {
f110: 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f .#if 0.. Tcl_
f120: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f130: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
f140: 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 use default cert
f150: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 ificate file ",
f160: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a certfile, ": ",.
f170: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e ..GET_ERR_REASON
f180: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
f190: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
f1a0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
f1b0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 return NULL;.#e
f1c0: 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ndif..}. }..
f1d0: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 /* set our pr
f1e0: 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 ivate key */.
f1f0: 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 if (load_privat
f200: 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 e_key) {..if (ke
f210: 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 yfile == NULL &&
f220: 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a key == NULL) {.
f230: 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 . keyfile = c
f240: 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 ertfile;..}...if
f250: 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c (keyfile != NUL
f260: 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 L) {.. /* get
f270: 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 the private key
f280: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
f290: 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 this certificat
f2a0: 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 e */.. if (ke
f2b0: 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b yfile == NULL) {
f2c0: 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 ...keyfile = cer
f2d0: 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 tfile;.. }...
f2e0: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f if (SSL_CTX_
f2f0: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 use_PrivateKey_f
f300: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 ile(ctx, F2N(key
f310: 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f file, &ds), SSL_
f320: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d FILETYPE_PEM) <=
f330: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 0) {...Tcl_DStr
f340: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 ingFree(&ds);...
f350: 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 /* flush the pas
f360: 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 sphrase which mi
f370: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 ght be left in t
f380: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 he result */...T
f390: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
f3a0: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 erp, NULL, TCL_S
f3b0: 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 TATIC);...Tcl_Ap
f3c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
f3d0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
f3e0: 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c t public key fil
f3f0: 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 e ", keyfile, "
f400: 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 52 ",... GET_ERR
f410: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
f420: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
f430: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
f440: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
f450: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
f460: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
f470: 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 ...} else if (ke
f480: 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 y != NULL) {..
f490: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 if (SSL_CTX_us
f4a0: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e e_PrivateKey_ASN
f4b0: 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 1(EVP_PKEY_RSA,
f4c0: 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e ctx, key,key_len
f4d0: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 ) <= 0) {.../* f
f4e0: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 lush the passphr
f4f0: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 ase which might
f500: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 be left in the r
f510: 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 esult */...Tcl_S
f520: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
f530: 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 NULL, TCL_STATI
f540: 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 C);...Tcl_Append
f550: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
f560: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 unable to set pu
f570: 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 blic key: ", GET
f580: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
f590: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
f5a0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
f5b0: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
f5c0: 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a L;.. }..}../*
f5d0: 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 Now we know tha
f5e0: 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 t a key and cert
f5f0: 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 have been set a
f600: 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 gainst.. * the S
f610: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 SL context */..i
f620: 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 f (!SSL_CTX_chec
f630: 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 k_private_key(ct
f640: 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 x)) {.. Tcl_A
f650: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
f660: 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 rp, "private key
f670: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 does not match
f680: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
f690: 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 public key",....
f6a0: 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 (char *) NU
f6b0: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
f6c0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
f6d0: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 return NULL;..
f6e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
f6f0: 53 65 74 20 74 6f 20 75 73 65 20 64 65 66 61 75 Set to use defau
f700: 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 lt location and
f710: 66 69 6c 65 20 66 6f 72 20 43 65 72 74 69 66 69 file for Certifi
f720: 63 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 cate Authority (
f730: 43 41 29 20 63 65 72 74 69 66 69 63 61 74 65 73 CA) certificates
f740: 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 76 65 72 . The. * ver
f750: 69 66 79 20 70 61 74 68 20 61 6e 64 20 73 74 6f ify path and sto
f760: 72 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 re can be overri
f770: 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f dden by the SSL_
f780: 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 CERT_DIR env var
f790: 2e 20 54 68 65 20 76 65 72 69 66 79 20 66 69 6c . The verify fil
f7a0: 65 20 63 61 6e 0a 20 20 20 20 20 2a 20 62 65 20 e can. * be
f7b0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 overridden by th
f7c0: 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 e SSL_CERT_FILE
f7d0: 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20 20 20 20 env var. */.
f7e0: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 if (!SSL_CTX_set
f7f0: 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f _default_verify_
f800: 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 09 61 paths(ctx)) {..a
f810: 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 bort++;. }..
f820: 20 20 20 2f 2a 20 4f 76 65 72 72 69 64 65 73 20 /* Overrides
f830: 66 6f 72 20 74 68 65 20 43 41 20 76 65 72 69 66 for the CA verif
f840: 79 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 y path and file
f850: 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 20 4f 50 45 */. {.#if OPE
f860: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
f870: 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
f880: 4c 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 3d L..if (CApath !=
f890: 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69 6c 65 20 NULL || CAfile
f8a0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
f8b0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b Tcl_DString ds1;
f8c0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
f8d0: 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 0a 09 20 gInit(&ds1);...
f8e0: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f if (!SSL_CTX_
f8f0: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 load_verify_loca
f900: 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 tions(ctx, F2N(C
f910: 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e Afile, &ds), F2N
f920: 28 43 41 70 61 74 68 2c 20 26 64 73 31 29 29 29 (CApath, &ds1)))
f930: 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 {...abort++;..
f940: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
f950: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
f960: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
f970: 46 72 65 65 28 26 64 73 31 29 3b 0a 0a 09 20 20 Free(&ds1);...
f980: 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 /* Set list of
f990: 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 CAs to send to
f9a0: 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 client when requ
f9b0: 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 esting a client
f9c0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
f9d0: 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 /* https://s
f9e0: 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 ourceforge.net/p
f9f0: 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f /tls/bugs/57/ */
fa00: 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 .. /* XXX:TOD
fa10: 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 O: Let the user
fa20: 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 supply values he
fa30: 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f re instead of so
fa40: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 mething that exi
fa50: 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 sts on the files
fa60: 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20 20 53 54 ystem */.. ST
fa70: 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 ACK_OF(X509_NAME
fa80: 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 ) *certNames = S
fa90: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 SL_load_client_C
faa0: 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c A_file(F2N(CAfil
fab0: 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69 e, &ds));.. i
fac0: 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 f (certNames !=
fad0: 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 NULL) {...SSL_CT
fae0: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f X_set_client_CA_
faf0: 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 list(ctx, certNa
fb00: 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 mes);.. }..
fb10: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
fb20: 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73 e(&ds);..}..#els
fb30: 65 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 3d e..if (CApath !=
fb40: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 NULL) {.. if
fb50: 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f (!SSL_CTX_load_
fb60: 76 65 72 69 66 79 5f 64 69 72 28 63 74 78 2c 20 verify_dir(ctx,
fb70: 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 29 F2N(CApath, &ds)
fb80: 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a )) {...abort++;.
fb90: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f . }.. Tcl_
fba0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
fbb0: 3b 0a 09 7d 0a 09 69 66 20 28 43 41 66 69 6c 65 ;..}..if (CAfile
fbc0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
fbd0: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f if (!SSL_CTX_lo
fbe0: 61 64 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 63 ad_verify_file(c
fbf0: 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 tx, F2N(CAfile,
fc00: 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 &ds))) {...abort
fc10: 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ++;.. }..
fc20: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
fc30: 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 &ds);... /* S
fc40: 65 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 et list of CAs t
fc50: 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 o send to client
fc60: 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 when requesting
fc70: 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 a client certif
fc80: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 53 54 icate */.. ST
fc90: 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 ACK_OF(X509_NAME
fca0: 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 ) *certNames = S
fcb0: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 SL_load_client_C
fcc0: 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c A_file(F2N(CAfil
fcd0: 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69 e, &ds));.. i
fce0: 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 f (certNames !=
fcf0: 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 NULL) {...SSL_CT
fd00: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f X_set_client_CA_
fd10: 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 list(ctx, certNa
fd20: 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 mes);.. }..
fd30: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
fd40: 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65 6e 64 69 e(&ds);..}.#endi
fd50: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 f. }.. ret
fd60: 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a urn ctx;.}.../*.
fd70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
fd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fdb0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 -----. *. * Stat
fdc0: 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 usObjCmd -- retu
fdd0: 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66 rn certificate f
fde0: 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 or connected pee
fdf0: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
fe00: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
fe10: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
fe20: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
fe30: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
fe40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe80: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
fe90: 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c .StatusObjCmd(Cl
fea0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
feb0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
fec0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
fed0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
fee0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
fef0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
ff00: 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b . X509 *peer;
ff10: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
ff20: 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 jPtr;. Tcl_Ch
ff30: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 annel chan;.
ff40: 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d char *channelNam
ff50: 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 e, *ciphers;.
ff60: 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 int mode;. c
ff70: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
ff80: 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 ar *proto;. u
ff90: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b nsigned int len;
ffa0: 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 . int nid, re
ffb0: 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c s;. (void) cl
ffc0: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 ientData;.. d
ffd0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
ffe0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
fff0: 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 < 2 || objc > 3
10000 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 || (objc == 3 &&
10010 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 !strcmp(Tcl_Get
10020 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c String(objv[1]),
10030 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 "-local"))) {..
10040 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
10050 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
10060 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e , "?-local? chan
10070 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 nel");..return T
10080 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
10090 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e . /* Get chan
100a0 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 nel Id */. ch
100b0 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f annelName = Tcl_
100c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28 GetString(objv[(
100d0 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 objc == 2 ? 1 :
100e0 32 29 5d 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 2)]);. chan =
100f0 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
10100 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e interp, channelN
10110 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 ame, &mode);.
10120 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
10130 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
10140 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
10150 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
10160 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
10170 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
10180 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
10190 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
101a0 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
101b0 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
101c0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
101d0 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
101e0 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
101f0 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
10200 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
10210 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
10220 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
10230 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 han),..."\": not
10240 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
10250 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
10260 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
10270 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
10280 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 48 41 , "STATUS", "CHA
10290 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 NNEL", "INVALID"
102a0 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
102b0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
102c0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 ROR;. }. s
102d0 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
102e0 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e *) Tcl_GetChann
102f0 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
10300 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 han);.. /* Ge
10310 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f t certificate fo
10320 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a r peer or self *
10330 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d /. if (objc =
10340 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 = 2) {..peer = S
10350 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 SL_get_peer_cert
10360 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 ificate(statePtr
10370 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c ->ssl);. } el
10380 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c se {..peer = SSL
10390 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 _get_certificate
103a0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
103b0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 . }. /* Ge
103c0 74 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 t X509 certifica
103d0 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 te info */. i
103e0 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 f (peer) {..objP
103f0 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 tr = Tls_NewX509
10400 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 Obj(interp, peer
10410 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 );..if (objc ==
10420 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 2) {.. X509_f
10430 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20 ree(peer);..
10440 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a peer = NULL;..}.
10450 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 } else {..ob
10460 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
10470 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
10480 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 }.. /* Pe
10490 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c er name */. L
104a0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
104b0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 p, objPtr, "peer
104c0 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f name", SSL_get0_
104d0 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 peername(statePt
104e0 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 r->ssl), -1);.
104f0 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e LAPPEND_INT(in
10500 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
10510 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 bits", SSL_get_c
10520 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 ipher_bits(state
10530 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 Ptr->ssl, NULL))
10540 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d ;.. ciphers =
10550 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f (char*)SSL_get_
10560 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d cipher(statePtr-
10570 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 >ssl);. LAPPE
10580 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
10590 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c bjPtr, "cipher",
105a0 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a ciphers, -1);..
105b0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 /* Verify th
105c0 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 e X509 certifica
105d0 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 te presented by
105e0 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 the peer */.
105f0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
10600 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 rp, objPtr, "ver
10610 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 ifyResult",..X50
10620 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 9_verify_cert_er
10630 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 ror_string(SSL_g
10640 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 et_verify_result
10650 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 (statePtr->ssl))
10660 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 , -1);.. /* V
10670 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 erify mode */.
10680 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 mode = SSL_get
10690 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 _verify_mode(sta
106a0 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
106b0 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c if (mode && SSL
106c0 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a _VERIFY_NONE) {.
106d0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
106e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 erp, objPtr, "ve
106f0 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 rifyMode", "none
10700 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c ", -1);. } el
10710 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c se {..Tcl_Obj *l
10720 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f istObjPtr = Tcl_
10730 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
10740 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 LL);..if (mode &
10750 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 & SSL_VERIFY_PEE
10760 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 R) {.. Tcl_Li
10770 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10780 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f nt(interp, listO
10790 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
107a0 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 ringObj("peer",
107b0 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f -1));..}..if (mo
107c0 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 de && SSL_VERIFY
107d0 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 _FAIL_IF_NO_PEER
107e0 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63 _CERT) {.. Tc
107f0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10800 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
10810 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e istObjPtr, Tcl_N
10820 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 ewStringObj("fai
10830 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72 l if no peer cer
10840 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 t", -1));..}..if
10850 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
10860 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 RIFY_CLIENT_ONCE
10870 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
10880 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
10890 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
108a0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
108b0 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f ingObj("client o
108c0 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 nce", -1));..}..
108d0 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f if (mode && SSL_
108e0 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 VERIFY_POST_HAND
108f0 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 SHAKE) {.. Tc
10900 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
10910 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c lement(interp, l
10920 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e istObjPtr, Tcl_N
10930 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 ewStringObj("pos
10940 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 t handshake", -1
10950 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f ));..}..LAPPEND_
10960 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OBJ(interp, objP
10970 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 tr, "verifyMode"
10980 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 , listObjPtr).
10990 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 }.. /* Veri
109a0 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f fy mode depth */
109b0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 . LAPPEND_INT
109c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
109d0 20 22 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 "verifyDepth",
109e0 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 SSL_get_verify_d
109f0 65 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 epth(statePtr->s
10a00 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 sl));.. /* Re
10a10 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 port the selecte
10a20 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 d protocol as a
10a30 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 result of the ne
10a40 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 gotiation */.
10a50 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 SSL_get0_alpn_s
10a60 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72 elected(statePtr
10a70 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 ->ssl, &proto, &
10a80 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e len);. LAPPEN
10a90 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10aa0 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 jPtr, "alpn", (c
10ab0 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 har *)proto, (Tc
10ac0 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 l_Size) len);.
10ad0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
10ae0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 terp, objPtr, "p
10af0 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 rotocol", SSL_ge
10b00 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 t_version(stateP
10b10 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a tr->ssl), -1);..
10b20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 /* Valid for
10b30 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 non-RSA signatu
10b40 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a re and TLS 1.3 *
10b50 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d /. if (objc =
10b60 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 2) {..res = SS
10b70 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 L_get_peer_signa
10b80 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 ture_nid(statePt
10b90 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 r->ssl, &nid);.
10ba0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 } else {..res
10bb0 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 = SSL_get_signa
10bc0 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 ture_nid(statePt
10bd0 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 r->ssl, &nid);.
10be0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 }. if (!re
10bf0 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 s) {nid = 0;}.
10c00 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
10c10 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
10c20 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f ignatureHashAlgo
10c30 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 rithm", OBJ_nid2
10c40 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 ln(nid), -1);..
10c50 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
10c60 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 ) {..res = SSL_g
10c70 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 et_peer_signatur
10c80 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 e_type_nid(state
10c90 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b Ptr->ssl, &nid);
10ca0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 . } else {..r
10cb0 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 es = SSL_get_sig
10cc0 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 nature_type_nid(
10cd0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 statePtr->ssl, &
10ce0 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 nid);. }.
10cf0 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d if (!res) {nid =
10d00 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 0;}. LAPPEND
10d10 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
10d20 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 Ptr, "signatureT
10d30 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e ype", OBJ_nid2ln
10d40 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 (nid), -1);..
10d50 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
10d60 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
10d70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
10d80 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
10d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10dd0 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 --. *. * Connect
10de0 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d ionInfoObjCmd --
10df0 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 return connecti
10e00 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 on info from Ope
10e10 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nSSL.. *. * Resu
10e20 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f lts:. *.A list o
10e30 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 f connection inf
10e40 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d o. *. *--------
10e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
10e90 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e .static int Conn
10ea0 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 ectionInfoObjCmd
10eb0 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
10ec0 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
10ed0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
10ee0 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
10ef0 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
10f00 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
10f10 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
10f20 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
10f30 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 de on */. Sta
10f40 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f te *statePtr;../
10f50 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
10f60 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
10f70 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
10f80 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a jPtr, *listPtr;.
10f90 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 const SSL *s
10fa0 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 sl;. const SS
10fb0 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 L_CIPHER *cipher
10fc0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
10fd0 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e SESSION *session
10fe0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f ;. const EVP_
10ff0 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 MD *md;. (voi
11000 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
11010 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 if (objc !=
11020 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
11030 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
11040 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c , objv, "channel
11050 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
11060 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
11070 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
11080 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
11090 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
110a0 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 jv[1]), NULL);.
110b0 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
110c0 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
110d0 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
110e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
110f0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
11100 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
11110 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
11120 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
11130 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
11140 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 l(chan);. if
11150 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
11160 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
11170 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
11180 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
11190 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
111a0 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
111b0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
111c0 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 (chan),.. "\"
111d0 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
111e0 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e nel", (char *) N
111f0 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
11200 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
11210 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 "TLS", "CONNECTI
11220 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 ON", "CHANNEL",
11230 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
11240 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
11250 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
11260 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 }.. objPtr
11270 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
11280 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 (0, NULL);..
11290 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e /* Connection in
112a0 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 fo */. stateP
112b0 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
112c0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
112d0 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
112e0 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 ssl = stateP
112f0 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 tr->ssl;. if
11300 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl != NULL) {.
11310 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 ./* connection s
11320 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 tate */..LAPPEND
11330 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11340 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 Ptr, "state", SS
11350 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c L_state_string_l
11360 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a ong(ssl), -1);..
11370 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 ./* Get SNI requ
11380 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d ested server nam
11390 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 e */..LAPPEND_ST
113a0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
113b0 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 , "servername",
113c0 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 SSL_get_serverna
113d0 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e me(ssl, TLSEXT_N
113e0 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d AMETYPE_host_nam
113f0 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 e), -1);.../* Ge
11400 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c t protocol */..L
11410 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11420 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 p, objPtr, "prot
11430 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 ocol", SSL_get_v
11440 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 ersion(ssl), -1)
11450 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 ;.../* Renegotia
11460 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a tion allowed */.
11470 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
11480 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 terp, objPtr, "r
11490 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c enegotiation_all
114a0 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 owed", SSL_get_s
114b0 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 ecure_renegotiat
114c0 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53 53 4c ion_support((SSL
114d0 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 *) ssl));.../*
114e0 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 Get security lev
114f0 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 el */..LAPPEND_I
11500 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
11510 72 2c 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76 r, "security_lev
11520 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 el", SSL_get_sec
11530 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 urity_level(ssl)
11540 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
11550 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 info */..LAPPEND
11560 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
11570 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 jPtr, "session_r
11580 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 eused", SSL_sess
11590 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 ion_reused(ssl))
115a0 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 ;.../* Is server
115b0 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e info */..LAPPEN
115c0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
115d0 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 bjPtr, "is_serve
115e0 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 r", SSL_is_serve
115f0 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 r(ssl));.../* Is
11600 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e DTLS */..LAPPEN
11610 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
11620 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 bjPtr, "is_dtls"
11630 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 , SSL_is_dtls(ss
11640 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 l));. }..
11650 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a /* Cipher info *
11660 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 /. cipher = S
11670 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 SL_get_current_c
11680 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 ipher(ssl);.
11690 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 if (cipher != NU
116a0 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b LL) {..char buf[
116b0 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 BUFSIZ] = {0};..
116c0 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 int bits, alg_bi
116d0 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 ts;.../* Cipher
116e0 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 name */..LAPPEND
116f0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11700 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 Ptr, "cipher", S
11710 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 SL_CIPHER_get_na
11720 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b me(cipher), -1);
11730 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f .../* RFC name o
11740 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 f cipher */..LAP
11750 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11760 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 objPtr, "standa
11770 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 rd_name", SSL_CI
11780 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 PHER_standard_na
11790 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b me(cipher), -1);
117a0 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 .../* OpenSSL na
117b0 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a me of cipher */.
117c0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
117d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 erp, objPtr, "op
117e0 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 enssl_name", OPE
117f0 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 NSSL_cipher_name
11800 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e (SSL_CIPHER_stan
11810 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 dard_name(cipher
11820 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 )), -1);.../* nu
11830 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 mber of secret b
11840 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 its used for cip
11850 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 her */..bits = S
11860 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 SL_CIPHER_get_bi
11870 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f ts(cipher, &alg_
11880 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f bits);..LAPPEND_
11890 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
118a0 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 tr, "secret_bits
118b0 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 ", bits);..LAPPE
118c0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
118d0 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 bjPtr, "algorith
118e0 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 m_bits", alg_bit
118f0 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 s);../* alg_bits
11900 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 is actual key s
11910 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 ecret bits. If u
11920 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 se bits and secr
11930 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 et (algorithm) b
11940 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 its differ,..
11950 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 the rest of the
11960 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 bits are fixed,
11970 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 i.e. for limited
11980 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 export ciphers
11990 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a (bits < 56) */..
119a0 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 ./* Indicates wh
119b0 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 ich SSL/TLS prot
119c0 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 ocol version fir
119d0 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 st defined the c
119e0 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e ipher */..LAPPEN
119f0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11a00 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 jPtr, "min_versi
11a10 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f on", SSL_CIPHER_
11a20 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 get_version(ciph
11a30 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 er), -1);.../* C
11a40 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 ipher NID */..LA
11a50 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11a60 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 , objPtr, "ciphe
11a70 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f rNID", (char *)O
11a80 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
11a90 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f PHER_get_cipher_
11aa0 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
11ab0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
11ac0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
11ad0 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 "digestNID", (ch
11ae0 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 ar *)OBJ_nid2ln(
11af0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 SSL_CIPHER_get_d
11b00 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 igest_nid(cipher
11b10 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e )), -1);..LAPPEN
11b20 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11b30 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e jPtr, "keyExchan
11b40 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 geNID", (char *)
11b50 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 OBJ_nid2ln(SSL_C
11b60 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 IPHER_get_kx_nid
11b70 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
11b80 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
11b90 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 erp, objPtr, "au
11ba0 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 thenticationNID"
11bb0 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
11bc0 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
11bd0 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 get_auth_nid(cip
11be0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a her)), -1);.../*
11bf0 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 message authent
11c00 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 ication code - C
11c10 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65 ipher is AEAD (e
11c20 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 .g. GCM or ChaCh
11c30 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 a20/Poly1305) or
11c40 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 not */../* Auth
11c50 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 enticated Encryp
11c60 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 tion with associ
11c70 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29 ated data (AEAD)
11c80 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 check */..LAPPE
11c90 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
11ca0 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f objPtr, "cipher_
11cb0 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 is_aead", SSL_CI
11cc0 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 PHER_is_aead(cip
11cd0 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 her));.../* Dige
11ce0 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 st used during t
11cf0 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 he SSL/TLS hands
11d00 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 hake when using
11d10 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 the cipher. */..
11d20 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f md = SSL_CIPHER_
11d30 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 get_handshake_di
11d40 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c gest(cipher);..L
11d50 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11d60 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 p, objPtr, "hand
11d70 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 shake_digest", (
11d80 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 char *)EVP_MD_na
11d90 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f me(md), -1);.../
11da0 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 * Get OpenSSL-sp
11db0 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 ecific ID, not I
11dc0 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 ANA ID */..LAPPE
11dd0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
11de0 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 bjPtr, "cipher_i
11df0 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 d", (int) SSL_CI
11e00 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 PHER_get_id(ciph
11e10 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 er));.../* Two-b
11e20 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 yte ID used in t
11e30 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 he TLS protocol
11e40 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 of the given cip
11e50 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
11e60 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
11e70 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 tr, "protocol_id
11e80 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 ", (int) SSL_CIP
11e90 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c HER_get_protocol
11ea0 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 _id(cipher));...
11eb0 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 /* Textual descr
11ec0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 iption of the ci
11ed0 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c pher */..if (SSL
11ee0 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 _CIPHER_descript
11ef0 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c ion(cipher, buf,
11f00 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d sizeof(buf)) !=
11f10 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 NULL) {.. LA
11f20 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11f30 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 , objPtr, "descr
11f40 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 iption", buf, -1
11f50 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
11f60 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f /* Session info
11f70 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 */. session
11f80 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f = SSL_get_sessio
11f90 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 n(ssl);. if (
11fa0 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 session != NULL)
11fb0 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e {..const unsign
11fc0 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b ed char *ticket;
11fd0 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 ..size_t len2;..
11fe0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 unsigned int ule
11ff0 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e n;..const unsign
12000 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
12010 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e _id, *proto;..un
12020 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 signed char buff
12030 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 er[SSL_MAX_MASTE
12040 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a R_KEY_LENGTH];..
12050 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 ./* Report the s
12060 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
12070 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
12080 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 the ALPN negotia
12090 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 tion */..SSL_SES
120a0 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 SION_get0_alpn_s
120b0 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c elected(session,
120c0 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b &proto, &len2);
120d0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
120e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 terp, objPtr, "a
120f0 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 lpn", (char *) p
12100 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 roto, (Tcl_Size)
12110 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 len2);.../* Rep
12120 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 ort the selected
12130 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 protocol as a r
12140 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e esult of the NPN
12150 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
12160 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
12170 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 SSL_get0_next_pr
12180 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 oto_negotiated(s
12190 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 sl, &proto, &ule
121a0 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 n);..LAPPEND_STR
121b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
121c0 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 "npn", (char *)
121d0 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a proto, (Tcl_Siz
121e0 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 e) ulen);.#endif
121f0 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 .../* Resumable
12200 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 session */..LAPP
12210 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
12220 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 objPtr, "resuma
12230 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f ble", SSL_SESSIO
12240 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 N_is_resumable(s
12250 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 ession));.../* S
12260 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d ession start tim
12270 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 e (seconds since
12280 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 epoch) */..LAPP
12290 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c END_LONG(interp,
122a0 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f objPtr, "start_
122b0 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 time", SSL_SESSI
122c0 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 ON_get_time(sess
122d0 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 ion));.../* Time
122e0 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f out value - SSL_
122f0 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 CTX_get_timeout
12300 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a (in seconds) */.
12310 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e .LAPPEND_LONG(in
12320 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 terp, objPtr, "t
12330 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 imeout", SSL_SES
12340 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 SION_get_timeout
12350 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a (session));.../*
12360 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c Session id - TL
12370 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 Sv1.2 and below
12380 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e only */..session
12390 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f _id = SSL_SESSIO
123a0 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e N_get_id(session
123b0 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 , &ulen);..LAPPE
123c0 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 ND_BARRAY(interp
123d0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 , objPtr, "sessi
123e0 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f on_id", session_
123f0 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 id, (Tcl_Size) u
12400 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 len);.../* Sessi
12410 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 on context */..s
12420 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f ession_id = SSL_
12430 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f SESSION_get0_id_
12440 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c context(session,
12450 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ulen);..LAPPEN
12460 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
12470 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
12480 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 n_context", sess
12490 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a ion_id, (Tcl_Siz
124a0 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 e) ulen);.../* S
124b0 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 ession ticket -
124c0 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 client only */..
124d0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
124e0 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c _ticket(session,
124f0 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 &ticket, &len2)
12500 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 ;..LAPPEND_BARRA
12510 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 Y(interp, objPtr
12520 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 , "session_ticke
12530 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c t", ticket, (Tcl
12540 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 _Size) len2);...
12550 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 /* Session ticke
12560 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 t lifetime hint
12570 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a (in seconds) */.
12580 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e .LAPPEND_LONG(in
12590 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c terp, objPtr, "l
125a0 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 ifetime", SSL_SE
125b0 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 SSION_get_ticket
125c0 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 _lifetime_hint(s
125d0 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 ession));.../* T
125e0 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a icket app data *
125f0 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 /.#if OPENSSL_VE
12600 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
12610 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f x30000000L..SSL_
12620 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 SESSION_get0_tic
12630 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c ket_appdata((SSL
12640 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 _SESSION *) sess
12650 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
12660 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 en2);..LAPPEND_B
12670 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
12680 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 jPtr, "ticket_ap
12690 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c p_data", ticket,
126a0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
126b0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 );.#endif.../* G
126c0 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f et master key */
126d0 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 ..len2 = SSL_SES
126e0 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f SION_get_master_
126f0 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 key(session, buf
12700 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 fer, SSL_MAX_MAS
12710 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b TER_KEY_LENGTH);
12720 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
12730 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12740 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 "master_key", b
12750 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 uffer, (Tcl_Size
12760 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f ) len2);.../* Co
12770 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a mpression id */.
12780 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 .unsigned int id
12790 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
127a0 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 et_compress_id(s
127b0 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e ession);..LAPPEN
127c0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
127d0 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 jPtr, "compressi
127e0 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 on_id", id == 1
127f0 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 ? "zlib" : "none
12800 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 ", -1);. }..
12810 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f /* Compressio
12820 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 n info */. if
12830 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b (ssl != NULL) {
12840 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c .#ifdef HAVE_SSL
12850 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f _COMPRESSION..co
12860 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 nst COMP_METHOD
12870 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 *comp, *expn;..c
12880 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 omp = SSL_get_cu
12890 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f rrent_compressio
128a0 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 n(ssl);..expn =
128b0 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
128c0 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a expansion(ssl);.
128d0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
128e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
128f0 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d ompression", com
12900 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 p ? SSL_COMP_get
12910 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e _name(comp) : "n
12920 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 one", -1);..LAPP
12930 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
12940 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 objPtr, "expansi
12950 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f on", expn ? SSL_
12960 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 COMP_get_name(ex
12970 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 pn) : "none", -1
12980 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e );.#else..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 63 6f 6d 70 72 65 73 73 69 jPtr, "compressi
129b0 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 on", "none", -1)
129c0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
129d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
129e0 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e expansion", "non
129f0 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a e", -1);.#endif.
12a00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
12a10 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 rver info */.
12a20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 {..long mode =
12a30 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 SSL_CTX_get_sess
12a40 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 ion_cache_mode(s
12a50 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 tatePtr->ctx);..
12a60 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 char *msg;...if
12a70 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
12a80 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 _CACHE_OFF) {..
12a90 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a msg = "off";.
12aa0 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 .} else if (mode
12ab0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
12ac0 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 E_CLIENT) {..
12ad0 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b msg = "client";
12ae0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 ..} else if (mod
12af0 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 e & SSL_SESS_CAC
12b00 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 HE_SERVER) {..
12b10 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 msg = "server"
12b20 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f ;..} else if (mo
12b30 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
12b40 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 CHE_BOTH) {..
12b50 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 msg = "both";..
12b60 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 } else {.. ms
12b70 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 g = "unknown";..
12b80 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 }..LAPPEND_STR(i
12b90 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12ba0 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
12bb0 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 de", msg, -1);.
12bc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 }.. /* CA
12bd0 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 List */. /* I
12be0 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 F not a server,
12bf0 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 same as SSL_get0
12c00 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 _peer_CA_list. I
12c10 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 f server same as
12c20 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 SSL_CTX_get_cli
12c30 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 ent_CA_list */.
12c40 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c listPtr = Tcl
12c50 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
12c60 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f ULL);. STACK_
12c70 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 OF(X509_NAME) *c
12c80 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 a_list;. if (
12c90 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 (ca_list = SSL_g
12ca0 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
12cb0 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 t(ssl)) != NULL)
12cc0 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b {..char buffer[
12cd0 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 BUFSIZ];..for (i
12ce0 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b nt i = 0; i < sk
12cf0 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 _X509_NAME_num(c
12d00 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a a_list); i++) {.
12d10 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a . X509_NAME *
12d20 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e name = sk_X509_N
12d30 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 AME_value(ca_lis
12d40 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 t, i);.. if (
12d50 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e name) {...X509_N
12d60 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 AME_oneline(name
12d70 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a , buffer, BUFSIZ
12d80 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a );...Tcl_ListObj
12d90 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
12da0 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 terp, listPtr, T
12db0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
12dc0 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 buffer, -1));..
12dd0 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 }..}. }.
12de0 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e LAPPEND_OBJ(in
12df0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
12e00 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 aList", listPtr)
12e10 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e ;. LAPPEND_IN
12e20 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
12e30 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c , "caListCount",
12e40 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 sk_X509_NAME_nu
12e50 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 m(ca_list));..
12e60 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
12e70 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
12e80 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
12e90 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
12ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ee0 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f ---. *. * Versio
12ef0 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 nObjCmd -- retur
12f00 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 n version string
12f10 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 from OpenSSL..
12f20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
12f30 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
12f40 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
12f50 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
12f60 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
12f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
12fb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 /.static int.Ver
12fc0 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e sionObjCmd(Clien
12fd0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
12fe0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
12ff0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
13000 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
13010 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
13020 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 _Obj *objPtr;.
13030 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 (void) clientD
13040 61 74 61 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 ata;. (void)
13050 6f 62 6a 63 3b 0a 20 20 20 20 28 76 6f 69 64 29 objc;. (void)
13060 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 64 70 72 69 objv;.. dpri
13070 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
13080 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
13090 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 _NewStringObj(OP
130a0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 ENSSL_VERSION_TE
130b0 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c XT, -1);. Tcl
130c0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
130d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a terp, objPtr);..
130e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
130f0 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
13100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
13140 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 *. * MiscObjCmd
13150 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 -- misc command
13160 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
13170 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
13180 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
13190 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
131a0 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
131b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131f0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
13200 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e MiscObjCmd(Clien
13210 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
13220 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
13230 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
13240 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
13250 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 bjv[]) {. sta
13260 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
13270 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 commands [] = {
13280 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c "req", "strreq",
13290 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 NULL };. enu
132a0 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 m command { C_RE
132b0 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 Q, C_STRREQ, C_D
132c0 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f UMMY };. Tcl_
132d0 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e Size cmd;. in
132e0 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 t isStr;. cha
132f0 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b r buffer[16384];
13300 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
13310 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ntData;.. dpr
13320 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
13330 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
13340 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
13350 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
13360 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d , objv, "subcomm
13370 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 and ?args?");..r
13380 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
13390 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 . }. if (T
133a0 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f cl_GetIndexFromO
133b0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
133c0 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 1], commands, "c
133d0 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 ommand", 0, &cmd
133e0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
133f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
13400 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
13410 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
13420 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d . isStr = (cm
13430 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a d == C_STRREQ);.
13440 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 switch ((enu
13450 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 m command) cmd)
13460 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 {..case C_REQ:..
13470 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b case C_STRREQ: {
13480 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a .. EVP_PKEY *
13490 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 pkey=NULL;..
134a0 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b X509 *cert=NULL;
134b0 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 .. X509_NAME
134c0 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 *name=NULL;..
134d0 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 Tcl_Obj **listv
134e0 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 ;.. Tcl_Size
134f0 6c 69 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20 listc;.. int
13500 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 i;... BIO *ou
13510 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 t=NULL;... ch
13520 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 ar *k_C="",*k_ST
13530 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f ="",*k_L="",*k_O
13540 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f ="",*k_OU="",*k_
13550 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 CN="",*k_Email="
13560 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 ";.. char *ke
13570 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 yout,*pemout,*st
13580 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 r;.. int keys
13590 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 ize,serial=0,day
135a0 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e s=365;..#if OPEN
135b0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
135c0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
135d0 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e .. BIGNUM *bn
135e0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 e = NULL;.. R
135f0 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a SA *rsa = NULL;.
13600 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 #else.. EVP_P
13610 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e KEY_CTX *ctx = N
13620 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 ULL;.#endif...
13630 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c if ((objc<5) |
13640 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 | (objc>6)) {...
13650 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
13660 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 (interp, 2, objv
13670 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 , "keysize keyfi
13680 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 le certfile ?inf
13690 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 o?");...return T
136a0 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
136b0 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 ... if (Tcl_G
136c0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
136d0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b erp, objv[2], &k
136e0 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f eysize) != TCL_O
136f0 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 K) {...return TC
13700 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
13710 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f . keyout=Tcl_
13720 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 GetString(objv[3
13730 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d ]);.. pemout=
13740 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
13750 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 jv[4]);.. if
13760 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f (isStr) {...Tcl_
13770 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 SetVar(interp,ke
13780 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 yout,"",0);...Tc
13790 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
137a0 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 pemout,"",0);..
137b0 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f }... if (o
137c0 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 bjc>=6) {...if (
137d0 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c Tcl_ListObjGetEl
137e0 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f ements(interp, o
137f0 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 bjv[5], &listc,
13800 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f &listv) != TCL_O
13810 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 K) {... retur
13820 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
13830 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 ....if ((listc%2
13840 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 ) != 0) {...
13850 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
13860 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f terp,"Informatio
13870 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 n list must have
13880 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 even number of
13890 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 arguments",NULL)
138a0 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
138b0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 CL_ERROR;...}...
138c0 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 for (i=0; i<list
138d0 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 c; i+=2) {...
138e0 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 str=Tcl_GetStri
138f0 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 ng(listv[i]);...
13900 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 if (strcmp(s
13910 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b tr,"days")==0) {
13920 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
13930 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
13940 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 ,listv[i+1],&day
13950 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 s)!=TCL_OK)....
13960 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
13970 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
13980 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
13990 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b ,"serial")==0) {
139a0 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
139b0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
139c0 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 ,listv[i+1],&ser
139d0 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 ial)!=TCL_OK)...
139e0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
139f0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 ERROR;... } e
13a00 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
13a10 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"C")==0) {...
13a20 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_C=Tcl_GetStri
13a30 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
13a40 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
13a50 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 (strcmp(str,"ST"
13a60 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d )==0) {....k_ST=
13a70 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
13a80 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
13a90 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
13aa0 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 mp(str,"L")==0)
13ab0 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 {....k_L=Tcl_Get
13ac0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
13ad0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
13ae0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
13af0 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "O")==0) {....k_
13b00 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 O=Tcl_GetString(
13b10 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
13b20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13b30 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d rcmp(str,"OU")==
13b40 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 0) {....k_OU=Tcl
13b50 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
13b60 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
13b70 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
13b80 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a str,"CN")==0) {.
13b90 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 ...k_CN=Tcl_GetS
13ba0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13bb0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
13bc0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
13bd0 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 Email")==0) {...
13be0 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 .k_Email=Tcl_Get
13bf0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
13c00 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
13c10 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 {....Tcl_SetRes
13c20 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e ult(interp,"Unkn
13c30 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e own parameter",N
13c40 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 ULL);....return
13c50 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
13c60 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 }...}.. }..#
13c70 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
13c80 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
13c90 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 000000L.. bne
13ca0 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 = BN_new();..
13cb0 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 rsa = RSA_new(
13cc0 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 );.. pkey = E
13cd0 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 VP_PKEY_new();..
13ce0 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e if (bne == N
13cf0 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 ULL || rsa == NU
13d00 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 LL || pkey == NU
13d10 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f LL || !BN_set_wo
13d20 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c rd(bne,RSA_F4) |
13d30 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 |...!RSA_generat
13d40 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 e_key_ex(rsa, ke
13d50 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c ysize, bne, NULL
13d60 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 ) || !EVP_PKEY_a
13d70 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 ssign_RSA(pkey,
13d80 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b rsa)) {...EVP_PK
13d90 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 EY_free(pkey);..
13da0 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 ./* RSA_free(rsa
13db0 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f ); freed by EVP_
13dc0 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 PKEY_free */...B
13dd0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c N_free(bne);.#el
13de0 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 se.. pkey = E
13df0 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 VP_RSA_gen((unsi
13e00 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a gned int) keysiz
13e10 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 e);.. ctx = E
13e20 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 VP_PKEY_CTX_new(
13e30 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 pkey,NULL);..
13e40 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c if (pkey == NUL
13e50 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c L || ctx == NULL
13e60 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 || !EVP_PKEY_ke
13e70 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c ygen_init(ctx) |
13e80 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 |...!EVP_PKEY_CT
13e90 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e X_set_rsa_keygen
13ea0 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 _bits(ctx, keysi
13eb0 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 ze) || !EVP_PKEY
13ec0 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b _keygen(ctx, &pk
13ed0 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 ey)) {...EVP_PKE
13ee0 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
13ef0 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 EVP_PKEY_CTX_fre
13f00 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 e(ctx);.#endif..
13f10 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
13f20 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
13f30 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 erating private
13f40 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 key",NULL);...re
13f50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13f60 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
13f70 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
13f80 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
13f90 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
13fa0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
13fb0 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c _PrivateKey(out,
13fc0 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 pkey,NULL,NULL,0
13fd0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ,NULL,NULL);...
13fe0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
13ff0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
14000 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
14010 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
14020 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
14030 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
14040 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
14050 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,keyout,buffer,0
14060 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
14070 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
14080 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
14090 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
140a0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
140b0 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
140c0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
140d0 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a me(out,keyout);.
140e0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
140f0 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f bio_PrivateKey(o
14100 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c ut,pkey,NULL,NUL
14110 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a L,0,NULL,NULL);.
14120 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 .. /* PEM_wri
14130 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 te_bio_RSAPrivat
14140 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e eKey(out, rsa, N
14150 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 ULL, NULL, 0, NU
14160 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 LL, NULL); */...
14170 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c BIO_free_all
14180 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 (out);.. .}....i
14190 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 f ((cert=X509_ne
141a0 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 w())==NULL) {...
141b0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
141c0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
141d0 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 generating certi
141e0 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c ficate request",
141f0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 NULL);... EVP
14200 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
14210 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
14220 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
14230 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
14240 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
14250 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 endif... retu
14260 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
14270 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 }....X509_set_ve
14280 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 rsion(cert,2);..
14290 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 .ASN1_INTEGER_se
142a0 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 t(X509_get_seria
142b0 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 lNumber(cert),se
142c0 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d rial);...X509_gm
142d0 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 time_adj(X509_ge
142e0 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 tm_notBefore(cer
142f0 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d t),0);...X509_gm
14300 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 time_adj(X509_ge
14310 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 tm_notAfter(cert
14320 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 ),(long)60*60*24
14330 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 *days);...X509_s
14340 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 et_pubkey(cert,p
14350 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 key);....name=X5
14360 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 09_get_subject_n
14370 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 ame(cert);....X5
14380 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
14390 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 y_by_txt(name,"C
143a0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
143b0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
143c0 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 char *) k_C, -1
143d0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...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 53 54 22 by_txt(name,"ST"
14400 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
14410 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
14420 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 char *) k_ST, -1
14430 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
14440 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
14450 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c by_txt(name,"L",
14460 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
14470 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
14480 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 har *) k_L, -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 4f 22 2c 20 4d _txt(name,"O", 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 4f 2c 20 2d 31 2c 20 2d 31 r *) k_O, -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 55 22 2c 20 4d 42 xt(name,"OU", MB
14520 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
14530 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
14540 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 *) k_OU, -1, -1
14550 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
14560 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
14570 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 xt(name,"CN", MB
14580 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e STRING_ASC, (con
14590 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
145a0 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 *) k_CN, -1, -1
145b0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
145c0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
145d0 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c xt(name,"Email",
145e0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
145f0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
14600 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 har *) k_Email,
14610 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 -1, -1, 0);....X
14620 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 509_set_subject_
14630 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b name(cert,name);
14640 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 ....if (!X509_si
14650 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 gn(cert,pkey,EVP
14660 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 _sha256())) {...
14670 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 X509_free(ce
14680 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 rt);... EVP_P
14690 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
146a0 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
146b0 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
146c0 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 0000000L... B
146d0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e N_free(bne);.#en
146e0 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 dif... Tcl_Se
146f0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
14700 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 Error signing ce
14710 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 rtificate",NULL)
14720 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
14730 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 CL_ERROR;...}...
14740 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 .if (isStr) {...
14750 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
14760 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 BIO_s_mem());...
14770 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
14780 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 o_X509(out,cert)
14790 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 ;... i=BIO_re
147a0 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 ad(out,buffer,si
147b0 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b zeof(buffer)-1);
147c0 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f ... i=(i<0) ?
147d0 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 0 : i;... bu
147e0 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 ffer[i]='\0';...
147f0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 Tcl_SetVar(i
14800 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 nterp,pemout,buf
14810 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 fer,0);... BI
14820 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 O_flush(out);...
14830 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 BIO_free(out
14840 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
14850 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
14860 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 BIO_s_file());..
14870 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 . BIO_write_f
14880 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f ilename(out,pemo
14890 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ut);... PEM_w
148a0 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 rite_bio_X509(ou
148b0 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 t,cert);... B
148c0 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 IO_free_all(out)
148d0 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 ;...}....X509_fr
148e0 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f ee(cert);...EVP_
148f0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
14900 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
14910 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
14920 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 30000000L...BN_f
14930 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 ree(bne);.#endif
14940 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 .. }..}..brea
14950 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a k;. default:.
14960 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 .break;. }.
14970 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
14980 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .}.../**********
14990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 **********/./* I
149a0 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 nit
149b0 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./************
149c0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a ********/../*. *
149d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
149e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
149f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a10 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 ---. *. * Tls_Fr
14a20 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 ee --. *. *.This
14a30 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e procedure clean
14a40 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 s up when a SSL
14a50 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
14a60 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 nnel. *.is close
14a70 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 d and its refere
14a80 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 nce count falls
14a90 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 below 1. *. * Re
14aa0 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 sults:. *.none.
14ab0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
14ac0 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 s:. *.Frees all
14ad0 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d the state. *. *-
14ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b20 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f --. */.void.Tls_
14b30 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b Free(char *block
14b40 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 Ptr) {. State
14b50 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
14b60 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a ate *)blockPtr;.
14b70 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
14b80 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 lled");.. Tls
14b90 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 _Clean(statePtr)
14ba0 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f ;. ckfree(blo
14bb0 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ckPtr);.}.../*.
14bc0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
14bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c00 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 ----. *. * Tls_C
14c10 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 lean --. *. *.Th
14c20 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 is procedure cle
14c30 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 ans up when a SS
14c40 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
14c50 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f hannel. *.is clo
14c60 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 sed and its refe
14c70 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c rence count fall
14c80 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 s below 1. This
14c90 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 should. *.be ca
14ca0 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 lled synchronous
14cb0 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 ly by the CloseP
14cc0 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a roc, not in the.
14cd0 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 *.EventuallyFre
14ce0 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 e callback.. *.
14cf0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f * Results:. *.no
14d00 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
14d10 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 fects:. *.Frees
14d20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a all the state. *
14d30 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
14d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d70 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 ------. */.void
14d80 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 Tls_Clean(State
14d90 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 *statePtr) {.
14da0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
14db0 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 ");.. /*.
14dc0 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e * we're assumin
14dd0 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72 g here that we'r
14de0 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 e single-threade
14df0 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 d. */. if
14e00 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 (statePtr->time
14e10 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 r != (Tcl_TimerT
14e20 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 oken) NULL) {..T
14e30 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 cl_DeleteTimerHa
14e40 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e ndler(statePtr->
14e50 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 timer);..statePt
14e60 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b r->timer = NULL;
14e70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
14e80 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
14e90 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 ) {..ckfree(stat
14ea0 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 ePtr->protos);..
14eb0 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
14ec0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
14ed0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
14ee0 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 >bio) {../* This
14ef0 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 will call SSL_s
14f00 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 hutdown. Bug 141
14f10 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 4045 */..dprintf
14f20 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 ("BIO_free_all(%
14f30 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 p)", statePtr->b
14f40 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 io);..BIO_free_a
14f50 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ll(statePtr->bio
14f60 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 );..statePtr->bi
14f70 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a o = NULL;. }.
14f80 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
14f90 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 ->ssl) {..dprint
14fa0 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 f("SSL_free(%p)"
14fb0 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 , statePtr->ssl)
14fc0 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 ;..SSL_free(stat
14fd0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 ePtr->ssl);..sta
14fe0 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c tePtr->ssl = NUL
14ff0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
15000 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 (statePtr->ctx)
15010 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 {..SSL_CTX_free(
15020 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
15030 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d .statePtr->ctx =
15040 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
15050 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
15060 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f allback) {..Tcl_
15070 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
15080 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
15090 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c ;..statePtr->cal
150a0 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 lback = 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 70 61 73 73 77 6f 72 64 29 20 ePtr->password)
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 70 61 unt(statePtr->pa
150f0 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 ssword);..stateP
15100 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e tr->password = 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 76 63 6d f (statePtr->vcm
15130 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 d) {..Tcl_DecrRe
15140 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
15150 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 >vcmd);..statePt
15160 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a r->vcmd = NULL;.
15170 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
15180 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b tf("Returning");
15190 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
151a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151e0 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66 . *. * Build Inf
151f0 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a o Command --. *.
15200 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e *.Create comman
15210 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75 69 6c d to return buil
15220 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61 d info for packa
15230 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ge.. *. * Result
15240 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
15250 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 Tcl result. *.
15260 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
15270 20 2a 09 43 72 65 61 74 65 64 20 62 75 69 6c 64 *.Created build
15280 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20 -info command..
15290 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
152d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
152e0 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 49 46 #ifndef STRINGIF
152f0 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49 Y.# define STRI
15300 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e 47 49 NGIFY(x) STRINGI
15310 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 6e 65 FY1(x).# define
15320 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 20 23 STRINGIFY1(x) #
15330 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75 x.#endif..int.Bu
15340 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54 ildInfoCommand(T
15350 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 72 cl_Interp* inter
15360 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64 p) {. Tcl_Cmd
15370 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 Info info;..
15380 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 if (Tcl_GetComma
15390 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22 ndInfo(interp, "
153a0 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 ::tcl::build-inf
153b0 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54 o", &info)) {..T
153c0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
153d0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
153e0 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c ls::build-info",
153f0 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 info.objProc, (
15400 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 4b 41 void *)(...PACKA
15410 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 53 GE_VERSION "+" S
15420 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 52 TRINGIFY(TLS_VER
15430 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20 64 SION_UUID).#if d
15440 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f efined(__clang__
15450 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 63 ) && defined(__c
15460 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09 lang_major__)...
15470 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53 . ".clang-" S
15480 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 TRINGIFY(__clang
15490 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f _major__).#if __
154a0 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 clang_minor__ <
154b0 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 10.... "0".#e
154c0 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 ndif.... STRI
154d0 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69 NGIFY(__clang_mi
154e0 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 nor__).#endif.#i
154f0 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 f defined(__cplu
15500 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 69 6e splus) && !defin
15510 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09 ed(__OBJC__)....
15520 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 22 ".cplusplus"
15530 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 .#endif.#ifndef
15540 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e NDEBUG.... ".
15550 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 debug".#endif.#i
15560 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 f !defined(__cla
15570 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 ng__) && !define
15580 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c d(__INTEL_COMPIL
15590 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f ER) && defined(_
155a0 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 20 _GNUC__)....
155b0 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49 46 ".gcc-" STRINGIF
155c0 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20 Y(__GNUC__).#if
155d0 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c __GNUC_MINOR__ <
155e0 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 10.... "0".#
155f0 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 endif.... STR
15600 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49 INGIFY(__GNUC_MI
15610 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 NOR__).#endif.#i
15620 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d fdef __INTEL_COM
15630 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e 69 PILER.... ".i
15640 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f cc-" STRINGIFY(_
15650 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 _INTEL_COMPILER)
15660 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 .#endif.#ifdef T
15670 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09 CL_MEM_DEBUG....
15680 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a ".memdebug".
15690 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
156a0 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09 ed(_MSC_VER)....
156b0 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 52 ".msvc-" STR
156c0 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 29 INGIFY(_MSC_VER)
156d0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 55 .#endif.#ifdef U
156e0 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20 SE_NMAKE....
156f0 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a ".nmake".#endif.
15700 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f #ifndef TCL_CFG_
15710 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 20 OPTIMIZED....
15720 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a ".no-optimize".
15730 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f #endif.#ifdef __
15740 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e OBJC__.... ".
15750 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 66 objective-c".#if
15760 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 defined(__cplus
15770 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70 6c plus).... "pl
15780 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 usplus".#endif.#
15790 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c endif.#ifdef TCL
157a0 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09 _CFG_PROFILED...
157b0 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a . ".profile".
157c0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50 55 #endif.#ifdef PU
157d0 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70 75 RIFY.... ".pu
157e0 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 66 rify".#endif.#if
157f0 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c 44 def STATIC_BUILD
15800 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 69 63 .... ".static
15810 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55 ".#endif...), NU
15820 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 LL);. }. r
15830 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
15840 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
15850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
15890 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a Tls_Init --. *.
158a0 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63 *.This is a pac
158b0 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 kage initializat
158c0 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 ion procedure, w
158d0 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 hich is called.
158e0 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 *.by Tcl when th
158f0 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f is package is to
15900 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 be added to an
15910 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a interpreter.. *.
15920 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c * Results: Ssl
15930 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 configured and
15940 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 loaded. *. * Sid
15950 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 e effects:. *. c
15960 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f reate the ssl co
15970 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a mmand, initializ
15980 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a e ssl context. *
15990 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
159a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159d0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20 ------. */..#if
159e0 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
159f0 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 N > 8.#define MI
15a00 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a N_VERSION "9.0".
15a10 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 #else.#define MI
15a20 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a N_VERSION "8.5".
15a30 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 63 #endif..static c
15a40 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c onst char tlsTcl
15a50 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b InitScript[] = {
15a60 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 .#include "tls.t
15a70 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 cl.h"..0x00.
15a80 7d 3b 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e };..DLLEXPORT in
15a90 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 t Tls_Init(Tcl_I
15aa0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
15ab0 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
15ac0 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65 66 alled");..#ifdef
15ad0 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 USE_TCL_STUBS.
15ae0 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 if (Tcl_InitS
15af0 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e tubs(interp, MIN
15b00 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 _VERSION, 0) ==
15b10 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
15b20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
15b30 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 .#endif. if (
15b40 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 Tcl_PkgRequire(i
15b50 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49 nterp, "Tcl", MI
15b60 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d N_VERSION, 0) ==
15b70 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
15b80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
15b90 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 }.. if (TlsLi
15ba0 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f bInit(0) != TCL_
15bb0 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e OK) {..Tcl_Appen
15bc0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
15bd0 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 "could not initi
15be0 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 alize SSL librar
15bf0 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c y", (char *) NUL
15c00 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
15c10 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
15c20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
15c30 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
15c40 3a 3a 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c ::tls::ciphers",
15c50 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 CiphersObjCmd,
15c60 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
15c70 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
15c80 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
15c90 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
15ca0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
15cb0 20 22 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 "::tls::connect
15cc0 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e ion", Connection
15cd0 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 InfoObjCmd, (Cli
15ce0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
15cf0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
15d00 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
15d10 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
15d20 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a mand(interp, "::
15d30 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c tls::handshake",
15d40 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 HandshakeObjCmd
15d50 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e , (ClientData) N
15d60 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ULL, (Tcl_CmdDel
15d70 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
15d80 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
15d90 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
15da0 70 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f 72 p, "::tls::impor
15db0 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 t", ImportObjCmd
15dc0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e , (ClientData) N
15dd0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ULL, (Tcl_CmdDel
15de0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
15df0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
15e00 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
15e10 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 69 6d 70 p, "::tls::unimp
15e20 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 ort", UnimportOb
15e30 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
15e40 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
15e50 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
15e60 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
15e70 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
15e80 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 nterp, "::tls::s
15e90 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 tatus", StatusOb
15ea0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
15eb0 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
15ec0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
15ed0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
15ee0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
15ef0 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 76 nterp, "::tls::v
15f00 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e ersion", Version
15f10 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
15f20 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f ata) NULL, (Tcl_
15f30 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
15f40 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
15f50 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
15f60 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a (interp, "::tls:
15f70 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 :misc", MiscObjC
15f80 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
15f90 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
15fa0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
15fb0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
15fc0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
15fd0 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 70 72 6f erp, "::tls::pro
15fe0 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f tocols", Protoco
15ff0 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e lsObjCmd, (Clien
16000 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 tData) NULL, (Tc
16010 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
16020 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 *) NULL);.. B
16030 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 uildInfoCommand(
16040 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 interp);.. if
16050 20 28 69 6e 74 65 72 70 20 26 26 20 54 63 6c 5f (interp && Tcl_
16060 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 Eval(interp, tls
16070 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 20 21 TclInitScript) !
16080 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
16090 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
160a0 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e }.. return
160b0 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 Tcl_PkgProvide(
160c0 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f interp, PACKAGE_
160d0 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 NAME, PACKAGE_VE
160e0 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a RSION);.}../*. *
160f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16120 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c ------*. *. *.Tl
16130 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a s_SafeInit --. *
16140 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
16150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16170 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 ----*. *.Standar
16180 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 d procedure requ
16190 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a ired by 'load'..
161a0 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 *.Initializes t
161b0 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f his extension fo
161c0 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 r a safe interpr
161d0 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d eter.. *.-------
161e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
161f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a ---------*. *. *
16210 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 .Side effects:.
16220 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e *..As of 'Tls_In
16230 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 it'. *. *.Result
16240 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 :. *..A standard
16250 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e Tcl error code.
16260 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
16270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
162a0 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 /.DLLEXPORT int
162b0 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c Tls_SafeInit(Tcl
162c0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 _Interp *interp)
162d0 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 {. dprintf("
162e0 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 Called");. re
162f0 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e turn Tls_Init(in
16300 74 65 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d terp);.}../*. *-
16310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16340 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 -----*. *. *.Tls
16350 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a LibInit --. *. *
16360 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
16370 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 -*. *.Initialize
163a0 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e s SSL library on
163b0 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 ce per applicati
163c0 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d on. *.----------
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 2a 0a 20 2a 0a 20 2a 09 53 69 ------*. *. *.Si
16400 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 de effects:. *..
16410 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 initializes SSL
16420 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 library. *. *.Re
16430 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 sult:. *..none.
16440 2a 0a 20 2a 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 2d 2d 2d ----------------
16460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a ----------*. */.
16480 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 static int TlsLi
16490 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 bInit(int uninit
164a0 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 ialize) {. st
164b0 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c atic int initial
164c0 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e ized = 0;. in
164d0 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f t status = TCL_O
164e0 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f K;.#if defined(O
164f0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
16500 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
16510 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 HREADS). size
16520 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 _t num_locks;.#e
16530 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e ndif.. if (un
16540 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 initialize) {..i
16550 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 f (!initialized)
16560 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
16570 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 "Asked to uninit
16580 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 ialize, but we a
16590 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a re not initializ
165a0 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 ed");... retu
165b0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 rn TCL_OK;..}...
165c0 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 dprintf("Asked t
165d0 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 o uninitialize")
165e0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
165f0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
16600 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
16610 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 HREADS)..Tcl_Mut
16620 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 exLock(&init_mx)
16630 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b ;...if (locks) {
16640 0a 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 .. free(locks
16650 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 );.. locks =
16660 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 NULL;.. locks
16670 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 Count = 0;..}.#e
16680 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 ndif..initialize
16690 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 d = 0;..#if defi
166a0 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
166b0 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
166c0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 TCL_THREADS)..Tc
166d0 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 l_MutexUnlock(&i
166e0 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a nit_mx);.#endif.
166f0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b ..return TCL_OK;
16700 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
16710 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
16720 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c dprintf("Called,
16730 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 but using cache
16740 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 d value");..retu
16750 72 6e 20 73 74 61 74 75 73 3b 0a 20 20 20 20 7d rn status;. }
16760 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
16770 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 alled");..#if de
16780 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
16790 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
167a0 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
167b0 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b Tcl_MutexLock
167c0 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 (&init_mx);.#end
167d0 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a if. initializ
167e0 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 ed = 1;..#if def
167f0 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
16800 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
16810 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 (TCL_THREADS).
16820 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b num_locks = 1;
16830 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 . locksCount
16840 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b = (int) num_lock
16850 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d s;. locks = m
16860 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f alloc(sizeof(*lo
16870 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 cks) * num_locks
16880 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f );. memset(lo
16890 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a cks, 0, sizeof(*
168a0 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 locks) * num_loc
168b0 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 ks);.#endif..
168c0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 /* Initialize B
168d0 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e OTH libcrypto an
168e0 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 d libssl. */.
168f0 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 OPENSSL_init_ss
16900 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c l(OPENSSL_INIT_L
16910 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 OAD_SSL_STRINGS
16920 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c | OPENSSL_INIT_L
16930 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e OAD_CRYPTO_STRIN
16940 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e GS..| OPENSSL_IN
16950 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 IT_ADD_ALL_CIPHE
16960 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 RS | OPENSSL_INI
16970 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 T_ADD_ALL_DIGEST
16980 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 S, NULL);.. B
16990 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c IO_new_tcl(NULL,
169a0 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 0);..#if 0.
169b0 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f /*. * XXX:TO
169c0 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20 DO: Remove this
169d0 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65 code and replace
169e0 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 6b it with a check
169f0 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 . * for enou
16a00 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 gh entropy and d
16a10 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65 o not try to cre
16a20 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 ate our own.
16a30 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72 * terrible entr
16a40 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 opy. */.
16a50 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74 /*. * Seed t
16a60 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 he random number
16a70 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 generator in th
16a80 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 e SSL library,.
16a90 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20 * using the
16aa0 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 do/while constru
16ab0 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 ct because of th
16ac0 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 e bug note in th
16ad0 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c e. * OpenSSL
16ae0 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 FAQ at http://w
16af0 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 ww.openssl.org/s
16b00 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 upport/faq.html#
16b10 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 USER1. *.
16b20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20 * The crux of
16b30 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 the problem is t
16b40 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f hat Solaris 7 do
16b50 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 es not have a.
16b60 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d * /dev/random
16b70 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d or /dev/urandom
16b80 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 61 device so it ca
16b90 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75 nnot gather enou
16ba0 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 gh. * entrop
16bb0 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f y from the RAND_
16bc0 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20 seed() when TLS
16bd0 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 initializes and
16be0 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74 refuses. * t
16bf0 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 o go further. Ea
16c00 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f rlier versions o
16c10 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 f OpenSSL carrie
16c20 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e d on regardless.
16c30 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 . */. sra
16c40 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 nd((unsigned int
16c50 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a ) time((time_t *
16c60 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f ) NULL));. do
16c70 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 {..for (i = 0;
16c80 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 i < 16; i++) {..
16c90 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 rnd_seed[i]
16ca0 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 35 = 1 + (char) (25
16cb0 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 5.0 * rand()/(RA
16cc0 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d ND_MAX+1.0));..}
16cd0 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f ..RAND_seed(rnd_
16ce0 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 seed, sizeof(rnd
16cf0 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 _seed));. } w
16d00 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75 hile (RAND_statu
16d10 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 s() != 1);.#endi
16d20 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f f..#if defined(O
16d30 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
16d40 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
16d50 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 HREADS)..Tcl_Mut
16d60 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d exUnlock(&init_m
16d70 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 x);.#endif..
16d80 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a 7d return status;.}
16d90 0a .