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: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 22 74 6c 73 55 75 69 64 2e nclude "tlsUuid.
0390: 68 22 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 2f 2a 0a 20 2a 20 ".#endif../*. *
0450: 45 78 74 65 72 6e 61 6c 20 66 75 6e 63 74 69 6f External functio
0460: 6e 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f ns. */../*. * Fo
0470: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f rward declaratio
0480: 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 ns. */..#define
0490: 46 32 4e 28 6b 65 79 2c 20 64 73 70 29 20 5c 0a F2N(key, dsp) \.
04a0: 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c .(((key) == NULL
04b0: 29 20 3f 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c ) ? (char *)NULL
04c0: 20 3a 20 5c 0a 09 09 54 63 6c 5f 54 72 61 6e 73 : \...Tcl_Trans
04d0: 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 lateFileName(int
04e0: 65 72 70 2c 20 28 6b 65 79 29 2c 20 28 64 73 70 erp, (key), (dsp
04f0: 29 29 29 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f )))..static SSL_
0500: 43 54 58 20 2a 43 54 58 5f 49 6e 69 74 28 53 74 CTX *CTX_Init(St
0510: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 ate *statePtr, i
0520: 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 nt isServer, int
0530: 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 proto, char *ke
0540: 79 2c 0a 09 09 63 68 61 72 20 2a 63 65 72 74 66 y,...char *certf
0550: 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 ile, unsigned ch
0560: 61 72 20 2a 6b 65 79 5f 61 73 6e 31 2c 20 75 6e ar *key_asn1, un
0570: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 signed char *cer
0580: 74 5f 61 73 6e 31 2c 0a 09 09 69 6e 74 20 6b 65 t_asn1,...int ke
0590: 79 5f 61 73 6e 31 5f 6c 65 6e 2c 20 69 6e 74 20 y_asn1_len, int
05a0: 63 65 72 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 cert_asn1_len, c
05b0: 68 61 72 20 2a 43 41 70 61 74 68 2c 20 63 68 61 har *CApath, cha
05c0: 72 20 2a 43 41 66 69 6c 65 2c 0a 09 09 63 68 61 r *CAfile,...cha
05d0: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 r *ciphers, char
05e0: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 *ciphersuites,
05f0: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 int level, char
0600: 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a 73 74 61 *DHparams);..sta
0610: 74 69 63 20 69 6e 74 09 54 6c 73 4c 69 62 49 6e tic int.TlsLibIn
0620: 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c it(int uninitial
0630: 69 7a 65 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54 ize);..#define T
0640: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30 LS_PROTO_SSL2..0
0650: 78 30 31 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f x01.#define TLS_
0660: 50 52 4f 54 4f 5f 53 53 4c 33 09 09 30 78 30 32 PROTO_SSL3..0x02
0670: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
0680: 54 4f 5f 54 4c 53 31 09 09 30 78 30 34 0a 23 64 TO_TLS1..0x04.#d
0690: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f efine TLS_PROTO_
06a0: 54 4c 53 31 5f 31 09 30 78 30 38 0a 23 64 65 66 TLS1_1.0x08.#def
06b0: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ine TLS_PROTO_TL
06c0: 53 31 5f 32 09 30 78 31 30 0a 23 64 65 66 69 6e S1_2.0x10.#defin
06d0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
06e0: 5f 33 09 30 78 32 30 0a 23 64 65 66 69 6e 65 20 _3.0x20.#define
06f0: 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 ENABLED(flag, ma
0700: 73 6b 29 09 28 28 28 66 6c 61 67 29 20 26 20 28 sk).(((flag) & (
0710: 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 mask)) == (mask)
0720: 29 0a 0a 23 64 65 66 69 6e 65 20 53 53 4c 4b 45 )..#define SSLKE
0730: 59 4c 4f 47 46 49 4c 45 09 09 22 53 53 4c 4b 45 YLOGFILE.."SSLKE
0740: 59 4c 4f 47 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a YLOGFILE"../*. *
0750: 20 54 68 72 65 61 64 2d 53 61 66 65 20 54 4c 53 Thread-Safe TLS
0760: 20 43 6f 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 Code. */..#ifde
0770: 66 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 23 64 f TCL_THREADS.#d
0780: 65 66 69 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48 efine OPENSSL_TH
0790: 52 45 41 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e READ_DEFINES.#in
07a0: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f clude <openssl/o
07b0: 70 65 6e 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 pensslconf.h>..#
07c0: 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48 ifdef OPENSSL_TH
07d0: 52 45 41 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c READS.#include <
07e0: 6f 70 65 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 openssl/crypto.h
07f0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e >.#include <open
0800: 73 73 6c 2f 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 ssl/ssl.h>../*.
0810: 2a 20 54 68 72 65 61 64 65 64 20 6f 70 65 72 61 * Threaded opera
0820: 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 6c 6f tion requires lo
0830: 63 6b 69 6e 67 20 63 61 6c 6c 62 61 63 6b 73 0a cking callbacks.
0840: 20 2a 20 42 61 73 65 64 20 66 72 6f 6d 20 2f 63 * Based from /c
0850: 72 79 70 74 6f 2f 63 72 79 70 74 6c 69 62 2e 63 rypto/cryptlib.c
0860: 20 6f 66 20 4f 70 65 6e 53 53 4c 20 61 6e 64 20 of OpenSSL and
0870: 4e 53 4f 70 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a NSOpenSSL.. */..
0880: 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 static Tcl_Mutex
0890: 20 2a 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a *locks = NULL;.
08a0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 73 static int locks
08b0: 43 6f 75 6e 74 20 3d 20 30 3b 0a 73 74 61 74 69 Count = 0;.stati
08c0: 63 20 54 63 6c 5f 4d 75 74 65 78 20 69 6e 69 74 c Tcl_Mutex init
08d0: 5f 6d 78 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f _mx;.#endif /* O
08e0: 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 20 2a PENSSL_THREADS *
08f0: 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f /.#endif /* TCL_
0900: 54 48 52 45 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a THREADS */..../*
0910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0920: 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b ***/./* Callback
0930: 73 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a s */./***
0940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0950: 2a 2f 0a 0a 2f 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
09a0: 20 2a 20 45 76 61 6c 20 43 61 6c 6c 62 61 63 6b * Eval Callback
09b0: 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 Command --. *.
09c0: 2a 09 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 *.Eval callback
09d0: 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 63 61 74 63 command and catc
09e0: 68 20 61 6e 79 20 65 72 72 6f 72 73 0a 20 2a 0a h any errors. *.
09f0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 * Results:. *.0
0a00: 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 = Command retur
0a10: 6e 65 64 20 66 61 69 6c 20 6f 72 20 65 76 61 6c ned fail or eval
0a20: 20 72 65 74 75 72 6e 65 64 20 54 43 4c 5f 45 52 returned TCL_ER
0a30: 52 4f 52 0a 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 ROR. *.1 = Comma
0a40: 6e 64 20 72 65 74 75 72 6e 65 64 20 73 75 63 63 nd returned succ
0a50: 65 73 73 20 6f 72 20 65 76 61 6c 20 72 65 74 75 ess or eval retu
0a60: 72 6e 65 64 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 rned TCL_OK. *.
0a70: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0a80: 20 2a 09 45 76 61 6c 75 61 74 65 73 20 63 61 6c *.Evaluates cal
0a90: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a lback command. *
0aa0: 0a 20 2a 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 2d 2d 2d 2d 2d 2d ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ae0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
0af0: 63 20 69 6e 74 0a 45 76 61 6c 43 61 6c 6c 62 61 c int.EvalCallba
0b00: 63 6b 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 ck(Tcl_Interp *i
0b10: 6e 74 65 72 70 2c 20 53 74 61 74 65 20 2a 73 74 nterp, State *st
0b20: 61 74 65 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 atePtr, Tcl_Obj
0b30: 2a 63 6d 64 50 74 72 29 20 7b 0a 20 20 20 20 69 *cmdPtr) {. i
0b40: 6e 74 20 63 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b nt code, ok = 0;
0b50: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
0b60: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 63 alled");.. Tc
0b70: 6c 5f 50 72 65 73 65 72 76 65 28 28 76 6f 69 64 l_Preserve((void
0b80: 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 *) interp);.
0b90: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 76 Tcl_Preserve((v
0ba0: 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 oid *) statePtr)
0bb0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
0bc0: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 73 75 63 allback with suc
0bd0: 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72 cess for ok or r
0be0: 65 74 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 66 eturn value 1, f
0bf0: 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f 72 ail for error or
0c00: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 30 20 return value 0
0c10: 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 */. Tcl_Reset
0c20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
0c30: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 code = Tcl_E
0c40: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c valObjEx(interp,
0c50: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 cmdPtr, TCL_EVA
0c60: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 64 L_GLOBAL);. d
0c70: 70 72 69 6e 74 66 28 22 45 76 61 6c 43 61 6c 6c printf("EvalCall
0c80: 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 29 back: %d", code)
0c90: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d ;. if (code =
0ca0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 = TCL_OK) {../*
0cb0: 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 Check result for
0cc0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f return value */
0cd0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c ..Tcl_Obj *resul
0ce0: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 t = Tcl_GetObjRe
0cf0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 sult(interp);..i
0d00: 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c f (result == NUL
0d10: 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 L || Tcl_GetIntF
0d20: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 romObj(interp, r
0d30: 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 esult, &ok) != T
0d40: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b CL_OK) {.. ok
0d50: 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 = 1;..}..dprint
0d60: 66 28 22 52 65 73 75 6c 74 3a 20 25 64 22 2c 20 f("Result: %d",
0d70: 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ok);. } else
0d80: 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 65 {../* Error - re
0d90: 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66 69 ject the certifi
0da0: 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66 cate */..dprintf
0db0: 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ("Tcl_Background
0dc0: 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 43 Error");.#if (TC
0dd0: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
0de0: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 == 8) && (TCL_MI
0df0: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 NOR_VERSION < 6)
0e00: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
0e10: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 Error(interp);.#
0e20: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 else..Tcl_Backgr
0e30: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e oundException(in
0e40: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e terp, code);.#en
0e50: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 dif. }.. T
0e60: 63 6c 5f 52 65 6c 65 61 73 65 28 28 76 6f 69 64 cl_Release((void
0e70: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 *) statePtr);.
0e80: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
0e90: 76 6f 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b void *) interp);
0ea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a . return ok;.
0eb0: 7d 0a 0c 0a 2f 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
0f00: 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 * InfoCallback
0f10: 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 --. *. *.Monitor
0f20: 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e s SSL connection
0f30: 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52 process. *. * R
0f40: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
0f50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
0f60: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
0f70: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
0f80: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d). *. *--------
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 2d ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
0fd0: 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f static void.Info
0fe0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
0ff0: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 SL *ssl, int whe
1000: 72 65 2c 20 69 6e 74 20 72 65 74 29 0a 7b 0a 20 re, int ret).{.
1010: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
1020: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
1030: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
1040: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
1050: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
1060: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
1070: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
1080: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
1090: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 61 6a 6f 72 onst char *major
10a0: 2c 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 , *minor;.. d
10b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
10c0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
10d0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d Ptr->callback ==
10e0: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
10f0: 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 ..return;.. i
1100: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
1110: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 B_HANDSHAKE_STAR
1120: 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 T) {..major = "h
1130: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f andshake";..mino
1140: 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 r = "start";.
1150: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 } else if (wher
1160: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 e & SSL_CB_HANDS
1170: 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 HAKE_DONE) {..ma
1180: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 jor = "handshake
1190: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e ";..minor = "don
11a0: 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b e";. } else {
11b0: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 ..if (where & SS
11c0: 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a L_CB_ALERT)..maj
11d0: 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 or = "alert";..e
11e0: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
11f0: 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 SSL_ST_CONNECT).
1200: 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 major = "connect
1210: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 ";..else if (whe
1220: 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 re & SSL_ST_ACCE
1230: 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 PT)..major = "ac
1240: 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 cept";..else....
1250: 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 .major = "unknow
1260: 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 n";...if (where
1270: 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 & SSL_CB_READ)..
1280: 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a minor = "read";.
1290: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
12a0: 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 & SSL_CB_WRITE).
12b0: 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 .minor = "write"
12c0: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
12d0: 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 e & SSL_CB_LOOP)
12e0: 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 ..minor = "loop"
12f0: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1300: 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 e & SSL_CB_EXIT)
1310: 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 ..minor = "exit"
1320: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f ;..else.....mino
1330: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 r = "unknown";.
1340: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
1350: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
1360: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 val with fn, cha
1370: 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c n, major, minor,
1380: 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79 message, and ty
1390: 70 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 pe args */. c
13a0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
13b0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
13c0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 r->callback);.
13d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
13e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
13f0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
1400: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 ewStringObj("inf
1410: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 o", -1));. Tc
1420: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1430: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
1440: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
1450: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
1460: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
1470: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
1480: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
1490: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
14a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
14b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
14c0: 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 gObj(major, -1))
14d0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
14e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
14f0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1500: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1510: 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 minor, -1));..
1520: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 if (where & SS
1530: 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 L_CB_ALERT) {..T
1540: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1550: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1560: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
1570: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 _NewStringObj(SS
1580: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 L_alert_desc_str
1590: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d ing_long(ret), -
15a0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
15b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
15c0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
15d0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
15e0: 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 gObj(SSL_alert_t
15f0: 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 ype_string_long(
1600: 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ret), -1));.
1610: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 } else {..Tcl_Li
1620: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1630: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1640: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1650: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 tringObj(SSL_sta
1660: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 te_string_long(s
1670: 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f sl), -1));..Tcl_
1680: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1690: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
16a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
16b0: 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 ngObj("info", -1
16c0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ));. }.. /
16d0: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
16e0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
16f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
1700: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 cmdPtr);. Eva
1710: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
1720: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
1730: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 tr);. Tcl_Dec
1740: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
1750: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
17a0: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c *. * MessageCal
17b0: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d lback --. *. *.M
17c0: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74 onitors SSL prot
17d0: 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a ocol messages. *
17e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
17f0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
1800: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
1810: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
1820: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d efined). *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1870: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 . */.#ifndef OPE
1880: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 NSSL_NO_SSL_TRAC
1890: 45 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65 E.static void.Me
18a0: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e ssageCallback(in
18b0: 74 20 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76 t write_p, int v
18c0: 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 ersion, int cont
18d0: 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 ent_type, const
18e0: 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f void *buf, size_
18f0: 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c t len, SSL *ssl,
1900: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 void *arg) {.
1910: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
1920: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b r = (State*)arg;
1930: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
1940: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
1950: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
1960: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
1970: 0a 20 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20 . char *ver,
1980: 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a *type;. BIO *
1990: 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75 bio;. char bu
19a0: 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20 ffer[15000];.
19b0: 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a buffer[0] = 0;.
19c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
19d0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
19e0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
19f0: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
1a00: 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a )NULL)..return;.
1a10: 0a 20 20 20 20 73 77 69 74 63 68 28 76 65 72 73 . switch(vers
1a20: 69 6f 6e 29 20 7b 0a 20 20 20 20 63 61 73 65 20 ion) {. case
1a30: 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 TLS1_VERSION:..v
1a40: 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 er = "TLSv1";..b
1a50: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
1a60: 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 LS1_1_VERSION:..
1a70: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b ver = "TLSv1.1";
1a80: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1a90: 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e e TLS1_2_VERSION
1aa0: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e :..ver = "TLSv1.
1ab0: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 2";..break;.
1ac0: 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 case TLS1_3_VERS
1ad0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 ION:..ver = "TLS
1ae0: 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 v1.3";..break;.
1af0: 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 72 20 case 0:..ver
1b00: 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b = "none";..break
1b10: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 ;. default:..
1b20: 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b ver = "unknown";
1b30: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a ..break;. }..
1b40: 20 20 20 20 73 77 69 74 63 68 20 28 63 6f 6e 74 switch (cont
1b50: 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 20 20 ent_type) {.
1b60: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 45 41 case SSL3_RT_HEA
1b70: 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 DER:..type = "He
1b80: 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 ader";..break;.
1b90: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f case SSL3_RT_
1ba0: 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 INNER_CONTENT_TY
1bb0: 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e PE:..type = "Inn
1bc0: 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 65 22 er Content Type"
1bd0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1be0: 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47 se SSL3_RT_CHANG
1bf0: 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a 0a 09 E_CIPHER_SPEC:..
1c00: 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 20 43 type = "Change C
1c10: 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a ipher";..break;.
1c20: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 case SSL3_RT
1c30: 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d 20 _ALERT:..type =
1c40: 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b "Alert";..break;
1c50: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 . case SSL3_R
1c60: 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 T_HANDSHAKE:..ty
1c70: 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 pe = "Handshake"
1c80: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1c90: 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 se SSL3_RT_APPLI
1ca0: 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 CATION_DATA:..ty
1cb0: 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b pe = "App Data";
1cc0: 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 4f 50 45 ..break;.#if OPE
1cd0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
1ce0: 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
1cf0: 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c 53 31 L. case DTLS1
1d00: 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a 0a 09 _RT_HEARTBEAT:..
1d10: 74 79 70 65 20 3d 20 22 48 65 61 72 74 62 65 61 type = "Heartbea
1d20: 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 t";..break;.#end
1d30: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a if. default:.
1d40: 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e .type = "unknown
1d50: 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a ";. }.. /*
1d60: 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 Needs compile t
1d70: 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 ime option "enab
1d80: 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a le-ssl-trace". *
1d90: 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f 20 3d /. if ((bio =
1da0: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d BIO_new(BIO_s_m
1db0: 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 em())) != NULL)
1dc0: 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 {..int n;..SSL_t
1dd0: 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 76 65 race(write_p, ve
1de0: 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 rsion, content_t
1df0: 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 ype, buf, len, s
1e00: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 sl, (void *)bio)
1e10: 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 ;..n = BIO_read(
1e20: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 49 4f bio, buffer, BIO
1e30: 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 3c 20 _pending(bio) <
1e40: 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65 6e 64 15000 ? BIO_pend
1e50: 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39 39 39 ing(bio) : 14999
1e60: 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 );..n = (n<0) ?
1e70: 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 0 : n;..buffer[n
1e80: 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 ] = 0;..(void)BI
1e90: 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42 O_flush(bio);..B
1ea0: 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 IO_free(bio);.
1eb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
1ec0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
1ed0: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c l with fn, chan,
1ee0: 20 64 69 72 65 63 74 69 6f 6e 2c 20 76 65 72 73 direction, vers
1ef0: 69 6f 6e 2c 20 74 79 70 65 2c 20 61 6e 64 20 6d ion, type, and m
1f00: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 essage args */.
1f10: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
1f20: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
1f30: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
1f40: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1f50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1f60: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1f70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1f80: 22 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29 3b "message", -1));
1f90: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1fa0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1fb0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
1fc0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
1fd0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
1fe0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
1ff0: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
2000: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2010: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2020: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2030: 65 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 ewStringObj(writ
2040: 65 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 e_p ? "Sent" : "
2050: 52 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29 3b Received", -1));
2060: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2070: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2080: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
2090: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 l_NewStringObj(v
20a0: 65 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 er, -1));. Tc
20b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
20c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
20d0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
20e0: 72 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 ringObj(type, -1
20f0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2100: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2110: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2120: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2130: 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a j(buffer, -1));.
2140: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
2150: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
2160: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
2170: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
2180: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 EvalCallback(
2190: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
21a0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
21b0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
21c0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 cmdPtr);.}.#endi
21d0: 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d f.../*. *-------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
2220: 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 * VerifyCallbac
2230: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 k --. *. *.Monit
2240: 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 63 ors SSL certific
2250: 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 ate validation p
2260: 72 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f 20 rocess. Used to
2270: 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 control the. *.b
2280: 65 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65 ehavior when the
2290: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 SSL_VERIFY_PEER
22a0: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 flag is set. Th
22b0: 69 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 is is called. *.
22c0: 77 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 whenever a certi
22d0: 66 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 ficate is inspec
22e0: 74 65 64 20 6f 72 20 64 65 63 69 64 65 64 20 69 ted or decided i
22f0: 6e 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 nvalid. Called f
2300: 6f 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74 69 or. *.each certi
2310: 66 69 63 61 74 65 20 69 6e 20 74 68 65 20 63 65 ficate in the ce
2320: 72 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 rt chain.. *. *
2330: 43 68 65 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 Checks:. *.certi
2340: 66 69 63 61 74 65 20 63 68 61 69 6e 20 69 73 20 ficate chain is
2350: 63 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e 67 checked starting
2360: 20 77 69 74 68 20 74 68 65 20 64 65 65 70 65 73 with the deepes
2370: 74 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a t nesting level.
2380: 20 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20 43 *. (the root C
2390: 41 20 63 65 72 74 69 66 69 63 61 74 65 29 20 61 A certificate) a
23a0: 6e 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72 64 nd worked upward
23b0: 20 74 6f 20 74 68 65 20 70 65 65 72 27 73 20 63 to the peer's c
23c0: 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 ertificate.. *.A
23d0: 6c 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61 72 ll signatures ar
23e0: 65 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 e valid, current
23f0: 20 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e 20 time is within
2400: 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76 first and last v
2410: 61 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a alidity time.. *
2420: 09 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 .Check that the
2430: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 certificate is i
2440: 73 73 75 65 64 20 62 79 20 74 68 65 20 69 73 73 ssued by the iss
2450: 75 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 uer certificate
2460: 69 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b issuer.. *.Check
2470: 20 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 the revocation
2480: 73 74 61 74 75 73 20 66 6f 72 20 65 61 63 68 20 status for each
2490: 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 certificate.. *.
24a0: 43 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64 69 Check the validi
24b0: 74 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 ty of the given
24c0: 43 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72 74 CRL and the cert
24d0: 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 revocation stat
24e0: 75 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 us.. *.Check the
24f0: 20 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c policies of all
2500: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
2510: 73 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 s. *. * Args. *.
2520: 70 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 preverify_ok ind
2530: 69 63 61 74 65 73 20 77 68 65 74 68 65 72 20 74 icates whether t
2540: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 76 he certificate v
2550: 65 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73 73 erification pass
2560: 65 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 ed (1) or not (0
2570: 29 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a ). *. * Results:
2580: 0a 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 . *.A callback b
2590: 6f 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 6b ound to the sock
25a0: 65 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e et may return on
25b0: 65 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 e of:. *. 0..
25c0: 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 .- the certifica
25d0: 74 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e 76 te is deemed inv
25e0: 61 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69 66 alid, send verif
25f0: 69 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 ication. *....
2600: 66 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74 6f failure alert to
2610: 20 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 peer, and termi
2620: 6e 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a nate handshake..
2630: 20 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68 65 *. 1...- the
2640: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 certificate is
2650: 64 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f deemed valid, co
2660: 6e 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e 64 ntinue with hand
2670: 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d shake.. *. em
2680: 70 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 pty string.- no
2690: 63 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 change to certif
26a0: 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e icate validation
26b0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
26c0: 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 cts:. *.The err
26d0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 field of the cur
26e0: 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 rently operative
26f0: 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a State is set. *
2700: 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 . to a string d
2710: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 escribing the SS
2720: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 L negotiation fa
2730: 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a ilure reason. *.
2740: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2780: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
2790: 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 int.VerifyCallb
27a0: 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 ack(int ok, X509
27b0: 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 _STORE_CTX *ctx)
27c0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
27d0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 cmdPtr;. SSL
27e0: 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 *ssl..= (SSL*)
27f0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 X509_STORE_CTX_g
2800: 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 et_ex_data(ctx,
2810: 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f SSL_get_ex_data_
2820: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 X509_STORE_CTX_i
2830: 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 dx());. X509
2840: 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 *cert..= X509_S
2850: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 TORE_CTX_get_cur
2860: 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a rent_cert(ctx);.
2870: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
2880: 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 Ptr.= (State*)SS
2890: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 L_get_app_data(s
28a0: 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 sl);. Tcl_Int
28b0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
28c0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
28d0: 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d int depth..=
28e0: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
28f0: 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 get_error_depth(
2900: 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 ctx);. int er
2910: 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f r..= X509_STORE_
2920: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 CTX_get_error(ct
2930: 78 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 x);.. dprintf
2940: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 ("Called");.
2950: 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 dprintf("VerifyC
2960: 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 6f 6b allback: %d", ok
2970: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
2980: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 ePtr->vcmd == (T
2990: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
29a0: 09 2f 2a 20 55 73 65 20 6f 6b 20 76 61 6c 75 65 ./* Use ok value
29b0: 20 69 66 20 76 65 72 69 66 69 63 61 74 69 6f 6e if verification
29c0: 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a is required */.
29d0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 .if (statePtr->v
29e0: 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 flags & SSL_VERI
29f0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
2a00: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
2a10: 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c return ok;..} el
2a20: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
2a30: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 1;..}. } els
2a40: 65 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 e if (cert == NU
2a50: 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c LL || ssl == NUL
2a60: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a L) {..return 0;.
2a70: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
2a80: 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 tf("VerifyCallba
2a90: 63 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61 63 ck: eval callbac
2aa0: 6b 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 k");.. /* Cre
2ab0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
2ac0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 val with fn, cha
2ad0: 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 69 n, depth, cert i
2ae0: 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 73 nfo list, status
2af0: 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 73 , and error args
2b00: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
2b10: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
2b20: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 j(statePtr->vcmd
2b30: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2b40: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2b50: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2b60: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2b70: 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b ("verify", -1));
2b80: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2b90: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2ba0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 terp, cmdPtr,..T
2bb0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2bc0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
2bd0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
2be0: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 f), -1));. Tc
2bf0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2c00: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2c10: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e mdPtr, Tcl_NewIn
2c20: 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 20 tObj(depth));.
2c30: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2c40: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2c50: 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f 4e p, cmdPtr, Tls_N
2c60: 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 ewX509Obj(interp
2c70: 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 54 63 , cert));. Tc
2c80: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2c90: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2ca0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e mdPtr, Tcl_NewIn
2cb0: 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 54 tObj(ok));. T
2cc0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2cd0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2ce0: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 cmdPtr,..Tcl_New
2cf0: 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a StringObj((char*
2d00: 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 )X509_verify_cer
2d10: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 t_error_string(e
2d20: 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 rr), -1));..
2d30: 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20 77 /* Prevent I/O w
2d40: 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 hile callback is
2d50: 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f 0a in progress */.
2d60: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d /* statePtr-
2d70: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 >flags |= TLS_TC
2d80: 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a 0a L_CALLBACK; */..
2d90: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
2da0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
2db0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
2dc0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
2dd0: 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c 62 ok = EvalCallb
2de0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
2df0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 ePtr, cmdPtr);.
2e00: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
2e10: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 unt(cmdPtr);..
2e20: 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 dprintf("Verif
2e30: 79 43 61 6c 6c 62 61 63 6b 3a 20 63 6f 6d 6d 61 yCallback: comma
2e40: 6e 64 20 72 65 73 75 6c 74 20 3d 20 25 64 22 2c nd result = %d",
2e50: 20 6f 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 ok);.. /* st
2e60: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d atePtr->flags &=
2e70: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 ~(TLS_TCL_CALLB
2e80: 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 ACK); */. ret
2e90: 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 urn(ok);./* By d
2ea0: 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 efault, leave ve
2eb0: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 rification uncha
2ec0: 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a nged. */.}.../*.
2ed0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f10: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
2f20: 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 Error --. *. *.C
2f30: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 alls callback wi
2f40: 74 68 20 6c 69 73 74 20 6f 66 20 65 72 72 6f 72 th list of error
2f50: 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 s.. *. * Side ef
2f60: 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 fects:. *.The er
2f70: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 r field of the c
2f80: 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 urrently operati
2f90: 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a ve State is set.
2fa0: 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 *. to a string
2fb0: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 describing the
2fc0: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 SSL negotiation
2fd0: 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 failure reason.
2fe0: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
3030: 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 .Tls_Error(State
3040: 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 *statePtr, char
3050: 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c *msg) {. Tcl
3060: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
3070: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
3080: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
3090: 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 *cmdPtr, *listPt
30a0: 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 r;. unsigned
30b0: 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74 long err;. st
30c0: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 atePtr->err = ms
30d0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 g;.. dprintf(
30e0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
30f0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
3100: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f llback == (Tcl_O
3110: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 bj*)NULL)..retur
3120: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 n;.. /* Creat
3130: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
3140: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c l with fn, chan,
3150: 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 and message arg
3160: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 s */. cmdPtr
3170: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
3180: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
3190: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f lback);. Tcl_
31a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
31b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
31c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
31d0: 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d ngObj("error", -
31e0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
31f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3200: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
3210: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
3220: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
3230: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
3240: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
3250: 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d ;. if (msg !=
3260: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 NULL) {..Tcl_Li
3270: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3280: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
3290: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
32a0: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a Obj(msg, -1));..
32b0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 } else if ((
32c0: 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 msg = Tcl_GetStr
32d0: 69 6e 67 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 ing(Tcl_GetObjRe
32e0: 73 75 6c 74 28 69 6e 74 65 72 70 29 29 29 20 21 sult(interp))) !
32f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c = NULL) {..Tcl_L
3300: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3310: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3320: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
3330: 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a gObj(msg, -1));.
3340: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c . } else {..l
3350: 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 istPtr = Tcl_New
3360: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
3370: 3b 0a 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d ;..while ((err =
3380: 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 ERR_get_error()
3390: 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) != 0) {.. T
33a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
33b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
33c0: 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 listPtr, Tcl_New
33d0: 53 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 StringObj(ERR_re
33e0: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e ason_error_strin
33f0: 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d g(err), -1));..}
3400: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
3410: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3420: 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 p, cmdPtr, listP
3430: 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 tr);. }..
3440: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
3450: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
3460: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
3470: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 (cmdPtr);. Ev
3480: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 alCallback(inter
3490: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 p, statePtr, cmd
34a0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 Ptr);. Tcl_De
34b0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
34c0: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d r);.}.../*. *---
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3510: 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c . *. * KeyLogCal
3520: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 lback --. *. *.W
3530: 72 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 rite received ke
3540: 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 y data to log fi
3550: 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 le.. *. * Side e
3560: 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a ffects:. *.none.
3570: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
35c0: 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b d KeyLogCallback
35d0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
35e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e const char *lin
35f0: 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 e) {. char *s
3600: 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b tr = getenv(SSLK
3610: 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 EYLOGFILE);.
3620: 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 FILE *fd;.. d
3630: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
3640: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 ;.. if (str)
3650: 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 {..fd = fopen(st
3660: 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 r, "a");..fprint
3670: 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e f(fd, "%s\n",lin
3680: 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b e);..fclose(fd);
3690: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a . }.}.../*. *
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f ---. *. * Passwo
36f0: 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 rd Callback --.
3700: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e *. *.Called when
3710: 20 61 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20 a password for
3720: 61 20 70 72 69 76 61 74 65 20 6b 65 79 20 6c 6f a private key lo
3730: 61 64 69 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20 ading/storing a
3740: 50 45 4d 0a 20 2a 09 63 65 72 74 69 66 69 63 61 PEM. *.certifica
3750: 74 65 20 77 69 74 68 20 65 6e 63 72 79 70 74 69 te with encrypti
3760: 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 on. Evals callba
3770: 63 6b 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 ck script and re
3780: 74 75 72 6e 73 0a 20 2a 09 74 68 65 20 72 65 73 turns. *.the res
3790: 75 6c 74 20 61 73 20 74 68 65 20 70 61 73 73 77 ult as the passw
37a0: 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20 62 75 ord string in bu
37b0: 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 f.. *. * Results
37c0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
37d0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
37e0: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 .Calls callback
37f0: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a (if defined). *.
3800: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 * Returns:. *.P
3810: 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 assword size in
3820: 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 bytes or -1 for
3830: 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d an error.. *. *-
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3880: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
3890: 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 t.PasswordCallba
38a0: 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e ck(char *buf, in
38b0: 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c t size, int rwfl
38c0: 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29 ag, void *udata)
38d0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
38e0: 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 20 atePtr.= (State
38f0: 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63 *) udata;. Tc
3900: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
3910: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
3920: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
3930: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e *cmdPtr;. in
3940: 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 t code;.. dpr
3950: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
3960: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 . /* If no ca
3970: 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 llback, use defa
3980: 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a ult callback */.
3990: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
39a0: 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 ->password == NU
39b0: 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 LL) {..if (Tcl_E
39c0: 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 valEx(interp, "t
39d0: 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d ls::password", -
39e0: 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 1, TCL_EVAL_GLOB
39f0: 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b AL) == TCL_OK) {
3a00: 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 .. char *ret
3a10: 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 = (char *) Tcl_G
3a20: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 etStringResult(i
3a30: 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72 nterp);.. str
3a40: 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 ncpy(buf, ret, (
3a50: 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 size_t) size);..
3a60: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 return (int)
3a70: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 strlen(ret);..}
3a80: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 else {.. retu
3a90: 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a rn -1;..}. }.
3aa0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
3ab0: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
3ac0: 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20 ith fn, rwflag,
3ad0: 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f and size args */
3ae0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
3af0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
3b00: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
3b10: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 d);. Tcl_List
3b20: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3b30: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3b40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
3b50: 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 j("password", -1
3b60: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
3b70: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3b80: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3b90: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 Tcl_NewIntObj(r
3ba0: 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c wflag));. Tcl
3bb0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3bc0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3bd0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 dPtr, Tcl_NewInt
3be0: 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 Obj(size));..
3bf0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 76 Tcl_Preserve((v
3c00: 6f 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a oid *) interp);.
3c10: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3c20: 28 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 ((void *) stateP
3c30: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 tr);.. /* Eva
3c40: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
3c50: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
3c60: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
3c70: 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 r);. code = T
3c80: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 cl_EvalObjEx(int
3c90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c erp, cmdPtr, TCL
3ca0: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 _EVAL_GLOBAL);.
3cb0: 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 if (code != T
3cc0: 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 CL_OK) {.#if (TC
3cd0: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MAJOR_VERSION
3ce0: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 == 8) && (TCL_MI
3cf0: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 NOR_VERSION < 6)
3d00: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
3d10: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 Error(interp);.#
3d20: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 else..Tcl_Backgr
3d30: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e oundException(in
3d40: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e terp, code);.#en
3d50: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 dif. }. Tc
3d60: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
3d70: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c mdPtr);.. Tcl
3d80: 5f 52 65 6c 65 61 73 65 28 28 76 6f 69 64 20 2a _Release((void *
3d90: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 ) statePtr);..
3da0: 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66 /* If successf
3db0: 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 61 ul, pass back pa
3dc0: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 6e ssword string an
3dd0: 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 6f d truncate if to
3de0: 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 o long */. if
3df0: 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b (code == TCL_OK
3e00: 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c 65 ) {..Tcl_Size le
3e10: 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 n;..char *ret =
3e20: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
3e30: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
3e40: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_GetObjResult(i
3e50: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 nterp), &len);..
3e60: 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 if (len > (Tcl_S
3e70: 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 ize) size-1) {..
3e80: 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 len = (Tcl_S
3e90: 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a ize) size-1;..}.
3ea0: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 .strncpy(buf, re
3eb0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 t, (size_t) len)
3ec0: 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c ;..buf[len] = '\
3ed0: 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 0';..Tcl_Release
3ee0: 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 65 72 70 ((void *) interp
3ef0: 29 3b 0a 09 72 65 74 75 72 6e 28 28 69 6e 74 29 );..return((int)
3f00: 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 len);. }.
3f10: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 76 6f Tcl_Release((vo
3f20: 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a 20 id *) interp);.
3f30: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a return -1;.}.
3f40: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
3f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
3f90: 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 Session Callbac
3fa0: 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d k for Clients --
3fb0: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 . *. *.Called wh
3fc0: 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e en a new session
3fd0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 is added to the
3fe0: 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 cache. In TLS 1
3ff0: 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 .3. *.this may b
4000: 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 e received multi
4010: 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 ple times after
4020: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 the handshake. F
4030: 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 or. *.earlier ve
4040: 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c rsions, this wil
4050: 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 l be received du
4060: 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 ring the handsha
4070: 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 ke.. *.This is t
4080: 68 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 he preferred way
4090: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 to obtain a res
40a0: 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a umable session..
40b0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
40c0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
40d0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
40e0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
40f0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
4100: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
4110: 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 .0 = error where
4120: 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 session will be
4130: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d immediately rem
4140: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e oved from the in
4150: 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a ternal cache.. *
4160: 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 .1 = success whe
4170: 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 re app retains s
4180: 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f ession in sessio
4190: 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 n cache, and mus
41a0: 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 t call SSL_SESSI
41b0: 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 ON_free() when d
41c0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
41d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4210: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 /.static int.Ses
4220: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c sionCallback(SSL
4230: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 *ssl, SSL_SESSI
4240: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 ON *session) {.
4250: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
4260: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
4270: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
4280: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
4290: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
42a0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
42b0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
42c0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
42d0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
42e0: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 ar *ticket;.
42f0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
4300: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b har *session_id;
4310: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 . size_t len2
4320: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 ;. unsigned i
4330: 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 nt ulen;.. dp
4340: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
4350: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
4360: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 tr->callback ==
4370: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
4380: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
4390: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
43a0: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 } else if (ssl
43b0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
43c0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
43d0: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
43e0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f /* Create co
43f0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 mmand to eval wi
4400: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 th fn, chan, ses
4410: 73 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e sion id, session
4420: 20 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 ticket, and lif
4430: 65 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 etime args */.
4440: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
4450: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
4460: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
4470: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4480: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4490: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
44a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
44b0: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a session", -1));.
44c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
44d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
44e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
44f0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
4500: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
4510: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
4520: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 self), -1));..
4530: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 /* Session id
4540: 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 */. session_i
4550: 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f d = SSL_SESSION_
4560: 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 get_id(session,
4570: 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f &ulen);. Tcl_
4580: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4590: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
45a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
45b0: 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e ArrayObj(session
45c0: 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 _id, (Tcl_Size)
45d0: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 ulen));.. /*
45e0: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a Session ticket *
45f0: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f /. SSL_SESSIO
4600: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
4610: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
4620: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f &len2);. Tcl_
4630: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4640: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
4650: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
4660: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c ArrayObj(ticket,
4670: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
4680: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 ));.. /* Life
4690: 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 time - number of
46a0: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 seconds */.
46b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
46c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
46d0: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 cmdPtr,..Tcl_Ne
46e0: 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 wLongObj((long)
46f0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
4700: 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f ticket_lifetime_
4710: 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b hint(session)));
4720: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
4730: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
4740: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
4750: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
4760: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b EvalCallback
4770: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
4780: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 r, cmdPtr);.
4790: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
47a0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 (cmdPtr);. re
47b0: 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 turn 0;.}.../*.
47c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4800: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 ----. *. * ALPN
4810: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 Callback for Ser
4820: 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c vers and NPN Cal
4830: 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 lback for Client
4840: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f s --. *. *.Perfo
4850: 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 rm protocol (htt
4860: 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 p/1.1, h2, h3, e
4870: 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 tc.) selection f
4880: 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 or the. *.incomi
4890: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 ng connection. C
48a0: 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c alled after Hell
48b0: 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c o and server cal
48c0: 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 lbacks.. *.Where
48d0: 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 'out' is select
48e0: 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 ed protocol and
48f0: 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 'in' is the peer
4900: 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 advertised list
4910: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
4920: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
4930: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
4940: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
4950: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
4960: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
4970: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
4980: 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f R_OK: ALPN proto
4990: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 col selected. Th
49a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e e connection con
49b0: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 tinues.. *.SSL_T
49c0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
49d0: 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 FATAL: There was
49e0: 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 no overlap betw
49f0: 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 een the client's
4a00: 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 . *. supplied
4a10: 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 list and the se
4a20: 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 rver configurati
4a30: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 on. The connecti
4a40: 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 on will be abort
4a50: 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 ed.. *.SSL_TLSEX
4a60: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 T_ERR_NOACK: ALP
4a70: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 N protocol not s
4a80: 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 elected, e.g., b
4a90: 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 ecause no ALPN.
4aa0: 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 *. protocols
4ab0: 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 are configured f
4ac0: 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 or this connecti
4ad0: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 on. The connecti
4ae0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
4af0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b30: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
4b40: 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 c int.ALPNCallba
4b50: 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e ck(SSL *ssl, con
4b60: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
4b70: 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 **out, unsigned
4b80: 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 char *outlen,..
4b90: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
4ba0: 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 har *in, unsigne
4bb0: 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 d int inlen, voi
4bc0: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 d *arg) {. St
4bd0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
4be0: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 (State*)arg;.
4bf0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
4c00: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
4c10: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
4c20: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
4c30: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a int code, res;.
4c40: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
4c50: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
4c60: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 (ssl == NULL ||
4c70: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 arg == NULL) {..
4c80: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
4c90: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
4ca0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 }.. /* Selec
4cb0: 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 t protocol */.
4cc0: 20 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 if (SSL_select
4cd0: 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 _next_proto((uns
4ce0: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f igned char **) o
4cf0: 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 ut, outlen, stat
4d00: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 ePtr->protos, st
4d10: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
4d20: 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 en,..in, inlen)
4d30: 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e == OPENSSL_NPN_N
4d40: 45 47 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a EGOTIATED) {../*
4d50: 20 4d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a Match found */.
4d60: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 .res = SSL_TLSEX
4d70: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 T_ERR_OK;. }
4d80: 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 else {../* OPENS
4d90: 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 SL_NPN_NO_OVERLA
4da0: 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 P = No overlap,
4db0: 73 6f 20 75 73 65 20 66 69 72 73 74 20 69 74 65 so use first ite
4dc0: 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 m from client pr
4dd0: 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 otocol list */..
4de0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
4df0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
4e00: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
4e10: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
4e20: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
4e30: 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 return res;.
4e40: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
4e50: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
4e60: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 with fn, chan,
4e70: 64 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f depth, cert info
4e80: 20 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 list, status, a
4e90: 6e 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f nd error args */
4ea0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 . cmdPtr = Tc
4eb0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
4ec0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a tatePtr->vcmd);.
4ed0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4ee0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4ef0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
4f00: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 _NewStringObj("a
4f10: 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 lpn", -1));.
4f20: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
4f30: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
4f40: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
4f50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 l_NewStringObj(T
4f60: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
4f70: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
4f80: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ), -1));. Tcl
4f90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4fa0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4fb0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
4fc0: 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 ingObj((const ch
4fd0: 61 72 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 ar *) *out, -1))
4fe0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
4ff0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5000: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
5010: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a cl_NewBooleanObj
5020: 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 (res == SSL_TLSE
5030: 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 XT_ERR_OK));..
5040: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
5050: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 ck command */.
5060: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
5070: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 nt(cmdPtr);.
5080: 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c if ((code = Eval
5090: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c Callback(interp,
50a0: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 statePtr, cmdPt
50b0: 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 r)) > 1) {..res
50c0: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 = SSL_TLSEXT_ERR
50d0: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c _NOACK;. } el
50e0: 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 se if (code == 1
50f0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 ) {..res = SSL_T
5100: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 LSEXT_ERR_OK;.
5110: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 } else {..res
5120: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 = SSL_TLSEXT_ERR
5130: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 _ALERT_FATAL;.
5140: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 }. Tcl_Decr
5150: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
5160: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 ;. return res
5170: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
51c0: 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 *. * Advertise P
51d0: 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 rotocols Callbac
51e0: 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f k for Next Proto
51f0: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 col Negotiation
5200: 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 (NPN) in ServerH
5210: 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 ello --. *. *.ca
5220: 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 lled when a TLS
5230: 73 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c server needs a l
5240: 69 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 ist of supported
5250: 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e protocols for N
5260: 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 ext. *.Protocol
5270: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a Negotiation.. *.
5280: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
5290: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
52a0: 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 ffects:. *. * Re
52b0: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 turn codes:. *.S
52c0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
52d0: 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 : NPN protocol s
52e0: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e elected. The con
52f0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
5300: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s.. *.SSL_TLSEXT
5310: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 _ERR_NOACK: NPN
5320: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c protocol not sel
5330: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 ected. The conne
5340: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
5350: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 ---------. */.#i
53a0: 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 fdef USE_NPN.sta
53b0: 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 tic int.NPNCallb
53c0: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
53d0: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e sl, const unsign
53e0: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 ed char **out, u
53f0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 nsigned int *out
5400: 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 len, void *arg)
5410: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
5420: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
5430: 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 arg;.. dprint
5440: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
5450: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c if (ssl == NUL
5460: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c L || arg == NULL
5470: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
5480: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
5490: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
54a0: 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 Set protocols li
54b0: 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 st */. if (st
54c0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 atePtr->protos !
54d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 = NULL) {..*out
54e0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 = statePtr->prot
54f0: 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 os;..*outlen = s
5500: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f tatePtr->protos_
5510: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 len;. } else
5520: 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a {..*out = NULL;.
5530: 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 .*outlen = 0;..r
5540: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
5550: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
5560: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c }. return SSL
5570: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
5580: 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a }.#endif.../*. *
5590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 ---. *. * SNI Ca
55e0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 llback for Serve
55f0: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 rs --. *. *.Perf
5600: 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 orm server-side
5610: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c SNI hostname sel
5620: 65 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 ection after rec
5630: 65 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e eiving SNI exten
5640: 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e sion. *.in Clien
5650: 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 t Hello. Called
5660: 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c after hello call
5670: 62 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 back but before
5680: 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 ALPN callback..
5690: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
56a0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
56b0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
56c0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
56d0: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
56e0: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
56f0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
5700: 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 K: SNI hostname
5710: 69 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 is accepted. The
5720: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
5730: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
5740: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 SEXT_ERR_ALERT_F
5750: 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 ATAL: SNI hostna
5760: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 me is not accept
5770: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
5780: 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f on. *. is abo
5790: 72 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f rted. Default fo
57a0: 72 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 r alert is SSL_A
57b0: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e D_UNRECOGNIZED_N
57c0: 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 AME.. *.SSL_TLSE
57d0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 XT_ERR_ALERT_WAR
57e0: 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 NING: SNI hostna
57f0: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 me is not accept
5800: 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 ed, warning aler
5810: 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e t. *. sent (n
5820: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 ot supported in
5830: 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f TLSv1.3). The co
5840: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
5850: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es.. *.SSL_TLSEX
5860: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 T_ERR_NOACK: SNI
5870: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 hostname is not
5880: 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f accepted and no
5890: 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a t acknowledged,.
58a0: 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 *. e.g. if S
58b0: 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 NI has not been
58c0: 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 configured. The
58d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
58e0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nues.. *. *-----
58f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5930: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e */.static int.SN
5940: 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 ICallback(const
5950: 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 SSL *ssl, int *a
5960: 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 lert, void *arg)
5970: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
5980: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a atePtr = (State*
5990: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e )arg;. Tcl_In
59a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
59b0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
59c0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
59d0: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f dPtr;. int co
59e0: 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e de, res;. con
59f0: 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e st char *servern
5a00: 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 ame = NULL;..
5a10: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
5a20: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c ");.. if (ssl
5a30: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 == NULL || arg
5a40: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
5a50: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
5a60: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
5a70: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b /* Only work
5a80: 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e s for TLS 1.2 an
5a90: 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 d earlier */.
5aa0: 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 servername = SS
5ab0: 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 L_get_servername
5ac0: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d (ssl, TLSEXT_NAM
5ad0: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
5ae0: 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 65 ;. if (!serve
5af0: 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e rname || servern
5b00: 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 ame[0] == '\0')
5b10: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
5b20: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
5b30: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
5b40: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d tatePtr->vcmd ==
5b50: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
5b60: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
5b70: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 LSEXT_ERR_OK;.
5b80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
5b90: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
5ba0: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e al with fn, chan
5bb0: 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d , and server nam
5bc0: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d e args */. cm
5bd0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
5be0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
5bf0: 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c ->vcmd);. Tcl
5c00: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
5c10: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
5c20: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
5c30: 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 ingObj("sni", -1
5c40: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
5c50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
5c60: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
5c70: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
5c80: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
5c90: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
5ca0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
5cb0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
5cc0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
5cd0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
5ce0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 l_NewStringObj(s
5cf0: 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 ervername , -1))
5d00: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
5d10: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
5d20: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
5d30: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
5d40: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d . if ((code =
5d50: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
5d60: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
5d70: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a cmdPtr)) > 1) {.
5d80: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 .res = SSL_TLSEX
5d90: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e T_ERR_ALERT_WARN
5da0: 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 ING;..*alert = S
5db0: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a SL_AD_UNRECOGNIZ
5dc0: 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 ED_NAME; /* Not
5dd0: 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 supported by TLS
5de0: 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 1.3 */. } el
5df0: 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 se if (code == 1
5e00: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 ) {..res = SSL_T
5e10: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 LSEXT_ERR_OK;.
5e20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 } else {..res
5e30: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 = SSL_TLSEXT_ERR
5e40: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a _ALERT_FATAL;..*
5e50: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 alert = SSL_AD_U
5e60: 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 NRECOGNIZED_NAME
5e70: 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 ; /* Not support
5e80: 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f ed by TLS 1.3 */
5e90: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
5ea0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
5eb0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
5ec0: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d res;.}.../*. *--
5ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f10: 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 -. *. * ClientHe
5f20: 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 llo Handshake Ca
5f30: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 llback for Serve
5f40: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 rs --. *. *.Used
5f50: 20 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 by server to ex
5f60: 61 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 amine the server
5f70: 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e name indication
5f80: 20 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e (SNI) extension
5f90: 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 . *.provided by
5fa0: 74 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 the client in or
5fb0: 64 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e der to select an
5fc0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 appropriate cer
5fd0: 74 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 tificate to. *.p
5fe0: 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 resent, and make
5ff0: 20 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 other configura
6000: 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 tion adjustments
6010: 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 relevant to tha
6020: 74 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 t server. *.name
6030: 20 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 and its configu
6040: 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 ration. This inc
6050: 6c 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f ludes swapping o
6060: 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 ut the associate
6070: 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 d. *.SSL_CTX poi
6080: 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 nter, modifying
6090: 74 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 the server's lis
60a0: 74 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 t of permitted T
60b0: 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 LS versions,. *.
60c0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 changing the ser
60d0: 76 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 ver's cipher lis
60e0: 74 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f t in response to
60f0: 20 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 the client's ci
6100: 70 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a pher list, etc..
6110: 20 2a 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 *.Called before
6120: 20 53 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 SNI and ALPN ca
6130: 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 llbacks.. *. * R
6140: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
6150: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
6160: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
6170: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
6180: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 d). *. * Return
6190: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c codes:. *.SSL_CL
61a0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 IENT_HELLO_RETRY
61b0: 3a 20 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 : suspend the ha
61c0: 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 ndshake, and the
61d0: 20 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 handshake funct
61e0: 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 ion will return
61f0: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 immediately. *.S
6200: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
6210: 45 52 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 ERROR: failure,
6220: 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 terminate connec
6230: 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 tion. Set alert
6240: 74 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 to error code..
6250: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c *.SSL_CLIENT_HEL
6260: 4c 4f 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 LO_SUCCESS: succ
6270: 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ess. *. *-------
6280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
62a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
62b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
62c0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c .static int.Hell
62d0: 6f 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 oCallback(SSL *s
62e0: 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 sl, int *alert,
62f0: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 void *arg) {.
6300: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
6310: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a = (State*)arg;.
6320: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
6330: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
6340: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 r->interp;. T
6350: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
6360: 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 int code, re
6370: 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 s;. const cha
6380: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 r *servername;.
6390: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 const unsigne
63a0: 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 d char *p;. s
63b0: 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 ize_t len, remai
63c0: 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e ning;.. dprin
63d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
63e0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
63f0: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 >vcmd == (Tcl_Ob
6400: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
6410: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
6420: 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 LLO_SUCCESS;.
6430: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 } else if (ssl
6440: 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 == (const SSL *)
6450: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 NULL || arg == (
6460: 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 void *)NULL) {..
6470: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6480: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
6490: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 }.. /* Get
64a0: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 names */. if
64b0: 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 (!SSL_client_he
64c0: 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c llo_get0_ext(ssl
64d0: 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 , TLSEXT_TYPE_se
64e0: 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 rver_name, &p, &
64f0: 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 remaining) || re
6500: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a maining <= 2) {.
6510: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
6520: 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 SSLV3_ALERT_ILLE
6530: 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 GAL_PARAMETER;..
6540: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6550: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
6560: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 }.. /* Ext
6570: 72 61 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 ract the length
6580: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 of the supplied
6590: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a list of names. *
65a0: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 /. len = (*(p
65b0: 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c ++) << 8);. l
65c0: 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 en += *(p++);.
65d0: 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d if (len + 2 !=
65e0: 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a remaining) {..*
65f0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 alert = SSL_R_SS
6600: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 LV3_ALERT_ILLEGA
6610: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 L_PARAMETER;..re
6620: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
6630: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
6640: 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 }. remaining
6650: 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 = len;.. /*
6660: 54 68 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 The list in prac
6670: 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 tice only has a
6680: 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 single element,
6690: 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 so we only consi
66a0: 64 65 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e der the first on
66b0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 e. */. if (re
66c0: 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 maining == 0 ||
66d0: 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e *p++ != TLSEXT_N
66e0: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d AMETYPE_host_nam
66f0: 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 e) {..*alert = S
6700: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
6710: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b _INTERNAL_ERROR;
6720: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
6730: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
6740: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 . }. remai
6750: 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 ning--;.. /*
6760: 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c Now we can final
6770: 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 ly pull out the
6780: 62 79 74 65 20 61 72 72 61 79 20 77 69 74 68 20 byte array with
6790: 74 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e the actual hostn
67a0: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 ame. */. if (
67b0: 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 remaining <= 2)
67c0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
67d0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e R_TLSV1_ALERT_IN
67e0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 TERNAL_ERROR;..r
67f0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6800: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
6810: 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a }. len = (*
6820: 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 (p++) << 8);.
6830: 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a len += *(p++);.
6840: 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 if (len + 2
6850: 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 > remaining) {..
6860: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 *alert = SSL_R_T
6870: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 LSV1_ALERT_INTER
6880: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 NAL_ERROR;..retu
6890: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
68a0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
68b0: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d . remaining =
68c0: 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 len;. server
68d0: 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 name = (const ch
68e0: 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 ar *)p;.. /*
68f0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
6900: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
6910: 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 chan, and server
6920: 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 name args */.
6930: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
6940: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
6950: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
6960: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
6970: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
6980: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
6990: 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c wStringObj("hell
69a0: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 o", -1));. Tc
69b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
69c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
69d0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
69e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
69f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
6a00: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
6a10: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
6a20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6a30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
6a40: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
6a50: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c gObj(servername,
6a60: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 (Tcl_Size) len)
6a70: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 );.. /* Eval
6a80: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
6a90: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 */. Tcl_Incr
6aa0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
6ab0: 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 ;. if ((code
6ac0: 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 = EvalCallback(i
6ad0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
6ae0: 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b cmdPtr)) > 1) {
6af0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 ..res = SSL_CLIE
6b00: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a NT_HELLO_RETRY;.
6b10: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
6b20: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 TLSV1_ALERT_USER
6b30: 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 _CANCELLED;.
6b40: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 } else if (code
6b50: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 1) {..res = S
6b60: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
6b70: 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 SUCCESS;. } e
6b80: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c lse {..res = SSL
6b90: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
6ba0: 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 ROR;..*alert = S
6bb0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 SL_R_TLSV1_ALERT
6bc0: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b _INTERNAL_ERROR;
6bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
6be0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ecrRefCount(cmdP
6bf0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
6c00: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d res;.}.../*. *--
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c50: 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f -. *. * CiphersO
6c60: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 bjCmd -- list av
6c70: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a ailable ciphers.
6c80: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
6c90: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
6ca0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
6cb0: 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f tls::ciphers" co
6cc0: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 mmand. *.to list
6cd0: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
6ce0: 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 rs, based upon p
6cf0: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
6d00: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
6d10: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
6d20: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a cl result list..
6d30: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
6d40: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 ts:. *.construct
6d50: 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 s and destroys S
6d60: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 SL context (CTX)
6d70: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
6dc0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
6dd0: 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b *protocols[] = {
6de0: 0a 20 20 20 20 22 73 73 6c 32 22 2c 20 22 73 73 . "ssl2", "ss
6df0: 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74 6c l3", "tls1", "tl
6e00: 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c s1.1", "tls1.2",
6e10: 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a "tls1.3", NULL.
6e20: 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c };.enum protocol
6e30: 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32 2c {. TLS_SSL2,
6e40: 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 TLS_SSL3, TLS_T
6e50: 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 2c LS1, TLS_TLS1_1,
6e60: 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 TLS_TLS1_2, TLS
6e70: 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e _TLS1_3, TLS_NON
6e80: 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 E.};..static int
6e90: 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 0a .CiphersObjCmd(.
6ea0: 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 TCL_UNUSED(v
6eb0: 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f oid *),. Tcl_
6ec0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a Interp *interp,.
6ed0: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 int objc,.
6ee0: 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e 73 74 Tcl_Obj.*const
6ef0: 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 objv[]).{. T
6f00: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d cl_Obj *objPtr =
6f10: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 NULL;. SSL_C
6f20: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a TX *ctx = NULL;.
6f30: 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e SSL *ssl = N
6f40: 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f ULL;. STACK_O
6f50: 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 F(SSL_CIPHER) *s
6f60: 6b 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 k;. const cha
6f70: 72 20 2a 63 70 3b 0a 20 20 20 20 63 68 61 72 20 r *cp;. char
6f80: 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 buf[BUFSIZ];.
6f90: 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 int index, verb
6fa0: 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 ose = 0, use_sup
6fb0: 70 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 ported = 0;.
6fc0: 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 const SSL_METHOD
6fd0: 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 *method;.. d
6fe0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
6ff0: 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 ;.. if ((objc
7000: 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e < 2) || (objc >
7010: 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 4)) {..Tcl_Wron
7020: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
7030: 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 1, objv, "proto
7040: 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 col ?verbose? ?s
7050: 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 upported?");..re
7060: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7070: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 }. if (Tc
7080: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
7090: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 j(interp, objv[1
70a0: 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 ], protocols, "p
70b0: 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e rotocol", 0, &in
70c0: 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 dex) != TCL_OK)
70d0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
70e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
70f0: 66 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 f ((objc > 2) &&
7100: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 Tcl_GetBooleanF
7110: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
7120: 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 bjv[2], &verbose
7130: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
7140: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7150: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
7160: 28 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 (objc > 3) && Tc
7170: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d l_GetBooleanFrom
7180: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
7190: 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 [3], &use_suppor
71a0: 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ted) != TCL_OK)
71b0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
71c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
71d0: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
71e0: 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 );.. switch (
71f0: 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 (enum protocol)i
7200: 6e 64 65 78 29 20 7b 0a 20 20 20 20 63 61 73 65 ndex) {. case
7210: 20 54 4c 53 5f 53 53 4c 32 3a 0a 09 54 63 6c 5f TLS_SSL2:..Tcl_
7220: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7230: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
7240: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
7250: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
7260: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
7270: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
7280: 52 4f 52 3b 0a 20 20 20 20 63 61 73 65 20 54 4c ROR;. case TL
7290: 53 5f 53 53 4c 33 3a 0a 09 54 63 6c 5f 41 70 70 S_SSL3:..Tcl_App
72a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
72b0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 , protocols[inde
72c0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 x], ": protocol
72d0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
72e0: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 (char *)NULL);..
72f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7300: 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 54 ;. case TLS_T
7310: 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 LS1:.#if defined
7320: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
7330: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7340: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
7350: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
7360: 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 _METHOD)..Tcl_Ap
7370: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7380: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
7390: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
73a0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
73b0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
73c0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
73d0: 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 R;.#else..method
73e0: 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 = TLSv1_method(
73f0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
7400: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c . case TLS_TL
7410: 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 S1_1:.#if define
7420: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 d(NO_TLS1_1) ||
7430: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7440: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 NO_TLS1_1) || de
7450: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7460: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a _TLS1_1_METHOD).
7470: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
7480: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
7490: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
74a0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
74b0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
74c0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
74d0: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
74e0: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f .method = TLSv1_
74f0: 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 1_method(); brea
7500: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 k;.#endif. ca
7510: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 se TLS_TLS1_2:.#
7520: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
7530: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_2) || defined
7540: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
7550: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _2) || defined(O
7560: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
7570: 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 _METHOD)..Tcl_Ap
7580: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7590: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 p, protocols[ind
75a0: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c ex], ": protocol
75b0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
75c0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
75d0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
75e0: 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 R;.#else..method
75f0: 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f = TLSv1_2_metho
7600: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
7610: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f if. case TLS_
7620: 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 TLS1_3:.#if defi
7630: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c ned(NO_TLS1_3) |
7640: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7650: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 L_NO_TLS1_3) ||
7660: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
7670: 4e 4f 5f 54 4c 53 31 5f 33 5f 4d 45 54 48 4f 44 NO_TLS1_3_METHOD
7680: 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 )..Tcl_AppendRes
7690: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 ult(interp, prot
76a0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a ocols[index], ":
76b0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
76c0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
76d0: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e *)NULL);..return
76e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
76f0: 65 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f e..method = TLS_
7700: 6d 65 74 68 6f 64 28 29 3b 0a 09 53 53 4c 5f 43 method();..SSL_C
7710: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f TX_set_min_proto
7720: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
7730: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 S1_3_VERSION);..
7740: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f SSL_CTX_set_max_
7750: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
7760: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f x, TLS1_3_VERSIO
7770: 4e 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 N);..break;.#end
7780: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a if. default:.
7790: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 .method = TLS_me
77a0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
77b0: 20 20 20 20 7d 0a 20 20 20 20 63 74 78 20 3d 20 }. ctx =
77c0: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 SSL_CTX_new(meth
77d0: 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78 od);. if (ctx
77e0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c == NULL) {..Tcl
77f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
7800: 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 terp, GET_ERR_RE
7810: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
7820: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
7830: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7840: 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 ssl = SSL_ne
7850: 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 w(ctx);. if (
7860: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ssl == NULL) {..
7870: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7880: 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52 (interp, GET_ERR
7890: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 _REASON(), (char
78a0: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 *)NULL);..SSL_C
78b0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 TX_free(ctx);..r
78c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
78d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 . }.. /* U
78e0: 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 se list and orde
78f0: 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 r as would be se
7900: 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 nt in a ClientHe
7910: 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c llo or all avail
7920: 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a able ciphers */.
7930: 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 70 70 if (use_supp
7940: 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 orted) {..sk = S
7950: 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65 SL_get1_supporte
7960: 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a d_ciphers(ssl);.
7970: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b } else {..sk
7980: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 = SSL_get_ciphe
7990: 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a rs(ssl);. }..
79a0: 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 if (sk != NU
79b0: 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72 62 LL) {..if (!verb
79c0: 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f 62 6a 50 ose) {.. objP
79d0: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
79e0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 Obj(0, NULL);..
79f0: 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 for (int i =
7a00: 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 0; i < sk_SSL_CI
7a10: 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b PHER_num(sk); i+
7a20: 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c +) {...const SSL
7a30: 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f _CIPHER *c = sk_
7a40: 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 SSL_CIPHER_value
7a50: 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 (sk, i);...if (c
7a60: 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e == NULL) contin
7a70: 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 ue;..../* cipher
7a80: 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 name or (NONE)
7a90: 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 */...cp = SSL_CI
7aa0: 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 PHER_get_name(c)
7ab0: 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 ;...if (cp == NU
7ac0: 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c LL) break;...Tcl
7ad0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
7ae0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
7af0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
7b00: 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b ingObj(cp, -1));
7b10: 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 .. }...} else
7b20: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d {.. objPtr =
7b30: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
7b40: 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f j("",0);.. fo
7b50: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
7b60: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f < sk_SSL_CIPHER_
7b70: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a num(sk); i++) {.
7b80: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 ..const SSL_CIPH
7b90: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 ER *c = sk_SSL_C
7ba0: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 IPHER_value(sk,
7bb0: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e i);...if (c == N
7bc0: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a ULL) continue;..
7bd0: 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 ../* textual des
7be0: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 cription of the
7bf0: 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 cipher */...if (
7c00: 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 SSL_CIPHER_descr
7c10: 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 iption(c, buf, s
7c20: 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e izeof(buf)) != N
7c30: 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c ULL) {... Tcl
7c40: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a _AppendToObj(obj
7c50: 50 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 Ptr, buf, (Tcl_S
7c60: 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29 ize) strlen(buf)
7c70: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
7c80: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f Tcl_AppendTo
7c90: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b Obj(objPtr, "UNK
7ca0: 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d NOWN\n", 8);...}
7cb0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 .. }..}..if (
7cc0: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b use_supported) {
7cd0: 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 .. sk_SSL_CIP
7ce0: 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d HER_free(sk);..}
7cf0: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 . }. SSL_f
7d00: 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 ree(ssl);. SS
7d10: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
7d20: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
7d30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
7d40: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
7d50: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
7d60: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
7d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7da0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 -------. *. * Pr
7db0: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d otocolsObjCmd --
7dc0: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
7dd0: 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 protocols. *. *.
7de0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
7df0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
7e00: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 cess the "tls::p
7e10: 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e rotocols" comman
7e20: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 d. *.to list ava
7e30: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 ilable protocols
7e40: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
7e50: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
7e60: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a cl result list..
7e70: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
7e80: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 ts:. *.none. *.
7e90: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
7ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ed0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
7ee0: 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 int.ProtocolsOb
7ef0: 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e jCmd(. TCL_UN
7f00: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 USED(void *),.
7f10: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
7f20: 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 terp,. int ob
7f30: 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 jc,. Tcl_Obj
7f40: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
7f50: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
7f60: 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e jPtr;.. dprin
7f70: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
7f80: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 if (objc != 1
7f90: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
7fa0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
7fb0: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 objv, "");..ret
7fc0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
7fd0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
7fe0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
7ff0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
8000: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
8010: 4c 29 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 L);..#if !define
8020: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 d(NO_TLS1) && !d
8030: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
8040: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
8050: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
8060: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 LS1_METHOD).
8070: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
8080: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
8090: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 objPtr, Tcl_New
80a0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 StringObj(protoc
80b0: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d ols[TLS_TLS1], -
80c0: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
80d0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
80e0: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
80f0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
8100: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
8110: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
8120: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
8130: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
8140: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
8150: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
8160: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
8170: 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 [TLS_TLS1_1], -1
8180: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
8190: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
81a0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
81b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
81c0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
81d0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f ENSSL_NO_TLS1_2_
81e0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f METHOD). Tcl_
81f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
8200: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
8210: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
8220: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
8230: 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 TLS_TLS1_2], -1)
8240: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
8250: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
8260: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
8270: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
8280: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
8290: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
82a0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
82b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
82c0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 rotocols[TLS_TLS
82d0: 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 1_3], -1));.#end
82e0: 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f if.. Tcl_SetO
82f0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
8300: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
8310: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
8320: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
8330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
8370: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 HandshakeObjCmd
8380: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f --. *. *.This co
8390: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f mmand is used to
83a0: 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20 verify whether
83b0: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 the handshake is
83c0: 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 complete. *.or
83d0: 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c not.. *. * Resul
83e0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
83f0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 d Tcl result. 1
8400: 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 means handshake
8410: 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e complete, 0 mean
8420: 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a s pending.. *. *
8430: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
8440: 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 *.May force SSL
8450: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 negotiation to t
8460: 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a ake place.. *. *
8470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84b0: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 ---. */..static
84c0: 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a int HandshakeObj
84d0: 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 Cmd(. TCL_UNU
84e0: 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 SED(void *),.
84f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
8500: 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a erp,. int obj
8510: 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a c,. Tcl_Obj *
8520: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a const objv[]).{.
8530: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
8540: 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 chan; /*
8550: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
8560: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
8570: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
8580: 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 ePtr; /*
8590: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
85a0: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
85b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 const char *e
85c0: 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 rrStr = NULL;.
85d0: 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 int ret = 1;.
85e0: 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a int err = 0;.
85f0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
8600: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
8610: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
8620: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
8630: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
8640: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
8650: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
8660: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
8670: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
8680: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
8690: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
86a0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 , Tcl_GetString(
86b0: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b objv[1]), NULL);
86c0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
86d0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
86e0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 ULL) {..return(T
86f0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
8700: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
8710: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
8720: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
8730: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
8740: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
8750: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
8760: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
8770: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
8780: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
8790: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
87a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
87b0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
87c0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
87d0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
87e0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
87f0: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 nel", (char *)NU
8800: 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 LL);..Tcl_SetErr
8810: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
8820: 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 TLS", "HANDSHAKE
8830: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
8840: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
8850: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 )NULL);..return(
8860: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
8870: 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d }. statePtr =
8880: 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 (State *)Tcl_Ge
8890: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
88a0: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 Data(chan);..
88b0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e dprintf("Callin
88c0: 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e g Tls_WaitForCon
88d0: 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 nect");. ret
88e0: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e = Tls_WaitForCon
88f0: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 nect(statePtr, &
8900: 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 err, 1);. dpr
8910: 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f intf("Tls_WaitFo
8920: 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 rConnect returne
8930: 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 d: %i", ret);..
8940: 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 if (ret < 0 &
8950: 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c & ((statePtr->fl
8960: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 ags & TLS_TCL_AS
8970: 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 YNC) && (err ==
8980: 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 EAGAIN))) {..dpr
8990: 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 intf("Async set
89a0: 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e and err = EAGAIN
89b0: 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 ");..ret = 0;.
89c0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 } else if (ret
89d0: 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 < 0) {..long re
89e0: 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 sult;..errStr =
89f0: 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 statePtr->err;..
8a00: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 Tcl_ResetResult(
8a10: 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 interp);..Tcl_Se
8a20: 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 tErrno(err);...i
8a30: 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a f (!errStr || (*
8a40: 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a errStr == 0)) {.
8a50: 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 . errStr = Tc
8a60: 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 l_PosixError(int
8a70: 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 erp);..}...Tcl_A
8a80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
8a90: 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 rp, "handshake f
8aa0: 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 ailed: ", errStr
8ab0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
8ac0: 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 ..if ((result =
8ad0: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
8ae0: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
8af0: 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f ssl)) != X509_V_
8b00: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 OK) {.. Tcl_A
8b10: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
8b20: 72 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22 rp, " due to \""
8b30: 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 , X509_verify_ce
8b40: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
8b50: 72 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 result), "\"", (
8b60: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 7d char *)NULL);..}
8b70: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
8b80: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
8b90: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 , "HANDSHAKE", "
8ba0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
8bb0: 29 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 )NULL);..dprintf
8bc0: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f ("Returning TCL_
8bd0: 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 ERROR with hands
8be0: 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 hake failed: %s"
8bf0: 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 , errStr);..retu
8c00: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
8c10: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
8c20: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 (err != 0) {..
8c30: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 dprintf("Got a
8c40: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 n error with a c
8c50: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 ompleted handsha
8c60: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 ke: err = %i", e
8c70: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 rr);..}..ret = 1
8c80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
8c90: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
8ca0: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 TCL_OK with data
8cb0: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a \"%i\"", ret);.
8cc0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
8cd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
8ce0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 _NewIntObj(ret))
8cf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c ;. return(TCL
8d00: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d _OK);.}../*. *--
8d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d50: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 -. *. * ImportOb
8d60: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
8d70: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
8d80: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
8d90: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d ss the "ssl" com
8da0: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 mand. *. *.The s
8db0: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 sl command pushe
8dc0: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 s SSL over a (ne
8dd0: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 wly connected) t
8de0: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 cp socket. *. *
8df0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
8e00: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
8e10: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
8e20: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f fects:. *.May mo
8e30: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f dify the behavio
8e40: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e r of an IO chann
8e50: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
8ea0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 ..static int.Imp
8eb0: 6f 72 74 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 ortObjCmd(. T
8ec0: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a CL_UNUSED(void *
8ed0: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 ),. Tcl_Inter
8ee0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 p *interp,. i
8ef0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c nt objc,. Tcl
8f00: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
8f10: 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []).{. Tcl_Ch
8f20: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
8f30: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
8f40: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
8f50: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
8f60: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 ePtr;../* client
8f70: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
8f80: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c ocket */. SSL
8f90: 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c _CTX *ctx..= NUL
8fa0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a L;. Tcl_Obj *
8fb0: 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a script..= NULL;.
8fc0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 Tcl_Obj *pas
8fd0: 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 sword..= NULL;.
8fe0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 Tcl_Obj *vcmd
8ff0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 ..= NULL;. Tc
9000: 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 l_DString upperC
9010: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
9020: 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 n, upperChannelB
9030: 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 locking, upperCh
9040: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 annelEncoding, u
9050: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
9060: 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b ar;. int idx;
9070: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 . Tcl_Size le
9080: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 n;. int flags
9090: 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 ...= TLS_TCL_INI
90a0: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 T;. int serve
90b0: 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63 r...= 0;./* is c
90c0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 onnection incomi
90d0: 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 ng or outgoing?
90e0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 */. char *key
90f0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 file..= NULL;.
9100: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 char *certfile
9110: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e ..= NULL;. un
9120: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 signed char *key
9130: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 ..= NULL;. Tc
9140: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09 l_Size key_len..
9150: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 = 0;. unsigne
9160: 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20 d char *cert..=
9170: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 NULL;. Tcl_Si
9180: 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30 ze cert_len..= 0
9190: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
91a0: 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ers..= NULL;.
91b0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 char *ciphersui
91c0: 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 tes..= NULL;.
91d0: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d char *CAfile..=
91e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
91f0: 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b *CApath..= NULL;
9200: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 . char *DHpar
9210: 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ams..= NULL;.
9220: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d char *model...=
9230: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
9240: 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e *servername..= N
9250: 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 ULL;./* hostname
9260: 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 for Server Name
9270: 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 Indication */.
9280: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 const unsigne
9290: 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f d char *session_
92a0: 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 id = NULL;. T
92b0: 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 cl_Obj *alpn..=
92c0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 NULL;. int ss
92d0: 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 l2 = 0, ssl3 = 0
92e0: 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d ;. int tls1 =
92f0: 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 1, tls1_1 = 1,
9300: 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 tls1_2 = 1, tls1
9310: 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 _3 = 1;. int
9320: 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c proto = 0, level
9330: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 = -1;. int v
9340: 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 erify = 0, requi
9350: 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 re = 0, request
9360: 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 = 1, post_handsh
9370: 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 ake = 0;.. dp
9380: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
9390: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f ..#if defined(NO
93a0: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
93b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
93c0: 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 1). tls1 = 0;
93d0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
93e0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c ned(NO_TLS1_1) |
93f0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
9400: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 L_NO_TLS1_1).
9410: 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e tls1_1 = 0;.#en
9420: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
9430: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 NO_TLS1_2) || de
9440: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
9450: 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 _TLS1_2). tls
9460: 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 1_2 = 0;.#endif.
9470: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
9480: 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_3) || define
9490: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
94a0: 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 1_3). tls1_3
94b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 = 0;.#endif..
94c0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b if (objc < 2) {
94d0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
94e0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
94f0: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 jv, "channel ?op
9500: 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 tions?");..retur
9510: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
9520: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
9530: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 r_error();..
9540: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
9550: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 annel(interp, Tc
9560: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
9570: 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 [1]), NULL);.
9580: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
9590: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
95a0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
95b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
95c0: 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 /*. * Make
95d0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
95e0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
95f0: 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 hannel. */.
9600: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
9610: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
9620: 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 );.. for (idx
9630: 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 = 2; idx < objc
9640: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 ; idx++) {..char
9650: 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 *opt = Tcl_GetS
9660: 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 tring(objv[idx])
9670: 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 ;...if (opt[0] !
9680: 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 = '-').. brea
9690: 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c k;...OPTOBJ("-al
96a0: 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 pn", alpn);..OPT
96b0: 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 STR("-cadir", CA
96c0: 70 61 74 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 path);..OPTSTR("
96d0: 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 -cafile", CAfile
96e0: 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 );..OPTBYTE("-ce
96f0: 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f rt", cert, cert_
9700: 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d len);..OPTSTR("-
9710: 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 certfile", certf
9720: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
9730: 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 cipher", ciphers
9740: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
9750: 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b hers", ciphers);
9760: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 ..OPTSTR("-ciphe
9770: 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 rsuites", cipher
9780: 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a suites);..OPTOBJ
9790: 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 ("-command", scr
97a0: 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ipt);..OPTSTR("-
97b0: 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 dhparams", DHpar
97c0: 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 ams);..OPTBYTE("
97d0: 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f -key", key, key_
97e0: 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d len);..OPTSTR("-
97f0: 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c keyfile", keyfil
9800: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f e);..OPTSTR("-mo
9810: 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f del", model);..O
9820: 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 PTOBJ("-password
9830: 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f ", password);..O
9840: 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 PTBOOL("-post_ha
9850: 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 ndshake", post_h
9860: 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 andshake);..OPTB
9870: 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 OOL("-request",
9880: 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f request);..OPTBO
9890: 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 OL("-require", r
98a0: 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 equire);..OPTINT
98b0: 28 22 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 ("-security_leve
98c0: 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 l", level);..OPT
98d0: 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 BOOL("-server",
98e0: 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 server);..OPTSTR
98f0: 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 ("-servername",
9900: 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 servername);..OP
9910: 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 TSTR("-session_i
9920: 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b d", session_id);
9930: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 ..OPTBOOL("-ssl2
9940: 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f ", ssl2);..OPTBO
9950: 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 OL("-ssl3", ssl3
9960: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
9970: 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 s1", tls1);..OPT
9980: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 BOOL("-tls1.1",
9990: 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f tls1_1);..OPTBOO
99a0: 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 L("-tls1.2", tls
99b0: 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 1_2);..OPTBOOL("
99c0: 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 -tls1.3", tls1_3
99d0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c );..OPTOBJ("-val
99e0: 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 idatecommand", v
99f0: 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d cmd);..OPTOBJ("-
9a00: 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 vcmd", vcmd);...
9a10: 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c OPTBAD("option",
9a20: 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c "-alpn, -cadir,
9a30: 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c -cafile, -cert,
9a40: 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 -certfile, -cip
9a50: 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 her, -ciphersuit
9a60: 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 es, -command, -d
9a70: 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d hparams, -key, -
9a80: 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c keyfile, -model,
9a90: 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 -password, -pos
9aa0: 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 t_handshake, -re
9ab0: 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c quest, -require,
9ac0: 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c -security_level
9ad0: 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 , -server, -serv
9ae0: 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e ername, -session
9af0: 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c _id, -ssl2, -ssl
9b00: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 3, -tls1, -tls1.
9b10: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 1, -tls1.2, -tls
9b20: 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 1.3, or -validat
9b30: 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 ecommand");...re
9b40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9b50: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 }. if (re
9b60: 71 75 65 73 74 29 09 20 20 20 20 76 65 72 69 66 quest). verif
9b70: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
9b80: 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 CLIENT_ONCE | SS
9b90: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 L_VERIFY_PEER;.
9ba0: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 if (request &
9bb0: 26 20 72 65 71 75 69 72 65 29 20 76 65 72 69 66 & require) verif
9bc0: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
9bd0: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f FAIL_IF_NO_PEER_
9be0: 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 CERT;. if (re
9bf0: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 quest && post_ha
9c00: 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 ndshake).verify
9c10: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f |= SSL_VERIFY_PO
9c20: 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 ST_HANDSHAKE;.
9c30: 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 if (verify ==
9c40: 30 29 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 0).verify = SSL_
9c50: 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 VERIFY_NONE;..
9c60: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 proto |= (ssl2
9c70: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ? TLS_PROTO_SSL
9c80: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 2 : 0);. prot
9c90: 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 o |= (ssl3 ? TLS
9ca0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 _PROTO_SSL3 : 0)
9cb0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
9cc0: 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f tls1 ? TLS_PROTO
9cd0: 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 _TLS1 : 0);.
9ce0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 proto |= (tls1_1
9cf0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
9d00: 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 1_1 : 0);. pr
9d10: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f oto |= (tls1_2 ?
9d20: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
9d30: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 2 : 0);. prot
9d40: 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 o |= (tls1_3 ? T
9d50: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 LS_PROTO_TLS1_3
9d60: 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 : 0);.. /* re
9d70: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 set to NULL if b
9d80: 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 lank string prov
9d90: 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 ided */. if (
9da0: 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 cert && !*cert).
9db0: 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 20 . cert.
9dc0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
9dd0: 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b if (key && !*k
9de0: 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 ey).. key
9df0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
9e00: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c . if (certfil
9e10: 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 e && !*certfile)
9e20: 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 6c certfil
9e30: 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 e.= NULL;. if
9e40: 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b (keyfile && !*k
9e50: 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 eyfile)..keyfile
9e60: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
9e70: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 . if (ciphers
9e80: 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 && !*ciphers).
9e90: 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 20 ciphers.
9ea0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
9eb0: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 69 if (ciphersui
9ec0: 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 tes && !*ciphers
9ed0: 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 69 uites) ciphersui
9ee0: 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 tes = NULL;.
9ef0: 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 if (CAfile &&
9f00: 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 !*CAfile).
9f10: 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 CAfile.
9f20: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
9f30: 20 28 43 41 70 61 74 68 20 26 26 20 21 2a 43 41 (CApath && !*CA
9f40: 70 61 74 68 29 09 20 20 20 20 20 20 20 20 43 41 path). CA
9f50: 70 61 74 68 09 20 20 20 20 20 20 20 20 3d 20 4e path. = N
9f60: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 ULL;. if (DHp
9f70: 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 arams && !*DHpar
9f80: 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 ams). DHp
9f90: 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e arams = N
9fa0: 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 ULL;.. /* new
9fb0: 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 SSL state */.
9fc0: 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 statePtr..= (S
9fd0: 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 tate *) ckalloc(
9fe0: 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f (unsigned) sizeo
9ff0: 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d f(State));. m
a000: 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 emset(statePtr,
a010: 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 0, sizeof(State)
a020: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 );.. statePtr
a030: 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b ->flags.= flags;
a040: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 . statePtr->i
a050: 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a nterp.= interp;.
a060: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 statePtr->vf
a070: 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 lags.= verify;.
a080: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 statePtr->err
a090: 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 .= "";.. /* a
a0a0: 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a llocate script *
a0b0: 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 /. if (script
a0c0: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f ) {..(void) Tcl_
a0d0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
a0e0: 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a (script, &len);.
a0f0: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 .if (len) {..
a100: 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 statePtr->callb
a110: 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 ack = script;..
a120: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
a130: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 unt(statePtr->ca
a140: 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 llback);..}.
a150: 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 }.. /* alloca
a160: 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 te password */.
a170: 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 if (password)
a180: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 {..(void) Tcl_G
a190: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
a1a0: 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b password, &len);
a1b0: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 ..if (len) {..
a1c0: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 statePtr->pass
a1d0: 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b word = password;
a1e0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
a1f0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
a200: 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 >password);..}.
a210: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
a220: 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 ocate validate c
a230: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 ommand */. if
a240: 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 (vcmd) {..(void
a250: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
a260: 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 romObj(vcmd, &le
a270: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
a280: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 . statePtr->v
a290: 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 cmd = vcmd;..
a2a0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
a2b0: 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 t(statePtr->vcmd
a2c0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
a2d0: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 if (model != NU
a2e0: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b LL) {..int mode;
a2f0: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f ../* Get the "mo
a300: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a del" context */.
a310: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 .chan = Tcl_GetC
a320: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d hannel(interp, m
a330: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 odel, &mode);..i
a340: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
a350: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
a360: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
a370: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
a380: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
a390: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
a3a0: 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 .. * Make sure t
a3b0: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
a3c0: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
a3d0: 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 .. */..chan = Tc
a3e0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
a3f0: 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f chan);..if (Tcl_
a400: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
a410: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
a420: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 nelType()) {..
a430: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
a440: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 lt(interp, "bad
a450: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c channel \"", Tcl
a460: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
a470: 63 68 61 6e 29 2c 0a 09 09 20 20 20 20 22 5c 22 chan),... "\"
a480: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
a490: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 nel", (char *)NU
a4a0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
a4b0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
a4c0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
a4d0: 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 T", "CHANNEL", "
a4e0: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
a4f0: 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c *)NULL);.. Tl
a500: 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 s_Free((void *)s
a510: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
a520: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
a530: 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 ..}..ctx = ((Sta
a540: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
a550: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
a560: 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 chan))->ctx;.
a570: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 } else {..if ((
a580: 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 ctx = CTX_Init(s
a590: 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c tatePtr, server,
a5a0: 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c proto, keyfile,
a5b0: 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 certfile, key,
a5c0: 63 65 72 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f cert, (int) key_
a5d0: 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 len,.. (int)
a5e0: 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 cert_len, CApath
a5f0: 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 , CAfile, cipher
a600: 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c s, ciphersuites,
a610: 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 level, DHparams
a620: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 )) == NULL) {..
a630: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 Tls_Free((voi
a640: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 d *)statePtr);..
a650: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
a660: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
a670: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 statePtr->ct
a680: 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a x = ctx;.. /*
a690: 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 . * We need
a6a0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 to make sure tha
a6b0: 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f t the channel wo
a6c0: 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 rks in binary (f
a6d0: 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e or the. * en
a6e0: 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 cryption not to
a6f0: 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a get goofed up)..
a700: 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 * We only w
a710: 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 ant to adjust th
a720: 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 e buffering in p
a730: 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 re-v2 channels,
a740: 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 where. * eac
a750: 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 h channel in the
a760: 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 stack maintaine
a770: 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 d its own buffer
a780: 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 s.. */. T
a790: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
a7a0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
a7b0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 slation);. Tc
a7c0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
a7d0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
a7e0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ing);. Tcl_DS
a7f0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
a800: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
a810: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
a820: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
a830: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 elEncoding);.
a840: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
a850: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
a860: 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 an, "-eofchar",
a870: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
a880: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 Char);. Tcl_G
a890: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
a8a0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
a8b0: 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 encoding", &uppe
a8c0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
a8d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
a8e0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
a8f0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e rp, chan, "-tran
a900: 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 slation", &upper
a910: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
a920: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 on);. Tcl_Get
a930: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
a940: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c terp, chan, "-bl
a950: 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 ocking", &upperC
a960: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b hannelBlocking);
a970: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
a980: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
a990: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c , chan, "-transl
a9a0: 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 ation", "binary"
a9b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
a9c0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
a9d0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 rp, chan, "-bloc
a9e0: 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a king", "true");.
a9f0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e dprintf("Con
aa00: 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e suming Tcl chann
aa10: 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 el %s", Tcl_GetC
aa20: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
aa30: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d );. statePtr-
aa40: 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 >self = Tcl_Stac
aa50: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c kChannel(interp,
aa60: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
aa70: 28 29 2c 20 73 74 61 74 65 50 74 72 2c 20 28 54 (), statePtr, (T
aa80: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 CL_READABLE | TC
aa90: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 L_WRITABLE), cha
aaa0: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 n);. dprintf(
aab0: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c "Created channel
aac0: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f named %s", Tcl_
aad0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
aae0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b tatePtr->self));
aaf0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
ab00: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f r->self == (Tcl_
ab10: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
ab20: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 ../*.. * No use
ab30: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c of Tcl_Eventuall
ab40: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f yFree because no
ab50: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 possible Tcl_Pr
ab60: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c eserve... */..Tl
ab70: 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 s_Free((void *)s
ab80: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 tatePtr);..retur
ab90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
aba0: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 }.. Tcl_SetC
abb0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
abc0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
abd0: 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 elf, "-translati
abe0: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 on", Tcl_DString
abf0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
ac00: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 nelTranslation))
ac10: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
ac20: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
ac30: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
ac40: 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 f, "-encoding",
ac50: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
ac60: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
ac70: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 coding));. Tc
ac80: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
ac90: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
aca0: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 Ptr->self, "-eof
acb0: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 char", Tcl_DStri
acc0: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
acd0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a annelEOFChar));.
ace0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
acf0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
ad00: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
ad10: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 "-blocking", Tc
ad20: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
ad30: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
ad40: 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f king));. Tcl_
ad50: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 DStringFree(&upp
ad60: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
ad70: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 tion);. Tcl_D
ad80: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
ad90: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
ada0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
adb0: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 ngFree(&upperCha
adc0: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 nnelEOFChar);.
add0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
ade0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 e(&upperChannelB
adf0: 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f locking);.. /
ae00: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 *. * SSL Ini
ae10: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 tialization.
ae20: 20 2a 2f 0a 0a 20 20 20 20 73 74 61 74 65 50 74 */.. statePt
ae30: 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 r->ssl = SSL_new
ae40: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b (statePtr->ctx);
ae50: 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 . if (!stateP
ae60: 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 tr->ssl) {../* S
ae70: 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 SL library error
ae80: 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 */..Tcl_AppendR
ae90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 esult(interp, "c
aea0: 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 ouldn't construc
aeb0: 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 t ssl session: "
aec0: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
aed0: 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c (), (char *)NULL
aee0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
aef0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
af00: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 S", "IMPORT", "I
af10: 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 NIT", "FAILED",
af20: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 (char *)NULL);..
af30: 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a Tls_Free((void *
af40: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 )statePtr);..ret
af50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
af60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
af70: 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d host server nam
af80: 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 e */. if (ser
af90: 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 vername) {../* S
afa0: 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e ets the server n
afb0: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 ame indication (
afc0: 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 SNI) in ClientHe
afd0: 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f llo extension */
afe0: 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 ../* Per RFC 606
aff0: 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 6, hostname is a
b000: 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 ASCII encoded s
b010: 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 tring, though RF
b020: 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d C 4366 says UTF-
b030: 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 8. */..if (!SSL_
b040: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f set_tlsext_host_
b050: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 name(statePtr->s
b060: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 sl, servername)
b070: 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 && require) {..
b080: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
b090: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
b0a0: 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 SNI extension f
b0b0: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 ailed: ", GET_ER
b0c0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
b0d0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
b0e0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
b0f0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
b100: 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c "IMPORT", "SNI",
b110: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
b120: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *)NULL);.. T
b130: 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 ls_Free((void *)
b140: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
b150: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
b160: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f ;..}.../* Set ho
b170: 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 stname for peer
b180: 63 65 72 74 69 66 69 63 61 74 65 20 68 6f 73 74 certificate host
b190: 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f name verificatio
b1a0: 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 n in clients...
b1b0: 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f Don't use SSL_
b1c0: 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 set1_host since
b1d0: 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f it has limitatio
b1e0: 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c ns. */..if (!SSL
b1f0: 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 _add1_host(state
b200: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 Ptr->ssl, server
b210: 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 name)) {.. Tc
b220: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
b230: 6e 74 65 72 70 2c 20 22 53 65 74 20 44 4e 53 20 nterp, "Set DNS
b240: 68 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a hostname failed:
b250: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
b260: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 ON(), (char *)NU
b270: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
b280: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
b290: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
b2a0: 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 T", "HOSTNAME",
b2b0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
b2c0: 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c *)NULL);.. Tl
b2d0: 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 s_Free((void *)s
b2e0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
b2f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b300: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
b310: 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e * Resume session
b320: 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 id */. if (s
b330: 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 ession_id && str
b340: 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 len(session_id)
b350: 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 <= SSL_MAX_SID_C
b360: 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a TX_LENGTH) {../*
b370: 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e SSL_set_session
b380: 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f () */..if (!SSL_
b390: 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f SESSION_set1_id_
b3a0: 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f context(SSL_get_
b3b0: 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 session(statePtr
b3c0: 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f ->ssl), session_
b3d0: 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e id, (unsigned in
b3e0: 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f t) strlen(sessio
b3f0: 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54 n_id))) {.. T
b400: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
b410: 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 interp, "Resume
b420: 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 session failed:
b430: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ", GET_ERR_REASO
b440: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c N(), (char *)NUL
b450: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
b460: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
b470: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
b480: 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 ", "SESSION", "F
b490: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
b4a0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
b4b0: 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 Free((void *)sta
b4c0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
b4d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
b4e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
b4f0: 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 Enable Applicati
b500: 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f on-Layer Protoco
b510: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 l Negotiation. E
b520: 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 xamples are: htt
b530: 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 p/1.0,..http/1.1
b540: 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 , h2, h3, ftp, i
b550: 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d map, pop3, xmpp-
b560: 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 client, xmpp-ser
b570: 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 ver, mqtt, irc,
b580: 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 etc. */. if (
b590: 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 alpn) {../* Conv
b5a0: 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 ert a TCL list i
b5b0: 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c nto a protocol-l
b5c0: 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d ist in wire-form
b5d0: 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 at */..unsigned
b5e0: 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 char *protos, *p
b5f0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 ;..unsigned int
b600: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a protos_len = 0;.
b610: 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 .Tcl_Size cnt, i
b620: 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f ;..int j;..Tcl_O
b630: 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 bj **list;...if
b640: 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 (Tcl_ListObjGetE
b650: 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 lements(interp,
b660: 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 alpn, &cnt, &lis
b670: 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a t) != TCL_OK) {.
b680: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76 . Tls_Free((v
b690: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
b6a0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b6b0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
b6c0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 Determine the me
b6d0: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f mory required fo
b6e0: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c r the protocol-l
b6f0: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d ist */..for (i =
b700: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 0; i < cnt; i++
b710: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 ) {.. Tcl_Get
b720: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 StringFromObj(li
b730: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 st[i], &len);..
b740: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 if (len > 255
b750: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
b760: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b770: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 ALPN protocol na
b780: 6d 65 73 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 mes too long", (
b790: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 char *)NULL);...
b7a0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
b7b0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
b7c0: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 "IMPORT", "ALPN"
b7d0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
b7e0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 r *)NULL);...Tls
b7f0: 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 _Free((void *)st
b800: 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 atePtr);...retur
b810: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
b820: 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f }.. protos_
b830: 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 len += 1 + (int)
b840: 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 len;..}.../* Bu
b850: 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 ild the complete
b860: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a protocol-list *
b870: 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c /..protos = ckal
b880: 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b loc(protos_len);
b890: 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 ../* protocol-li
b8a0: 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 sts consist of 8
b8b0: 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 -bit length-pref
b8c0: 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e ixed, byte strin
b8d0: 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 gs */..for (j =
b8e0: 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 0, p = protos; j
b8f0: 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 < cnt; j++) {..
b900: 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 char *str =
b910: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
b920: 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c mObj(list[j], &l
b930: 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d en);.. *p++ =
b940: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 (unsigned char)
b950: 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 len;.. memcp
b960: 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f y(p, str, (size_
b970: 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 t) len);.. p
b980: 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 += len;..}.../*
b990: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f SSL_set_alpn_pro
b9a0: 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 tos makes a copy
b9b0: 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c of the protocol
b9c0: 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 -list */../* Not
b9d0: 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e e: This function
b9e0: 73 20 72 65 76 65 72 73 65 73 20 74 68 65 20 72 s reverses the r
b9f0: 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 eturn value conv
ba00: 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 ention */..if (S
ba10: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 SL_set_alpn_prot
ba20: 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c os(statePtr->ssl
ba30: 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 , protos, protos
ba40: 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 _len)) {.. Tc
ba50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
ba60: 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c 50 4e nterp, "Set ALPN
ba70: 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c 65 protocols faile
ba80: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 d: ", GET_ERR_RE
ba90: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
baa0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
bab0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
bac0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
bad0: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 ORT", "ALPN", "F
bae0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
baf0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
bb00: 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 Free((void *)sta
bb10: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 tePtr);.. ckf
bb20: 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 ree(protos);..
bb30: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
bb40: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 OR;..}.../* Stor
bb50: 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 e protocols list
bb60: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 */..statePtr->p
bb70: 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a rotos = protos;.
bb80: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
bb90: 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c s_len = protos_l
bba0: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b en;. } else {
bbb0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
bbc0: 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 os = NULL;..stat
bbd0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
bbe0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 = 0;. }..
bbf0: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 /*. * SSL C
bc00: 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f allbacks. */
bc10: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 . SSL_set_app
bc20: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e _data(statePtr->
bc30: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ssl, (void *)sta
bc40: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 tePtr);./* point
bc50: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 back to us */.
bc60: 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 SSL_set_verif
bc70: 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c y(statePtr->ssl,
bc80: 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 verify, VerifyC
bc90: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 allback);. SS
bca0: 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 L_set_info_callb
bcb0: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ack(statePtr->ss
bcc0: 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 l, InfoCallback)
bcd0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 ;.. /* Callba
bce0: 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 ck for observing
bcf0: 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 protocol messag
bd00: 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 es */.#ifndef OP
bd10: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 ENSSL_NO_SSL_TRA
bd20: 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 CE. /* void S
bd30: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 SL_CTX_set_msg_c
bd40: 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 allback_arg(stat
bd50: 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 ePtr->ctx, (void
bd60: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 *)statePtr);.
bd70: 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 void SSL_CTX_s
bd80: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 et_msg_callback(
bd90: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d statePtr->ctx, M
bda0: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b essageCallback);
bdb0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f */. SSL_set_
bdc0: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 msg_callback_arg
bdd0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
bde0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
bdf0: 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d );. SSL_set_m
be00: 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 sg_callback(stat
be10: 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 ePtr->ssl, Messa
be20: 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e geCallback);.#en
be30: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 dif.. /* Crea
be40: 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 te Tcl_Channel B
be50: 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 IO Handler */.
be60: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 statePtr->p_bi
be70: 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 o.= BIO_new_tcl(
be80: 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f statePtr, BIO_NO
be90: 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 CLOSE);. stat
bea0: 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f ePtr->bio.= BIO_
beb0: 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 new(BIO_f_ssl())
bec0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 ;.. if (serve
bed0: 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 r) {../* Server
bee0: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 callbacks */..SS
bef0: 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 L_CTX_set_tlsext
bf00: 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 _servername_arg(
bf10: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 statePtr->ctx, (
bf20: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
bf30: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 ;..SSL_CTX_set_t
bf40: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 lsext_servername
bf50: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 _callback(stateP
bf60: 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c tr->ctx, SNICall
bf70: 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f back);..SSL_CTX_
bf80: 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f set_client_hello
bf90: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
bfa0: 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b x, HelloCallback
bfb0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
bfc0: 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 tr);..if (stateP
bfd0: 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 tr->protos != NU
bfe0: 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 LL) {.. SSL_C
bff0: 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 TX_set_alpn_sele
c000: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ct_cb(statePtr->
c010: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 ctx, ALPNCallbac
c020: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
c030: 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 Ptr);.#ifdef USE
c040: 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c _NPN.. if (tl
c050: 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 s1_2 == 0 && tls
c060: 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 1_3 == 0) {...SS
c070: 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 L_CTX_set_next_p
c080: 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 rotos_advertised
c090: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
c0a0: 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 x, NPNCallback,
c0b0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c0c0: 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 );.. }.#endif
c0d0: 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 ..}.../* Enable
c0e0: 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 server to send c
c0f0: 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65 ert request afte
c100: 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 r handshake (TLS
c110: 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 1.3 only) */../
c120: 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 * A write operat
c130: 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c ion must take pl
c140: 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 ace for the Cert
c150: 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20 ificate Request
c160: 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 to be.. sent t
c170: 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 o the client, th
c180: 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 is can be done w
c190: 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 ith SSL_do_hands
c1a0: 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 hake(). */..if (
c1b0: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f request && post_
c1c0: 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73 handshake && tls
c1d0: 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 1_3) {.. SSL_
c1e0: 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f verify_client_po
c1f0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 st_handshake(sta
c200: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a tePtr->ssl);..}.
c210: 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 ../* set automat
c220: 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 ic curve selecti
c230: 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 on */..SSL_set_e
c240: 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74 cdh_auto(statePt
c250: 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a r->ssl, 1);.../*
c260: 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 Set server mode
c270: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 */..statePtr->f
c280: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f lags |= TLS_TCL_
c290: 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 SERVER;..SSL_set
c2a0: 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 _accept_state(st
c2b0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
c2c0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 } else {../* C
c2d0: 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 lient callbacks
c2e0: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 */.#ifdef USE_NP
c2f0: 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d N..if (statePtr-
c300: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 >protos != NULL
c310: 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 && tls1_2 == 0 &
c320: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b & tls1_3 == 0) {
c330: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
c340: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c t_next_proto_sel
c350: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d ect_cb(statePtr-
c360: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 >ctx, ALPNCallba
c370: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
c380: 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 ePtr);..}.#endif
c390: 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 .../* Session ca
c3a0: 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 ching */..SSL_CT
c3b0: 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 X_set_session_ca
c3c0: 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 che_mode(statePt
c3d0: 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 r->ctx, SSL_SESS
c3e0: 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 _CACHE_CLIENT |
c3f0: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e SSL_SESS_CACHE_N
c400: 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 O_INTERNAL_STORE
c410: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 );..SSL_CTX_sess
c420: 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 _set_new_cb(stat
c430: 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 ePtr->ctx, Sessi
c440: 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f onCallback);.../
c450: 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 * Enable post ha
c460: 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 ndshake Authenti
c470: 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e cation extension
c480: 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 . TLS 1.3 only,
c490: 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 not http/2. */..
c4a0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 if (request && p
c4b0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b ost_handshake) {
c4c0: 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f .. SSL_set_po
c4d0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 st_handshake_aut
c4e0: 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c h(statePtr->ssl,
c4f0: 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 1);..}.../* Set
c500: 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a client mode */.
c510: 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 .SSL_set_connect
c520: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d _state(statePtr-
c530: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 >ssl);. }.
c540: 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 SSL_set_bio(sta
c550: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 tePtr->ssl, stat
c560: 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 ePtr->p_bio, sta
c570: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 tePtr->p_bio);.
c580: 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 BIO_set_ssl(s
c590: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 tatePtr->bio, st
c5a0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f atePtr->ssl, BIO
c5b0: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 _NOCLOSE);..
c5c0: 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 /*. * End of
c5d0: 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a SSL Init. *
c5e0: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 /. dprintf("R
c5f0: 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 eturning %s", Tc
c600: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
c610: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
c620: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 );. Tcl_SetRe
c630: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 sult(interp, (ch
c640: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 ar *) Tcl_GetCha
c650: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
c660: 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f r->self), TCL_VO
c670: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 LATILE);. ret
c680: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
c690: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
c6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c6d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 --------. *. * U
c6e0: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d nimportObjCmd --
c6f0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
c700: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
c710: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 to remove the t
c720: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 opmost channel f
c730: 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 ilter.. *. * Res
c740: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
c750: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
c760: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
c770: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 ts:. *.May modif
c780: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f y the behavior o
c790: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e f an IO channel.
c7a0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
c7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
c7f0: 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f tatic int.Unimpo
c800: 72 74 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 rtObjCmd(. TC
c810: 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 L_UNUSED(void *)
c820: 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ,. Tcl_Interp
c830: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e *interp,. in
c840: 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f t objc,. Tcl_
c850: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
c860: 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]).{. Tcl_Cha
c870: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
c880: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
c890: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
c8a0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
c8b0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
c8c0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
c8d0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
c8e0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
c8f0: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
c900: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
c910: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 }.. chan
c920: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
c930: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 (interp, Tcl_Get
c940: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c String(objv[1]),
c950: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
c960: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
c970: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
c980: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
c990: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
c9a0: 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 * Make sure
c9b0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
c9c0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
c9d0: 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 l. */. ch
c9e0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
c9f0: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 hannel(chan);..
ca00: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
ca10: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
ca20: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
ca30: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
ca40: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
ca50: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
ca60: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
ca70: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 elName(chan),...
ca80: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
ca90: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a hannel", (char *
caa0: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c )NULL);.. Tcl
cab0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
cac0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e terp, "TLS", "UN
cad0: 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 IMPORT", "CHANNE
cae0: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
caf0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
cb00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
cb10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
cb20: 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e Tcl_UnstackChann
cb30: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 el(interp, chan)
cb40: 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b == TCL_ERROR) {
cb50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
cb60: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 OR;. }.. r
cb70: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
cb80: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
cb90: 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a ----------. *. *
cbd0: 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e CTX_Init -- con
cbe0: 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 struct a SSL_CTX
cbf0: 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 instance. *. *
cc00: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 Results:. *.A va
cc10: 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 lid SSL_CTX inst
cc20: 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a ance or NULL.. *
cc30: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
cc40: 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 :. *.constructs
cc50: 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 SSL context (CTX
cc60: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ). *. *---------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
ccb0: 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a static SSL_CTX *
ccc0: 0a 43 54 58 5f 49 6e 69 74 28 0a 20 20 20 20 53 .CTX_Init(. S
ccd0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 0a tate *statePtr,.
cce0: 20 20 20 20 69 6e 74 20 69 73 53 65 72 76 65 72 int isServer
ccf0: 2c 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 2c ,. int proto,
cd00: 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69 . char *keyfi
cd10: 6c 65 2c 0a 20 20 20 20 63 68 61 72 20 2a 63 65 le,. char *ce
cd20: 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 rtfile,. unsi
cd30: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 0a gned char *key,.
cd40: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
cd50: 72 20 2a 63 65 72 74 2c 0a 20 20 20 20 69 6e 74 r *cert,. int
cd60: 20 6b 65 79 5f 6c 65 6e 2c 0a 20 20 20 20 69 6e key_len,. in
cd70: 74 20 63 65 72 74 5f 6c 65 6e 2c 0a 20 20 20 20 t cert_len,.
cd80: 63 68 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 char *CApath,.
cd90: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a char *CAfile,.
cda0: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 char *cipher
cdb0: 73 2c 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 s,. char *cip
cdc0: 68 65 72 73 75 69 74 65 73 2c 0a 20 20 20 20 69 hersuites,. i
cdd0: 6e 74 20 6c 65 76 65 6c 2c 0a 20 20 20 20 63 68 nt level,. ch
cde0: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 0a 7b 0a ar *DHparams).{.
cdf0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
ce00: 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 interp = statePt
ce10: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 r->interp;. S
ce20: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 SL_CTX *ctx = NU
ce30: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 LL;. Tcl_DStr
ce40: 69 6e 67 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 ing ds;. int
ce50: 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d off = 0, abort =
ce60: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 0;. int load
ce70: 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 _private_key;.
ce80: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 const SSL_METH
ce90: 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 OD *method;..
cea0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
ceb0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 ");.. if (!pr
cec0: 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 oto) {..Tcl_Appe
ced0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
cee0: 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f "no valid proto
cef0: 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 28 col selected", (
cf00: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
cf10: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
cf20: 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 }.. /* create
cf30: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
cf40: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
cf50: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
cf60: 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 _SSL2)) {..Tcl_A
cf70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
cf80: 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 rp, "SSL2 protoc
cf90: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
cfa0: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
cfb0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
cfc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 45 4e }. if (EN
cfd0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
cfe0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a _PROTO_SSL3)) {.
cff0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
d000: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 t(interp, "SSL3
d010: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
d020: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a ported", (char *
d030: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 )NULL);..return
d040: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 69 66 20 NULL;. }.#if
d050: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
d060: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
d070: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 SSL_NO_TLS1) ||
d080: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d090: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
d0a0: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
d0b0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
d0c0: 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 _TLS1)) {..Tcl_A
d0d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
d0e0: 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f rp, "TLS 1.0 pro
d0f0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
d100: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 ted", (char *)NU
d110: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
d120: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
d130: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
d140: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
d150: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d160: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 1_1) || defined(
d170: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
d180: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 69 66 1_METHOD). if
d190: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
d1a0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
d1b0: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 1)) {..Tcl_Appen
d1c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
d1d0: 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f "TLS 1.1 protoco
d1e0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
d1f0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
d200: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
d210: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
d220: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
d230: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
d240: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
d250: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
d260: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 SSL_NO_TLS1_2_ME
d270: 54 48 4f 44 29 0a 20 20 20 20 69 66 20 28 45 4e THOD). if (EN
d280: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
d290: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 _PROTO_TLS1_2))
d2a0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
d2b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ult(interp, "TLS
d2c0: 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 1.2 protocol no
d2d0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 t supported", (c
d2e0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 har *)NULL);..re
d2f0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
d300: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
d310: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c ned(NO_TLS1_3) |
d320: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
d330: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 L_NO_TLS1_3) ||
d340: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d350: 4e 4f 5f 54 4c 53 31 5f 33 5f 4d 45 54 48 4f 44 NO_TLS1_3_METHOD
d360: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
d370: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d380: 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 TO_TLS1_3)) {..T
d390: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d3a0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 interp, "TLS 1.3
d3b0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
d3c0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 pported", (char
d3d0: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e *)NULL);..return
d3e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
d3f0: 64 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 dif. if (prot
d400: 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 o == 0) {../* Us
d410: 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a e full range */.
d420: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e .SSL_CTX_set_min
d430: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
d440: 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 tx, 0);..SSL_CTX
d450: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 _set_max_proto_v
d460: 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a ersion(ctx, 0);.
d470: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 }.. switc
d480: 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 h (proto) {.#if
d490: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
d4a0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d4b0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
d4c0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d4d0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
d4e0: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
d4f0: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 PROTO_TLS1:..met
d500: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
d510: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 TLSv1_server_me
d520: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 thod() : TLSv1_c
d530: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
d540: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
d550: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
d560: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
d570: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d580: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
d590: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d5a0: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_1_METHOD).
d5b0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
d5c0: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_1:..method =
d5d0: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
d5e0: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_1_server_metho
d5f0: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c d() : TLSv1_1_cl
d600: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
d610: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
d620: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d630: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
d640: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d650: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
d660: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d670: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _2_METHOD). c
d680: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
d690: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_2:..method =
d6a0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
d6b0: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 _2_server_method
d6c0: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 () : TLSv1_2_cli
d6d0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
d6e0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
d6f0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
d700: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
d710: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d720: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
d730: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
d740: 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 3_METHOD). ca
d750: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
d760: 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 1_3:../* Use the
d770: 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 generic method
d780: 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 and constraint r
d790: 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 ange after conte
d7a0: 78 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f xt is created */
d7b0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
d7c0: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 ver ? TLS_server
d7d0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f _method() : TLS_
d7e0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
d7f0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
d800: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a default:../*
d810: 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 Negotiate highe
d820: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c st available SSL
d830: 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a /TLS version */.
d840: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
d850: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f er ? TLS_server_
d860: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 method() : TLS_c
d870: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
d880: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
d890: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
d8a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d8b0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
d8c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d PENSSL_NO_TLS1_M
d8d0: 45 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 ETHOD)..off |= (
d8e0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
d8f0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 LS_PROTO_TLS1)
d900: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
d910: 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a _TLSv1);.#endif.
d920: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
d930: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
d940: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
d950: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
d960: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d970: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 6f 66 S1_1_METHOD)..of
d980: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
d990: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
d9a0: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c LS1_1) ? 0 : SSL
d9b0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b _OP_NO_TLSv1_1);
d9c0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
d9d0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
d9e0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d9f0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 SSL_NO_TLS1_2) &
da00: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
da10: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 SL_NO_TLS1_2_MET
da20: 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e HOD)..off |= (EN
da30: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
da40: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f _PROTO_TLS1_2) ?
da50: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
da60: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a LSv1_2);.#endif.
da70: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
da80: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
da90: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
daa0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
dab0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
dac0: 53 31 5f 33 5f 4d 45 54 48 4f 44 29 0a 09 6f 66 S1_3_METHOD)..of
dad0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
dae0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
daf0: 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c LS1_3) ? 0 : SSL
db00: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b _OP_NO_TLSv1_3);
db10: 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a .#endif..break;.
db20: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 }.. ERR_c
db30: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 lear_error();..
db40: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
db50: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 _new(method);.
db60: 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 if (!ctx) {..r
db70: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 eturn(NULL);.
db80: 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 }.. if (gete
db90: 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 nv(SSLKEYLOGFILE
dba0: 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 )) {..SSL_CTX_se
dbb0: 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 t_keylog_callbac
dbc0: 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c k(ctx, KeyLogCal
dbd0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 lback);. }..#
dbe0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
dbf0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
dc00: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
dc10: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 S1_3). if (pr
dc20: 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f oto == TLS_PROTO
dc30: 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f _TLS1_3) {..SSL_
dc40: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
dc50: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 o_version(ctx, T
dc60: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a LS1_3_VERSION);.
dc70: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 .SSL_CTX_set_max
dc80: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
dc90: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
dca0: 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ON);. }.#endi
dcb0: 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 f.. /* Force
dcc0: 63 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e cipher selection
dcd0: 20 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72 order by server
dce0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 */. if (!isS
dcf0: 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 erver) {..SSL_CT
dd00: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
dd10: 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 x, SSL_OP_CIPHER
dd20: 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e _SERVER_PREFEREN
dd30: 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 CE);. }..
dd40: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f SSL_CTX_set_app_
dd50: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a data(ctx, (void*
dd60: 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d )interp);./* rem
dd70: 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 ember the interp
dd80: 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c reter */. SSL
dd90: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
dda0: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c (ctx, SSL_OP_ALL
ddb0: 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 );./* all SSL bu
ddc0: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f g workarounds */
ddd0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
dde0: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 _options(ctx, SS
ddf0: 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 L_OP_NO_COMPRESS
de00: 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65 ION);./* disable
de10: 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 65 compression eve
de20: 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 2a n if supported *
de30: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 /. SSL_CTX_se
de40: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f t_options(ctx, o
de50: 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 ff);../* disable
de60: 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f protocol versio
de70: 6e 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 ns */. SSL_CT
de80: 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 X_sess_set_cache
de90: 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b _size(ctx, 128);
dea0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 .. /* Set use
deb0: 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 r defined cipher
dec0: 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73 s, cipher suites
ded0: 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c , and security l
dee0: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 evel */. if (
def0: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c (ciphers != NULL
df00: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 ) && !SSL_CTX_se
df10: 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 t_cipher_list(ct
df20: 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 x, ciphers)) {..
df30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
df40: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 (interp, "Set ci
df50: 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f phers failed: No
df60: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c valid ciphers",
df70: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
df80: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
df90: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c x);..return NULL
dfa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
dfb0: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21 3d (ciphersuites !=
dfc0: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 NULL) && !SSL_C
dfd0: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69 TX_set_ciphersui
dfe0: 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 73 tes(ctx, ciphers
dff0: 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 uites)) {..Tcl_A
e000: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
e010: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 20 rp, "Set cipher
e020: 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e suites failed: N
e030: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 o valid ciphers"
e040: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
e050: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e060: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
e070: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a L;. }.. /*
e080: 20 53 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 Set security le
e090: 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c vel */. if (l
e0a0: 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 evel > -1 && lev
e0b0: 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 el < 6) {../* SS
e0c0: 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c L_set_security_l
e0d0: 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 evel */..SSL_CTX
e0e0: 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _set_security_le
e0f0: 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b vel(ctx, level);
e100: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 . }.. /* s
e110: 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b et some callback
e120: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 s */. SSL_CTX
e130: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 _set_default_pas
e140: 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 swd_cb(ctx, Pass
e150: 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 wordCallback);.
e160: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 SSL_CTX_set_d
e170: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 efault_passwd_cb
e180: 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 _userdata(ctx, (
e190: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
e1a0: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 ;.. /* read a
e1b0: 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 Diffie-Hellman
e1c0: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c parameters file,
e1d0: 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 6c or use the buil
e1e0: 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 t-in one */.#ifd
e1f0: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 ef OPENSSL_NO_DH
e200: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d . if (DHparam
e210: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 s != NULL) {..Tc
e220: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e230: 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d nterp, "DH param
e240: 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 eter support not
e250: 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 available", (ch
e260: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c ar *)NULL);..SSL
e270: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
e280: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
e290: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a }.#else. {.
e2a0: 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 .DH* dh;..if (DH
e2b0: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 params != NULL)
e2c0: 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b {.. BIO *bio;
e2d0: 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f .. bio = BIO_
e2e0: 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 new_file(F2N(DHp
e2f0: 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 arams, &ds), "r"
e300: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f );.. if (!bio
e310: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
e320: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 gFree(&ds);...Tc
e330: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e340: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f nterp, "Could no
e350: 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 t find DH parame
e360: 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 ters file", (cha
e370: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c r *)NULL);...SSL
e380: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
e390: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
e3a0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d }... dh =
e3b0: 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 PEM_read_bio_DH
e3c0: 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c params(bio, NULL
e3d0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 , NULL, NULL);..
e3e0: 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f BIO_free(bio
e3f0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 );.. Tcl_DStr
e400: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
e410: 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 if (!dh) {...
e420: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
e430: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 (interp, "Could
e440: 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 not read DH para
e450: 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 meters from file
e460: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
e470: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
e480: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
e490: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 NULL;.. }..
e4a0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d SSL_CTX_set_tm
e4b0: 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 p_dh(ctx, dh);..
e4c0: 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 29 3b DH_free(dh);
e4d0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
e4e0: 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 /* Use well know
e4f0: 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 n DH parameters
e500: 74 68 61 74 20 68 61 76 65 20 62 75 69 6c 74 2d that have built-
e510: 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 4f 70 in support in Op
e520: 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66 enSSL */.. if
e530: 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 (!SSL_CTX_set_d
e540: 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 29 20 h_auto(ctx, 1))
e550: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
e560: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f sult(interp, "Co
e570: 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73 uld not enable s
e580: 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c 20 47 et DH auto: ", G
e590: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
e5a0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
e5b0: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e5c0: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
e5d0: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 LL;.. }..}.
e5e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
e5f0: 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 /* set our certi
e600: 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f ficate */. lo
e610: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
e620: 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 0;. if (cert
e630: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
e640: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 .load_private_ke
e650: 79 20 3d 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c y = 1;...if (SSL
e660: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 _CTX_use_certifi
e670: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 cate_file(ctx, F
e680: 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 2N(certfile, &ds
e690: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ), SSL_FILETYPE_
e6a0: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 PEM) <= 0) {..
e6b0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
e6c0: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c e(&ds);.. Tcl
e6d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e6e0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
e6f0: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 set certificate
e700: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c file ", certfil
e710: 65 2c 20 22 3a 20 22 2c 0a 09 09 20 20 20 20 47 e, ": ",... G
e720: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
e730: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
e740: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
e750: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
e760: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 urn NULL;..}..Tc
e770: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
e780: 73 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 s);.. } else
e790: 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c if (cert != NULL
e7a0: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 ) {..load_privat
e7b0: 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 e_key = 1;..if (
e7c0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 SSL_CTX_use_cert
e7d0: 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 ificate_ASN1(ctx
e7e0: 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 , cert_len, cert
e7f0: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) <= 0) {.. T
e800: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e810: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
e820: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 to set certifica
e830: 74 65 3a 20 22 2c 0a 09 09 20 20 20 20 47 45 54 te: ",... GET
e840: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
e850: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 char *)NULL);..
e860: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
e870: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ctx);.. retur
e880: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d n NULL;..}. }
e890: 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c else {..certfil
e8a0: 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f e = (char*)X509_
e8b0: 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 get_default_cert
e8c0: 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 _file();...if (S
e8d0: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 SL_CTX_use_certi
e8e0: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c ficate_file(ctx,
e8f0: 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 certfile, SSL_F
e900: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 ILETYPE_PEM) <=
e910: 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 0) {.#if 0..
e920: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
e930: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
e940: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 to use default
e950: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 certificate file
e960: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a ", certfile, ":
e970: 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 ",... GET_ER
e980: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
e990: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
e9a0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
e9b0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
e9c0: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 ULL;.#endif..}.
e9d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 }.. /* set
e9e0: 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 our private key
e9f0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 */. if (load
ea00: 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a _private_key) {.
ea10: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 .if (keyfile ==
ea20: 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e NULL && key == N
ea30: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 ULL) {.. keyf
ea40: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
ea50: 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 .}...if (keyfile
ea60: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
ea70: 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 /* get the priv
ea80: 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 ate key associat
ea90: 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 ed with this cer
eaa0: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
eab0: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 if (keyfile ==
eac0: 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c NULL) {...keyfil
ead0: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 e = certfile;..
eae0: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 }... if (S
eaf0: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 SL_CTX_use_Priva
eb00: 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 teKey_file(ctx,
eb10: 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 F2N(keyfile, &ds
eb20: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ), SSL_FILETYPE_
eb30: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 PEM) <= 0) {...T
eb40: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
eb50: 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 ds);.../* flush
eb60: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 the passphrase w
eb70: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 hich might be le
eb80: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 ft in the result
eb90: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 */...Tcl_SetRes
eba0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c ult(interp, NULL
ebb0: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 , TCL_STATIC);..
ebc0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
ebd0: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
ebe0: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 e to set public
ebf0: 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 key file ", keyf
ec00: 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 47 45 54 ile, " ",....GET
ec10: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
ec20: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 char *)NULL);...
ec30: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
ec40: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
ec50: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
ec60: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
ec70: 73 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 s);..} else if (
ec80: 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 key != NULL) {..
ec90: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f if (SSL_CTX_
eca0: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 use_PrivateKey_A
ecb0: 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 SN1(EVP_PKEY_RSA
ecc0: 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c , ctx, key,key_l
ecd0: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a en) <= 0) {.../*
ece0: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
ecf0: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
ed00: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
ed10: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
ed20: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
ed30: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
ed40: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
ed50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ed60: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
ed70: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 public key: ", G
ed80: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
ed90: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
eda0: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
edb0: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
edc0: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f LL;.. }..}../
edd0: 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 * Now we know th
ede0: 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 at a key and cer
edf0: 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 t have been set
ee00: 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 against.. * the
ee10: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 SSL context */..
ee20: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 if (!SSL_CTX_che
ee30: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 ck_private_key(c
ee40: 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f tx)) {.. Tcl_
ee50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
ee60: 65 72 70 2c 0a 09 09 20 20 20 20 22 70 72 69 76 erp,... "priv
ee70: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 ate key does not
ee80: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 match the certi
ee90: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 ficate public ke
eea0: 79 22 2c 0a 09 09 20 20 20 20 28 63 68 61 72 20 y",... (char
eeb0: 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 *)NULL);.. SS
eec0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
eed0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
eee0: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 L;..}. }..
eef0: 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20 64 /* Set to use d
ef00: 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 efault location
ef10: 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65 72 and file for Cer
ef20: 74 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 tificate Authori
ef30: 74 79 20 28 43 41 29 20 63 65 72 74 69 66 69 63 ty (CA) certific
ef40: 61 74 65 73 2e 20 54 68 65 0a 20 20 20 20 20 2a ates. The. *
ef50: 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 verify path and
ef60: 20 73 74 6f 72 65 20 63 61 6e 20 62 65 20 6f 76 store can be ov
ef70: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 erridden by the
ef80: 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 SSL_CERT_DIR env
ef90: 20 76 61 72 2e 20 54 68 65 20 76 65 72 69 66 79 var. The verify
efa0: 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 20 20 2a file can. *
efb0: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 be overridden b
efc0: 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 y the SSL_CERT_F
efd0: 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a ILE env var. */.
efe0: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 if (!SSL_CTX
eff0: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 _set_default_ver
f000: 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 ify_paths(ctx))
f010: 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 {..abort++;.
f020: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 }.. /* Overri
f030: 64 65 73 20 66 6f 72 20 74 68 65 20 43 41 20 76 des for the CA v
f040: 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 66 erify path and f
f050: 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 ile */. {.#if
f060: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
f070: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
f080: 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61 74 0000L..if (CApat
f090: 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 h != NULL || CAf
f0a0: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile != NULL) {..
f0b0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
f0c0: 64 73 31 3b 0a 09 20 20 20 20 69 66 20 28 21 53 ds1;.. if (!S
f0d0: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 SL_CTX_load_veri
f0e0: 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 fy_locations(ctx
f0f0: 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 , F2N(CAfile, &d
f100: 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 s), F2N(CApath,
f110: 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 &ds1))) {...abor
f120: 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 t++;.. }..
f130: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
f140: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
f150: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 DStringFree(&ds1
f160: 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 );... /* Set
f170: 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 list of CAs to s
f180: 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 end to client wh
f190: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 en requesting a
f1a0: 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 client certifica
f1b0: 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 te */.. /* ht
f1c0: 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 tps://sourceforg
f1d0: 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 e.net/p/tls/bugs
f1e0: 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 /57/ */.. /*
f1f0: 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 XXX:TODO: Let th
f200: 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 e user supply va
f210: 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 lues here instea
f220: 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 d of something t
f230: 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 hat exists on th
f240: 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a e filesystem */.
f250: 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 . STACK_OF(X5
f260: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 09_NAME) *certNa
f270: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 mes = SSL_load_c
f280: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 lient_CA_file(F2
f290: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b N(CAfile, &ds));
f2a0: 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 .. if (certNa
f2b0: 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 mes != NULL) {..
f2c0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 .SSL_CTX_set_cli
f2d0: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c ent_CA_list(ctx,
f2e0: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 certNames);..
f2f0: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
f300: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
f310: 7d 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 41 }..#else..if (CA
f320: 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a path != NULL) {.
f330: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
f340: 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 X_load_verify_di
f350: 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 r(ctx, F2N(CApat
f360: 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 h, &ds))) {...ab
f370: 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 ort++;.. }..
f380: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
f390: 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 ee(&ds);..}..if
f3a0: 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 (CAfile != NULL)
f3b0: 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c {.. if (!SSL
f3c0: 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 _CTX_load_verify
f3d0: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 _file(ctx, F2N(C
f3e0: 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a Afile, &ds))) {.
f3f0: 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 ..abort++;..
f400: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
f410: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 ngFree(&ds);...
f420: 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f /* Set list o
f430: 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f f CAs to send to
f440: 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 client when req
f450: 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 uesting a client
f460: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
f470: 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 . STACK_OF(X5
f480: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 09_NAME) *certNa
f490: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 mes = SSL_load_c
f4a0: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 lient_CA_file(F2
f4b0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b N(CAfile, &ds));
f4c0: 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 .. if (certNa
f4d0: 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 mes != NULL) {..
f4e0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 .SSL_CTX_set_cli
f4f0: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c ent_CA_list(ctx,
f500: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 certNames);..
f510: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
f520: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
f530: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a }.#endif. }..
f540: 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a return ctx;.
f550: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
f560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
f5a0: 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 * StatusObjCmd
f5b0: 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 -- return certif
f5c0: 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 icate for connec
f5d0: 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 ted peer.. *. *
f5e0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
f5f0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
f600: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
f610: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
f620: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
f630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f660: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
f670: 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 tic int.StatusOb
f680: 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e jCmd(. TCL_UN
f690: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 USED(void *),.
f6a0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
f6b0: 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 terp,. int ob
f6c0: 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 jc,. Tcl_Obj.
f6d0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b *const objv[]).{
f6e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
f6f0: 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a ePtr;. X509 *
f700: 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 peer;. Tcl_Ob
f710: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 j *objPtr;. T
f720: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
f730: 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e . char *chann
f740: 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 elName, *ciphers
f750: 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a ;. int mode;.
f760: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
f770: 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a ed char *proto;.
f780: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
f790: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 len;. int ni
f7a0: 64 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 d, res;.. dpr
f7b0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
f7c0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
f7d0: 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 2 || objc > 3 ||
f7e0: 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 (objc == 3 && !
f7f0: 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 strcmp(Tcl_GetSt
f800: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 ring(objv[1]), "
f810: 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 -local"))) {..Tc
f820: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
f830: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
f840: 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 "?-local? channe
f850: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
f860: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
f870: 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d channelName =
f880: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
f890: 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f bjv[(objc == 2 ?
f8a0: 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 1 : 2)]);. c
f8b0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
f8c0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 nnel(interp, cha
f8d0: 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 nnelName, &mode)
f8e0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
f8f0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
f900: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
f910: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
f920: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d . /*. * M
f930: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
f940: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
f950: 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 st channel.
f960: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
f970: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
f980: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
f990: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
f9a0: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
f9b0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
f9c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
f9d0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
f9e0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
f9f0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
fa00: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 han),..."\": not
fa10: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
fa20: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
fa30: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
fa40: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
fa50: 20 22 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e "STATUS", "CHAN
fa60: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
fa70: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
fa80: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
fa90: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 R;. }. sta
faa0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
fab0: 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c ) Tcl_GetChannel
fac0: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
fad0: 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 n);.. /* Get
fae0: 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 certificate for
faf0: 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a peer or self */.
fb00: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
fb10: 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 2) {..peer = SSL
fb20: 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 _get_peer_certif
fb30: 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e icate(statePtr->
fb40: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ssl);. } else
fb50: 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 {..peer = SSL_g
fb60: 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 et_certificate(s
fb70: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
fb80: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 }. /* Get
fb90: 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 X509 certificate
fba0: 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 info */. if
fbb0: 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 (peer) {..objPtr
fbc0: 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 = Tls_NewX509Ob
fbd0: 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b j(interp, peer);
fbe0: 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 ..if (objc == 2)
fbf0: 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65 {.. X509_fre
fc00: 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65 e(peer);.. pe
fc10: 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 er = NULL;..}.
fc20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 } else {..objP
fc30: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
fc40: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 Obj(0, NULL);.
fc50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 }.. /* Peer
fc60: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 name */. LAP
fc70: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
fc80: 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 objPtr, "peerna
fc90: 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 me", SSL_get0_pe
fca0: 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d ername(statePtr-
fcb0: 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 >ssl), -1);.
fcc0: 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
fcd0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 rp, objPtr, "sbi
fce0: 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 ts", SSL_get_cip
fcf0: 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74 her_bits(statePt
fd00: 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a r->ssl, NULL));.
fd10: 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 . ciphers = (
fd20: 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 char*)SSL_get_ci
fd30: 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 pher(statePtr->s
fd40: 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 sl);. LAPPEND
fd50: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
fd60: 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 63 Ptr, "cipher", c
fd70: 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 iphers, -1);..
fd80: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 /* Verify the
fd90: 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 X509 certificate
fda0: 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 presented by th
fdb0: 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 e peer */. LA
fdc0: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
fdd0: 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 , objPtr, "verif
fde0: 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f yResult",..X509_
fdf0: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f verify_cert_erro
fe00: 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 r_string(SSL_get
fe10: 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 _verify_result(s
fe20: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 tatePtr->ssl)),
fe30: 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 -1);.. /* Ver
fe40: 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 ify mode */.
fe50: 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 mode = SSL_get_v
fe60: 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 erify_mode(state
fe70: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 Ptr->ssl);. i
fe80: 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 f (mode && SSL_V
fe90: 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c ERIFY_NONE) {..L
fea0: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
feb0: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 p, objPtr, "veri
fec0: 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c fyMode", "none",
fed0: 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 -1);. } else
fee0: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 {..Tcl_Obj *lis
fef0: 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 tObjPtr = Tcl_Ne
ff00: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
ff10: 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 );..if (mode &&
ff20: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29 SSL_VERIFY_PEER)
ff30: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
ff40: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
ff50: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a (interp, listObj
ff60: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
ff70: 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 ngObj("peer", -1
ff80: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 ));..}..if (mode
ff90: 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 && SSL_VERIFY_F
ffa0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 AIL_IF_NO_PEER_C
ffb0: 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ERT) {.. Tcl_
ffc0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
ffd0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
ffe0: 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
fff0: 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 StringObj("fail
10000 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22 if no peer cert"
10010 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
10020 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
10030 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 FY_CLIENT_ONCE)
10040 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
10050 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10060 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 interp, listObjP
10070 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
10080 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 gObj("client onc
10090 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 e", -1));..}..if
100a0 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
100b0 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 RIFY_POST_HANDSH
100c0 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f AKE) {.. Tcl_
100d0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
100e0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
100f0 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
10100 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 StringObj("post
10110 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 handshake", -1))
10120 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 ;..}..LAPPEND_OB
10130 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 J(interp, objPtr
10140 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 , "verifyMode",
10150 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 listObjPtr).
10160 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 }.. /* Verify
10170 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 mode depth */.
10180 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 LAPPEND_INT(i
10190 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
101a0 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 53 53 verifyDepth", SS
101b0 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70 L_get_verify_dep
101c0 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c th(statePtr->ssl
101d0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f ));.. /* Repo
101e0 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 rt the selected
101f0 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 protocol as a re
10200 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f sult of the nego
10210 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 tiation */. S
10220 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c SL_get0_alpn_sel
10230 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e ected(statePtr->
10240 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 ssl, &proto, &le
10250 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f n);. LAPPEND_
10260 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
10270 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 tr, "alpn", (cha
10280 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f r *)proto, (Tcl_
10290 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 Size) len);.
102a0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
102b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f rp, objPtr, "pro
102c0 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f tocol", SSL_get_
102d0 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 version(statePtr
102e0 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 ->ssl), -1);..
102f0 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e /* Valid for n
10300 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 on-RSA signature
10310 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a and TLS 1.3 */.
10320 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
10330 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 2) {..res = SSL_
10340 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 get_peer_signatu
10350 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d re_nid(statePtr-
10360 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 >ssl, &nid);.
10370 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
10380 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 SSL_get_signatu
10390 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d re_nid(statePtr-
103a0 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 >ssl, &nid);.
103b0 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 }. if (!res)
103c0 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 {nid = 0;}.
103d0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
103e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 rp, objPtr, "sig
103f0 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 natureHashAlgori
10400 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e thm", OBJ_nid2ln
10410 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 (nid), -1);..
10420 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
10430 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
10440 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f _peer_signature_
10450 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 type_nid(statePt
10460 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 r->ssl, &nid);.
10470 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 } else {..res
10480 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 = SSL_get_signa
10490 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 ture_type_nid(st
104a0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
104b0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 d);. }. if
104c0 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 (!res) {nid = 0
104d0 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 ;}. LAPPEND_S
104e0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
104f0 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 70 r, "signatureTyp
10500 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e e", OBJ_nid2ln(n
10510 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 id), -1);.. T
10520 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
10530 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
10540 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
10550 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
10560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
105a0 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f . *. * Connectio
105b0 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 nInfoObjCmd -- r
105c0 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e eturn connection
105d0 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 info from OpenS
105e0 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 SL.. *. * Result
105f0 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 s:. *.A list of
10600 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a connection info.
10610 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *----------
10620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10650 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
10660 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 tatic int Connec
10670 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 0a tionInfoObjCmd(.
10680 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 TCL_UNUSED(v
10690 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f oid *),. Tcl_
106a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a Interp *interp,.
106b0 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 int objc,.
106c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 Tcl_Obj *const
106d0 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 objv[]).{. T
106e0 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
106f0 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c ../* The channel
10700 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
10710 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a n */. State *
10720 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c statePtr;../* cl
10730 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 ient state for s
10740 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 sl socket */.
10750 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
10760 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 , *listPtr;.
10770 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a const SSL *ssl;.
10780 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 const SSL_CI
10790 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 PHER *cipher;.
107a0 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 const SSL_SESS
107b0 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 ION *session;.
107c0 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a const EVP_MD *
107d0 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a md;.. if (obj
107e0 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
107f0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
10800 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
10810 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
10820 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
10830 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
10840 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
10850 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
10860 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 ing(objv[1]), NU
10870 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
10880 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
10890 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
108a0 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
108b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b }.. /* Mak
108c0 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
108d0 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
108e0 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
108f0 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
10900 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
10910 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
10920 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
10930 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
10940 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
10950 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
10960 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
10970 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
10980 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
10990 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 "\": not a T
109a0 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
109b0 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f L);..Tcl_SetErro
109c0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
109d0 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e LS", "CONNECTION
109e0 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
109f0 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
10a00 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 )NULL);..return(
10a10 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
10a20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 }.. objPtr =
10a30 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
10a40 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a , NULL);.. /*
10a50 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f Connection info
10a60 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
10a70 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f = (State *)Tcl_
10a80 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
10a90 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 ceData(chan);.
10aa0 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72 ssl = statePtr
10ab0 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 ->ssl;. if (s
10ac0 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f sl != NULL) {../
10ad0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 * connection sta
10ae0 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 te */..LAPPEND_S
10af0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10b00 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 4c 5f r, "state", SSL_
10b10 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e state_string_lon
10b20 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f g(ssl), -1);.../
10b30 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 73 * Get SNI reques
10b40 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 ted server name
10b50 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
10b60 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10b70 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 "servername", SS
10b80 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 L_get_servername
10b90 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d (ssl, TLSEXT_NAM
10ba0 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
10bb0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
10bc0 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 protocol */..LAP
10bd0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10be0 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
10bf0 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 ol", SSL_get_ver
10c00 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a sion(ssl), -1);.
10c10 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 ../* Renegotiati
10c20 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c on allowed */..L
10c30 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
10c40 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e rp, objPtr, "ren
10c50 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 egotiation_allow
10c60 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 ed", SSL_get_sec
10c70 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f ure_renegotiatio
10c80 6e 5f 73 75 70 70 6f 72 74 28 28 53 53 4c 20 2a n_support((SSL *
10c90 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 ) ssl));.../* Ge
10ca0 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c t security level
10cb0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
10cc0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10cd0 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c "security_level
10ce0 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 ", SSL_get_secur
10cf0 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b ity_level(ssl));
10d00 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e .../* Session in
10d10 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 fo */..LAPPEND_B
10d20 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
10d30 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 tr, "session_reu
10d40 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f sed", SSL_sessio
10d50 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a n_reused(ssl));.
10d60 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 ../* Is server i
10d70 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f nfo */..LAPPEND_
10d80 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
10d90 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22 Ptr, "is_server"
10da0 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 , SSL_is_server(
10db0 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 ssl));.../* Is D
10dc0 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f TLS */..LAPPEND_
10dd0 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
10de0 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 Ptr, "is_dtls",
10df0 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 SSL_is_dtls(ssl)
10e00 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
10e10 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a Cipher info */.
10e20 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c cipher = SSL
10e30 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 _get_current_cip
10e40 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 her(ssl);. if
10e50 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c (cipher != NULL
10e60 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 ) {..char buf[BU
10e70 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e FSIZ] = {0};..in
10e80 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 t bits, alg_bits
10e90 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 ;.../* Cipher na
10ea0 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 me */..LAPPEND_S
10eb0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10ec0 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 4c r, "cipher", SSL
10ed0 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 _CIPHER_get_name
10ee0 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
10ef0 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 ./* RFC name of
10f00 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 cipher */..LAPPE
10f10 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
10f20 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 64 bjPtr, "standard
10f30 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 _name", SSL_CIPH
10f40 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
10f50 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
10f60 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 ./* OpenSSL name
10f70 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c of cipher */..L
10f80 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10f90 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e p, objPtr, "open
10fa0 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 ssl_name", OPENS
10fb0 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 SL_cipher_name(S
10fc0 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 SL_CIPHER_standa
10fd0 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 29 rd_name(cipher))
10fe0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 , -1);.../* numb
10ff0 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 74 er of secret bit
11000 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 65 s used for ciphe
11010 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c r */..bits = SSL
11020 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 _CIPHER_get_bits
11030 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 (cipher, &alg_bi
11040 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e ts);..LAPPEND_IN
11050 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
11060 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c , "secret_bits",
11070 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 bits);..LAPPEND
11080 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
11090 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f Ptr, "algorithm_
110a0 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 bits", alg_bits)
110b0 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 ;../* alg_bits i
110c0 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 s actual key sec
110d0 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 ret bits. If use
110e0 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 bits and secret
110f0 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 (algorithm) bit
11100 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68 s differ,.. th
11110 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 e rest of the bi
11120 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e ts are fixed, i.
11130 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 e. for limited e
11140 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 xport ciphers (b
11150 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f its < 56) */.../
11160 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 63 * Indicates whic
11170 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 h SSL/TLS protoc
11180 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 74 ol version first
11190 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 70 defined the cip
111a0 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
111b0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
111c0 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e tr, "min_version
111d0 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ", SSL_CIPHER_ge
111e0 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 t_version(cipher
111f0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 ), -1);.../* Cip
11200 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 her NID */..LAPP
11210 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11220 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e objPtr, "cipherN
11230 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
11240 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
11250 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 ER_get_cipher_ni
11260 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b d(cipher)), -1);
11270 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
11280 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 terp, objPtr, "d
11290 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72 igestNID", (char
112a0 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 *)OBJ_nid2ln(SS
112b0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67 L_CIPHER_get_dig
112c0 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29 est_nid(cipher))
112d0 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
112e0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
112f0 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65 tr, "keyExchange
11300 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 NID", (char *)OB
11310 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 J_nid2ln(SSL_CIP
11320 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 HER_get_kx_nid(c
11330 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c ipher)), -1);..L
11340 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11350 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 p, objPtr, "auth
11360 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 enticationNID",
11370 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 (char *)OBJ_nid2
11380 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ln(SSL_CIPHER_ge
11390 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65 t_auth_nid(ciphe
113a0 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d r)), -1);.../* m
113b0 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 essage authentic
113c0 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 ation code - Cip
113d0 68 65 72 20 69 73 20 41 45 41 44 20 28 65 2e 67 her is AEAD (e.g
113e0 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32 . GCM or ChaCha2
113f0 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 0/Poly1305) or n
11400 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e ot */../* Authen
11410 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 69 ticated Encrypti
11420 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 on with associat
11430 65 64 20 64 61 74 61 20 28 41 45 41 44 29 20 63 ed data (AEAD) c
11440 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 heck */..LAPPEND
11450 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
11460 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73 jPtr, "cipher_is
11470 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 _aead", SSL_CIPH
11480 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65 ER_is_aead(ciphe
11490 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74 r));.../* Digest
114a0 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 65 used during the
114b0 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 SSL/TLS handsha
114c0 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 ke when using th
114d0 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 e cipher. */..md
114e0 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 = SSL_CIPHER_ge
114f0 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 t_handshake_dige
11500 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 st(cipher);..LAP
11510 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11520 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 objPtr, "handsh
11530 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 68 ake_digest", (ch
11540 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 ar *)EVP_MD_name
11550 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 (md), -1);.../*
11560 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 Get OpenSSL-spec
11570 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e ific ID, not IAN
11580 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 A ID */..LAPPEND
11590 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
115a0 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 22 Ptr, "cipher_id"
115b0 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 , (int) SSL_CIPH
115c0 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 ER_get_id(cipher
115d0 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 ));.../* Two-byt
115e0 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 65 e ID used in the
115f0 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 TLS protocol of
11600 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 65 the given ciphe
11610 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e r */..LAPPEND_IN
11620 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
11630 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c , "protocol_id",
11640 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 (int) SSL_CIPHE
11650 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 R_get_protocol_i
11660 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a d(cipher));.../*
11670 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 Textual descrip
11680 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 tion of the ciph
11690 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 er */..if (SSL_C
116a0 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f IPHER_descriptio
116b0 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 n(cipher, buf, s
116c0 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e izeof(buf)) != N
116d0 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 ULL) {.. LAPP
116e0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
116f0 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70 objPtr, "descrip
11700 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b tion", buf, -1);
11710 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
11720 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a * Session info *
11730 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 /. session =
11740 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_get_session(
11750 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 ssl);. if (se
11760 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b ssion != NULL) {
11770 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
11780 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 char *ticket;..
11790 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e size_t len2;..un
117a0 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
117b0 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
117c0 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
117d0 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 d, *proto;..unsi
117e0 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65 72 gned char buffer
117f0 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f [SSL_MAX_MASTER_
11800 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f KEY_LENGTH];.../
11810 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c * Report the sel
11820 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
11830 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 s a result of th
11840 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 e ALPN negotiati
11850 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 on */..SSL_SESSI
11860 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c ON_get0_alpn_sel
11870 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 ected(session, &
11880 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 proto, &len2);..
11890 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
118a0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 rp, objPtr, "alp
118b0 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f n", (char *) pro
118c0 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c to, (Tcl_Size) l
118d0 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 en2);.../* Repor
118e0 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 t the selected p
118f0 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 rotocol as a res
11900 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e ult of the NPN n
11910 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 egotiation */.#i
11920 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 fdef USE_NPN..SS
11930 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 L_get0_next_prot
11940 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c o_negotiated(ssl
11950 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 , &proto, &ulen)
11960 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
11970 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11980 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 npn", (char *) p
11990 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 roto, (Tcl_Size)
119a0 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a ulen);.#endif..
119b0 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 ./* Resumable se
119c0 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e ssion */..LAPPEN
119d0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
119e0 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 6c bjPtr, "resumabl
119f0 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f e", SSL_SESSION_
11a00 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 is_resumable(ses
11a10 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 sion));.../* Ses
11a20 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20 sion start time
11a30 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 (seconds since e
11a40 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e poch) */..LAPPEN
11a50 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
11a60 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 69 6d jPtr, "start_tim
11a70 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f e", SSL_SESSION_
11a80 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e get_time(session
11a90 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 ));.../* Timeout
11aa0 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 value - SSL_CTX
11ab0 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e _get_timeout (in
11ac0 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 seconds) */..LA
11ad0 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
11ae0 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f , objPtr, "timeo
11af0 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e ut", SSL_SESSION
11b00 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 _get_timeout(ses
11b10 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 sion));.../* Ses
11b20 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e sion id - TLSv1.
11b30 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 2 and below only
11b40 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 */..session_id
11b50 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
11b60 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 t_id(session, &u
11b70 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 len);..LAPPEND_B
11b80 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
11b90 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 jPtr, "session_i
11ba0 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 d", session_id,
11bb0 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 (Tcl_Size) ulen)
11bc0 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 ;.../* Session c
11bd0 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 ontext */..sessi
11be0 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 on_id = SSL_SESS
11bf0 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 ION_get0_id_cont
11c00 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c ext(session, &ul
11c10 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 en);..LAPPEND_BA
11c20 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a RRAY(interp, obj
11c30 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f Ptr, "session_co
11c40 6e 74 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f ntext", session_
11c50 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 id, (Tcl_Size) u
11c60 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 len);.../* Sessi
11c70 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 on ticket - clie
11c80 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f nt only */..SSL_
11c90 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 SESSION_get0_tic
11ca0 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 ket(session, &ti
11cb0 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c cket, &len2);..L
11cc0 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e APPEND_BARRAY(in
11cd0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
11ce0 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 ession_ticket",
11cf0 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a ticket, (Tcl_Siz
11d00 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 e) len2);.../* S
11d10 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 ession ticket li
11d20 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 fetime hint (in
11d30 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 seconds) */..LAP
11d40 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
11d50 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 objPtr, "lifeti
11d60 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e me", SSL_SESSION
11d70 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 _get_ticket_life
11d80 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f time_hint(sessio
11d90 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 n));.../* Ticket
11da0 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 app data */.#if
11db0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
11dc0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
11dd0 30 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 0000L..SSL_SESSI
11de0 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 ON_get0_ticket_a
11df0 70 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 ppdata((SSL_SESS
11e00 49 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 ION *) session,
11e10 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b &ticket, &len2);
11e20 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
11e30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11e40 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 "ticket_app_dat
11e50 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c a", ticket, (Tcl
11e60 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 _Size) len2);.#e
11e70 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 ndif.../* Get ma
11e80 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e ster key */..len
11e90 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 2 = SSL_SESSION_
11ea0 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 get_master_key(s
11eb0 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 ession, buffer,
11ec0 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b SSL_MAX_MASTER_K
11ed0 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 EY_LENGTH);..LAP
11ee0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
11ef0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 rp, objPtr, "mas
11f00 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 ter_key", buffer
11f10 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
11f20 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 2);.../* Compres
11f30 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 sion id */..unsi
11f40 67 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 gned int id = SS
11f50 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f L_SESSION_get_co
11f60 6d 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f mpress_id(sessio
11f70 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 n);..LAPPEND_STR
11f80 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11f90 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 "compression_id
11fa0 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c ", id == 1 ? "zl
11fb0 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 ib" : "none", -1
11fc0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
11fd0 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 Compression inf
11fe0 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c o */. if (ssl
11ff0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 != NULL) {.#ifd
12000 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 ef HAVE_SSL_COMP
12010 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 RESSION..const C
12020 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 OMP_METHOD *comp
12030 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d , *expn;..comp =
12040 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 SSL_get_current
12050 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c _compression(ssl
12060 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 );..expn = SSL_g
12070 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e et_current_expan
12080 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 sion(ssl);...LAP
12090 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
120a0 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 objPtr, "compre
120b0 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 ssion", comp ? S
120c0 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 SL_COMP_get_name
120d0 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c (comp) : "none",
120e0 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
120f0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12100 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 r, "expansion",
12110 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f expn ? SSL_COMP_
12120 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a get_name(expn) :
12130 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 "none", -1);.#e
12140 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 lse..LAPPEND_STR
12150 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12160 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 "compression",
12170 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 "none", -1);..LA
12180 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12190 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e , objPtr, "expan
121a0 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d sion", "none", -
121b0 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 1);.#endif. }
121c0 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 .. /* Server
121d0 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c info */. {..l
121e0 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 ong mode = SSL_C
121f0 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 TX_get_session_c
12200 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 ache_mode(stateP
12210 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 tr->ctx);..char
12220 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 *msg;...if (mode
12230 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
12240 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 E_OFF) {.. ms
12250 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c g = "off";..} el
12260 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
12270 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 L_SESS_CACHE_CLI
12280 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 ENT) {.. msg
12290 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 = "client";..} e
122a0 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 lse if (mode & S
122b0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 SL_SESS_CACHE_SE
122c0 52 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 RVER) {.. msg
122d0 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 = "server";..}
122e0 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 else if (mode &
122f0 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 SSL_SESS_CACHE_B
12300 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 OTH) {.. msg
12310 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 = "both";..} els
12320 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 e {.. msg = "
12330 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 unknown";..}..LA
12340 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12350 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 , objPtr, "sessi
12360 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 on_cache_mode",
12370 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a msg, -1);. }.
12380 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 . /* CA List
12390 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 */. /* IF not
123a0 20 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 a server, same
123b0 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 as SSL_get0_peer
123c0 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 _CA_list. If ser
123d0 76 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f ver same as SSL_
123e0 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 CTX_get_client_C
123f0 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 A_list */. li
12400 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c stPtr = Tcl_NewL
12410 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
12420 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 . STACK_OF(X5
12430 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 09_NAME) *ca_lis
12440 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c t;. if ((ca_l
12450 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c ist = SSL_get_cl
12460 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c ient_CA_list(ssl
12470 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 )) != NULL) {..c
12480 68 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 har buffer[BUFSI
12490 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 Z];..for (int i
124a0 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 = 0; i < sk_X509
124b0 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 _NAME_num(ca_lis
124c0 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 t); i++) {..
124d0 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 X509_NAME *name
124e0 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 = sk_X509_NAME_v
124f0 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 alue(ca_list, i)
12500 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 ;.. if (name)
12510 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f {...X509_NAME_o
12520 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 neline(name, buf
12530 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 fer, BUFSIZ);...
12540 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
12550 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
12560 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 listPtr, Tcl_Ne
12570 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 wStringObj(buffe
12580 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a r, -1));.. }.
12590 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 .}. }. LAP
125a0 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c PEND_OBJ(interp,
125b0 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 objPtr, "caList
125c0 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 ", listPtr);.
125d0 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 LAPPEND_INT(int
125e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 erp, objPtr, "ca
125f0 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 ListCount", sk_X
12600 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 509_NAME_num(ca_
12610 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c list));.. Tcl
12620 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
12630 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
12640 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
12650 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
12660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
126a0 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 *. * VersionObjC
126b0 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 md -- return ver
126c0 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d sion string from
126d0 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 OpenSSL.. *. *
126e0 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
126f0 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
12700 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
12710 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
12720 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
12730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12760 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
12770 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f tic int.VersionO
12780 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 bjCmd(. TCL_U
12790 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 NUSED(void *),.
127a0 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
127b0 6e 74 65 72 70 2c 0a 20 20 20 20 54 43 4c 5f 55 nterp,. TCL_U
127c0 4e 55 53 45 44 28 69 6e 74 29 20 2f 2a 20 6f 62 NUSED(int) /* ob
127d0 6a 63 20 2a 2f 2c 0a 20 20 20 20 54 43 4c 5f 55 jc */,. TCL_U
127e0 4e 55 53 45 44 28 54 63 6c 5f 4f 62 6a 20 2a 63 NUSED(Tcl_Obj *c
127f0 6f 6e 73 74 20 2a 29 20 2f 2a 20 6f 62 6a 76 20 onst *) /* objv
12800 2a 2f 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 */).{. Tcl_Ob
12810 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 j *objPtr;..
12820 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
12830 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d );.. objPtr =
12840 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
12850 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f j(OPENSSL_VERSIO
12860 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 0a 20 20 N_TEXT, -1);..
12870 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
12880 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
12890 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
128a0 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
128b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
128c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
128d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
128e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
128f0 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 ---. *. * MiscOb
12900 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d jCmd -- misc com
12910 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 mands. *. * Resu
12920 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
12930 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
12940 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
12950 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
12960 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
12970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129a0 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
129b0 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 0a int.MiscObjCmd(.
129c0 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 TCL_UNUSED(v
129d0 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f oid *),. Tcl_
129e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a Interp *interp,.
129f0 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 int objc,.
12a00 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e 73 74 Tcl_Obj.*const
12a10 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 73 objv[]).{. s
12a20 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
12a30 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 *commands [] =
12a40 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 { "req", "strreq
12a50 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 ", NULL };. e
12a60 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f num command { C_
12a70 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 REQ, C_STRREQ, C
12a80 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 _DUMMY };. Tc
12a90 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 l_Size cmd;.
12aa0 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 int isStr;. c
12ab0 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 har buffer[16384
12ac0 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ];.. dprintf(
12ad0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
12ae0 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a if (objc < 2) {.
12af0 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
12b00 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
12b10 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f v, "subcommand ?
12b20 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e args?");..return
12b30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
12b40 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 }. if (Tcl_Ge
12b50 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e tIndexFromObj(in
12b60 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 terp, objv[1], c
12b70 6f 6d 6d 61 6e 64 73 2c 0a 09 20 20 20 20 22 63 ommands,.. "c
12b80 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29 ommand", 0,&cmd)
12b90 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
12ba0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
12bb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
12bc0 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
12bd0 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 isStr = (cmd
12be0 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 == C_STRREQ);.
12bf0 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d switch ((enum
12c00 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b command) cmd) {
12c10 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 ..case C_REQ:..c
12c20 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a ase C_STRREQ: {.
12c30 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 . EVP_PKEY *p
12c40 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 key=NULL;.. X
12c50 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 509 *cert=NULL;.
12c60 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a . X509_NAME *
12c70 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 name=NULL;..
12c80 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b Tcl_Obj **listv;
12c90 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c .. Tcl_Size l
12ca0 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 istc,i;... BI
12cb0 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 O *out=NULL;...
12cc0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b const char *k
12cd0 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a _C="",*k_ST="",*
12ce0 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a k_L="",*k_O="",*
12cf0 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 k_OU="",*k_CN=""
12d00 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 ,*k_Email="";..
12d10 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c char *keyout,
12d20 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 *pemout,*str;..
12d30 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 int keysize,s
12d40 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 erial=0,days=365
12d50 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 ;..#if OPENSSL_V
12d60 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
12d70 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 0x30000000L..
12d80 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e BIGNUM *bne = N
12d90 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 ULL;.. RSA *r
12da0 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 sa = NULL;.#else
12db0 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 .. EVP_PKEY_C
12dc0 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a TX *ctx = NULL;.
12dd0 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 #endif... if
12de0 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 ((objc<5) || (ob
12df0 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 jc>6)) {...Tcl_W
12e00 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
12e10 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 rp, 2, objv, "ke
12e20 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 ysize keyfile ce
12e30 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b rtfile ?info?");
12e40 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
12e50 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ROR;.. }...
12e60 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 if (Tcl_GetInt
12e70 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
12e80 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a objv[2], &keysiz
12e90 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a e) != TCL_OK) {.
12ea0 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
12eb0 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 OR;.. }..
12ec0 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 keyout=Tcl_GetSt
12ed0 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 ring(objv[3]);..
12ee0 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 pemout=Tcl_G
12ef0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d etString(objv[4]
12f00 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 );.. if (isSt
12f10 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 r) {...Tcl_SetVa
12f20 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c r(interp,keyout,
12f30 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 "",0);...Tcl_Set
12f40 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 Var(interp,pemou
12f50 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a t,"",0);.. }.
12f60 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d .. if (objc>=
12f70 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 6) {...if (Tcl_L
12f80 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 istObjGetElement
12f90 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 s(interp, objv[5
12fa0 5d 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 ], &listc, &list
12fb0 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a v) != TCL_OK) {.
12fc0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
12fd0 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 _ERROR;...}....i
12fe0 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 f ((listc%2) !=
12ff0 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 0) {... Tcl_S
13000 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
13010 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 "Information lis
13020 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e t must have even
13030 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d number of argum
13040 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ents",NULL);...
13050 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
13060 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 ROR;...}...for (
13070 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b i=0; i<listc; i+
13080 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d =2) {... str=
13090 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
130a0 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 stv[i]);... i
130b0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 f (strcmp(str,"d
130c0 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 ays")==0) {....i
130d0 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
130e0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 mObj(interp,list
130f0 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 v[i+1],&days)!=T
13100 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 CL_OK).... re
13110 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
13120 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
13130 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 (strcmp(str,"ser
13140 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 ial")==0) {....i
13150 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
13160 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 mObj(interp,list
13170 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 v[i+1],&serial)!
13180 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 =TCL_OK)....
13190 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
131a0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
131b0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
131c0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d ")==0) {....k_C=
131d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
131e0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
131f0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
13200 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 mp(str,"ST")==0)
13210 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 {....k_ST=Tcl_G
13220 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
13230 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
13240 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
13250 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 r,"L")==0) {....
13260 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e k_L=Tcl_GetStrin
13270 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
13280 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
13290 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d strcmp(str,"O")=
132a0 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c =0) {....k_O=Tcl
132b0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
132c0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
132d0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
132e0 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a str,"OU")==0) {.
132f0 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 ...k_OU=Tcl_GetS
13300 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13310 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
13320 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
13330 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f CN")==0) {....k_
13340 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 CN=Tcl_GetString
13350 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
13360 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
13370 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c trcmp(str,"Email
13380 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d ")==0) {....k_Em
13390 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e ail=Tcl_GetStrin
133a0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
133b0 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
133c0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
133d0 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 nterp,"Unknown p
133e0 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b arameter",NULL);
133f0 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ....return TCL_E
13400 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 RROR;... }...
13410 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 }.. }..#if OP
13420 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
13430 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
13440 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 0L.. bne = BN
13450 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 _new();.. rsa
13460 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 = RSA_new();..
13470 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b pkey = EVP_PK
13480 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 EY_new();.. i
13490 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c f (bne == NULL |
134a0 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c | rsa == NULL ||
134b0 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c pkey == NULL ||
134c0 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e !BN_set_word(bn
134d0 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 e,RSA_F4) ||...!
134e0 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 RSA_generate_key
134f0 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 _ex(rsa, keysize
13500 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 , bne, NULL) ||
13510 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e !EVP_PKEY_assign
13520 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 _RSA(pkey, rsa))
13530 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 {...EVP_PKEY_fr
13540 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 ee(pkey);.../* R
13550 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 SA_free(rsa); fr
13560 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f eed by EVP_PKEY_
13570 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 free */...BN_fre
13580 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 e(bne);.#else..
13590 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 pkey = EVP_RS
135a0 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 A_gen((unsigned
135b0 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 int) keysize);..
135c0 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b ctx = EVP_PK
135d0 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c EY_CTX_new(pkey,
135e0 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 NULL);.. if (
135f0 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 pkey == NULL ||
13600 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 ctx == NULL || !
13610 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f EVP_PKEY_keygen_
13620 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 init(ctx) ||...!
13630 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 EVP_PKEY_CTX_set
13640 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 _rsa_keygen_bits
13650 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c (ctx, keysize) |
13660 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 | !EVP_PKEY_keyg
13670 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 en(ctx, &pkey))
13680 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 {...EVP_PKEY_fre
13690 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 e(pkey);...EVP_P
136a0 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 KEY_CTX_free(ctx
136b0 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f );.#endif...Tcl_
136c0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
136d0 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 ,"Error generati
136e0 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c ng private key",
136f0 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 NULL);...return
13700 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
13710 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 } else {...if (i
13720 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 sStr) {... ou
13730 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
13740 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 mem());... PE
13750 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 M_write_bio_Priv
13760 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c ateKey(out,pkey,
13770 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c NULL,NULL,0,NULL
13780 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d ,NULL);... i=
13790 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 BIO_read(out,buf
137a0 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 fer,sizeof(buffe
137b0 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 r)-1);... i=(
137c0 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 i<0) ? 0 : i;...
137d0 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c buffer[i]='\
137e0 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 0';... Tcl_Se
137f0 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f tVar(interp,keyo
13800 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 ut,buffer,0);...
13810 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 BIO_flush(ou
13820 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 t);... BIO_fr
13830 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 ee(out);...} els
13840 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 e {... out=BI
13850 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 O_new(BIO_s_file
13860 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 ());... BIO_w
13870 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 rite_filename(ou
13880 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 t,keyout);...
13890 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 PEM_write_bio_P
138a0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b rivateKey(out,pk
138b0 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e ey,NULL,NULL,0,N
138c0 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ULL,NULL);...
138d0 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 /* PEM_write_bi
138e0 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 o_RSAPrivateKey(
138f0 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 out, rsa, NULL,
13900 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e NULL, 0, NULL, N
13910 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 ULL); */... B
13920 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 IO_free_all(out)
13930 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 ;.. .}....if ((c
13940 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d ert=X509_new())=
13950 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 =NULL) {... T
13960 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
13970 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 erp,"Error gener
13980 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 ating certificat
13990 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 e request",NULL)
139a0 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 ;... EVP_PKEY
139b0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 _free(pkey);.#if
139c0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
139d0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
139e0 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 0000L... BN_f
139f0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 ree(bne);.#endif
13a00 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 ... return(TC
13a10 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 L_ERROR);...}...
13a20 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f .X509_set_versio
13a30 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e n(cert,2);...ASN
13a40 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 1_INTEGER_set(X5
13a50 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 09_get_serialNum
13a60 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c ber(cert),serial
13a70 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 );...X509_gmtime
13a80 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e _adj(X509_getm_n
13a90 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 otBefore(cert),0
13aa0 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 );...X509_gmtime
13ab0 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e _adj(X509_getm_n
13ac0 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c otAfter(cert),(l
13ad0 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 ong)60*60*24*day
13ae0 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 s);...X509_set_p
13af0 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 ubkey(cert,pkey)
13b00 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 ;....name=X509_g
13b10 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 et_subject_name(
13b20 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e cert);....X509_N
13b30 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
13b40 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d _txt(name,"C", M
13b50 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e BSTRING_ASC, (un
13b60 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
13b70 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _C, -1, -1, 0);.
13b80 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
13b90 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
13ba0 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 e,"ST", MBSTRING
13bb0 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 _ASC, (unsigned
13bc0 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 char *) k_ST, -1
13bd0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
13be0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
13bf0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c by_txt(name,"L",
13c00 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
13c10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
13c20 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_L, -1, -1, 0)
13c30 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
13c40 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
13c50 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e ame,"O", MBSTRIN
13c60 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 G_ASC, (unsigned
13c70 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 char *) k_O, -1
13c80 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
13c90 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
13ca0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 by_txt(name,"OU"
13cb0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
13cc0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
13cd0 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_OU, -1, -1,
13ce0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
13cf0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
13d00 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 (name,"CN", MBST
13d10 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 RING_ASC, (unsig
13d20 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e ned char *) k_CN
13d30 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
13d40 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
13d50 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
13d60 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e "Email", MBSTRIN
13d70 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 G_ASC, (unsigned
13d80 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c char *) k_Email
13d90 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 , -1, -1, 0);...
13da0 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 .X509_set_subjec
13db0 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 t_name(cert,name
13dc0 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f );....if (!X509_
13dd0 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 sign(cert,pkey,E
13de0 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a VP_sha256())) {.
13df0 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 .. X509_free(
13e00 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 cert);... EVP
13e10 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
13e20 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
13e30 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
13e40 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
13e50 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
13e60 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f endif... Tcl_
13e70 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
13e80 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 ,"Error signing
13e90 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c certificate",NUL
13ea0 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e L);... return
13eb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a TCL_ERROR;...}.
13ec0 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a ...if (isStr) {.
13ed0 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
13ee0 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a w(BIO_s_mem());.
13ef0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
13f00 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 bio_X509(out,cer
13f10 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f t);... i=BIO_
13f20 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c read(out,buffer,
13f30 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 sizeof(buffer)-1
13f40 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 );... i=(i<0)
13f50 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 ? 0 : i;...
13f60 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a buffer[i]='\0';.
13f70 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 .. Tcl_SetVar
13f80 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 (interp,pemout,b
13f90 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 uffer,0);...
13fa0 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a BIO_flush(out);.
13fb0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f .. BIO_free(o
13fc0 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a ut);...} else {.
13fd0 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
13fe0 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b w(BIO_s_file());
13ff0 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 ... BIO_write
14000 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 _filename(out,pe
14010 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d mout);... PEM
14020 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 _write_bio_X509(
14030 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 out,cert);...
14040 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 BIO_free_all(ou
14050 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f t);...}....X509_
14060 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 free(cert);...EV
14070 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
14080 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 );.#if OPENSSL_V
14090 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
140a0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 0x30000000L...BN
140b0 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
140c0 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 if.. }..}..br
140d0 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 eak;. default
140e0 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a :..break;. }.
140f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
14100 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
14110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
14150 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d *. * Tls_Free -
14160 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
14170 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 cedure cleans up
14180 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b when a SSL sock
14190 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
141a0 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e . *.is closed an
141b0 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 d its reference
141c0 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f count falls belo
141d0 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 w 1. *. * Result
141e0 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.none. *. *
141f0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
14200 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 *.Frees all the
14210 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d state. *. *-----
14220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
14260 2a 2f 0a 76 6f 69 64 0a 23 69 66 20 54 43 4c 5f */.void.#if TCL_
14270 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20 MAJOR_VERSION >
14280 38 0a 54 6c 73 5f 46 72 65 65 28 20 76 6f 69 64 8.Tls_Free( void
14290 20 2a 62 6c 6f 63 6b 50 74 72 20 29 0a 23 65 6c *blockPtr ).#el
142a0 73 65 0a 54 6c 73 5f 46 72 65 65 28 20 63 68 61 se.Tls_Free( cha
142b0 72 20 2a 62 6c 6f 63 6b 50 74 72 20 29 0a 23 65 r *blockPtr ).#e
142c0 6e 64 69 66 0a 7b 0a 20 20 20 20 53 74 61 74 65 ndif.{. State
142d0 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
142e0 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a ate *)blockPtr;.
142f0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
14300 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 lled");.. Tls
14310 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 _Clean(statePtr)
14320 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f ;. ckfree(blo
14330 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ckPtr);.}.../*.
14340 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
14350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14380 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 ----. *. * Tls_C
14390 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 lean --. *. *.Th
143a0 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 is procedure cle
143b0 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 ans up when a SS
143c0 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
143d0 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f hannel. *.is clo
143e0 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 sed and its refe
143f0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c rence count fall
14400 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 s below 1. This
14410 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 should. *.be ca
14420 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 lled synchronous
14430 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 ly by the CloseP
14440 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a roc, not in the.
14450 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 *.EventuallyFre
14460 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 e callback.. *.
14470 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f * Results:. *.no
14480 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
14490 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 fects:. *.Frees
144a0 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a all the state. *
144b0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
144c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144f0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 ------. */.void
14500 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 Tls_Clean(State
14510 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 *statePtr) {.
14520 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
14530 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 ");.. /*.
14540 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e * we're assumin
14550 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72 g here that we'r
14560 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 e single-threade
14570 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 d. */. if
14580 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 (statePtr->time
14590 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 r != (Tcl_TimerT
145a0 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 oken) NULL) {..T
145b0 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 cl_DeleteTimerHa
145c0 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e ndler(statePtr->
145d0 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 timer);..statePt
145e0 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b r->timer = NULL;
145f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
14600 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
14610 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 ) {..ckfree(stat
14620 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 ePtr->protos);..
14630 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
14640 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
14650 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
14660 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 >bio) {../* This
14670 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 will call SSL_s
14680 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 hutdown. Bug 141
14690 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 4045 */..dprintf
146a0 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 ("BIO_free_all(%
146b0 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 p)", statePtr->b
146c0 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 io);..BIO_free_a
146d0 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ll(statePtr->bio
146e0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 );..statePtr->bi
146f0 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a o = NULL;. }.
14700 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
14710 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 ->ssl) {..dprint
14720 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 f("SSL_free(%p)"
14730 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 , statePtr->ssl)
14740 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 ;..SSL_free(stat
14750 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 ePtr->ssl);..sta
14760 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c tePtr->ssl = NUL
14770 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
14780 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 (statePtr->ctx)
14790 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 {..SSL_CTX_free(
147a0 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
147b0 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d .statePtr->ctx =
147c0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
147d0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
147e0 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f allback) {..Tcl_
147f0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
14800 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
14810 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c ;..statePtr->cal
14820 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 lback = NULL;.
14830 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
14840 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 ePtr->password)
14850 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f {..Tcl_DecrRefCo
14860 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 unt(statePtr->pa
14870 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 ssword);..stateP
14880 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e tr->password = N
14890 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
148a0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d f (statePtr->vcm
148b0 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 d) {..Tcl_DecrRe
148c0 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
148d0 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 >vcmd);..statePt
148e0 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a r->vcmd = NULL;.
148f0 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
14900 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b tf("Returning");
14910 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
14920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
14960 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a . * Tls_Init --.
14970 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 *. *.This is a
14980 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 package initiali
14990 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 zation procedure
149a0 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 , which is calle
149b0 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e d. *.by Tcl when
149c0 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 this package is
149d0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 to be added to
149e0 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a an interpreter..
149f0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 *. * Results:
14a00 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 Ssl configured a
14a10 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 nd loaded. *. *
14a20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
14a30 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c . create the ssl
14a40 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 command, initia
14a50 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 lize ssl context
14a60 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
14a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 ---------. */..#
14ab0 69 66 6e 64 65 66 20 53 54 52 49 4e 47 49 46 59 ifndef STRINGIFY
14ac0 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49 4e .# define STRIN
14ad0 47 49 46 59 28 78 29 20 53 54 52 49 4e 47 49 46 GIFY(x) STRINGIF
14ae0 59 31 28 78 29 0a 23 20 20 64 65 66 69 6e 65 20 Y1(x).# define
14af0 53 54 52 49 4e 47 49 46 59 31 28 78 29 20 23 78 STRINGIFY1(x) #x
14b00 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 .#endif..static
14b10 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 const char tlsTc
14b20 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 lInitScript[] =
14b30 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e {.#include "tls.
14b40 74 63 6c 2e 68 22 0a 20 20 20 20 30 78 30 30 0a tcl.h". 0x00.
14b50 7d 3b 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e };..DLLEXPORT in
14b60 74 20 54 6c 73 5f 49 6e 69 74 28 0a 20 20 20 20 t Tls_Init(.
14b70 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
14b80 72 70 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 6d rp).{. Tcl_Cm
14b90 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 dInfo info;..
14ba0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
14bb0 22 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 ");.../*.. * We
14bc0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 54 63 6c only support Tcl
14bd0 20 38 2e 36 20 6f 72 20 6e 65 77 65 72 0a 09 20 8.6 or newer..
14be0 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 */. if (Tcl_I
14bf0 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c nitStubs(interp,
14c00 20 22 38 2e 36 2d 22 2c 20 30 29 20 3d 3d 20 4e "8.6-", 0) == N
14c10 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
14c20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
14c30 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 . if (TlsLibI
14c40 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b nit(0) != TCL_OK
14c50 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
14c60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 esult(interp, "c
14c70 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c ould not initial
14c80 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 ize SSL library"
14c90 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
14ca0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
14cb0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
14cc0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
14cd0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
14ce0 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 ::ciphers", Ciph
14cf0 65 72 73 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c ersObjCmd, NULL,
14d00 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 0);. Tcl_Cre
14d10 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
14d20 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e terp, "tls::conn
14d30 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 ection", Connect
14d40 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 4e ionInfoObjCmd, N
14d50 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c ULL, 0);. Tcl
14d60 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
14d70 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
14d80 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 handshake", Hand
14d90 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 4e 55 4c shakeObjCmd, NUL
14da0 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 L, 0);. Tcl_C
14db0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
14dc0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d interp, "tls::im
14dd0 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a port", ImportObj
14de0 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 Cmd, NULL, 0);.
14df0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
14e00 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
14e10 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c "tls::unimport",
14e20 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c UnimportObjCmd,
14e30 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 NULL, 0);. T
14e40 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
14e50 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
14e60 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 ::status", Statu
14e70 73 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 sObjCmd, NULL, 0
14e80 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
14e90 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
14ea0 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f rp, "tls::versio
14eb0 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d n", VersionObjCm
14ec0 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 d, NULL, 0);.
14ed0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
14ee0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
14ef0 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f ls::misc", MiscO
14f00 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b bjCmd, NULL, 0);
14f10 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
14f20 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
14f30 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c , "tls::protocol
14f40 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a s", ProtocolsObj
14f50 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a Cmd, NULL, 0);..
14f60 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 if (interp)
14f70 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c 28 {..if (Tcl_Eval(
14f80 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e interp, tlsTclIn
14f90 69 74 53 63 72 69 70 74 29 20 21 3d 20 54 43 4c itScript) != TCL
14fa0 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 _OK) {.. retu
14fb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
14fc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
14fd0 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e Tcl_GetCommandIn
14fe0 66 6f 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 63 fo(interp, "::tc
14ff0 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 l::build-info",
15000 26 69 6e 66 6f 29 29 20 7b 0a 09 54 63 6c 5f 43 &info)) {..Tcl_C
15010 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
15020 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a interp, "::tls::
15030 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 0a 09 09 69 build-info",...i
15040 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f nfo.objProc, (vo
15050 69 64 20 2a 29 28 0a 09 09 20 20 20 20 50 41 43 id *)(... PAC
15060 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 KAGE_VERSION "+"
15070 20 53 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 STRINGIFY(TLS_V
15080 45 52 53 49 4f 4e 5f 55 55 49 44 29 0a 09 09 09 ERSION_UUID)....
15090 20 20 20 20 22 2e 62 6f 68 61 67 61 6e 22 0a 23 ".bohagan".#
150a0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 if defined(__cla
150b0 6e 67 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 ng__) && defined
150c0 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f (__clang_major__
150d0 29 0a 09 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 ).... ".clang
150e0 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 -" STRINGIFY(__c
150f0 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 lang_major__).#i
15100 66 20 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f f __clang_minor_
15110 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 _ < 10.... "0
15120 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 ".#endif....
15130 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e STRINGIFY(__clan
15140 67 5f 6d 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 g_minor__).#endi
15150 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f f.#if defined(__
15160 63 70 6c 75 73 70 6c 75 73 29 20 26 26 20 21 64 cplusplus) && !d
15170 65 66 69 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 efined(__OBJC__)
15180 0a 09 09 09 20 20 20 20 22 2e 63 70 6c 75 73 70 .... ".cplusp
15190 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e lus".#endif.#ifn
151a0 64 65 66 20 4e 44 45 42 55 47 0a 09 09 09 20 20 def NDEBUG....
151b0 20 20 22 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 ".debug".#endi
151c0 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f f.#if !defined(_
151d0 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 _clang__) && !de
151e0 66 69 6e 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f fined(__INTEL_CO
151f0 4d 50 49 4c 45 52 29 20 26 26 20 64 65 66 69 6e MPILER) && defin
15200 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 ed(__GNUC__)....
15210 20 20 20 20 22 2e 67 63 63 2d 22 20 53 54 52 49 ".gcc-" STRI
15220 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a NGIFY(__GNUC__).
15230 23 69 66 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 #if __GNUC_MINOR
15240 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 __ < 10.... "
15250 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 0".#endif....
15260 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 STRINGIFY(__GNU
15270 43 5f 4d 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 C_MINOR__).#endi
15280 66 0a 23 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c f.#ifdef __INTEL
15290 5f 43 4f 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 _COMPILER....
152a0 20 22 2e 69 63 63 2d 22 20 53 54 52 49 4e 47 49 ".icc-" STRINGI
152b0 46 59 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 FY(__INTEL_COMPI
152c0 4c 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 LER).#endif.#ifd
152d0 65 66 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 ef TCL_MEM_DEBUG
152e0 0a 09 09 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 .... ".memdeb
152f0 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 ug".#endif.#if d
15300 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 efined(_MSC_VER)
15310 0a 09 09 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 .... ".msvc-"
15320 20 53 54 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f STRINGIFY(_MSC_
15330 56 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 VER).#endif.#ifd
15340 65 66 20 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 ef USE_NMAKE....
15350 20 20 20 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e ".nmake".#en
15360 64 69 66 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f dif.#ifndef TCL_
15370 43 46 47 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 CFG_OPTIMIZED...
15380 09 20 20 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 . ".no-optimi
15390 7a 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 ze".#endif.#ifde
153a0 66 20 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 f __OBJC__....
153b0 20 20 22 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 ".objective-c"
153c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 .#if defined(__c
153d0 70 6c 75 73 70 6c 75 73 29 0a 09 09 09 20 20 20 plusplus)....
153e0 20 22 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 "plusplus".#end
153f0 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 if.#endif.#ifdef
15400 20 54 43 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 TCL_CFG_PROFILE
15410 44 0a 09 09 09 20 20 20 20 22 2e 70 72 6f 66 69 D.... ".profi
15420 6c 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 le".#endif.#ifde
15430 66 20 50 55 52 49 46 59 0a 09 09 09 20 20 20 20 f PURIFY....
15440 22 2e 70 75 72 69 66 79 22 0a 23 65 6e 64 69 66 ".purify".#endif
15450 0a 23 69 66 64 65 66 20 53 54 41 54 49 43 5f 42 .#ifdef STATIC_B
15460 55 49 4c 44 0a 09 09 09 20 20 20 20 22 2e 73 74 UILD.... ".st
15470 61 74 69 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 atic".#endif...)
15480 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a , NULL);. }..
15490 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 return Tcl_P
154a0 6b 67 50 72 6f 76 69 64 65 45 78 28 69 6e 74 65 kgProvideEx(inte
154b0 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 rp, PACKAGE_NAME
154c0 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f , PACKAGE_VERSIO
154d0 4e 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a N, NULL);.}../*.
154e0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
154f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15510 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
15520 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a Tls_SafeInit --.
15530 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.----------
15540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15560 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 ------*. *.Stand
15570 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 ard procedure re
15580 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 quired by 'load'
15590 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 .. *.Initializes
155a0 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 this extension
155b0 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 for a safe inter
155c0 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d preter.. *.-----
155d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
155f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
15600 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a *.Side effects:
15610 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f . *..As of 'Tls_
15620 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 Init'. *. *.Resu
15630 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 lt:. *..A standa
15640 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 rd Tcl error cod
15650 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
15660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
15690 20 2a 2f 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 */..DLLEXPORT i
156a0 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 nt Tls_SafeInit(
156b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
156c0 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 rp) {. dprint
156d0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 f("Called");.
156e0 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 return(Tls_Init
156f0 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a (interp));.}../*
15700 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
15710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a ---------*. *. *
15740 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 .TlsLibInit --.
15750 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.-----------
15760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15780 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 -----*. *.Initia
15790 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 lizes SSL librar
157a0 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 y once per appli
157b0 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d cation. *.------
157c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
157e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
157f0 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a *.Side effects:.
15800 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 *..initializes
15810 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 SSL library. *.
15820 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f *.Result:. *..no
15830 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ne. *. *--------
15840 2d 2d 2d 2d 2d 2d 2d 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 2a 0a --------------*.
15870 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 */.static int T
15880 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e lsLibInit(int un
15890 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 initialize) {.
158a0 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 static int ini
158b0 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 tialized = 0;.
158c0 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 int status = T
158d0 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e CL_OK;.#if defin
158e0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
158f0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
15900 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 CL_THREADS).
15910 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 size_t num_locks
15920 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 ;.#endif.. if
15930 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 (uninitialize)
15940 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69 {..if (!initiali
15950 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69 zed) {.. dpri
15960 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e ntf("Asked to un
15970 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 initialize, but
15980 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 we are not initi
15990 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20 alized");...
159a0 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a return(TCL_OK);.
159b0 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73 .}...dprintf("As
159c0 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c ked to uninitial
159d0 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 ize");..#if defi
159e0 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 ned(OPENSSL_THRE
159f0 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 ADS) && defined(
15a00 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 TCL_THREADS)..Tc
15a10 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 l_MutexLock(&ini
15a20 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 t_mx);...if (loc
15a30 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28 ks) {.. free(
15a40 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63 locks);.. loc
15a50 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 ks = NULL;..
15a60 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a locksCount = 0;.
15a70 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69 .}.#endif..initi
15a80 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 alized = 0;..#if
15a90 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
15aa0 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
15ab0 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
15ac0 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f )..Tcl_MutexUnlo
15ad0 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 ck(&init_mx);.#e
15ae0 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 54 43 ndif...return(TC
15af0 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 L_OK);. }..
15b00 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 if (initialize
15b10 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 d) {..dprintf("C
15b20 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 alled, but using
15b30 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b cached value");
15b40 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 ..return(status)
15b50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
15b60 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
15b70 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
15b80 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
15b90 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
15ba0 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 EADS). Tcl_Mu
15bb0 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 texLock(&init_mx
15bc0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e );.#endif. in
15bd0 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a itialized = 1;..
15be0 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
15bf0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
15c00 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
15c10 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 ADS). num_loc
15c20 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b ks = 1;. lock
15c30 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e sCount = (int) n
15c40 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f um_locks;. lo
15c50 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a cks = malloc(siz
15c60 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 eof(*locks) * nu
15c70 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 m_locks);. me
15c80 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 mset(locks, 0, s
15c90 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 izeof(*locks) *
15ca0 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 num_locks);.#end
15cb0 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 if.. /* Initi
15cc0 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 alize BOTH libcr
15cd0 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e ypto and libssl.
15ce0 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f */. OPENSSL_
15cf0 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c init_ssl(OPENSSL
15d00 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 _INIT_LOAD_SSL_S
15d10 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c TRINGS | OPENSSL
15d20 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 _INIT_LOAD_CRYPT
15d30 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 O_STRINGS..| OPE
15d40 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c NSSL_INIT_ADD_AL
15d50 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e L_CIPHERS | OPEN
15d60 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c SSL_INIT_ADD_ALL
15d70 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b _DIGESTS, NULL);
15d80 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 .. BIO_new_tc
15d90 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 l(NULL, 0);..#if
15da0 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
15db0 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
15dc0 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
15dd0 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 ). Tcl_MutexU
15de0 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b nlock(&init_mx);
15df0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 .#endif.. ret
15e00 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a urn(status);.}.