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 68 61 72 20 62 75 66 5b k;. char buf[
6f70: 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 BUFSIZ];. int
6f80: 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 index, verbose
6f90: 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 = 0, use_support
6fa0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 ed = 0;. cons
6fb0: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 t SSL_METHOD *me
6fc0: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e thod;.. dprin
6fd0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
6fe0: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 if ((objc < 2
6ff0: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 ) || (objc > 4))
7000: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
7010: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
7020: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 objv, "protocol
7030: 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f ?verbose? ?suppo
7040: 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e rted?");..return
7050: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
7060: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 }. if (Tcl_Ge
7070: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e tIndexFromObj(in
7080: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 terp, objv[1], p
7090: 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f rotocols, "proto
70a0: 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 col", 0, &index)
70b0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
70c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
70d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
70e0: 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c objc > 2) && Tcl
70f0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f _GetBooleanFromO
7100: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
7110: 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 2], &verbose) !=
7120: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
7130: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7140: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
7150: 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65 c > 3) && Tcl_Ge
7160: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
7170: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c interp, objv[3],
7180: 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 &use_supported)
7190: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
71a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
71b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
71c0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
71d0: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 switch ((enu
71e0: 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 m protocol)index
71f0: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 ) {. case TLS
7200: 5f 53 53 4c 32 3a 0a 09 54 63 6c 5f 41 70 70 65 _SSL2:..Tcl_Appe
7210: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
7220: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 protocols[index
7230: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e ], ": protocol n
7240: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
7250: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
7260: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7270: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 . case TLS_SS
7280: 4c 33 3a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 L3:..Tcl_AppendR
7290: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
72a0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
72b0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
72c0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
72d0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 r *)NULL);..retu
72e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
72f0: 20 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a case TLS_TLS1:
7300: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
7310: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
7320: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
7330: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
7340: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 NSSL_NO_TLS1_MET
7350: 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 HOD)..Tcl_Append
7360: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
7370: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
7380: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
7390: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
73a0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 ar *)NULL);..ret
73b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
73c0: 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 54 else..method = T
73d0: 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 LSv1_method(); b
73e0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 reak;.#endif.
73f0: 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 case TLS_TLS1_1
7400: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
7410: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
7420: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7430: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_1) || define
7440: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
7450: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 1_1_METHOD)..Tcl
7460: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
7470: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
7480: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
7490: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
74a0: 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c d", (char *)NULL
74b0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
74c0: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 RROR;.#else..met
74d0: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 hod = TLSv1_1_me
74e0: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
74f0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 endif. case T
7500: 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 LS_TLS1_2:.#if d
7510: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
7520: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
7530: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 NSSL_NO_TLS1_2)
7540: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
7550: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 SL_NO_TLS1_2_MET
7560: 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 HOD)..Tcl_Append
7570: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
7580: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
7590: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
75a0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 supported", (ch
75b0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 ar *)NULL);..ret
75c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
75d0: 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 54 else..method = T
75e0: 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 3b LSv1_2_method();
75f0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 break;.#endif.
7600: 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 case TLS_TLS1
7610: 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 _3:.#if defined(
7620: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 NO_TLS1_3) || de
7630: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
7640: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 _TLS1_3) || defi
7650: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
7660: 4c 53 31 5f 33 5f 4d 45 54 48 4f 44 29 0a 09 54 LS1_3_METHOD)..T
7670: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7680: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
7690: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
76a0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
76b0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 ted", (char *)NU
76c0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
76d0: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d _ERROR;.#else..m
76e0: 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 ethod = TLS_meth
76f0: 6f 64 28 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 od();..SSL_CTX_s
7700: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 et_min_proto_ver
7710: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 sion(ctx, TLS1_3
7720: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f _VERSION);..SSL_
7730: 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 CTX_set_max_prot
7740: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 o_version(ctx, T
7750: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a LS1_3_VERSION);.
7760: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 .break;.#endif.
7770: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 6d 65 74 default:..met
7780: 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 hod = TLS_method
7790: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 ();..break;.
77a0: 7d 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f }. ctx = SSL_
77b0: 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b CTX_new(method);
77c0: 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 . if (ctx ==
77d0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
77e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
77f0: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
7800: 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c (), (char *)NULL
7810: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
7820: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
7830: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 ssl = SSL_new(ct
7840: 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 x);. if (ssl
7850: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
7860: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7870: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 erp, GET_ERR_REA
7880: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e SON(), (char *)N
7890: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
78a0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
78b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
78c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c }.. /* Use l
78d0: 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 ist and order as
78e0: 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 would be sent i
78f0: 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 n a ClientHello
7900: 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 or all available
7910: 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 ciphers */.
7920: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 if (use_supporte
7930: 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 d) {..sk = SSL_g
7940: 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 et1_supported_ci
7950: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 phers(ssl);.
7960: 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 } else {..sk = S
7970: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 SL_get_ciphers(s
7980: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 sl);. }..
7990: 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 if (sk != NULL)
79a0: 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 {..if (!verbose)
79b0: 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68 {.. const ch
79c0: 61 72 20 2a 63 70 3b 0a 09 20 20 20 20 6f 62 6a ar *cp;.. obj
79d0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
79e0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 tObj(0, NULL);..
79f0: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d for (int i =
7a00: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 0; i < sk_SSL_C
7a10: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 IPHER_num(sk); i
7a20: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 ++) {...const SS
7a30: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b L_CIPHER *c = sk
7a40: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 _SSL_CIPHER_valu
7a50: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 e(sk, i);...if (
7a60: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 c == NULL) conti
7a70: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 nue;..../* ciphe
7a80: 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 r name or (NONE)
7a90: 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 */...cp = SSL_C
7aa0: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 IPHER_get_name(c
7ab0: 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e );...if (cp == N
7ac0: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 ULL) break;...Tc
7ad0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
7ae0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
7af0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
7b00: 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 ringObj(cp, -1))
7b10: 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 ;.. }...} els
7b20: 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 e {.. objPtr
7b30: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f = Tcl_NewStringO
7b40: 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 bj("",0);.. f
7b50: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 or (int i = 0; i
7b60: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 < sk_SSL_CIPHER
7b70: 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b _num(sk); i++) {
7b80: 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 ...const SSL_CIP
7b90: 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f HER *c = sk_SSL_
7ba0: 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c CIPHER_value(sk,
7bb0: 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 i);...if (c ==
7bc0: 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a NULL) continue;.
7bd0: 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 .../* textual de
7be0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 scription of the
7bf0: 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 cipher */...if
7c00: 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 (SSL_CIPHER_desc
7c10: 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 ription(c, buf,
7c20: 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 sizeof(buf)) !=
7c30: 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 NULL) {... Tc
7c40: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 l_AppendToObj(ob
7c50: 6a 50 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f jPtr, buf, (Tcl_
7c60: 53 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66 Size) strlen(buf
7c70: 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ));...} else {..
7c80: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 . Tcl_AppendT
7c90: 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e oObj(objPtr, "UN
7ca0: 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 KNOWN\n", 8);...
7cb0: 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 }.. }..}..if
7cc0: 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 (use_supported)
7cd0: 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 {.. sk_SSL_CI
7ce0: 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 PHER_free(sk);..
7cf0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f }. }. SSL_
7d00: 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 free(ssl);. S
7d10: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
7d20: 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 ;.. Tcl_SetOb
7d30: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
7d40: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
7d50: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
7d60: 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a 20 2a 20 50 --------. *. * P
7db0: 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d rotocolsObjCmd -
7dc0: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 - list available
7dd0: 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a protocols. *. *
7de0: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
7df0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 is invoked to pr
7e00: 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a ocess the "tls::
7e10: 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 protocols" comma
7e20: 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 nd. *.to list av
7e30: 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c ailable protocol
7e40: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
7e50: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
7e60: 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e Tcl result list.
7e70: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
7e80: 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a cts:. *.none. *.
7e90: 20 2a 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 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
7ee0: 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f c int.ProtocolsO
7ef0: 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 bjCmd(. TCL_U
7f00: 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 NUSED(void *),.
7f10: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
7f20: 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f nterp,. int o
7f30: 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a bjc,. Tcl_Obj
7f40: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
7f50: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f {. Tcl_Obj *o
7f60: 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 bjPtr;.. dpri
7f70: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
7f80: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 if (objc !=
7f90: 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 1) {..Tcl_WrongN
7fa0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
7fb0: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 , objv, "");..re
7fc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 }.. ERR_c
7fe0: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 lear_error();..
7ff0: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
8000: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 NewListObj(0, NU
8010: 4c 4c 29 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e LL);..#if !defin
8020: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 ed(NO_TLS1) && !
8030: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
8040: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 NO_TLS1) && !def
8050: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8060: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 TLS1_METHOD).
8070: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
8080: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
8090: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
80a0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
80b0: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 cols[TLS_TLS1],
80c0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
80d0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
80e0: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
80f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8100: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
8110: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
8120: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 1_METHOD). Tc
8130: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
8140: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
8150: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
8160: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
8170: 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d s[TLS_TLS1_1], -
8180: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
8190: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
81a0: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
81b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
81c0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
81d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
81e0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
81f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
8200: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
8210: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
8220: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
8230: 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 [TLS_TLS1_2], -1
8240: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
8250: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
8260: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
8270: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
8280: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
8290: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
82a0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
82b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
82c0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c protocols[TLS_TL
82d0: 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e S1_3], -1));.#en
82e0: 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 dif.. Tcl_Set
82f0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
8300: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
8310: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
8320: 0c 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a 20 2a ----------. *. *
8370: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 HandshakeObjCmd
8380: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 --. *. *.This c
8390: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 ommand is used t
83a0: 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72 o verify whether
83b0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 the handshake i
83c0: 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 s complete. *.or
83d0: 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 not.. *. * Resu
83e0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
83f0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 rd Tcl result. 1
8400: 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 means handshake
8410: 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 complete, 0 mea
8420: 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 ns pending.. *.
8430: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
8440: 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c *.May force SSL
8450: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 negotiation to
8460: 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 take place.. *.
8470: 2a 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 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
84c0: 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 int HandshakeOb
84d0: 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e jCmd(. TCL_UN
84e0: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 USED(void *),.
84f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
8500: 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 terp,. int ob
8510: 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 jc,. Tcl_Obj
8520: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b *const objv[]).{
8530: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
8540: 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a chan; /*
8550: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
8560: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
8570: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
8580: 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a tePtr; /*
8590: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f client state fo
85a0: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a r ssl socket */.
85b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
85c0: 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 errStr = NULL;.
85d0: 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a int ret = 1;.
85e0: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b int err = 0;
85f0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
8600: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
8610: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
8620: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
8630: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
8640: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
8650: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
8660: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 ;. }.. ERR
8670: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
8680: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
8690: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
86a0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
86b0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
86c0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
86d0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
86e0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 NULL) {..return(
86f0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
8700: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 }.. /* Make s
8710: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
8720: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
8730: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
8740: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
8750: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 annel(chan);.
8760: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
8770: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
8780: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
8790: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e ()) {..Tcl_Appen
87a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
87b0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
87c0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
87d0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c Name(chan),..."\
87e0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
87f0: 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e nnel", (char *)N
8800: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
8810: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
8820: 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b "TLS", "HANDSHAK
8830: 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 E", "CHANNEL", "
8840: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
8850: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e *)NULL);..return
8860: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
8870: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 }. statePtr
8880: 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 = (State *)Tcl_G
8890: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
88a0: 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 eData(chan);..
88b0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 dprintf("Calli
88c0: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f ng Tls_WaitForCo
88d0: 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 nnect");. ret
88e0: 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f = Tls_WaitForCo
88f0: 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 nnect(statePtr,
8900: 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 &err, 1);. dp
8910: 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 rintf("Tls_WaitF
8920: 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e orConnect return
8930: 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a ed: %i", ret);..
8940: 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 if (ret < 0
8950: 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 && ((statePtr->f
8960: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 lags & TLS_TCL_A
8970: 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d SYNC) && (err ==
8980: 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 EAGAIN))) {..dp
8990: 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 rintf("Async set
89a0: 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 and err = EAGAI
89b0: 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 N");..ret = 0;.
89c0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 } else if (re
89d0: 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 t < 0) {..long r
89e0: 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d esult;..errStr =
89f0: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a statePtr->err;.
8a00: 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 .Tcl_ResetResult
8a10: 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 (interp);..Tcl_S
8a20: 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 etErrno(err);...
8a30: 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 if (!errStr || (
8a40: 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b *errStr == 0)) {
8a50: 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 .. errStr = T
8a60: 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e cl_PosixError(in
8a70: 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f terp);..}...Tcl_
8a80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
8a90: 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 erp, "handshake
8aa0: 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 failed: ", errSt
8ab0: 72 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 r, (char *)NULL)
8ac0: 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d ;..if ((result =
8ad0: 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f SSL_get_verify_
8ae0: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d result(statePtr-
8af0: 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 >ssl)) != X509_V
8b00: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f _OK) {.. Tcl_
8b10: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
8b20: 65 72 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 erp, " due to \"
8b30: 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 ", X509_verify_c
8b40: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
8b50: 28 72 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 (result), "\"",
8b60: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 (char *)NULL);..
8b70: 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 }..Tcl_SetErrorC
8b80: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
8b90: 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 ", "HANDSHAKE",
8ba0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
8bb0: 2a 29 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 *)NULL);..dprint
8bc0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c f("Returning TCL
8bd0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 _ERROR with hand
8be0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 shake failed: %s
8bf0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 ", errStr);..ret
8c00: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
8c10: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 } else {..if
8c20: 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 (err != 0) {..
8c30: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 dprintf("Got
8c40: 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 an error with a
8c50: 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 completed handsh
8c60: 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 ake: err = %i",
8c70: 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 err);..}..ret =
8c80: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 1;. }.. dp
8c90: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
8ca0: 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 TCL_OK with dat
8cb0: 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b a \"%i\"", ret);
8cc0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
8cd0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
8ce0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 l_NewIntObj(ret)
8cf0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 );. return(TC
8d00: 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d L_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 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f --. *. * ImportO
8d60: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 bjCmd --. *. *.T
8d70: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
8d80: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
8d90: 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f ess the "ssl" co
8da0: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 mmand. *. *.The
8db0: 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 ssl command push
8dc0: 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e es SSL over a (n
8dd0: 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 ewly connected)
8de0: 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a tcp socket. *. *
8df0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
8e00: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
8e10: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
8e20: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d ffects:. *.May m
8e30: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 odify the behavi
8e40: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e or of an IO chan
8e50: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nel.. *. *------
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 2d 0a 20 2a -------------. *
8ea0: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d /..static int.Im
8eb0: 70 6f 72 74 4f 62 6a 43 6d 64 28 0a 20 20 20 20 portObjCmd(.
8ec0: 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 TCL_UNUSED(void
8ed0: 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 *),. Tcl_Inte
8ee0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 rp *interp,.
8ef0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 int objc,. Tc
8f00: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
8f10: 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]).{. Tcl_C
8f20: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
8f30: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
8f40: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
8f50: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
8f60: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e tePtr;../* clien
8f70: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
8f80: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 socket */. SS
8f90: 4c 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 L_CTX *ctx..= NU
8fa0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
8fb0: 2a 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b *script..= NULL;
8fc0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 . Tcl_Obj *pa
8fd0: 73 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a ssword..= NULL;.
8fe0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d Tcl_Obj *vcm
8ff0: 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 d..= NULL;. T
9000: 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 cl_DString upper
9010: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
9020: 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c on, upperChannel
9030: 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 Blocking, upperC
9040: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 hannelEncoding,
9050: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
9060: 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 har;. int idx
9070: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c ;. Tcl_Size l
9080: 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 en;. int flag
9090: 73 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e s...= TLS_TCL_IN
90a0: 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 IT;. int serv
90b0: 65 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 er...= 0;./* is
90c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d connection incom
90d0: 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f ing or outgoing?
90e0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 */. char *ke
90f0: 79 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 yfile..= NULL;.
9100: 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c char *certfil
9110: 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 e..= NULL;. u
9120: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 nsigned char *ke
9130: 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 y..= NULL;. T
9140: 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 cl_Size key_len.
9150: 09 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e .= 0;. unsign
9160: 65 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d ed char *cert..=
9170: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 NULL;. Tcl_S
9180: 69 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 ize cert_len..=
9190: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 0;. char *cip
91a0: 68 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 hers..= NULL;.
91b0: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 char *ciphersu
91c0: 69 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 ites..= NULL;.
91d0: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 char *CAfile..
91e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
91f0: 20 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c *CApath..= NULL
9200: 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 ;. char *DHpa
9210: 72 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 rams..= NULL;.
9220: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 char *model...
9230: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
9240: 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 *servername..=
9250: 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d NULL;./* hostnam
9260: 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d e for Server Nam
9270: 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a e Indication */.
9280: 20 20 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f char *sessio
9290: 6e 5f 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 n_id..= NULL;.
92a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 Tcl_Obj *alpn.
92b0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 .= NULL;. int
92c0: 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 ssl2 = 0, ssl3
92d0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 = 0;. int tls
92e0: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 1 = 1, tls1_1 =
92f0: 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 1, tls1_2 = 1, t
9300: 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 ls1_3 = 1;. i
9310: 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 nt proto = 0, le
9320: 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e vel = -1;. in
9330: 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 t verify = 0, re
9340: 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 quire = 0, reque
9350: 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e st = 1, post_han
9360: 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 dshake = 0;..
9370: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
9380: 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 ");..#if defined
9390: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
93a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
93b0: 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d TLS1). tls1 =
93c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 0;.#endif.#if d
93d0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
93e0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
93f0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a NSSL_NO_TLS1_1).
9400: 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a tls1_1 = 0;.
9410: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
9420: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c ed(NO_TLS1_2) ||
9430: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
9440: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 _NO_TLS1_2).
9450: 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 tls1_2 = 0;.#end
9460: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
9470: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
9480: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
9490: 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 TLS1_3). tls1
94a0: 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a _3 = 0;.#endif..
94b0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
94c0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
94d0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
94e0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 objv, "channel
94f0: 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 ?options?");..re
9500: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9510: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 }.. ERR_c
9520: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 lear_error();..
9530: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
9540: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
9550: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
9560: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a bjv[1]), NULL);.
9570: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
9580: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
9590: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
95a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
95b0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 /*. * Ma
95c0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
95d0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
95e0: 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a t channel. *
95f0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
9600: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
9610: 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 han);.. for (
9620: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f idx = 2; idx < o
9630: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 bjc; idx++) {..c
9640: 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 har *opt = Tcl_G
9650: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 etString(objv[id
9660: 78 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 x]);...if (opt[0
9670: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 ] != '-').. b
9680: 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 reak;...OPTOBJ("
9690: 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 -alpn", alpn);..
96a0: 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c OPTSTR("-cadir",
96b0: 20 43 41 70 61 74 68 29 3b 0a 09 4f 50 54 53 54 CApath);..OPTST
96c0: 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 R("-cafile", CAf
96d0: 69 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 ile);..OPTBYTE("
96e0: 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 -cert", cert, ce
96f0: 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 rt_len);..OPTSTR
9700: 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 ("-certfile", ce
9710: 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 rtfile);..OPTSTR
9720: 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 ("-cipher", ciph
9730: 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ers);..OPTSTR("-
9740: 63 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 ciphers", cipher
9750: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 s);..OPTSTR("-ci
9760: 70 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 phersuites", cip
9770: 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 hersuites);..OPT
9780: 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 OBJ("-command",
9790: 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 script);..OPTSTR
97a0: 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 ("-dhparams", DH
97b0: 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 params);..OPTBYT
97c0: 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b E("-key", key, k
97d0: 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 ey_len);..OPTSTR
97e0: 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 ("-keyfile", key
97f0: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 file);..OPTSTR("
9800: 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b -model", model);
9810: 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 ..OPTOBJ("-passw
9820: 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b ord", password);
9830: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 ..OPTBOOL("-post
9840: 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 _handshake", pos
9850: 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f t_handshake);..O
9860: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 PTBOOL("-request
9870: 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 ", request);..OP
9880: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 TBOOL("-require"
9890: 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 , require);..OPT
98a0: 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 5f 6c INT("-security_l
98b0: 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 evel", level);..
98c0: 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 OPTBOOL("-server
98d0: 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 ", server);..OPT
98e0: 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 STR("-servername
98f0: 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a ", servername);.
9900: 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f .OPTSTR("-sessio
9910: 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 n_id", session_i
9920: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 d);..OPTBOOL("-s
9930: 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 sl2", ssl2);..OP
9940: 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 TBOOL("-ssl3", s
9950: 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 sl3);..OPTBOOL("
9960: 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 -tls1", tls1);..
9970: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 OPTBOOL("-tls1.1
9980: 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 ", tls1_1);..OPT
9990: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 BOOL("-tls1.2",
99a0: 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f tls1_2);..OPTBOO
99b0: 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 L("-tls1.3", tls
99c0: 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 1_3);..OPTOBJ("-
99d0: 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 validatecommand"
99e0: 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a , vcmd);..OPTOBJ
99f0: 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b ("-vcmd", vcmd);
9a00: 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f ...OPTBAD("optio
9a10: 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 n", "-alpn, -cad
9a20: 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 ir, -cafile, -ce
9a30: 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d rt, -certfile, -
9a40: 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 cipher, -ciphers
9a50: 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c uites, -command,
9a60: 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 -dhparams, -key
9a70: 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 , -keyfile, -mod
9a80: 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d el, -password, -
9a90: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 post_handshake,
9aa0: 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 -request, -requi
9ab0: 72 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 re, -security_le
9ac0: 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 vel, -server, -s
9ad0: 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 ervername, -sess
9ae0: 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d ion_id, -ssl2, -
9af0: 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c ssl3, -tls1, -tl
9b00: 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d s1.1, -tls1.2, -
9b10: 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 tls1.3, or -vali
9b20: 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a datecommand");..
9b30: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
9b40: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
9b50: 28 72 65 71 75 65 73 74 29 09 20 20 20 20 76 65 (request). ve
9b60: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
9b70: 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c FY_CLIENT_ONCE |
9b80: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 SSL_VERIFY_PEER
9b90: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 ;. if (reques
9ba0: 74 20 26 26 20 72 65 71 75 69 72 65 29 20 76 65 t && require) ve
9bb0: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 rify |= SSL_VERI
9bc0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
9bd0: 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 ER_CERT;. if
9be0: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 (request && post
9bf0: 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 _handshake).veri
9c00: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
9c10: 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b _POST_HANDSHAKE;
9c20: 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 . if (verify
9c30: 3d 3d 20 30 29 09 76 65 72 69 66 79 20 3d 20 53 == 0).verify = S
9c40: 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a SL_VERIFY_NONE;.
9c50: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 . proto |= (s
9c60: 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f sl2 ? TLS_PROTO_
9c70: 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 SSL2 : 0);. p
9c80: 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 roto |= (ssl3 ?
9c90: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a TLS_PROTO_SSL3 :
9ca0: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
9cb0: 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 = (tls1 ? TLS_PR
9cc0: 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 OTO_TLS1 : 0);.
9cd0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 proto |= (tls
9ce0: 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 1_1 ? TLS_PROTO_
9cf0: 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 TLS1_1 : 0);.
9d00: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
9d10: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 2 ? TLS_PROTO_TL
9d20: 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 S1_2 : 0);. p
9d30: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 roto |= (tls1_3
9d40: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 ? TLS_PROTO_TLS1
9d50: 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a _3 : 0);.. /*
9d60: 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 reset to NULL i
9d70: 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 f blank string p
9d80: 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 rovided */. i
9d90: 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 f (cert && !*cer
9da0: 74 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 t).. cert
9db0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
9dc0: 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 . if (key &&
9dd0: 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 !*key)..
9de0: 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 key. = NU
9df0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 LL;. if (cert
9e00: 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 file && !*certfi
9e10: 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 le) cert
9e20: 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 file.= NULL;.
9e30: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 if (keyfile &&
9e40: 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 !*keyfile)..keyf
9e50: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
9e60: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 LL;. if (ciph
9e70: 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 ers && !*ciphers
9e80: 29 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 ). cipher
9e90: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c s. = NULL
9ea0: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 ;. if (cipher
9eb0: 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 suites && !*ciph
9ec0: 65 72 73 75 69 74 65 73 29 20 63 69 70 68 65 72 ersuites) cipher
9ed0: 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c suites = NULL
9ee0: 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 ;. if (CAfile
9ef0: 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 && !*CAfile).
9f00: 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 CAfile.
9f10: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
9f20: 20 69 66 20 28 43 41 70 61 74 68 20 26 26 20 21 if (CApath && !
9f30: 2a 43 41 70 61 74 68 29 09 20 20 20 20 20 20 20 *CApath).
9f40: 20 43 41 70 61 74 68 09 20 20 20 20 20 20 20 20 CApath.
9f50: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
9f60: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 DHparams && !*DH
9f70: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 params).
9f80: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 DHparams
9f90: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 = NULL;.. /*
9fa0: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f new SSL state */
9fb0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d . statePtr..=
9fc0: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c (State *) ckall
9fd0: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 oc((unsigned) si
9fe0: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 zeof(State));.
9ff0: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 memset(statePt
a000: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 r, 0, sizeof(Sta
a010: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 te));.. state
a020: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 Ptr->flags.= fla
a030: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 gs;. statePtr
a040: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 ->interp.= inter
a050: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d p;. statePtr-
a060: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 >vflags.= verify
a070: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
a080: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f err.= "";.. /
a090: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 * allocate scrip
a0a0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 t */. if (scr
a0b0: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 ipt) {..(void) T
a0c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
a0d0: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e Obj(script, &len
a0e0: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
a0f0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 statePtr->ca
a100: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b llback = script;
a110: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
a120: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
a130: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 >callback);..}.
a140: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
a150: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a ocate password *
a160: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f /. if (passwo
a170: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 rd) {..(void) Tc
a180: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
a190: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 bj(password, &le
a1a0: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
a1b0: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 . statePtr->p
a1c0: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f assword = passwo
a1d0: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 rd;.. Tcl_Inc
a1e0: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
a1f0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
a200: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
a210: 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 allocate validat
a220: 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 e command */.
a230: 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 if (vcmd) {..(v
a240: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 oid) Tcl_GetStri
a250: 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 ngFromObj(vcmd,
a260: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 &len);..if (len)
a270: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 {.. statePtr
a280: 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 ->vcmd = vcmd;..
a290: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
a2a0: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 ount(statePtr->v
a2b0: 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a cmd);..}. }..
a2c0: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d if (model !=
a2d0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f NULL) {..int mo
a2e0: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 de;../* Get the
a2f0: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 "model" context
a300: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 */..chan = Tcl_G
a310: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
a320: 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b , model, &mode);
a330: 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 ..if (chan == (T
a340: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
a350: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 ) {.. Tls_Fre
a360: 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 e((void *)stateP
a370: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
a380: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
a390: 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 ./*.. * Make sur
a3a0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
a3b0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
a3c0: 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d nel.. */..chan =
a3d0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
a3e0: 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 el(chan);..if (T
a3f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
a400: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
a410: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
a420: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
a430: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
a440: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
a450: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
a460: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 20 20 20 20 me(chan),...
a470: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
a480: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a hannel", (char *
a490: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c )NULL);.. Tcl
a4a0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
a4b0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
a4c0: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 PORT", "CHANNEL"
a4d0: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
a4e0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 ar *)NULL);..
a4f0: 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 Tls_Free((void
a500: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 *)statePtr);..
a510: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
a520: 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 OR;..}..ctx = ((
a530: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 State *)Tcl_GetC
a540: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
a550: 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a ta(chan))->ctx;.
a560: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 } else {..if
a570: 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 ((ctx = CTX_Ini
a580: 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 t(statePtr, serv
a590: 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 er, proto, keyfi
a5a0: 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 le, certfile, ke
a5b0: 79 2c 20 63 65 72 74 2c 20 28 69 6e 74 29 20 6b y, cert, (int) k
a5c0: 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e ey_len,.. (in
a5d0: 74 29 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 t) cert_len, CAp
a5e0: 61 74 68 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 ath, CAfile, cip
a5f0: 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 hers, ciphersuit
a600: 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 es, level, DHpar
a610: 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b ams)) == NULL) {
a620: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
a630: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
a640: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
a650: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
a660: 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d }.. statePtr-
a670: 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 >ctx = ctx;..
a680: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 /*. * We ne
a690: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 ed to make sure
a6a0: 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c that the channel
a6b0: 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 works in binary
a6c0: 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a (for the. *
a6d0: 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 encryption not
a6e0: 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 to get goofed up
a6f0: 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c ).. * We onl
a700: 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 y want to adjust
a710: 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 the buffering i
a720: 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c n pre-v2 channel
a730: 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 s, where. *
a740: 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 each channel in
a750: 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 the stack mainta
a760: 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 ined its own buf
a770: 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 fers.. */.
a780: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
a790: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 t(&upperChannelT
a7a0: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 ranslation);.
a7b0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
a7c0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
a7d0: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c ocking);. Tcl
a7e0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
a7f0: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
a800: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 r);. Tcl_DStr
a810: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 ingInit(&upperCh
a820: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a annelEncoding);.
a830: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
a840: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
a850: 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 chan, "-eofchar
a860: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ", &upperChannel
a870: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 EOFChar);. Tc
a880: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_GetChannelOpti
a890: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
a8a0: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 "-encoding", &u
a8b0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
a8c0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 ing);. Tcl_Ge
a8d0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
a8e0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 nterp, chan, "-t
a8f0: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 ranslation", &up
a900: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
a910: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f ation);. Tcl_
a920: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
a930: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
a940: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 -blocking", &upp
a950: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
a960: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 g);. Tcl_SetC
a970: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
a980: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 erp, chan, "-tra
a990: 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 nslation", "bina
a9a0: 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ry");. Tcl_Se
a9b0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
a9c0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 nterp, chan, "-b
a9d0: 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 locking", "true"
a9e0: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 );. dprintf("
a9f0: 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 Consuming Tcl ch
aa00: 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 annel %s", Tcl_G
aa10: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
aa20: 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 an));. stateP
aa30: 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 tr->self = Tcl_S
aa40: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 tackChannel(inte
aa50: 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 rp, Tls_ChannelT
aa60: 79 70 65 28 29 2c 20 73 74 61 74 65 50 74 72 2c ype(), statePtr,
aa70: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c (TCL_READABLE |
aa80: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 TCL_WRITABLE),
aa90: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e chan);. dprin
aaa0: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e tf("Created chan
aab0: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 nel named %s", T
aac0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
aad0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
aae0: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 ));. if (stat
aaf0: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
ab00: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
ab10: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 ) {../*.. * No u
ab20: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 se of Tcl_Eventu
ab30: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 allyFree because
ab40: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c no possible Tcl
ab50: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a _Preserve... */.
ab60: 09 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 .Tls_Free((void
ab70: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 *)statePtr);..re
ab80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
ab90: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 }.. Tcl_S
aba0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
abb0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
abc0: 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c ->self, "-transl
abd0: 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 ation", Tcl_DStr
abe0: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 ingValue(&upperC
abf0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f hannelTranslatio
ac00: 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 n));. Tcl_Set
ac10: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
ac20: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e terp, statePtr->
ac30: 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 self, "-encoding
ac40: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
ac50: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
ac60: 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 lEncoding));.
ac70: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
ac80: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 ption(interp, st
ac90: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d atePtr->self, "-
aca0: 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 eofchar", Tcl_DS
acb0: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 tringValue(&uppe
acc0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 rChannelEOFChar)
acd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
ace0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
acf0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
ad00: 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c lf, "-blocking",
ad10: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
ad20: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 e(&upperChannelB
ad30: 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 locking));. T
ad40: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
ad50: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
ad60: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 slation);. Tc
ad70: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 l_DStringFree(&u
ad80: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
ad90: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ing);. Tcl_DS
ada0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
adb0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
adc0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
add0: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
ade0: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 elBlocking);..
adf0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 /*. * SSL
ae00: 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 Initialization.
ae10: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 74 61 74 */.. stat
ae20: 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f ePtr->ssl = SSL_
ae30: 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 new(statePtr->ct
ae40: 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 x);. if (!sta
ae50: 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f tePtr->ssl) {../
ae60: 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 * SSL library er
ae70: 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 ror */..Tcl_Appe
ae80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
ae90: 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 "couldn't const
aea0: 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e ruct ssl session
aeb0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
aec0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e SON(), (char *)N
aed0: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
aee0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
aef0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
af00: 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 "INIT", "FAILED
af10: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
af20: 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 ;..Tls_Free((voi
af30: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 d *)statePtr);..
af40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
af50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
af60: 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 Set host server
af70: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 name */. if (
af80: 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f servername) {../
af90: 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65 * Sets the serve
afa0: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f r name indicatio
afb0: 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e n (SNI) in Clien
afc0: 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e tHello extension
afd0: 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 */../* Per RFC
afe0: 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 6066, hostname i
aff0: 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 s a ASCII encode
b000: 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 d string, though
b010: 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55 RFC 4366 says U
b020: 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 TF-8. */..if (!S
b030: 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f SL_set_tlsext_ho
b040: 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 st_name(statePtr
b050: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d ->ssl, servernam
b060: 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b e) && require) {
b070: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
b080: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
b090: 53 65 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f Set SNI extensio
b0a0: 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 n failed: ", GET
b0b0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
b0c0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 char *)NULL);..
b0d0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
b0e0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
b0f0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e ", "IMPORT", "SN
b100: 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 I", "FAILED", (c
b110: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 har *)NULL);..
b120: 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 Tls_Free((void
b130: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *)statePtr);..
b140: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
b150: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 ROR;..}.../* Set
b160: 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 hostname for pe
b170: 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 68 er certificate h
b180: 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 ostname verifica
b190: 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e tion in clients.
b1a0: 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 .. Don't use S
b1b0: 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e SL_set1_host sin
b1c0: 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 ce it has limita
b1d0: 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 tions. */..if (!
b1e0: 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 SSL_add1_host(st
b1f0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 atePtr->ssl, ser
b200: 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 vername)) {..
b210: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
b220: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 44 t(interp, "Set D
b230: 4e 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69 6c NS hostname fail
b240: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 ed: ", GET_ERR_R
b250: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
b260: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c )NULL);.. Tcl
b270: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
b280: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
b290: 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 PORT", "HOSTNAME
b2a0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
b2b0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 ar *)NULL);..
b2c0: 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 Tls_Free((void
b2d0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 *)statePtr);..
b2e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
b2f0: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
b300: 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73 /* Resume sess
b310: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 ion id */. if
b320: 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 (session_id &&
b330: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 strlen(session_i
b340: 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 d) <= SSL_MAX_SI
b350: 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a D_CTX_LENGTH) {.
b360: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 ./* SSL_set_sess
b370: 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 ion() */..if (!S
b380: 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f SL_SESSION_set1_
b390: 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 id_context(SSL_g
b3a0: 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 et_session(state
b3b0: 50 74 72 2d 3e 73 73 6c 29 2c 0a 09 09 28 63 6f Ptr->ssl),...(co
b3c0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
b3d0: 72 20 2a 29 20 73 65 73 73 69 6f 6e 5f 69 64 2c r *) session_id,
b3e0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 (unsigned int)
b3f0: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 strlen(session_i
b400: 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f d))) {.. Tcl_
b410: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
b420: 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 erp, "Resume ses
b430: 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 sion failed: ",
b440: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
b450: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
b460: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
b470: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b480: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
b490: 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c "SESSION", "FAIL
b4a0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c ED", (char *)NUL
b4b0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
b4c0: 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 e((void *)stateP
b4d0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
b4e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
b4f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 }.. /* Ena
b500: 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d ble Application-
b510: 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e Layer Protocol N
b520: 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d egotiation. Exam
b530: 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31 ples are: http/1
b540: 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 .0,..http/1.1, h
b550: 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2, h3, ftp, imap
b560: 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 , pop3, xmpp-cli
b570: 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 ent, xmpp-server
b580: 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63 , mqtt, irc, etc
b590: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 . */. if (alp
b5a0: 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 n) {../* Convert
b5b0: 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f a TCL list into
b5c0: 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 a protocol-list
b5d0: 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 in wire-format
b5e0: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 */..unsigned cha
b5f0: 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 r *protos, *p;..
b600: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f unsigned int pro
b610: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 tos_len = 0;..Tc
b620: 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 l_Size cnt, i;..
b630: 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 int j;..Tcl_Obj
b640: 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 **list;...if (Tc
b650: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d l_ListObjGetElem
b660: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 ents(interp, alp
b670: 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 n, &cnt, &list)
b680: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
b690: 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 Tls_Free((void
b6a0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *)statePtr);..
b6b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
b6c0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 ROR;..}.../* Det
b6d0: 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 ermine the memor
b6e0: 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 y required for t
b6f0: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 he protocol-list
b700: 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b */..for (i = 0;
b710: 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b i < cnt; i++) {
b720: 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 .. Tcl_GetStr
b730: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b ingFromObj(list[
b740: 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 i], &len);..
b750: 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b if (len > 255) {
b760: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
b770: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 ult(interp, "ALP
b780: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 N protocol names
b790: 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 too long", (cha
b7a0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c r *)NULL);...Tcl
b7b0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
b7c0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d terp, "TLS", "IM
b7d0: 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 PORT", "ALPN", "
b7e0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a FAILED", (char *
b7f0: 29 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 )NULL);...Tls_Fr
b800: 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65 ee((void *)state
b810: 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 Ptr);...return T
b820: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
b830: 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e .. protos_len
b840: 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 += 1 + (int) le
b850: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 n;..}.../* Build
b860: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 the complete pr
b870: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 otocol-list */..
b880: 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 protos = ckalloc
b890: 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f (protos_len);../
b8a0: 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 * protocol-lists
b8b0: 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 consist of 8-bi
b8c0: 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 t length-prefixe
b8d0: 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 d, byte strings
b8e0: 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 */..for (j = 0,
b8f0: 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 p = protos; j <
b900: 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 cnt; j++) {..
b910: 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c char *str = Tcl
b920: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
b930: 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 j(list[j], &len)
b940: 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 ;.. *p++ = (u
b950: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65 nsigned char) le
b960: 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 n;.. memcpy(p
b970: 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 , str, (size_t)
b980: 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 len);.. p +=
b990: 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c len;..}.../* SSL
b9a0: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 _set_alpn_protos
b9b0: 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 makes a copy of
b9c0: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 the protocol-li
b9d0: 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 st */../* Note:
b9e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 This functions r
b9f0: 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74 75 everses the retu
ba00: 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 rn value convent
ba10: 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f ion */..if (SSL_
ba20: 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 set_alpn_protos(
ba30: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 statePtr->ssl, p
ba40: 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 rotos, protos_le
ba50: 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 n)) {.. Tcl_A
ba60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
ba70: 72 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 72 rp, "Set ALPN pr
ba80: 6f 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a 20 otocols failed:
ba90: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ", GET_ERR_REASO
baa0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c N(), (char *)NUL
bab0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
bac0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
bad0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
bae0: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c ", "ALPN", "FAIL
baf0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c ED", (char *)NUL
bb00: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
bb10: 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 e((void *)stateP
bb20: 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 tr);.. ckfree
bb30: 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 (protos);.. r
bb40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
bb50: 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 ..}.../* Store p
bb60: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f rotocols list */
bb70: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
bb80: 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 os = protos;..st
bb90: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
bba0: 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b en = protos_len;
bbb0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 . } else {..s
bbc0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
bbd0: 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 = NULL;..statePt
bbe0: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 r->protos_len =
bbf0: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0;. }.. /*
bc00: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c . * SSL Call
bc10: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 backs. */.
bc20: 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 SSL_set_app_da
bc30: 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ta(statePtr->ssl
bc40: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
bc50: 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 tr);./* point ba
bc60: 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 ck to us */.
bc70: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 SSL_set_verify(s
bc80: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 tatePtr->ssl, ve
bc90: 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c rify, VerifyCall
bca0: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 back);. SSL_s
bcb0: 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b et_info_callback
bcc0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
bcd0: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a InfoCallback);..
bce0: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 /* Callback
bcf0: 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72 for observing pr
bd00: 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 otocol messages
bd10: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 */.#ifndef OPENS
bd20: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a SL_NO_SSL_TRACE.
bd30: 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f /* void SSL_
bd40: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c CTX_set_msg_call
bd50: 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 back_arg(statePt
bd60: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 r->ctx, (void *)
bd70: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76 statePtr);. v
bd80: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f oid SSL_CTX_set_
bd90: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 msg_callback(sta
bda0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 tePtr->ctx, Mess
bdb0: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f ageCallback); */
bdc0: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 . SSL_set_msg
bdd0: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 _callback_arg(st
bde0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f atePtr->ssl, (vo
bdf0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
be00: 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f SSL_set_msg_
be10: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
be20: 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 r->ssl, MessageC
be30: 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 allback);.#endif
be40: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
be50: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 Tcl_Channel BIO
be60: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 Handler */. s
be70: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d tatePtr->p_bio.=
be80: 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 BIO_new_tcl(sta
be90: 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f tePtr, BIO_NOCLO
bea0: 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 SE);. statePt
beb0: 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 r->bio.= BIO_new
bec0: 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a (BIO_f_ssl());..
bed0: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20 if (server)
bee0: 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c {../* Server cal
bef0: 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 lbacks */..SSL_C
bf00: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 TX_set_tlsext_se
bf10: 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 rvername_arg(sta
bf20: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 tePtr->ctx, (voi
bf30: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 d *)statePtr);..
bf40: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 SSL_CTX_set_tlse
bf50: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 xt_servername_ca
bf60: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d llback(statePtr-
bf70: 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 >ctx, SNICallbac
bf80: 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 k);..SSL_CTX_set
bf90: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 _client_hello_cb
bfa0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
bfb0: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 HelloCallback, (
bfc0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
bfd0: 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d ;..if (statePtr-
bfe0: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 >protos != NULL)
bff0: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f {.. SSL_CTX_
c000: 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f set_alpn_select_
c010: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 cb(statePtr->ctx
c020: 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 , ALPNCallback,
c030: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c040: 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 );.#ifdef USE_NP
c050: 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f N.. if (tls1_
c060: 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 2 == 0 && tls1_3
c070: 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 == 0) {...SSL_C
c080: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 TX_set_next_prot
c090: 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62 os_advertised_cb
c0a0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c0b0: 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f NPNCallback, (vo
c0c0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
c0d0: 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d . }.#endif..}
c0e0: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 .../* Enable ser
c0f0: 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 ver to send cert
c100: 20 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68 request after h
c110: 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e andshake (TLS 1.
c120: 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 3 only) */../* A
c130: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e write operation
c140: 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65 must take place
c150: 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 69 for the Certifi
c160: 63 61 74 65 20 52 65 71 75 65 73 74 20 74 6f 20 cate Request to
c170: 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74 be.. sent to t
c180: 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 he client, this
c190: 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68 can be done with
c1a0: 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b SSL_do_handshak
c1b0: 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 e(). */..if (req
c1c0: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e uest && post_han
c1d0: 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 dshake && tls1_3
c1e0: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 ) {.. SSL_ver
c1f0: 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f ify_client_post_
c200: 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 handshake(stateP
c210: 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f tr->ssl);..}.../
c220: 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 * set automatic
c230: 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 curve selection
c240: 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 */..SSL_set_ecdh
c250: 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e _auto(statePtr->
c260: 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 ssl, 1);.../* Se
c270: 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f t server mode */
c280: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
c290: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 s |= TLS_TCL_SER
c2a0: 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 VER;..SSL_set_ac
c2b0: 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 cept_state(state
c2c0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
c2d0: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 else {../* Clie
c2e0: 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a nt callbacks */.
c2f0: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
c300: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 if (statePtr->pr
c310: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 otos != NULL &&
c320: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 tls1_2 == 0 && t
c330: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 ls1_3 == 0) {..
c340: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e SSL_CTX_set_n
c350: 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 ext_proto_select
c360: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
c370: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c x, ALPNCallback,
c380: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c390: 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 r);..}.#endif...
c3a0: 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69 /* Session cachi
c3b0: 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ng */..SSL_CTX_s
c3c0: 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 et_session_cache
c3d0: 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e _mode(statePtr->
c3e0: 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 ctx, SSL_SESS_CA
c3f0: 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c CHE_CLIENT | SSL
c400: 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 _SESS_CACHE_NO_I
c410: 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a NTERNAL_STORE);.
c420: 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 .SSL_CTX_sess_se
c430: 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 t_new_cb(statePt
c440: 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 r->ctx, SessionC
c450: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 allback);.../* E
c460: 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 nable post hands
c470: 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74 hake Authenticat
c480: 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 ion extension. T
c490: 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 LS 1.3 only, not
c4a0: 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 http/2. */..if
c4b0: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 (request && post
c4c0: 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 _handshake) {..
c4d0: 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f SSL_set_post_
c4e0: 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73 handshake_auth(s
c4f0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 tatePtr->ssl, 1)
c500: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c ;..}.../* Set cl
c510: 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 ient mode */..SS
c520: 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 L_set_connect_st
c530: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
c540: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 l);. }. SS
c550: 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 L_set_bio(stateP
c560: 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 tr->ssl, statePt
c570: 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 r->p_bio, stateP
c580: 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 tr->p_bio);.
c590: 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 BIO_set_ssl(stat
c5a0: 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 ePtr->bio, state
c5b0: 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f Ptr->ssl, BIO_NO
c5c0: 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a CLOSE);.. /*.
c5d0: 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 * End of SS
c5e0: 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 L Init. */.
c5f0: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
c600: 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 rning %s", Tcl_G
c610: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
c620: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a atePtr->self));.
c630: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
c640: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 t(interp, (char
c650: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *) Tcl_GetChanne
c660: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
c670: 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 self), TCL_VOLAT
c680: 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ILE);. return
c690: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
c6a0: 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c6e0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d -----. *. * Unim
c6f0: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a portObjCmd --. *
c700: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
c710: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f re is invoked to
c720: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d remove the topm
c730: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 ost channel filt
c740: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
c750: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
c760: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
c770: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
c780: 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 . *.May modify t
c790: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 he behavior of a
c7a0: 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a n IO channel.. *
c7b0: 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
c7f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
c800: 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f ic int.UnimportO
c810: 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 bjCmd(. TCL_U
c820: 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 NUSED(void *),.
c830: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
c840: 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f nterp,. int o
c850: 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a bjc,. Tcl_Obj
c860: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a *const objv[]).
c870: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
c880: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
c890: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
c8a0: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 mode on. */..
c8b0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
c8c0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
c8d0: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
c8e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
c8f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
c900: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 hannel");..retur
c910: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
c920: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
c930: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
c940: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
c950: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 ing(objv[1]), NU
c960: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
c970: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
c980: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
c990: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
c9a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 }.. /*.
c9b0: 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 * Make sure to
c9c0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
c9d0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 20 opmost channel.
c9e0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 */. chan
c9f0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
ca00: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 nel(chan);..
ca10: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
ca20: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
ca30: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
ca40: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
ca50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
ca60: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
ca70: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
ca80: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
ca90: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
caa0: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 nel", (char *)NU
cab0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
cac0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
cad0: 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 p, "TLS", "UNIMP
cae0: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c ORT", "CHANNEL",
caf0: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
cb00: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 r *)NULL);..retu
cb10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
cb20: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c }.. if (Tcl
cb30: 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 _UnstackChannel(
cb40: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d interp, chan) ==
cb50: 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 TCL_ERROR) {..r
cb60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
cb70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
cb80: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
cb90: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d ----------------
cbd0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 -------. *. * CT
cbe0: 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 X_Init -- constr
cbf0: 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e uct a SSL_CTX in
cc00: 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 stance. *. * Res
cc10: 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 ults:. *.A valid
cc20: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 SSL_CTX instanc
cc30: 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a e or NULL.. *. *
cc40: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
cc50: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c *.constructs SSL
cc60: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 context (CTX).
cc70: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d ----------------
ccb0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
ccc0: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 tic SSL_CTX *.CT
ccd0: 58 5f 49 6e 69 74 28 0a 20 20 20 20 53 74 61 74 X_Init(. Stat
cce0: 65 20 2a 73 74 61 74 65 50 74 72 2c 0a 20 20 20 e *statePtr,.
ccf0: 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 0a 20 int isServer,.
cd00: 20 20 20 69 6e 74 20 70 72 6f 74 6f 2c 0a 20 20 int proto,.
cd10: 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c char *keyfile,
cd20: 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 . char *certf
cd30: 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 ile,. unsigne
cd40: 64 20 63 68 61 72 20 2a 6b 65 79 2c 0a 20 20 20 d char *key,.
cd50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
cd60: 63 65 72 74 2c 0a 20 20 20 20 69 6e 74 20 6b 65 cert,. int ke
cd70: 79 5f 6c 65 6e 2c 0a 20 20 20 20 69 6e 74 20 63 y_len,. int c
cd80: 65 72 74 5f 6c 65 6e 2c 0a 20 20 20 20 63 68 61 ert_len,. cha
cd90: 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 63 r *CApath,. c
cda0: 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a 20 20 20 har *CAfile,.
cdb0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 0a char *ciphers,.
cdc0: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 char *cipher
cdd0: 73 75 69 74 65 73 2c 0a 20 20 20 20 69 6e 74 20 suites,. int
cde0: 6c 65 76 65 6c 2c 0a 20 20 20 20 63 68 61 72 20 level,. char
cdf0: 2a 44 48 70 61 72 61 6d 73 29 0a 7b 0a 20 20 20 *DHparams).{.
ce00: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
ce10: 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e erp = statePtr->
ce20: 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f interp;. SSL_
ce30: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b CTX *ctx = NULL;
ce40: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
ce50: 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 ds;. int off
ce60: 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b = 0, abort = 0;
ce70: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 . int load_pr
ce80: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 ivate_key;. c
ce90: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 onst SSL_METHOD
cea0: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 *method;.. dp
ceb0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
cec0: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f .. if (!proto
ced0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
cee0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e esult(interp, "n
cef0: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c o valid protocol
cf00: 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 selected", (cha
cf10: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 r *)NULL);..retu
cf20: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a rn NULL;. }..
cf30: 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 /* create SS
cf40: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 L context */.
cf50: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
cf60: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 to, TLS_PROTO_SS
cf70: 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 L2)) {..Tcl_Appe
cf80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
cf90: 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 "SSL2 protocol
cfa0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
cfb0: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 (char *)NULL);..
cfc0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
cfd0: 20 7d 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c }. if (ENABL
cfe0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
cff0: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 OTO_SSL3)) {..Tc
d000: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
d010: 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f nterp, "SSL3 pro
d020: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
d030: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 ted", (char *)NU
d040: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
d050: 4c 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 L;. }.#if def
d060: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c ined(NO_TLS1) ||
d070: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
d080: 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 _NO_TLS1) || def
d090: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d0a0: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 TLS1_METHOD).
d0b0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
d0c0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
d0d0: 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 S1)) {..Tcl_Appe
d0e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
d0f0: 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 "TLS 1.0 protoc
d100: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
d110: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
d120: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
d130: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
d140: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
d150: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
d160: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
d170: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
d180: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d NSSL_NO_TLS1_1_M
d190: 45 54 48 4f 44 29 0a 20 20 20 20 69 66 20 28 45 ETHOD). if (E
d1a0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
d1b0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 S_PROTO_TLS1_1))
d1c0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
d1d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
d1e0: 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.1 protocol n
d1f0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
d200: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
d210: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
d220: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
d230: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
d240: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
d250: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c SL_NO_TLS1_2) ||
d260: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
d270: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f _NO_TLS1_2_METHO
d280: 44 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c D). if (ENABL
d290: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d2a0: 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 OTO_TLS1_2)) {..
d2b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d2c0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
d2d0: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 2 protocol not s
d2e0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
d2f0: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *)NULL);..retur
d300: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
d310: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
d320: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
d330: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d340: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
d350: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d360: 54 4c 53 31 5f 33 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_3_METHOD).
d370: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
d380: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
d390: 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f TLS1_3)) {..Tcl_
d3a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d3b0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 erp, "TLS 1.3 pr
d3c0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d3d0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e rted", (char *)N
d3e0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
d3f0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
d400: 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d . if (proto =
d410: 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 = 0) {../* Use f
d420: 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 ull range */..SS
d430: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 L_CTX_set_min_pr
d440: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
d450: 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 0);..SSL_CTX_se
d460: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 t_max_proto_vers
d470: 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 ion(ctx, 0);.
d480: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 }.. switch (
d490: 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 21 64 65 proto) {.#if !de
d4a0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
d4b0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d4c0: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 SL_NO_TLS1) && !
d4d0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d4e0: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
d4f0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
d500: 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 TO_TLS1:..method
d510: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
d520: 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f Sv1_server_metho
d530: 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 d() : TLSv1_clie
d540: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
d550: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
d560: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
d570: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
d580: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
d590: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
d5a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
d5b0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 _METHOD). cas
d5c0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
d5d0: 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 _1:..method = is
d5e0: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 Server ? TLSv1_1
d5f0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
d600: 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e : TLSv1_1_clien
d610: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
d620: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
d630: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
d640: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
d650: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
d660: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d670: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f ENSSL_NO_TLS1_2_
d680: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
d690: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
d6a0: 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 2:..method = isS
d6b0: 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f erver ? TLSv1_2_
d6c0: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
d6d0: 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 : TLSv1_2_client
d6e0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
d6f0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
d700: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
d710: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d720: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
d730: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
d740: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 5f 4d NSSL_NO_TLS1_3_M
d750: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 ETHOD). case
d760: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
d770: 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 :../* Use the ge
d780: 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 neric method and
d790: 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 constraint rang
d7a0: 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 e after context
d7b0: 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d is created */..m
d7c0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 ethod = isServer
d7d0: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 ? TLS_server_me
d7e0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 thod() : TLS_cli
d7f0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
d800: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 reak;.#endif.
d810: 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 default:../* Ne
d820: 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20 gotiate highest
d830: 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c available SSL/TL
d840: 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 S version */..me
d850: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
d860: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 ? TLS_server_met
d870: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 hod() : TLS_clie
d880: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 nt_method();.#if
d890: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
d8a0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
d8b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 PENSSL_NO_TLS1)
d8c0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
d8d0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 SSL_NO_TLS1_METH
d8e0: 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 OD)..off |= (ENA
d8f0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
d900: 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 PROTO_TLS1) ?
d910: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 0 : SSL_OP_NO_TL
d920: 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 Sv1);.#endif.#if
d930: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
d940: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
d950: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d960: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
d970: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
d980: 31 5f 4d 45 54 48 4f 44 29 0a 09 6f 66 66 20 7c 1_METHOD)..off |
d990: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
d9a0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
d9b0: 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 _1) ? 0 : SSL_OP
d9c0: 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 _NO_TLSv1_1);.#e
d9d0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
d9e0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 d(NO_TLS1_2) &&
d9f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
da00: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 _NO_TLS1_2) && !
da10: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
da20: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 NO_TLS1_2_METHOD
da30: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
da40: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
da50: 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 OTO_TLS1_2) ? 0
da60: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
da70: 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 1_2);.#endif.#if
da80: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
da90: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
daa0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
dab0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
dac0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
dad0: 33 5f 4d 45 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3_METHOD)..off |
dae0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
daf0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
db00: 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 _3) ? 0 : SSL_OP
db10: 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 _NO_TLSv1_3);.#e
db20: 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 ndif..break;.
db30: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
db40: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 r_error();..
db50: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
db60: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 w(method);. i
db70: 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75 f (!ctx) {..retu
db80: 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a rn(NULL);. }.
db90: 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 . if (getenv(
dba0: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 SSLKEYLOGFILE))
dbb0: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b {..SSL_CTX_set_k
dbc0: 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 eylog_callback(c
dbd0: 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 tx, KeyLogCallba
dbe0: 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 ck);. }..#if
dbf0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
dc00: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
dc10: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
dc20: 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 3). if (proto
dc30: 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c == TLS_PROTO_TL
dc40: 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 S1_3) {..SSL_CTX
dc50: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 _set_min_proto_v
dc60: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 ersion(ctx, TLS1
dc70: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 _3_VERSION);..SS
dc80: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 L_CTX_set_max_pr
dc90: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
dca0: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 TLS1_3_VERSION)
dcb0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a ;. }.#endif..
dcc0: 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 /* Force cip
dcd0: 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 her selection or
dce0: 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f der by server */
dcf0: 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76 . if (!isServ
dd00: 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 er) {..SSL_CTX_s
dd10: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 et_options(ctx,
dd20: 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 SSL_OP_CIPHER_SE
dd30: 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 RVER_PREFERENCE)
dd40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 53 4c ;. }.. SSL
dd50: 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 _CTX_set_app_dat
dd60: 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e a(ctx, (void*)in
dd70: 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 terp);./* rememb
dd80: 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 er the interpret
dd90: 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 er */. SSL_CT
dda0: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
ddb0: 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 x, SSL_OP_ALL);.
ddc0: 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 /* all SSL bug w
ddd0: 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 orkarounds */.
dde0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
ddf0: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
de00: 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e P_NO_COMPRESSION
de10: 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f );./* disable co
de20: 6d 70 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 mpression even i
de30: 66 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 f supported */.
de40: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f SSL_CTX_set_o
de50: 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 ptions(ctx, off)
de60: 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 ;../* disable pr
de70: 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 otocol versions
de80: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
de90: 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 ess_set_cache_si
dea0: 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 ze(ctx, 128);..
deb0: 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 /* Set user d
dec0: 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 efined ciphers,
ded0: 63 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 cipher suites, a
dee0: 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 nd security leve
def0: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 l */. if ((ci
df00: 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 phers != NULL) &
df10: 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 & !SSL_CTX_set_c
df20: 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 ipher_list(ctx,
df30: 63 69 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c ciphers)) {..Tcl
df40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
df50: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 terp, "Set ciphe
df60: 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 rs failed: No va
df70: 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 lid ciphers", (c
df80: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 har *)NULL);..SS
df90: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
dfa0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
dfb0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 }. if ((ci
dfc0: 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 phersuites != NU
dfd0: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f LL) && !SSL_CTX_
dfe0: 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 set_ciphersuites
dff0: 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 (ctx, ciphersuit
e000: 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 es)) {..Tcl_Appe
e010: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
e020: 20 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69 "Set cipher sui
e030: 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 tes failed: No v
e040: 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 alid ciphers", (
e050: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 char *)NULL);..S
e060: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
e070: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
e080: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
e090: 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c t security level
e0a0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 */. if (leve
e0b0: 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 l > -1 && level
e0c0: 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 < 6) {../* SSL_s
e0d0: 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 et_security_leve
e0e0: 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 l */..SSL_CTX_se
e0f0: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c t_security_level
e100: 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 (ctx, level);.
e110: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 }.. /* set
e120: 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a some callbacks *
e130: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 /. SSL_CTX_se
e140: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 t_default_passwd
e150: 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 _cb(ctx, Passwor
e160: 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 dCallback);.
e170: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
e180: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 ult_passwd_cb_us
e190: 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 erdata(ctx, (voi
e1a0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a d *)statePtr);..
e1b0: 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 /* read a Di
e1c0: 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 ffie-Hellman par
e1d0: 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 ameters file, or
e1e0: 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 use the built-i
e1f0: 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 n one */.#ifdef
e200: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 OPENSSL_NO_DH.
e210: 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 if (DHparams !
e220: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
e230: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
e240: 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 rp, "DH paramete
e250: 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 r support not av
e260: 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 ailable", (char
e270: 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 *)NULL);..SSL_CT
e280: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
e290: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
e2a0: 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 .#else. {..DH
e2b0: 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 * dh;..if (DHpar
e2c0: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ams != NULL) {..
e2d0: 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 BIO *bio;..
e2e0: 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 bio = BIO_new
e2f0: 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 _file(F2N(DHpara
e300: 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a ms, &ds), "r");.
e310: 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b . if (!bio) {
e320: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ...Tcl_DStringFr
e330: 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 ee(&ds);...Tcl_A
e340: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
e350: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 rp, "Could not f
e360: 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 ind DH parameter
e370: 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a s file", (char *
e380: 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 )NULL);...SSL_CT
e390: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
e3a0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
e3b0: 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45 }... dh = PE
e3c0: 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 M_read_bio_DHpar
e3d0: 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e ams(bio, NULL, N
e3e0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ULL, NULL);..
e3f0: 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a BIO_free(bio);.
e400: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
e410: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
e420: 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c if (!dh) {...Tcl
e430: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e440: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 terp, "Could not
e450: 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 read DH paramet
e460: 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 ers from file",
e470: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 (char *)NULL);..
e480: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
e490: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
e4a0: 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53 L;.. }.. S
e4b0: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 SL_CTX_set_tmp_d
e4c0: 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 h(ctx, dh);..
e4d0: 20 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 09 7d DH_free(dh);..}
e4e0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 else {.. /*
e4f0: 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 Use well known D
e500: 48 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 H parameters tha
e510: 74 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 t have built-in
e520: 73 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 support in OpenS
e530: 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 SL */.. if (!
e540: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 SSL_CTX_set_dh_a
e550: 75 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 uto(ctx, 1)) {..
e560: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
e570: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 t(interp, "Could
e580: 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 not enable set
e590: 44 48 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f DH auto: ", GET_
e5a0: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
e5b0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 har *)NULL);...S
e5c0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
e5d0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
e5e0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d .. }..}. }
e5f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 .#endif.. /*
e600: 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 set our certific
e610: 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f ate */. load_
e620: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b private_key = 0;
e630: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c . if (certfil
e640: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f e != NULL) {..lo
e650: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
e660: 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 1;...if (SSL_CT
e670: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
e680: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 e_file(ctx, F2N(
e690: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 certfile, &ds),
e6a0: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
e6b0: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) <= 0) {.. T
e6c0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
e6d0: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
e6e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
e6f0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
e700: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 t certificate fi
e710: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 le ", certfile,
e720: 22 3a 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f ": ",... GET_
e730: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
e740: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 har *)NULL);..
e750: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
e760: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
e770: 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 NULL;..}..Tcl_D
e780: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
e790: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
e7a0: 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b (cert != NULL) {
e7b0: 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b ..load_private_k
e7c0: 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c ey = 1;..if (SSL
e7d0: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 _CTX_use_certifi
e7e0: 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 cate_ASN1(ctx, c
e7f0: 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c ert_len, cert) <
e800: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
e810: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
e820: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
e830: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a set certificate:
e840: 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 ",... GET_ER
e850: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
e860: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
e870: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
e880: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
e890: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c ULL;..}. } el
e8a0: 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d se {..certfile =
e8b0: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 (char*)X509_get
e8c0: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 _default_cert_fi
e8d0: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f le();...if (SSL_
e8e0: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
e8f0: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 ate_file(ctx, ce
e900: 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 rtfile, SSL_FILE
e910: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 TYPE_PEM) <= 0)
e920: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c {.#if 0.. Tcl
e930: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e940: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
e950: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 use default cer
e960: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c tificate file ",
e970: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c certfile, ": ",
e980: 0a 09 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 ... GET_ERR_R
e990: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
e9a0: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c )NULL);.. SSL
e9b0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
e9c0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
e9d0: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 ;.#endif..}.
e9e0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 }.. /* set ou
e9f0: 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f r private key */
ea00: 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 . if (load_pr
ea10: 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 ivate_key) {..if
ea20: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
ea30: 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c L && key == NULL
ea40: 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 ) {.. keyfile
ea50: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a = certfile;..}.
ea60: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d ..if (keyfile !=
ea70: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a NULL) {.. /*
ea80: 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 get the private
ea90: 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 key associated
eaa0: 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 with this certif
eab0: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 icate */.. if
eac0: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c (keyfile == NUL
ead0: 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d L) {...keyfile =
eae0: 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 certfile;..
eaf0: 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f }... if (SSL_
eb00: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b CTX_use_PrivateK
eb10: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e ey_file(ctx, F2N
eb20: 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 (keyfile, &ds),
eb30: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
eb40: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f ) <= 0) {...Tcl_
eb50: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
eb60: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 ;.../* flush the
eb70: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 passphrase whic
eb80: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 h might be left
eb90: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f in the result */
eba0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
ebb0: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 (interp, NULL, T
ebc0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 CL_STATIC);...Tc
ebd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
ebe0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
ebf0: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 o set public key
ec00: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 file ", keyfile
ec10: 2c 20 22 20 22 2c 0a 09 09 09 47 45 54 5f 45 52 , " ",....GET_ER
ec20: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
ec30: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c r *)NULL);...SSL
ec40: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
ec50: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
ec60: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
ec70: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
ec80: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 ..} else if (key
ec90: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
eca0: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 if (SSL_CTX_use
ecb0: 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 _PrivateKey_ASN1
ecc0: 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 (EVP_PKEY_RSA, c
ecd0: 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 tx, key,key_len)
ece0: 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 6c <= 0) {.../* fl
ecf0: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 ush the passphra
ed00: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 se which might b
ed10: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 e left in the re
ed20: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 sult */...Tcl_Se
ed30: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
ed40: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 NULL, TCL_STATIC
ed50: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 );...Tcl_AppendR
ed60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
ed70: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 nable to set pub
ed80: 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f lic key: ", GET_
ed90: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
eda0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 har *)NULL);...S
edb0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
edc0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
edd0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e .. }..}../* N
ede0: 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 ow we know that
edf0: 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 a key and cert h
ee00: 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 ave been set aga
ee10: 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c inst.. * the SSL
ee20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 context */..if
ee30: 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f (!SSL_CTX_check_
ee40: 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 private_key(ctx)
ee50: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
ee60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
ee70: 2c 0a 09 09 20 20 20 20 22 70 72 69 76 61 74 65 ,... "private
ee80: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 key does not ma
ee90: 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 tch the certific
eea0: 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c ate public key",
eeb0: 0a 09 09 20 20 20 20 28 63 68 61 72 20 2a 29 4e ... (char *)N
eec0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
eed0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
eee0: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
eef0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
ef00: 20 53 65 74 20 74 6f 20 75 73 65 20 64 65 66 61 Set to use defa
ef10: 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 ult location and
ef20: 20 66 69 6c 65 20 66 6f 72 20 43 65 72 74 69 66 file for Certif
ef30: 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 icate Authority
ef40: 28 43 41 29 20 63 65 72 74 69 66 69 63 61 74 65 (CA) certificate
ef50: 73 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 76 65 s. The. * ve
ef60: 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 73 74 rify path and st
ef70: 6f 72 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 ore can be overr
ef80: 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c idden by the SSL
ef90: 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 _CERT_DIR env va
efa0: 72 2e 20 54 68 65 20 76 65 72 69 66 79 20 66 69 r. The verify fi
efb0: 6c 65 20 63 61 6e 0a 20 20 20 20 20 2a 20 62 65 le can. * be
efc0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 overridden by t
efd0: 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 he SSL_CERT_FILE
efe0: 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20 20 20 env var. */.
eff0: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 if (!SSL_CTX_se
f000: 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 t_default_verify
f010: 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 09 _paths(ctx)) {..
f020: 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a abort++;. }..
f030: 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64 65 73 /* Overrides
f040: 20 66 6f 72 20 74 68 65 20 43 41 20 76 65 72 69 for the CA veri
f050: 66 79 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 fy path and file
f060: 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 20 4f 50 */. {.#if OP
f070: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
f080: 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
f090: 30 4c 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 0L..if (CApath !
f0a0: 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69 6c 65 = NULL || CAfile
f0b0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
f0c0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 Tcl_DString ds1
f0d0: 3b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f ;.. if (!SSL_
f0e0: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f CTX_load_verify_
f0f0: 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 locations(ctx, F
f100: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 2N(CAfile, &ds),
f110: 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 F2N(CApath, &ds
f120: 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 1))) {...abort++
f130: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
f140: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
f150: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 s);.. Tcl_DSt
f160: 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a ringFree(&ds1);.
f170: 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 .. /* Set lis
f180: 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 t of CAs to send
f190: 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 to client when
f1a0: 72 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 requesting a cli
f1b0: 65 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 ent certificate
f1c0: 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73 */.. /* https
f1d0: 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e ://sourceforge.n
f1e0: 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 et/p/tls/bugs/57
f1f0: 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 / */.. /* XXX
f200: 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 :TODO: Let the u
f210: 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 ser supply value
f220: 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f s here instead o
f230: 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 f something that
f240: 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 exists on the f
f250: 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 ilesystem */..
f260: 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f STACK_OF(X509_
f270: 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 NAME) *certNames
f280: 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 = SSL_load_clie
f290: 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 nt_CA_file(F2N(C
f2a0: 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 Afile, &ds));..
f2b0: 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 if (certNames
f2c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 != NULL) {...SS
f2d0: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 L_CTX_set_client
f2e0: 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 _CA_list(ctx, ce
f2f0: 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d rtNames);.. }
f300: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
f310: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a gFree(&ds);..}..
f320: 23 65 6c 73 65 0a 09 69 66 20 28 43 41 70 61 74 #else..if (CApat
f330: 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 h != NULL) {..
f340: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c if (!SSL_CTX_l
f350: 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 oad_verify_dir(c
f360: 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 tx, F2N(CApath,
f370: 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 &ds))) {...abort
f380: 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ++;.. }..
f390: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
f3a0: 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28 43 41 &ds);..}..if (CA
f3b0: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
f3c0: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
f3d0: 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 X_load_verify_fi
f3e0: 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 le(ctx, F2N(CAfi
f3f0: 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 le, &ds))) {...a
f400: 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 bort++;.. }..
f410: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
f420: 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 ree(&ds);...
f430: 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 /* Set list of C
f440: 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c As to send to cl
f450: 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 ient when reques
f460: 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 ting a client ce
f470: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 rtificate */..
f480: 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f STACK_OF(X509_
f490: 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 NAME) *certNames
f4a0: 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 = SSL_load_clie
f4b0: 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 nt_CA_file(F2N(C
f4c0: 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 Afile, &ds));..
f4d0: 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 if (certNames
f4e0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 != NULL) {...SS
f4f0: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 L_CTX_set_client
f500: 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 _CA_list(ctx, ce
f510: 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d rtNames);.. }
f520: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
f530: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 gFree(&ds);..}.#
f540: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 endif. }..
f550: 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c return ctx;.}..
f560: 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d ----------------
f5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
f5b0: 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 StatusObjCmd --
f5c0: 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 return certifica
f5d0: 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 te for connected
f5e0: 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 peer.. *. * Res
f5f0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
f600: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
f610: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
f620: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
f630: 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f670: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
f680: 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d int.StatusObjCm
f690: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 d(. TCL_UNUSE
f6a0: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 D(void *),. T
f6b0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
f6c0: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c p,. int objc,
f6d0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f . Tcl_Obj.*co
f6e0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 nst objv[]).{.
f6f0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
f700: 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 r;. X509 *pee
f710: 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a r;. Tcl_Obj *
f720: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f objPtr;. Tcl_
f730: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 Channel chan;.
f740: 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e char *channelN
f750: 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 ame, *ciphers;.
f760: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 int mode;.
f770: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
f780: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 char *proto;.
f790: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 unsigned int le
f7a0: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 n;. int nid,
f7b0: 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 res;.. dprint
f7c0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
f7d0: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c if (objc < 2 |
f7e0: 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f | objc > 3 || (o
f7f0: 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 74 72 bjc == 3 && !str
f800: 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e cmp(Tcl_GetStrin
f810: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f g(objv[1]), "-lo
f820: 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 cal"))) {..Tcl_W
f830: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
f840: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d rp, 1, objv, "?-
f850: 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 local? channel")
f860: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
f870: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
f880: 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 channelName = Tc
f890: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
f8a0: 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 [(objc == 2 ? 1
f8b0: 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 68 61 6e : 2)]);. chan
f8c0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
f8d0: 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 l(interp, channe
f8e0: 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 lName, &mode);.
f8f0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
f900: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
f910: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
f920: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
f930: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 /*. * Make
f940: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
f950: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
f960: 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a channel. */.
f970: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
f980: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
f990: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f n);. if (Tcl_
f9a0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
f9b0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
f9c0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
f9d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
f9e0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
f9f0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
fa00: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
fa10: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 ),..."\": not a
fa20: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 TLS channel", (c
fa30: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 63 har *)NULL);..Tc
fa40: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
fa50: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 nterp, "TLS", "S
fa60: 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c TATUS", "CHANNEL
fa70: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 ", "INVALID", (c
fa80: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 har *)NULL);..re
fa90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
faa0: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
fab0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 tr = (State *) T
fac0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
fad0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b tanceData(chan);
fae0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 .. /* Get cer
faf0: 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 tificate for pee
fb00: 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 r or self */.
fb10: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
fb20: 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 {..peer = SSL_ge
fb30: 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 t_peer_certifica
fb40: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
fb50: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
fb60: 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f .peer = SSL_get_
fb70: 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 certificate(stat
fb80: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
fb90: 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 }. /* Get X50
fba0: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 9 certificate in
fbb0: 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 fo */. if (pe
fbc0: 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 er) {..objPtr =
fbd0: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 Tls_NewX509Obj(i
fbe0: 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 nterp, peer);..i
fbf0: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a f (objc == 2) {.
fc00: 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 . X509_free(p
fc10: 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 eer);.. peer
fc20: 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d = NULL;..}. }
fc30: 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 else {..objPtr
fc40: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
fc50: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d (0, NULL);. }
fc60: 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 .. /* Peer na
fc70: 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e me */. LAPPEN
fc80: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
fc90: 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 jPtr, "peername"
fca0: 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e , SSL_get0_peern
fcb0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ame(statePtr->ss
fcc0: 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 l), -1);. LAP
fcd0: 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
fce0: 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 objPtr, "sbits"
fcf0: 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 , SSL_get_cipher
fd00: 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e _bits(statePtr->
fd10: 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 ssl, NULL));..
fd20: 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 ciphers = (cha
fd30: 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 r*)SSL_get_ciphe
fd40: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 r(statePtr->ssl)
fd50: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
fd60: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
fd70: 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 , "cipher", ciph
fd80: 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f ers, -1);.. /
fd90: 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 * Verify the X50
fda0: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 9 certificate pr
fdb0: 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 esented by the p
fdc0: 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 eer */. LAPPE
fdd0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
fde0: 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 bjPtr, "verifyRe
fdf0: 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 sult",..X509_ver
fe00: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 ify_cert_error_s
fe10: 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 tring(SSL_get_ve
fe20: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
fe30: 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 ePtr->ssl)), -1)
fe40: 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 ;.. /* Verify
fe50: 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 mode */. mod
fe60: 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 e = SSL_get_veri
fe70: 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 fy_mode(statePtr
fe80: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 ->ssl);. if (
fe90: 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
fea0: 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 FY_NONE) {..LAPP
feb0: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
fec0: 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d objPtr, "verifyM
fed0: 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 ode", "none", -1
fee0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
fef0: 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 .Tcl_Obj *listOb
ff00: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
ff10: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
ff20: 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c .if (mode && SSL
ff30: 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a _VERIFY_PEER) {.
ff40: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
ff50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
ff60: 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 terp, listObjPtr
ff70: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
ff80: 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b bj("peer", -1));
ff90: 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 ..}..if (mode &&
ffa0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
ffb0: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
ffc0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
ffd0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
ffe0: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
fff0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
10000 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 ingObj("fail if
10010 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d no peer cert", -
10020 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 1));..}..if (mod
10030 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f e && SSL_VERIFY_
10040 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 CLIENT_ONCE) {..
10050 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
10060 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
10070 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c erp, listObjPtr,
10080 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
10090 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c j("client once",
100a0 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d -1));..}..if (m
100b0 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 ode && SSL_VERIF
100c0 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 Y_POST_HANDSHAKE
100d0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ) {.. Tcl_Lis
100e0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
100f0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 t(interp, listOb
10100 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
10110 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e ingObj("post han
10120 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 dshake", -1));..
10130 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 }..LAPPEND_OBJ(i
10140 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10150 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 verifyMode", lis
10160 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a tObjPtr). }..
10170 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f /* Verify mo
10180 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 de depth */.
10190 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
101a0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 rp, objPtr, "ver
101b0 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 ifyDepth", SSL_g
101c0 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 et_verify_depth(
101d0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b statePtr->ssl));
101e0 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 .. /* Report
101f0 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
10200 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
10210 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 t of the negotia
10220 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f tion */. SSL_
10230 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 get0_alpn_select
10240 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ed(statePtr->ssl
10250 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b , &proto, &len);
10260 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
10270 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10280 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a "alpn", (char *
10290 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a )proto, (Tcl_Siz
102a0 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 e) len);. LAP
102b0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
102c0 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
102d0 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 ol", SSL_get_ver
102e0 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 sion(statePtr->s
102f0 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f sl), -1);.. /
10300 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d * Valid for non-
10310 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e RSA signature an
10320 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 d TLS 1.3 */.
10330 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
10340 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
10350 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f _peer_signature_
10360 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
10370 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 l, &nid);. }
10380 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 else {..res = SS
10390 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f L_get_signature_
103a0 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 nid(statePtr->ss
103b0 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a l, &nid);. }.
103c0 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e if (!res) {n
103d0 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 id = 0;}. LAP
103e0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
103f0 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 objPtr, "signat
10400 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d ureHashAlgorithm
10410 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 ", OBJ_nid2ln(ni
10420 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66 d), -1);.. if
10430 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
10440 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 res = SSL_get_pe
10450 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 er_signature_typ
10460 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
10470 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
10480 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
10490 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 SSL_get_signatur
104a0 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 e_type_nid(state
104b0 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b Ptr->ssl, &nid);
104c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 . }. if (!
104d0 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a res) {nid = 0;}.
104e0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
104f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10500 22 73 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c "signatureType",
10510 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 OBJ_nid2ln(nid)
10520 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f , -1);.. Tcl_
10530 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
10540 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
10550 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
10560 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
105b0 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e . * ConnectionIn
105c0 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 foObjCmd -- retu
105d0 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e rn connection in
105e0 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e fo from OpenSSL.
105f0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
10600 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e *.A list of con
10610 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a nection info. *
10620 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
10660 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
10670 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f ic int Connectio
10680 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 0a 20 20 20 nInfoObjCmd(.
10690 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 TCL_UNUSED(void
106a0 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 *),. Tcl_Int
106b0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 erp *interp,.
106c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 int objc,. T
106d0 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
106e0 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f jv[]).{. Tcl_
106f0 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
10700 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
10710 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a set a mode on *
10720 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
10730 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e tePtr;../* clien
10740 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
10750 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 socket */. Tc
10760 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a l_Obj *objPtr, *
10770 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e listPtr;. con
10780 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 st SSL *ssl;.
10790 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 const SSL_CIPHE
107a0 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 R *cipher;. c
107b0 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e onst SSL_SESSION
107c0 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 *session;. c
107d0 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b onst EVP_MD *md;
107e0 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
107f0 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
10800 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
10810 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
10820 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 el");..return(TC
10830 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a L_ERROR);. }.
10840 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
10850 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
10860 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
10870 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
10880 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
10890 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
108a0 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 NULL) {..return(
108b0 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
108c0 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 }.. /* Make s
108d0 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
108e0 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
108f0 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
10900 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
10910 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 annel(chan);.
10920 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
10930 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
10940 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
10950 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e ()) {..Tcl_Appen
10960 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
10970 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
10980 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
10990 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 Name(chan),..
109a0 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 "\": not a TLS
109b0 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
109c0 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
109d0 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
109e0 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 , "CONNECTION",
109f0 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 "CHANNEL", "INVA
10a00 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 LID", (char *)NU
10a10 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c LL);..return(TCL
10a20 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a _ERROR);. }..
10a30 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
10a40 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
10a50 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f ULL);.. /* Co
10a60 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f nnection info */
10a70 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 . statePtr =
10a80 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 (State *)Tcl_Get
10a90 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
10aa0 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 ata(chan);. s
10ab0 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 sl = statePtr->s
10ac0 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 sl;. if (ssl
10ad0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 != NULL) {../* c
10ae0 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 onnection state
10af0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
10b00 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10b10 22 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 "state", SSL_sta
10b20 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 te_string_long(s
10b30 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 sl), -1);.../* G
10b40 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 et SNI requested
10b50 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a server name */.
10b60 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
10b70 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
10b80 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 rvername", SSL_g
10b90 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 et_servername(ss
10ba0 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 l, TLSEXT_NAMETY
10bb0 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d PE_host_name), -
10bc0 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 1);.../* Get pro
10bd0 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e tocol */..LAPPEN
10be0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10bf0 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 jPtr, "protocol"
10c00 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f , SSL_get_versio
10c10 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f n(ssl), -1);.../
10c20 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 * Renegotiation
10c30 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 allowed */..LAPP
10c40 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
10c50 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f objPtr, "renego
10c60 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 tiation_allowed"
10c70 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 , SSL_get_secure
10c80 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 _renegotiation_s
10c90 75 70 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 upport((SSL *) s
10ca0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 sl));.../* Get s
10cb0 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f ecurity level */
10cc0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
10cd0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
10ce0 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 ecurity_level",
10cf0 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 SSL_get_security
10d00 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 _level(ssl));...
10d10 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 /* Session info
10d20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c */..LAPPEND_BOOL
10d30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10d40 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 "session_reused
10d50 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 ", SSL_session_r
10d60 65 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f eused(ssl));.../
10d70 2a 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f * Is server info
10d80 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
10d90 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
10da0 2c 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 , "is_server", S
10db0 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c SL_is_server(ssl
10dc0 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 ));.../* Is DTLS
10dd0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
10de0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
10df0 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c , "is_dtls", SSL
10e00 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a _is_dtls(ssl));.
10e10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 }.. /* Ci
10e20 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 pher info */.
10e30 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 cipher = SSL_ge
10e40 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 t_current_cipher
10e50 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 (ssl);. if (c
10e60 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b ipher != NULL) {
10e70 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 ..char buf[BUFSI
10e80 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 Z] = {0};..int b
10e90 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a its, alg_bits;..
10ea0 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 ./* Cipher name
10eb0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
10ec0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10ed0 22 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 "cipher", SSL_CI
10ee0 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 PHER_get_name(ci
10ef0 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a pher), -1);.../*
10f00 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 RFC name of cip
10f10 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
10f20 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
10f30 74 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 tr, "standard_na
10f40 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f me", SSL_CIPHER_
10f50 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 standard_name(ci
10f60 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a pher), -1);.../*
10f70 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 OpenSSL name of
10f80 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 cipher */..LAPP
10f90 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10fa0 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c objPtr, "openssl
10fb0 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f _name", OPENSSL_
10fc0 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f cipher_name(SSL_
10fd0 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f CIPHER_standard_
10fe0 6e 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d name(cipher)), -
10ff0 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 1);.../* number
11000 6f 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75 of secret bits u
11010 73 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a sed for cipher *
11020 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 /..bits = SSL_CI
11030 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 PHER_get_bits(ci
11040 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 pher, &alg_bits)
11050 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 ;..LAPPEND_INT(i
11060 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11070 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 secret_bits", bi
11080 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e ts);..LAPPEND_IN
11090 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
110a0 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 , "algorithm_bit
110b0 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 s", alg_bits);..
110c0 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 /* alg_bits is a
110d0 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 ctual key secret
110e0 20 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 bits. If use bi
110f0 74 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 ts and secret (a
11100 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 lgorithm) bits d
11110 69 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 iffer,.. the r
11120 65 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 est of the bits
11130 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 are fixed, i.e.
11140 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f for limited expo
11150 72 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 rt ciphers (bits
11160 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 < 56) */.../* I
11170 6e 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53 ndicates which S
11180 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 SL/TLS protocol
11190 76 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 version first de
111a0 66 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 fined the cipher
111b0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
111c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
111d0 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 "min_version",
111e0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 SSL_CIPHER_get_v
111f0 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 ersion(cipher),
11200 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 -1);.../* Cipher
11210 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 NID */..LAPPEND
11220 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11230 50 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 Ptr, "cipherNID"
11240 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
11250 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
11260 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 get_cipher_nid(c
11270 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c ipher)), -1);..L
11280 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
11290 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 p, objPtr, "dige
112a0 73 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 stNID", (char *)
112b0 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 OBJ_nid2ln(SSL_C
112c0 49 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 IPHER_get_digest
112d0 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d _nid(cipher)), -
112e0 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 1);..LAPPEND_STR
112f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11300 20 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 "keyExchangeNID
11310 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e ", (char *)OBJ_n
11320 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 id2ln(SSL_CIPHER
11330 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 _get_kx_nid(ciph
11340 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 er)), -1);..LAPP
11350 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11360 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 objPtr, "authent
11370 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 icationNID", (ch
11380 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 ar *)OBJ_nid2ln(
11390 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 SSL_CIPHER_get_a
113a0 75 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 uth_nid(cipher))
113b0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 , -1);.../* mess
113c0 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 age authenticati
113d0 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 on code - Cipher
113e0 20 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 is AEAD (e.g. G
113f0 43 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 CM or ChaCha20/P
11400 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 oly1305) or not
11410 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 */../* Authentic
11420 61 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 ated Encryption
11430 77 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 with associated
11440 64 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63 data (AEAD) chec
11450 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f k */..LAPPEND_BO
11460 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
11470 72 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 r, "cipher_is_ae
11480 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f ad", SSL_CIPHER_
11490 69 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 is_aead(cipher))
114a0 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 ;.../* Digest us
114b0 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 ed during the SS
114c0 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 L/TLS handshake
114d0 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 when using the c
114e0 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 ipher. */..md =
114f0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 SSL_CIPHER_get_h
11500 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 andshake_digest(
11510 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e cipher);..LAPPEN
11520 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11530 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 jPtr, "handshake
11540 5f 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 _digest", (char
11550 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 *)EVP_MD_name(md
11560 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 ), -1);.../* Get
11570 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 OpenSSL-specifi
11580 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 c ID, not IANA I
11590 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e D */..LAPPEND_IN
115a0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
115b0 2c 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 , "cipher_id", (
115c0 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f int) SSL_CIPHER_
115d0 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b get_id(cipher));
115e0 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 .../* Two-byte I
115f0 44 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c D used in the TL
11600 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 S protocol of th
11610 65 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a e given cipher *
11620 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 /..LAPPEND_INT(i
11630 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11640 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 protocol_id", (i
11650 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 nt) SSL_CIPHER_g
11660 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 et_protocol_id(c
11670 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 ipher));.../* Te
11680 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f xtual descriptio
11690 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 n of the cipher
116a0 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 */..if (SSL_CIPH
116b0 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 ER_description(c
116c0 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 ipher, buf, size
116d0 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c of(buf)) != NULL
116e0 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 ) {.. LAPPEND
116f0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
11700 50 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f Ptr, "descriptio
11710 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d n", buf, -1);..}
11720 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
11730 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 ession info */.
11740 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c session = SSL
11750 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c _get_session(ssl
11760 29 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 );. if (sessi
11770 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 on != NULL) {..c
11780 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
11790 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a ar *ticket;..siz
117a0 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 e_t len2;..unsig
117b0 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 ned int ulen;..c
117c0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
117d0 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 ar *session_id,
117e0 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 *proto;..unsigne
117f0 64 20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 d char buffer[SS
11800 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 L_MAX_MASTER_KEY
11810 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 _LENGTH];.../* R
11820 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 eport the select
11830 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 ed protocol as a
11840 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 result of the A
11850 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 LPN negotiation
11860 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f */..SSL_SESSION_
11870 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 get0_alpn_select
11880 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f ed(session, &pro
11890 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 to, &len2);..LAP
118a0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
118b0 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c objPtr, "alpn",
118c0 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c (char *) proto,
118d0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
118e0 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 );.../* Report t
118f0 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 he selected prot
11900 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 ocol as a result
11910 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f of the NPN nego
11920 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 tiation */.#ifde
11930 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 f USE_NPN..SSL_g
11940 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e et0_next_proto_n
11950 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 egotiated(ssl, &
11960 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 proto, &ulen);..
11970 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11980 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e rp, objPtr, "npn
11990 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 ", (char *) prot
119a0 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c o, (Tcl_Size) ul
119b0 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a en);.#endif.../*
119c0 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 Resumable sessi
119d0 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 on */..LAPPEND_B
119e0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
119f0 74 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c tr, "resumable",
11a00 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f SSL_SESSION_is_
11a10 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f resumable(sessio
11a20 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f n));.../* Sessio
11a30 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 n start time (se
11a40 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 conds since epoc
11a50 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 h) */..LAPPEND_I
11a60 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
11a70 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c r, "start_time",
11a80 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
11a90 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b _time(session));
11aa0 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 .../* Timeout va
11ab0 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 lue - SSL_CTX_ge
11ac0 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 t_timeout (in se
11ad0 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 conds) */..LAPPE
11ae0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
11af0 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 bjPtr, "timeout"
11b00 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 , SSL_SESSION_ge
11b10 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f t_timeout(sessio
11b20 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f n));.../* Sessio
11b30 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 n id - TLSv1.2 a
11b40 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f nd below only */
11b50 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 ..session_id = S
11b60 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 SL_SESSION_get_i
11b70 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e d(session, &ulen
11b80 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
11b90 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
11ba0 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c r, "session_id",
11bb0 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 session_id, (Tc
11bc0 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a l_Size) ulen);..
11bd0 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 ./* Session cont
11be0 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f ext */..session_
11bf0 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e id = SSL_SESSION
11c00 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 _get0_id_context
11c10 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 (session, &ulen)
11c20 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 ;..LAPPEND_BARRA
11c30 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 Y(interp, objPtr
11c40 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 , "session_conte
11c50 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c xt", session_id,
11c60 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e (Tcl_Size) ulen
11c70 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
11c80 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 ticket - client
11c90 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 only */..SSL_SES
11ca0 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 SION_get0_ticket
11cb0 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 (session, &ticke
11cc0 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 t, &len2);..LAPP
11cd0 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 END_BARRAY(inter
11ce0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 p, objPtr, "sess
11cf0 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 ion_ticket", tic
11d00 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 ket, (Tcl_Size)
11d10 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 len2);.../* Sess
11d20 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 ion ticket lifet
11d30 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 ime hint (in sec
11d40 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e onds) */..LAPPEN
11d50 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
11d60 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 jPtr, "lifetime"
11d70 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 , SSL_SESSION_ge
11d80 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d t_ticket_lifetim
11d90 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 e_hint(session))
11da0 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 ;.../* Ticket ap
11db0 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50 p data */.#if OP
11dc0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
11dd0 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
11de0 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 0L..SSL_SESSION_
11df0 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 get0_ticket_appd
11e00 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e ata((SSL_SESSION
11e10 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 74 69 *) session, &ti
11e20 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c cket, &len2);..L
11e30 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e APPEND_BARRAY(in
11e40 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 terp, objPtr, "t
11e50 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c icket_app_data",
11e60 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 ticket, (Tcl_Si
11e70 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 ze) len2);.#endi
11e80 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 f.../* Get maste
11e90 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d r key */..len2 =
11ea0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
11eb0 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 _master_key(sess
11ec0 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c ion, buffer, SSL
11ed0 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f _MAX_MASTER_KEY_
11ee0 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e LENGTH);..LAPPEN
11ef0 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
11f00 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 objPtr, "master
11f10 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28 _key", buffer, (
11f20 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b Tcl_Size) len2);
11f30 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f .../* Compressio
11f40 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 n id */..unsigne
11f50 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 d int id = SSL_S
11f60 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 ESSION_get_compr
11f70 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b ess_id(session);
11f80 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
11f90 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
11fa0 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 ompression_id",
11fb0 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 id == 1 ? "zlib"
11fc0 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a : "none", -1);.
11fd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f }.. /* Co
11fe0 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a mpression info *
11ff0 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d /. if (ssl !=
12000 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 NULL) {.#ifdef
12010 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 HAVE_SSL_COMPRES
12020 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 SION..const COMP
12030 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a _METHOD *comp, *
12040 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 expn;..comp = SS
12050 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f L_get_current_co
12060 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a mpression(ssl);.
12070 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f .expn = SSL_get_
12080 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f current_expansio
12090 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e n(ssl);...LAPPEN
120a0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
120b0 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 jPtr, "compressi
120c0 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f on", comp ? SSL_
120d0 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f COMP_get_name(co
120e0 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 mp) : "none", -1
120f0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
12100 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12110 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 "expansion", exp
12120 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 n ? SSL_COMP_get
12130 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e _name(expn) : "n
12140 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 one", -1);.#else
12150 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
12160 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
12170 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f ompression", "no
12180 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 ne", -1);..LAPPE
12190 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
121a0 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f bjPtr, "expansio
121b0 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b n", "none", -1);
121c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 .#endif. }..
121d0 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 /* Server inf
121e0 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 o */. {..long
121f0 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f mode = SSL_CTX_
12200 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 get_session_cach
12210 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d e_mode(statePtr-
12220 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 >ctx);..char *ms
12230 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 g;...if (mode &
12240 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f SSL_SESS_CACHE_O
12250 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d FF) {.. msg =
12260 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 "off";..} else
12270 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
12280 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 ESS_CACHE_CLIENT
12290 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 ) {.. msg = "
122a0 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 client";..} else
122b0 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
122c0 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 SESS_CACHE_SERVE
122d0 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 R) {.. msg =
122e0 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 "server";..} els
122f0 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c e if (mode & SSL
12300 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 _SESS_CACHE_BOTH
12310 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 ) {.. msg = "
12320 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b both";..} else {
12330 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b .. msg = "unk
12340 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 nown";..}..LAPPE
12350 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
12360 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f bjPtr, "session_
12370 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 cache_mode", msg
12380 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 , -1);. }..
12390 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a /* CA List */.
123a0 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 /* IF not a
123b0 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 20 server, same as
123c0 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 SSL_get0_peer_CA
123d0 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 72 _list. If server
123e0 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 same as SSL_CTX
123f0 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c _get_client_CA_l
12400 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 ist */. listP
12410 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
12420 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 Obj(0, NULL);.
12430 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f STACK_OF(X509_
12440 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a NAME) *ca_list;.
12450 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 74 if ((ca_list
12460 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e = SSL_get_clien
12470 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 t_CA_list(ssl))
12480 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 != NULL) {..char
12490 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b buffer[BUFSIZ];
124a0 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 ..for (int i = 0
124b0 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 ; i < sk_X509_NA
124c0 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b ME_num(ca_list);
124d0 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 i++) {.. X50
124e0 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 9_NAME *name = s
124f0 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 k_X509_NAME_valu
12500 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 e(ca_list, i);..
12510 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a if (name) {.
12520 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c ..X509_NAME_onel
12530 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 ine(name, buffer
12540 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c , BUFSIZ);...Tcl
12550 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
12560 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
12570 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 stPtr, Tcl_NewSt
12580 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 ringObj(buffer,
12590 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a -1));.. }..}.
125a0 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e }. LAPPEN
125b0 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 D_OBJ(interp, ob
125c0 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 jPtr, "caList",
125d0 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 listPtr);. LA
125e0 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
125f0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 , objPtr, "caLis
12600 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 tCount", sk_X509
12610 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 _NAME_num(ca_lis
12620 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 t));.. Tcl_Se
12630 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
12640 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
12650 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
12660 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d ----------------
126a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
126b0 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 * VersionObjCmd
126c0 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f -- return versio
126d0 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 n string from Op
126e0 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 enSSL.. *. * Res
126f0 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
12700 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
12710 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
12720 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
12730 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12770 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
12780 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 int.VersionObjC
12790 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 md(. TCL_UNUS
127a0 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 ED(void *),.
127b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
127c0 72 70 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 rp,. TCL_UNUS
127d0 45 44 28 69 6e 74 29 20 2f 2a 20 6f 62 6a 63 20 ED(int) /* objc
127e0 2a 2f 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 */,. TCL_UNUS
127f0 45 44 28 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 ED(Tcl_Obj *cons
12800 74 20 2a 29 20 2f 2a 20 6f 62 6a 76 20 2a 2f 29 t *) /* objv */)
12810 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a .{. Tcl_Obj *
12820 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 objPtr;.. dpr
12830 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
12840 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
12850 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f l_NewStringObj(O
12860 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 PENSSL_VERSION_T
12870 45 58 54 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 EXT, -1);.. T
12880 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
12890 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
128a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
128b0 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12900 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d . *. * MiscObjCm
12910 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e d -- misc comman
12920 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 ds. *. * Results
12930 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
12940 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
12950 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
12960 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129b0 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
129c0 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 0a 20 20 20 .MiscObjCmd(.
129d0 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 TCL_UNUSED(void
129e0 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 *),. Tcl_Int
129f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 erp *interp,.
12a00 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 int objc,. T
12a10 63 6c 5f 4f 62 6a 09 2a 63 6f 6e 73 74 20 6f 62 cl_Obj.*const ob
12a20 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 73 74 61 74 jv[]).{. stat
12a30 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 ic const char *c
12a40 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 ommands [] = { "
12a50 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 req", "strreq",
12a60 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d NULL };. enum
12a70 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 command { C_REQ
12a80 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 , C_STRREQ, C_DU
12a90 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 MMY };. Tcl_S
12aa0 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e 74 ize cmd;. int
12ab0 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 isStr;. char
12ac0 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a buffer[16384];.
12ad0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
12ae0 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
12af0 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 (objc < 2) {..Tc
12b00 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
12b10 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
12b20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 "subcommand ?arg
12b30 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 s?");..return TC
12b40 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
12b50 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
12b60 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
12b70 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d p, objv[1], comm
12b80 61 6e 64 73 2c 0a 09 20 20 20 20 22 63 6f 6d 6d ands,.. "comm
12b90 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d and", 0,&cmd) !=
12ba0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
12bb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
12bc0 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
12bd0 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
12be0 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d isStr = (cmd ==
12bf0 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 C_STRREQ);.
12c00 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f switch ((enum co
12c10 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 mmand) cmd) {..c
12c20 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 ase C_REQ:..case
12c30 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 C_STRREQ: {..
12c40 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 EVP_PKEY *pkey
12c50 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
12c60 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 *cert=NULL;..
12c70 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d X509_NAME *nam
12c80 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c e=NULL;.. Tcl
12c90 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 _Obj **listv;..
12ca0 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 Tcl_Size list
12cb0 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a c,i;... BIO *
12cc0 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 out=NULL;...
12cd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 5f 43 3d const char *k_C=
12ce0 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c "",*k_ST="",*k_L
12cf0 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f ="",*k_O="",*k_O
12d00 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b U="",*k_CN="",*k
12d10 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 _Email="";..
12d20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 char *keyout,*pe
12d30 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 mout,*str;..
12d40 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 int keysize,seri
12d50 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a al=0,days=365;..
12d60 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
12d70 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
12d80 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 0000000L.. BI
12d90 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c GNUM *bne = NULL
12da0 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 ;.. RSA *rsa
12db0 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 = NULL;.#else..
12dc0 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 EVP_PKEY_CTX
12dd0 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e *ctx = NULL;.#en
12de0 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f dif... if ((o
12df0 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e bjc<5) || (objc>
12e00 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 6)) {...Tcl_Wron
12e10 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
12e20 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 2, objv, "keysi
12e30 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 ze keyfile certf
12e40 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 ile ?info?");...
12e50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
12e60 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 ;.. }... i
12e70 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
12e80 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
12e90 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 v[2], &keysize)
12ea0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 != TCL_OK) {...r
12eb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
12ec0 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 .. }.. key
12ed0 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e out=Tcl_GetStrin
12ee0 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 g(objv[3]);..
12ef0 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 pemout=Tcl_GetS
12f00 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a tring(objv[4]);.
12f10 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 . if (isStr)
12f20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 {...Tcl_SetVar(i
12f30 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c nterp,keyout,"",
12f40 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 0);...Tcl_SetVar
12f50 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 (interp,pemout,"
12f60 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 ",0);.. }...
12f70 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 if (objc>=6)
12f80 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 {...if (Tcl_List
12f90 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 ObjGetElements(i
12fa0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 nterp, objv[5],
12fb0 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 &listc, &listv)
12fc0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 != TCL_OK) {...
12fd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
12fe0 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ROR;...}....if (
12ff0 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 (listc%2) != 0)
13000 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 {... Tcl_SetR
13010 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e esult(interp,"In
13020 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d formation list m
13030 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 ust have even nu
13040 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
13050 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 s",NULL);...
13060 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
13070 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 ;...}...for (i=0
13080 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 ; i<listc; i+=2)
13090 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c {... str=Tcl
130a0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
130b0 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 [i]);... if (
130c0 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 strcmp(str,"days
130d0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 ")==0) {....if (
130e0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
130f0 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 j(interp,listv[i
13100 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f +1],&days)!=TCL_
13110 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 OK).... retur
13120 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 n TCL_ERROR;...
13130 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
13140 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c rcmp(str,"serial
13150 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 ")==0) {....if (
13160 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
13170 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 j(interp,listv[i
13180 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 +1],&serial)!=TC
13190 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 L_OK).... ret
131a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
131b0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
131c0 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d strcmp(str,"C")=
131d0 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c =0) {....k_C=Tcl
131e0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
131f0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
13200 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
13210 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a str,"ST")==0) {.
13220 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 ...k_ST=Tcl_GetS
13230 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
13240 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
13250 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
13260 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c L")==0) {....k_L
13270 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
13280 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
13290 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
132a0 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 cmp(str,"O")==0)
132b0 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 {....k_O=Tcl_Ge
132c0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
132d0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
132e0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
132f0 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 ,"OU")==0) {....
13300 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 k_OU=Tcl_GetStri
13310 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
13320 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
13330 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 (strcmp(str,"CN"
13340 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d )==0) {....k_CN=
13350 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
13360 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
13370 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
13380 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d mp(str,"Email")=
13390 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c =0) {....k_Email
133a0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
133b0 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
133c0 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 } else {....Tc
133d0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
133e0 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 rp,"Unknown para
133f0 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 meter",NULL);...
13400 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
13410 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 R;... }...}..
13420 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 }..#if OPENS
13430 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
13440 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a R < 0x30000000L.
13450 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 . bne = BN_ne
13460 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 w();.. rsa =
13470 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 RSA_new();..
13480 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f pkey = EVP_PKEY_
13490 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 new();.. if (
134a0 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 bne == NULL || r
134b0 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b sa == NULL || pk
134c0 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 ey == NULL || !B
134d0 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 N_set_word(bne,R
134e0 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 SA_F4) ||...!RSA
134f0 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 _generate_key_ex
13500 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 (rsa, keysize, b
13510 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 ne, NULL) || !EV
13520 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 P_PKEY_assign_RS
13530 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a A(pkey, rsa)) {.
13540 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 ..EVP_PKEY_free(
13550 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f pkey);.../* RSA_
13560 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 free(rsa); freed
13570 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 by EVP_PKEY_fre
13580 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 e */...BN_free(b
13590 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 ne);.#else..
135a0 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 pkey = EVP_RSA_g
135b0 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 en((unsigned int
135c0 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 ) keysize);..
135d0 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f ctx = EVP_PKEY_
135e0 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c CTX_new(pkey,NUL
135f0 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 L);.. if (pke
13600 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 y == NULL || ctx
13610 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 == NULL || !EVP
13620 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 _PKEY_keygen_ini
13630 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 t(ctx) ||...!EVP
13640 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 _PKEY_CTX_set_rs
13650 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 a_keygen_bits(ct
13660 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 x, keysize) || !
13670 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 EVP_PKEY_keygen(
13680 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 ctx, &pkey)) {..
13690 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 .EVP_PKEY_free(p
136a0 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 key);...EVP_PKEY
136b0 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
136c0 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 #endif...Tcl_Set
136d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
136e0 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 rror generating
136f0 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c private key",NUL
13700 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c L);...return TCL
13710 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 _ERROR;.. } e
13720 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 lse {...if (isSt
13730 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 r) {... out=B
13740 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d IO_new(BIO_s_mem
13750 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 ());... PEM_w
13760 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 rite_bio_Private
13770 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c Key(out,pkey,NUL
13780 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 L,NULL,0,NULL,NU
13790 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f LL);... i=BIO
137a0 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 _read(out,buffer
137b0 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d ,sizeof(buffer)-
137c0 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 1);... i=(i<0
137d0 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 ) ? 0 : i;...
137e0 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b buffer[i]='\0';
137f0 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 ... Tcl_SetVa
13800 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c r(interp,keyout,
13810 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 buffer,0);...
13820 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b BIO_flush(out);
13830 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 ... BIO_free(
13840 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b out);...} else {
13850 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e ... out=BIO_n
13860 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 ew(BIO_s_file())
13870 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 ;... BIO_writ
13880 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b e_filename(out,k
13890 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 eyout);... PE
138a0 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 M_write_bio_Priv
138b0 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c ateKey(out,pkey,
138c0 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c NULL,NULL,0,NULL
138d0 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a ,NULL);... /*
138e0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 PEM_write_bio_R
138f0 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 SAPrivateKey(out
13900 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c , rsa, NULL, NUL
13910 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c L, 0, NULL, NULL
13920 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f ); */... BIO_
13930 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 free_all(out);..
13940 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 .}....if ((cert
13950 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 =X509_new())==NU
13960 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f LL) {... Tcl_
13970 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
13980 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 ,"Error generati
13990 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 ng certificate r
139a0 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 equest",NULL);..
139b0 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 . EVP_PKEY_fr
139c0 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 ee(pkey);.#if OP
139d0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
139e0 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
139f0 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 0L... BN_free
13a00 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (bne);.#endif...
13a10 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 return(TCL_E
13a20 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 RROR);...}....X5
13a30 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 09_set_version(c
13a40 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 ert,2);...ASN1_I
13a50 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f NTEGER_set(X509_
13a60 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 get_serialNumber
13a70 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a (cert),serial);.
13a80 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 ..X509_gmtime_ad
13a90 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 j(X509_getm_notB
13aa0 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a efore(cert),0);.
13ab0 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 ..X509_gmtime_ad
13ac0 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 j(X509_getm_notA
13ad0 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 fter(cert),(long
13ae0 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b )60*60*24*days);
13af0 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b ...X509_set_pubk
13b00 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a ey(cert,pkey);..
13b10 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f ..name=X509_get_
13b20 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 subject_name(cer
13b30 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 t);....X509_NAME
13b40 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
13b50 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 t(name,"C", MBST
13b60 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 RING_ASC, (unsig
13b70 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c ned char *) k_C,
13b80 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
13b90 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
13ba0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
13bb0 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 ST", MBSTRING_AS
13bc0 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 C, (unsigned cha
13bd0 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d r *) k_ST, -1, -
13be0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
13bf0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
13c00 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 txt(name,"L", MB
13c10 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 STRING_ASC, (uns
13c20 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
13c30 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 L, -1, -1, 0);..
13c40 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 .X509_NAME_add_e
13c50 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 ntry_by_txt(name
13c60 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ,"O", MBSTRING_A
13c70 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 SC, (unsigned ch
13c80 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d ar *) k_O, -1, -
13c90 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
13ca0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
13cb0 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d txt(name,"OU", M
13cc0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e BSTRING_ASC, (un
13cd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
13ce0 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _OU, -1, -1, 0);
13cf0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
13d00 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
13d10 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e me,"CN", MBSTRIN
13d20 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 G_ASC, (unsigned
13d30 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d char *) k_CN, -
13d40 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
13d50 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
13d60 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d _by_txt(name,"Em
13d70 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 ail", MBSTRING_A
13d80 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 SC, (unsigned ch
13d90 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d ar *) k_Email, -
13da0 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 1, -1, 0);....X5
13db0 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 09_set_subject_n
13dc0 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a ame(cert,name);.
13dd0 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 ...if (!X509_sig
13de0 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f n(cert,pkey,EVP_
13df0 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 sha256())) {...
13e00 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 X509_free(cer
13e10 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b t);... EVP_PK
13e20 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 EY_free(pkey);.#
13e30 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
13e40 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
13e50 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 000000L... BN
13e60 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 _free(bne);.#end
13e70 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 if... Tcl_Set
13e80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
13e90 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 rror signing cer
13ea0 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b tificate",NULL);
13eb0 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
13ec0 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 L_ERROR;...}....
13ed0 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
13ee0 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
13ef0 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
13f00 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
13f10 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b _X509(out,cert);
13f20 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 ... i=BIO_rea
13f30 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a d(out,buffer,siz
13f40 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a eof(buffer)-1);.
13f50 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 .. i=(i<0) ?
13f60 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 0 : i;... buf
13f70 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 fer[i]='\0';...
13f80 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e Tcl_SetVar(in
13f90 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 terp,pemout,buff
13fa0 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f er,0);... BIO
13fb0 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 _flush(out);...
13fc0 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 BIO_free(out)
13fd0 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
13fe0 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
13ff0 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 IO_s_file());...
14000 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 BIO_write_fi
14010 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 lename(out,pemou
14020 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 t);... PEM_wr
14030 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 ite_bio_X509(out
14040 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 ,cert);... BI
14050 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
14060 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 ...}....X509_fre
14070 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 e(cert);...EVP_P
14080 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
14090 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
140a0 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
140b0 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 0000000L...BN_fr
140c0 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
140d0 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b . }..}..break
140e0 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 ;. default:..
140f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
14100 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
14110 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d ----------------
14150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
14160 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 * Tls_Free --.
14170 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
14180 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 ure cleans up wh
14190 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 en a SSL socket
141a0 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a based channel. *
141b0 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 .is closed and i
141c0 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 ts reference cou
141d0 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 nt falls below 1
141e0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
141f0 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
14200 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
14210 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
14220 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
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 2d 2d ----------------
14260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
14270 76 6f 69 64 0a 23 69 66 20 54 43 4c 5f 4d 41 4a void.#if TCL_MAJ
14280 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 54 OR_VERSION > 8.T
14290 6c 73 5f 46 72 65 65 28 20 76 6f 69 64 20 2a 62 ls_Free( void *b
142a0 6c 6f 63 6b 50 74 72 20 29 0a 23 65 6c 73 65 0a lockPtr ).#else.
142b0 54 6c 73 5f 46 72 65 65 28 20 63 68 61 72 20 2a Tls_Free( char *
142c0 62 6c 6f 63 6b 50 74 72 20 29 0a 23 65 6e 64 69 blockPtr ).#endi
142d0 66 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 f.{. State *s
142e0 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
142f0 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 *)blockPtr;..
14300 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
14310 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c d");.. Tls_Cl
14320 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 ean(statePtr);.
14330 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 ckfree(blockP
14340 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d tr);.}.../*. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14390 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 -. *. * Tls_Clea
143a0 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 n --. *. *.This
143b0 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 procedure cleans
143c0 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 up when a SSL s
143d0 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e ocket based chan
143e0 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 nel. *.is closed
143f0 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e and its referen
14400 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 ce count falls b
14410 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 elow 1. This sh
14420 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 ould. *.be calle
14430 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 d synchronously
14440 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 by the CloseProc
14450 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 , not in the. *.
14460 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 EventuallyFree c
14470 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 allback.. *. * R
14480 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a esults:. *.none.
14490 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
144a0 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c ts:. *.Frees all
144b0 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a the state. *. *
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14500 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 ---. */.void Tls
14510 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 _Clean(State *st
14520 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 atePtr) {. dp
14530 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
14540 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
14550 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 we're assuming h
14560 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73 ere that we're s
14570 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 ingle-threaded.
14580 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 */. if (s
14590 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 tatePtr->timer !
145a0 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
145b0 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f n) NULL) {..Tcl_
145c0 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c DeleteTimerHandl
145d0 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d er(statePtr->tim
145e0 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e er);..statePtr->
145f0 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 timer = NULL;.
14600 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
14610 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b tePtr->protos) {
14620 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 ..ckfree(statePt
14630 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 r->protos);..sta
14640 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 tePtr->protos =
14650 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
14660 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 if (statePtr->bi
14670 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 o) {../* This wi
14680 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 ll call SSL_shut
14690 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 down. Bug 141404
146a0 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 5 */..dprintf("B
146b0 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 IO_free_all(%p)"
146c0 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 , statePtr->bio)
146d0 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 ;..BIO_free_all(
146e0 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a statePtr->bio);.
146f0 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d .statePtr->bio =
14700 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
14710 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
14720 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 sl) {..dprintf("
14730 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 SSL_free(%p)", s
14740 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
14750 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 SSL_free(statePt
14760 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 r->ssl);..stateP
14770 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a tr->ssl = NULL;.
14780 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
14790 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 atePtr->ctx) {..
147a0 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 SSL_CTX_free(sta
147b0 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 tePtr->ctx);..st
147c0 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 atePtr->ctx = NU
147d0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
147e0 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
147f0 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 back) {..Tcl_Dec
14800 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
14810 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 tr->callback);..
14820 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
14830 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d ck = NULL;. }
14840 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
14850 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 r->password) {..
14860 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
14870 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
14880 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ord);..statePtr-
14890 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c >password = NULL
148a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
148b0 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 statePtr->vcmd)
148c0 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f {..Tcl_DecrRefCo
148d0 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 unt(statePtr->vc
148e0 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e md);..statePtr->
148f0 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 vcmd = NULL;.
14900 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
14910 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a "Returning");.}.
14920 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d ----------------
14960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
14970 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a Tls_Init --. *.
14980 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63 *.This is a pac
14990 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 kage initializat
149a0 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 ion procedure, w
149b0 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 hich is called.
149c0 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 *.by Tcl when th
149d0 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f is package is to
149e0 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 be added to an
149f0 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a interpreter.. *.
14a00 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c * Results: Ssl
14a10 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 configured and
14a20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 loaded. *. * Sid
14a30 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 e effects:. *. c
14a40 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f reate the ssl co
14a50 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a mmand, initializ
14a60 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a e ssl context. *
14a70 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
14ab0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 6e ------. */..#ifn
14ac0 64 65 66 20 53 54 52 49 4e 47 49 46 59 0a 23 20 def STRINGIFY.#
14ad0 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49 46 define STRINGIF
14ae0 59 28 78 29 20 53 54 52 49 4e 47 49 46 59 31 28 Y(x) STRINGIFY1(
14af0 78 29 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 x).# define STR
14b00 49 4e 47 49 46 59 31 28 78 29 20 23 78 0a 23 65 INGIFY1(x) #x.#e
14b10 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e ndif..static con
14b20 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e st char tlsTclIn
14b30 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 itScript[] = {.#
14b40 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c include "tls.tcl
14b50 2e 68 22 0a 20 20 20 20 30 78 30 30 0a 7d 3b 0a .h". 0x00.};.
14b60 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 .DLLEXPORT int T
14b70 6c 73 5f 49 6e 69 74 28 0a 20 20 20 20 54 63 6c ls_Init(. Tcl
14b80 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 _Interp *interp)
14b90 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64 49 6e .{. Tcl_CmdIn
14ba0 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 64 70 fo info;.. dp
14bb0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
14bc0 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 6f 6e 6c .../*.. * We onl
14bd0 79 20 73 75 70 70 6f 72 74 20 54 63 6c 20 38 2e y support Tcl 8.
14be0 36 20 6f 72 20 6e 65 77 65 72 0a 09 20 2a 2f 0a 6 or newer.. */.
14bf0 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 if (Tcl_Init
14c00 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 Stubs(interp, "8
14c10 2e 36 2d 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c .6-", 0) == NULL
14c20 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
14c30 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
14c40 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 if (TlsLibInit
14c50 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b (0) != TCL_OK) {
14c60 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
14c70 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c lt(interp, "coul
14c80 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 d not initialize
14c90 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 SSL library", (
14ca0 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
14cb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
14cc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
14cd0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
14ce0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 (interp, "tls::c
14cf0 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 iphers", Ciphers
14d00 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 ObjCmd, NULL, 0)
14d10 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
14d20 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
14d30 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 p, "tls::connect
14d40 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e ion", Connection
14d50 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c InfoObjCmd, NULL
14d60 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 , 0);. Tcl_Cr
14d70 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
14d80 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e nterp, "tls::han
14d90 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 dshake", Handsha
14da0 6b 65 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 keObjCmd, NULL,
14db0 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 0);. Tcl_Crea
14dc0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
14dd0 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 erp, "tls::impor
14de0 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 t", ImportObjCmd
14df0 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 , NULL, 0);.
14e00 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
14e10 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
14e20 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e s::unimport", Un
14e30 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 4e 55 importObjCmd, NU
14e40 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f LL, 0);. Tcl_
14e50 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
14e60 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 (interp, "tls::s
14e70 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 tatus", StatusOb
14e80 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a jCmd, NULL, 0);.
14e90 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
14ea0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
14eb0 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c "tls::version",
14ec0 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 VersionObjCmd,
14ed0 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 NULL, 0);. Tc
14ee0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
14ef0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
14f00 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 :misc", MiscObjC
14f10 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 md, NULL, 0);.
14f20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
14f30 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
14f40 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c tls::protocols",
14f50 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 ProtocolsObjCmd
14f60 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 20 20 20 , NULL, 0);..
14f70 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 if (interp) {..
14f80 69 66 20 28 54 63 6c 5f 45 76 61 6c 28 69 6e 74 if (Tcl_Eval(int
14f90 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 erp, tlsTclInitS
14fa0 63 72 69 70 74 29 20 21 3d 20 54 43 4c 5f 4f 4b cript) != TCL_OK
14fb0 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
14fc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
14fd0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c }.. if (Tcl
14fe0 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 _GetCommandInfo(
14ff0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 63 6c 3a 3a interp, "::tcl::
15000 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 26 69 6e build-info", &in
15010 66 6f 29 29 20 7b 0a 09 54 63 6c 5f 43 72 65 61 fo)) {..Tcl_Crea
15020 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
15030 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 62 75 69 erp, "::tls::bui
15040 6c 64 2d 69 6e 66 6f 22 2c 0a 09 09 69 6e 66 6f ld-info",...info
15050 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f 69 64 20 .objProc, (void
15060 2a 29 28 0a 09 09 20 20 20 20 50 41 43 4b 41 47 *)(... PACKAG
15070 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 53 54 E_VERSION "+" ST
15080 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 52 53 RINGIFY(TLS_VERS
15090 49 4f 4e 5f 55 55 49 44 29 0a 09 09 09 20 20 20 ION_UUID)....
150a0 20 22 2e 62 6f 68 61 67 61 6e 22 0a 23 69 66 20 ".bohagan".#if
150b0 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f defined(__clang_
150c0 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f _) && defined(__
150d0 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 clang_major__)..
150e0 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 .. ".clang-"
150f0 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e STRINGIFY(__clan
15100 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f g_major__).#if _
15110 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c _clang_minor__ <
15120 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 10.... "0".#
15130 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 endif.... STR
15140 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d INGIFY(__clang_m
15150 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 inor__).#endif.#
15160 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c if defined(__cpl
15170 75 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 69 usplus) && !defi
15180 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 ned(__OBJC__)...
15190 09 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 . ".cplusplus
151a0 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 ".#endif.#ifndef
151b0 20 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 NDEBUG.... "
151c0 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 .debug".#endif.#
151d0 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c if !defined(__cl
151e0 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e ang__) && !defin
151f0 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 ed(__INTEL_COMPI
15200 4c 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28 LER) && defined(
15210 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 __GNUC__)....
15220 20 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49 ".gcc-" STRINGI
15230 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 FY(__GNUC__).#if
15240 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 __GNUC_MINOR__
15250 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a < 10.... "0".
15260 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 #endif.... ST
15270 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d RINGIFY(__GNUC_M
15280 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 INOR__).#endif.#
15290 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f ifdef __INTEL_CO
152a0 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e MPILER.... ".
152b0 69 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 icc-" STRINGIFY(
152c0 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 __INTEL_COMPILER
152d0 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ).#endif.#ifdef
152e0 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 TCL_MEM_DEBUG...
152f0 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 . ".memdebug"
15300 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
15310 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 ned(_MSC_VER)...
15320 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 . ".msvc-" ST
15330 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 RINGIFY(_MSC_VER
15340 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ).#endif.#ifdef
15350 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 USE_NMAKE....
15360 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 ".nmake".#endif
15370 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 .#ifndef TCL_CFG
15380 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 _OPTIMIZED....
15390 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 ".no-optimize"
153a0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f .#endif.#ifdef _
153b0 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 _OBJC__.... "
153c0 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 .objective-c".#i
153d0 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 f defined(__cplu
153e0 73 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70 splus).... "p
153f0 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a lusplus".#endif.
15400 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 #endif.#ifdef TC
15410 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 L_CFG_PROFILED..
15420 09 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 .. ".profile"
15430 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50 .#endif.#ifdef P
15440 55 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70 URIFY.... ".p
15450 75 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 urify".#endif.#i
15460 66 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c fdef STATIC_BUIL
15470 44 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 69 D.... ".stati
15480 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e c".#endif...), N
15490 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ULL);. }..
154a0 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 return Tcl_PkgP
154b0 72 6f 76 69 64 65 45 78 28 69 6e 74 65 72 70 2c rovideEx(interp,
154c0 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 PACKAGE_NAME, P
154d0 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 2c 20 ACKAGE_VERSION,
154e0 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d NULL);.}../*. *-
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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15520 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 -----*. *. *.Tls
15530 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a _SafeInit --. *.
15540 20 2a 09 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15570 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 ---*. *.Standard
15580 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 procedure requi
15590 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 red by 'load'..
155a0 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 *.Initializes th
155b0 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 is extension for
155c0 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 a safe interpre
155d0 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d ter.. *.--------
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 2d 2d 2d 2d 2d ----------------
15600 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
15610 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
15620 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 ..As of 'Tls_Ini
15630 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a t'. *. *.Result:
15640 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 . *..A standard
15650 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a Tcl error code..
15660 20 2a 0a 20 2a 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 2d 2d ----------------
15690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f -----------*. */
156a0 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 ..DLLEXPORT int
156b0 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c Tls_SafeInit(Tcl
156c0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 _Interp *interp)
156d0 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 {. dprintf("
156e0 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 Called");. re
156f0 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e turn(Tls_Init(in
15700 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a terp));.}../*. *
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 2d 2d 2d 2d 2d 2d 2d ----------------
15740 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c ------*. *. *.Tl
15750 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 sLibInit --. *.
15760 2a 09 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15790 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a --*. *.Initializ
157a0 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f es SSL library o
157b0 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 nce per applicat
157c0 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d ion. *.---------
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 2d 2d 2d 2d 2d 2d ----------------
157f0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 -------*. *. *.S
15800 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
15810 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c .initializes SSL
15820 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 library. *. *.R
15830 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a esult:. *..none.
15840 20 2a 0a 20 2a 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 2d 2d ----------------
15870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f -----------*. */
15880 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c .static int TlsL
15890 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 ibInit(int unini
158a0 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 tialize) {. s
158b0 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 tatic int initia
158c0 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 lized = 0;. i
158d0 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f nt status = TCL_
158e0 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 OK;.#if defined(
158f0 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
15900 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
15910 54 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a THREADS). siz
15920 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 e_t num_locks;.#
15930 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 endif.. if (u
15940 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 ninitialize) {..
15950 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 if (!initialized
15960 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 ) {.. dprintf
15970 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 ("Asked to unini
15980 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 tialize, but we
15990 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 are not initiali
159a0 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 zed");... ret
159b0 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a urn(TCL_OK);..}.
159c0 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 ..dprintf("Asked
159d0 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 to uninitialize
159e0 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 ");..#if defined
159f0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
15a00 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
15a10 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d _THREADS)..Tcl_M
15a20 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d utexLock(&init_m
15a30 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 x);...if (locks)
15a40 20 7b 0a 09 20 20 20 20 66 72 65 65 28 6c 6f 63 {.. free(loc
15a50 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 ks);.. locks
15a60 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 = NULL;.. loc
15a70 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a ksCount = 0;..}.
15a80 23 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 #endif..initiali
15a90 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 zed = 0;..#if de
15aa0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
15ab0 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
15ac0 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 d(TCL_THREADS)..
15ad0 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 Tcl_MutexUnlock(
15ae0 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 &init_mx);.#endi
15af0 66 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f f...return(TCL_O
15b00 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 K);. }.. i
15b10 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 f (initialized)
15b20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c {..dprintf("Call
15b30 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 ed, but using ca
15b40 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 ched value");..r
15b50 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 eturn(status);.
15b60 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
15b70 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 f("Called");..#i
15b80 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
15b90 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
15ba0 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
15bb0 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 S). Tcl_Mutex
15bc0 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a Lock(&init_mx);.
15bd0 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 #endif. initi
15be0 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 alized = 1;..#if
15bf0 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
15c00 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
15c10 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
15c20 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 ). num_locks
15c30 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f = 1;. locksCo
15c40 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f unt = (int) num_
15c50 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 locks;. locks
15c60 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 = malloc(sizeof
15c70 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c (*locks) * num_l
15c80 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 ocks);. memse
15c90 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 t(locks, 0, size
15ca0 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d of(*locks) * num
15cb0 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a _locks);.#endif.
15cc0 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 . /* Initiali
15cd0 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 ze BOTH libcrypt
15ce0 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f o and libssl. */
15cf0 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 . OPENSSL_ini
15d00 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e t_ssl(OPENSSL_IN
15d10 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 IT_LOAD_SSL_STRI
15d20 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e NGS | OPENSSL_IN
15d30 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 IT_LOAD_CRYPTO_S
15d40 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 TRINGS..| OPENSS
15d50 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 L_INIT_ADD_ALL_C
15d60 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c IPHERS | OPENSSL
15d70 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 _INIT_ADD_ALL_DI
15d80 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 GESTS, NULL);..
15d90 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e BIO_new_tcl(N
15da0 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 64 65 ULL, 0);..#if de
15db0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
15dc0 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
15dd0 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
15de0 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f Tcl_MutexUnlo
15df0 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 ck(&init_mx);.#e
15e00 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e ndif.. return
15e10 28 73 74 61 74 75 73 29 3b 0a 7d 0a (status);.}.