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 23 69 66 20 21 64 65 66 69 ion) {.#if !defi
1a30: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 ned(NO_SSL3) &&
1a40: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
1a50: 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 _NO_SSL3). ca
1a60: 73 65 20 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3a se SSL3_VERSION:
1a70: 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 33 22 3b ..ver = "SSLv3";
1a80: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
1a90: 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 56 45 case TLS1_VE
1aa0: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 RSION:..ver = "T
1ab0: 4c 53 76 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 LSv1";..break;.
1ac0: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 31 5f 56 case TLS1_1_V
1ad0: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 ERSION:..ver = "
1ae0: 54 4c 53 76 31 2e 31 22 3b 0a 09 62 72 65 61 6b TLSv1.1";..break
1af0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f ;. case TLS1_
1b00: 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 2_VERSION:..ver
1b10: 3d 20 22 54 4c 53 76 31 2e 32 22 3b 0a 09 62 72 = "TLSv1.2";..br
1b20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c eak;. case TL
1b30: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 S1_3_VERSION:..v
1b40: 65 72 20 3d 20 22 54 4c 53 76 31 2e 33 22 3b 0a er = "TLSv1.3";.
1b50: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 .break;. case
1b60: 20 30 3a 0a 09 76 65 72 20 3d 20 22 6e 6f 6e 65 0:..ver = "none
1b70: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 ";..break;. d
1b80: 65 66 61 75 6c 74 3a 0a 09 76 65 72 20 3d 20 22 efault:..ver = "
1b90: 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72 65 61 6b unknown";..break
1ba0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 ;. }.. swi
1bb0: 74 63 68 20 28 63 6f 6e 74 65 6e 74 5f 74 79 70 tch (content_typ
1bc0: 65 29 20 7b 0a 20 20 20 20 63 61 73 65 20 53 53 e) {. case SS
1bd0: 4c 33 5f 52 54 5f 48 45 41 44 45 52 3a 0a 09 74 L3_RT_HEADER:..t
1be0: 79 70 65 20 3d 20 22 48 65 61 64 65 72 22 3b 0a ype = "Header";.
1bf0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 .break;. case
1c00: 20 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 SSL3_RT_INNER_C
1c10: 4f 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09 74 79 ONTENT_TYPE:..ty
1c20: 70 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f 6e 74 pe = "Inner Cont
1c30: 65 6e 74 20 54 79 70 65 22 3b 0a 09 62 72 65 61 ent Type";..brea
1c40: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 k;. case SSL3
1c50: 5f 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48 45 _RT_CHANGE_CIPHE
1c60: 52 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d 20 R_SPEC:..type =
1c70: 22 43 68 61 6e 67 65 20 43 69 70 68 65 72 22 3b "Change Cipher";
1c80: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1c90: 65 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a e SSL3_RT_ALERT:
1ca0: 0a 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22 ..type = "Alert"
1cb0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1cc0: 73 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 se SSL3_RT_HANDS
1cd0: 48 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 HAKE:..type = "H
1ce0: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 62 72 65 61 andshake";..brea
1cf0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 k;. case SSL3
1d00: 5f 52 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f _RT_APPLICATION_
1d10: 44 41 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 DATA:..type = "A
1d20: 70 70 20 44 61 74 61 22 3b 0a 09 62 72 65 61 6b pp Data";..break
1d30: 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
1d40: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
1d50: 78 33 30 30 30 30 30 30 30 4c 0a 20 20 20 20 63 x30000000L. c
1d60: 61 73 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 ase DTLS1_RT_HEA
1d70: 52 54 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 RTBEAT:..type =
1d80: 22 48 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 "Heartbeat";..br
1d90: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
1da0: 64 65 66 61 75 6c 74 3a 0a 09 74 79 70 65 20 3d default:..type =
1db0: 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 "unknown";.
1dc0: 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65 65 64 73 20 }.. /* Needs
1dd0: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f 70 74 compile time opt
1de0: 69 6f 6e 20 22 65 6e 61 62 6c 65 2d 73 73 6c 2d ion "enable-ssl-
1df0: 74 72 61 63 65 22 2e 20 2a 2f 0a 20 20 20 20 69 trace". */. i
1e00: 66 20 28 28 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 f ((bio = BIO_ne
1e10: 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 w(BIO_s_mem()))
1e20: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 != NULL) {..int
1e30: 6e 3b 0a 09 53 53 4c 5f 74 72 61 63 65 28 77 72 n;..SSL_trace(wr
1e40: 69 74 65 5f 70 2c 20 76 65 72 73 69 6f 6e 2c 20 ite_p, version,
1e50: 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 62 75 content_type, bu
1e60: 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20 28 76 6f f, len, ssl, (vo
1e70: 69 64 20 2a 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 id *)bio);..n =
1e80: 42 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 BIO_read(bio, bu
1e90: 66 66 65 72 2c 20 42 49 4f 5f 70 65 6e 64 69 6e ffer, BIO_pendin
1ea0: 67 28 62 69 6f 29 20 3c 20 31 35 30 30 30 20 3f g(bio) < 15000 ?
1eb0: 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f BIO_pending(bio
1ec0: 29 20 3a 20 31 34 39 39 39 29 3b 0a 09 6e 20 3d ) : 14999);..n =
1ed0: 20 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a (n<0) ? 0 : n;.
1ee0: 09 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a .buffer[n] = 0;.
1ef0: 09 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 .(void)BIO_flush
1f00: 28 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 (bio);..BIO_free
1f10: 28 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 (bio);. }..
1f20: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
1f30: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 nd to eval with
1f40: 66 6e 2c 20 63 68 61 6e 2c 20 64 69 72 65 63 74 fn, chan, direct
1f50: 69 6f 6e 2c 20 76 65 72 73 69 6f 6e 2c 20 74 79 ion, version, ty
1f60: 70 65 2c 20 61 6e 64 20 6d 65 73 73 61 67 65 20 pe, and message
1f70: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 args */. cmdP
1f80: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
1f90: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
1fa0: 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 callback);. T
1fb0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1fc0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
1fd0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
1fe0: 74 72 69 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67 tringObj("messag
1ff0: 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 e", -1));. Tc
2000: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2010: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2020: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
2030: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
2040: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
2050: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
2060: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
2070: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2080: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2090: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
20a0: 67 4f 62 6a 28 77 72 69 74 65 5f 70 20 3f 20 22 gObj(write_p ? "
20b0: 53 65 6e 74 22 20 3a 20 22 52 65 63 65 69 76 65 Sent" : "Receive
20c0: 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 d", -1));. Tc
20d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
20e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
20f0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
2100: 72 69 6e 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29 ringObj(ver, -1)
2110: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2120: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2130: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2140: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
2150: 28 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20 (type, -1));.
2160: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2170: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2180: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2190: 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 wStringObj(buffe
21a0: 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a r, -1));.. /*
21b0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
21c0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
21d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
21e0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c mdPtr);. Eval
21f0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c Callback(interp,
2200: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 statePtr, cmdPt
2210: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 r);. Tcl_Decr
2220: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
2230: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a ;.}.#endif.../*.
2240: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2280: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 -----. *. * Veri
2290: 66 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a fyCallback --. *
22a0: 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c . *.Monitors SSL
22b0: 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c certificate val
22c0: 69 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e idation process.
22d0: 20 55 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c Used to control
22e0: 20 74 68 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 the. *.behavior
22f0: 20 77 68 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 when the SSL_VE
2300: 52 49 46 59 5f 50 45 45 52 20 66 6c 61 67 20 69 RIFY_PEER flag i
2310: 73 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 63 s set. This is c
2320: 61 6c 6c 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 alled. *.wheneve
2330: 72 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 r a certificate
2340: 69 73 20 69 6e 73 70 65 63 74 65 64 20 6f 72 20 is inspected or
2350: 64 65 63 69 64 65 64 20 69 6e 76 61 6c 69 64 2e decided invalid.
2360: 20 43 61 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65 Called for. *.e
2370: 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65 20 ach certificate
2380: 69 6e 20 74 68 65 20 63 65 72 74 20 63 68 61 69 in the cert chai
2390: 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a n.. *. * Checks:
23a0: 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 65 20 . *.certificate
23b0: 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64 chain is checked
23c0: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 starting with t
23d0: 68 65 20 64 65 65 70 65 73 74 20 6e 65 73 74 69 he deepest nesti
23e0: 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74 ng level. *. (t
23f0: 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69 he root CA certi
2400: 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b ficate) and work
2410: 65 64 20 75 70 77 61 72 64 20 74 6f 20 74 68 65 ed upward to the
2420: 20 70 65 65 72 27 73 20 63 65 72 74 69 66 69 63 peer's certific
2430: 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e ate.. *.All sign
2440: 61 74 75 72 65 73 20 61 72 65 20 76 61 6c 69 64 atures are valid
2450: 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69 , current time i
2460: 73 20 77 69 74 68 69 6e 20 66 69 72 73 74 20 61 s within first a
2470: 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79 nd last validity
2480: 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20 time.. *.Check
2490: 74 68 61 74 20 74 68 65 20 63 65 72 74 69 66 69 that the certifi
24a0: 63 61 74 65 20 69 73 20 69 73 73 75 65 64 20 62 cate is issued b
24b0: 79 20 74 68 65 20 69 73 73 75 65 72 20 63 65 72 y the issuer cer
24c0: 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72 2e tificate issuer.
24d0: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65 . *.Check the re
24e0: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20 vocation status
24f0: 66 6f 72 20 65 61 63 68 20 63 65 72 74 69 66 69 for each certifi
2500: 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 cate.. *.Check t
2510: 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74 he validity of t
2520: 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64 he given CRL and
2530: 20 74 68 65 20 63 65 72 74 20 72 65 76 6f 63 61 the cert revoca
2540: 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09 tion status.. *.
2550: 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69 Check the polici
2560: 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65 es of all the ce
2570: 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a rtificates. *. *
2580: 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69 Args. *.preveri
2590: 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20 fy_ok indicates
25a0: 77 68 65 74 68 65 72 20 74 68 65 20 63 65 72 74 whether the cert
25b0: 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63 61 ificate verifica
25c0: 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20 tion passed (1)
25d0: 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a or not (0). *. *
25e0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 Results:. *.A c
25f0: 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f allback bound to
2600: 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 the socket may
2610: 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 return one of:.
2620: 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 *. 0...- the
2630: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64 certificate is d
2640: 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73 eemed invalid, s
2650: 65 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e end verification
2660: 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65 . *.... failure
2670: 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20 alert to peer,
2680: 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61 and terminate ha
2690: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 ndshake.. *.
26a0: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 1...- the certif
26b0: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 icate is deemed
26c0: 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20 valid, continue
26d0: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a with handshake..
26e0: 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74 72 *. empty str
26f0: 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 ing.- no change
2700: 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20 76 to certificate v
2710: 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 alidation. *. *
2720: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
2730: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f .The err field o
2740: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 f the currently
2750: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20 operative State
2760: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 is set. *. to a
2770: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 string describi
2780: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 ng the SSL negot
2790: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 iation failure r
27a0: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d eason. *. *-----
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
27f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 */.static int.Ve
2800: 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 rifyCallback(int
2810: 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f ok, X509_STORE_
2820: 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20 CTX *ctx) {.
2830: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
2840: 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 . SSL *ssl.
2850: 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 .= (SSL*)X509_ST
2860: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 ORE_CTX_get_ex_d
2870: 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 ata(ctx, SSL_get
2880: 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 _ex_data_X509_ST
2890: 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a ORE_CTX_idx());.
28a0: 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 X509 *cert.
28b0: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 .= X509_STORE_CT
28c0: 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 X_get_current_ce
28d0: 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 rt(ctx);. Sta
28e0: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 te *statePtr.= (
28f0: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 State*)SSL_get_a
2900: 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 pp_data(ssl);.
2910: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
2920: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
2930: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 >interp;. int
2940: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 depth..= X509_S
2950: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 TORE_CTX_get_err
2960: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 or_depth(ctx);.
2970: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 int err..= X5
2980: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
2990: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 _error(ctx);..
29a0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
29b0: 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 d");. dprintf
29c0: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b ("VerifyCallback
29d0: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 : %d", ok);..
29e0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
29f0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a cmd == (Tcl_Obj*
2a00: 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 )NULL) {../* Use
2a10: 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72 ok value if ver
2a20: 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71 ification is req
2a30: 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74 uired */..if (st
2a40: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 atePtr->vflags &
2a50: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
2a60: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
2a70: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
2a80: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 ok;..} else {..
2a90: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a return 1;..}.
2aa0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
2ab0: 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 ert == NULL || s
2ac0: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 sl == NULL) {..r
2ad0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a eturn 0;. }..
2ae0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 dprintf("Ver
2af0: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 ifyCallback: eva
2b00: 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 l callback");..
2b10: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
2b20: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 mand to eval wit
2b30: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74 h fn, chan, dept
2b40: 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 73 h, cert info lis
2b50: 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 20 65 t, status, and e
2b60: 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 20 rror args */.
2b70: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
2b80: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
2b90: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
2ba0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2bb0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2bc0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2bd0: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 StringObj("verif
2be0: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 y", -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 0a 09 54 63 6c 5f 4e 65 77 53 mdPtr,..Tcl_NewS
2c20: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
2c30: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
2c40: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
2c50: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2c60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2c70: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c80: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 Tcl_NewIntObj(de
2c90: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c pth));. Tcl_L
2ca0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
2cb0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
2cc0: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f tr, Tls_NewX509O
2cd0: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 bj(interp, cert)
2ce0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2cf0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
2d00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2d10: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b Tcl_NewIntObj(ok
2d20: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2d30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2d40: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2d50: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f ..Tcl_NewStringO
2d60: 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76 bj((char*)X509_v
2d70: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 erify_cert_error
2d80: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 _string(err), -1
2d90: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 ));.. /* Prev
2da0: 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 ent I/O while ca
2db0: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f llback is in pro
2dc0: 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 gress */. /*
2dd0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
2de0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 |= TLS_TCL_CALLB
2df0: 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 ACK; */.. /*
2e00: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
2e10: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
2e20: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
2e30: 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 dPtr);. ok =
2e40: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
2e50: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
2e60: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f mdPtr);. Tcl_
2e70: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 DecrRefCount(cmd
2e80: 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e Ptr);.. dprin
2e90: 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 tf("VerifyCallba
2ea0: 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 73 75 ck: command resu
2eb0: 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a lt = %d", ok);..
2ec0: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d /* statePtr-
2ed0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f >flags &= ~(TLS_
2ee0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a TCL_CALLBACK); *
2ef0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 /. return(ok)
2f00: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c ;./* By default,
2f10: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 leave verificat
2f20: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a ion unchanged. *
2f30: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d /.}.../*. *-----
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2f80: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d *. * Tls_Error -
2f90: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 -. *. *.Calls ca
2fa0: 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74 llback with list
2fb0: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 of errors.. *.
2fc0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
2fd0: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 *.The err field
2fe0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c of the currentl
2ff0: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 y operative Stat
3000: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f e is set. *. to
3010: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 a string descri
3020: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 bing the SSL neg
3030: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 otiation failure
3040: 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d reason. *. *---
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3090: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 . */.void.Tls_Er
30a0: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 ror(State *state
30b0: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 Ptr, char *msg)
30c0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 {. Tcl_Interp
30d0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
30e0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
30f0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
3100: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 , *listPtr;.
3110: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 unsigned long er
3120: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d r;. statePtr-
3130: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 >err = msg;..
3140: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
3150: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
3160: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
3170: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
3180: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 L)..return;..
3190: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
31a0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 nd to eval with
31b0: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d 65 fn, chan, and me
31c0: 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 20 ssage args */.
31d0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
31e0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
31f0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
3200: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
3210: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3220: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
3230: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
3240: 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 error", -1));.
3250: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
3260: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3270: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
3280: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
3290: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
32a0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
32b0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 lf), -1));. i
32c0: 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 f (msg != NULL)
32d0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
32e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
32f0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3300: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 NewStringObj(msg
3310: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 , -1));.. } e
3320: 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54 lse if ((msg = T
3330: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63 6c cl_GetString(Tcl
3340: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _GetObjResult(in
3350: 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c 29 terp))) != NULL)
3360: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
3370: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3380: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3390: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 _NewStringObj(ms
33a0: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 g, -1));.. }
33b0: 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 20 else {..listPtr
33c0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
33d0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c (0, NULL);..whil
33e0: 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 65 e ((err = ERR_ge
33f0: 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 29 t_error()) != 0)
3400: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
3410: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3420: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 (interp, listPtr
3430: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
3440: 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 bj(ERR_reason_er
3450: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c ror_string(err),
3460: 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c -1));..}..Tcl_L
3470: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3480: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3490: 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 tr, listPtr);.
34a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c }.. /* Eval
34b0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
34c0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
34d0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
34e0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 );. EvalCallb
34f0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
3500: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 ePtr, cmdPtr);.
3510: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
3520: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c unt(cmdPtr);.}..
3530: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
3580: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d KeyLogCallback -
3590: 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 -. *. *.Write re
35a0: 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20 ceived key data
35b0: 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a to log file.. *.
35c0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
35d0: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d . *.none. *. *--
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3620: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f -. */.void KeyLo
3630: 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 gCallback(const
3640: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 SSL *ssl, const
3650: 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 char *line) {.
3660: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67 65 char *str = ge
3670: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 tenv(SSLKEYLOGFI
3680: 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 LE);. FILE *f
3690: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 d;.. dprintf(
36a0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
36b0: 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d if (str) {..fd =
36c0: 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 fopen(str, "a")
36d0: 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 ;..fprintf(fd, "
36e0: 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 %s\n",line);..fc
36f0: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a lose(fd);. }.
3700: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
3750: 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c * Password Call
3760: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 back --. *. *.Ca
3770: 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 lled when a pass
3780: 77 6f 72 64 20 66 6f 72 20 61 20 70 72 69 76 61 word for a priva
3790: 74 65 20 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73 te key loading/s
37a0: 74 6f 72 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09 toring a PEM. *.
37b0: 63 65 72 74 69 66 69 63 61 74 65 20 77 69 74 68 certificate with
37c0: 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 encryption. Eva
37d0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 ls callback scri
37e0: 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 pt and returns.
37f0: 2a 09 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 *.the result as
3800: 74 68 65 20 70 61 73 73 77 6f 72 64 20 73 74 72 the password str
3810: 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 ing in buf.. *.
3820: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
3830: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
3840: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
3850: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
3860: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 ined). *. * Retu
3870: 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 rns:. *.Password
3880: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f size in bytes o
3890: 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f r -1 for an erro
38a0: 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d r.. *. *--------
38b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
38f0: 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 static int.Passw
3900: 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 ordCallback(char
3910: 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c *buf, int size,
3920: 20 69 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 int rwflag, voi
3930: 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 20 d *udata) {.
3940: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 State *statePtr.
3950: 3d 20 28 53 74 61 74 65 20 2a 29 20 75 64 61 74 = (State *) udat
3960: 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 a;. Tcl_Inter
3970: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
3980: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
3990: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
39a0: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b r;. int code;
39b0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
39c0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
39d0: 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c If no callback,
39e0: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c use default cal
39f0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 lback */. if
3a00: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 (statePtr->passw
3a10: 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ord == NULL) {..
3a20: 69 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 if (Tcl_EvalEx(i
3a30: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 nterp, "tls::pas
3a40: 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f sword", -1, TCL_
3a50: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 EVAL_GLOBAL) ==
3a60: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 TCL_OK) {.. c
3a70: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 har *ret = (char
3a80: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e *) Tcl_GetStrin
3a90: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b gResult(interp);
3aa0: 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 .. strncpy(bu
3ab0: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 f, ret, (size_t)
3ac0: 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 size);.. ret
3ad0: 75 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 urn (int)strlen(
3ae0: 72 65 74 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a ret);..} else {.
3af0: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
3b00: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
3b10: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
3b20: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c to eval with fn,
3b30: 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73 69 7a rwflag, and siz
3b40: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d e args */. cm
3b50: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
3b60: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
3b70: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 ->password);.
3b80: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3b90: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3ba0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
3bb0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 wStringObj("pass
3bc0: 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 word", -1));.
3bd0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3be0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3bf0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
3c00: 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 wIntObj(rwflag))
3c10: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
3c20: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
3c30: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3c40: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a cl_NewIntObj(siz
3c50: 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 e));.. Tcl_Pr
3c60: 65 73 65 72 76 65 28 28 76 6f 69 64 20 2a 29 20 eserve((void *)
3c70: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
3c80: 5f 50 72 65 73 65 72 76 65 28 28 76 6f 69 64 20 _Preserve((void
3c90: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 *) statePtr);..
3ca0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
3cb0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
3cc0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
3cd0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
3ce0: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
3cf0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d ObjEx(interp, cm
3d00: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 dPtr, TCL_EVAL_G
3d10: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 LOBAL);. if (
3d20: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 code != TCL_OK)
3d30: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 {.#if (TCL_MAJOR
3d40: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 _VERSION == 8) &
3d50: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 & (TCL_MINOR_VER
3d60: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 SION < 6)..Tcl_B
3d70: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 ackgroundError(i
3d80: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 nterp);.#else..T
3d90: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 cl_BackgroundExc
3da0: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 eption(interp, c
3db0: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 ode);.#endif.
3dc0: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
3dd0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
3de0: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 .. Tcl_Releas
3df0: 65 28 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 e((void *) state
3e00: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 Ptr);.. /* If
3e10: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 61 73 successful, pas
3e20: 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72 64 20 s back password
3e30: 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 string and trunc
3e40: 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 ate if too long
3e50: 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 */. if (code
3e60: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 == TCL_OK) {..Tc
3e70: 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 09 63 68 61 l_Size len;..cha
3e80: 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a r *ret = (char *
3e90: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
3ea0: 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 romObj(Tcl_GetOb
3eb0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c jResult(interp),
3ec0: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e &len);..if (len
3ed0: 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 > (Tcl_Size) si
3ee0: 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e ze-1) {.. len
3ef0: 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 = (Tcl_Size) si
3f00: 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 ze-1;..}..strncp
3f10: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a y(buf, ret, (siz
3f20: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b e_t) len);..buf[
3f30: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 len] = '\0';..Tc
3f40: 6c 5f 52 65 6c 65 61 73 65 28 28 76 6f 69 64 20 l_Release((void
3f50: 2a 29 20 69 6e 74 65 72 70 29 3b 0a 09 72 65 74 *) interp);..ret
3f60: 75 72 6e 28 28 69 6e 74 29 20 6c 65 6e 29 3b 0a urn((int) len);.
3f70: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 }. Tcl_Re
3f80: 6c 65 61 73 65 28 28 76 6f 69 64 20 2a 29 20 69 lease((void *) i
3f90: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 nterp);. retu
3fa0: 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a rn -1;.}.../*. *
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ff0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f ---. *. * Sessio
4000: 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 n Callback for C
4010: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 lients --. *. *.
4020: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 Called when a ne
4030: 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 w session is add
4040: 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e ed to the cache.
4050: 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 In TLS 1.3. *.t
4060: 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 his may be recei
4070: 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d ved multiple tim
4080: 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e es after the han
4090: 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 dshake. For. *.e
40a0: 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c arlier versions,
40b0: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 this will be re
40c0: 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 ceived during th
40d0: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 e handshake.. *.
40e0: 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66 This is the pref
40f0: 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 erred way to obt
4100: 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 ain a resumable
4110: 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 session.. *. * R
4120: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
4130: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
4140: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
4150: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
4160: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 d). *. * Return
4170: 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 codes:. *.0 = er
4180: 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f ror where sessio
4190: 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 n will be immedi
41a0: 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 ately removed fr
41b0: 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 om the internal
41c0: 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 cache.. *.1 = su
41d0: 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20 ccess where app
41e0: 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 retains session
41f0: 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 in session cache
4200: 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 , and must call
4210: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 SSL_SESSION_free
4220: 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a () when done.. *
4230: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4270: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
4280: 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c c int.SessionCal
4290: 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 lback(SSL *ssl,
42a0: 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 SSL_SESSION *ses
42b0: 73 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 sion) {. Stat
42c0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
42d0: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
42e0: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 p_data((SSL *)ss
42f0: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 l);. Tcl_Inte
4300: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
4310: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
4320: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
4330: 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e tr;. const un
4340: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 signed char *tic
4350: 6b 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 ket;. const u
4360: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 nsigned char *se
4370: 73 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 ssion_id;. si
4380: 7a 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 ze_t len2;. u
4390: 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e nsigned int ulen
43a0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
43b0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
43c0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
43d0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 lback == (Tcl_Ob
43e0: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 j*)NULL) {..retu
43f0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
4400: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 R_OK;. } else
4410: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
4420: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
4430: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
4440: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
4450: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
4460: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
4470: 63 68 61 6e 2c 20 73 65 73 73 69 6f 6e 20 69 64 chan, session id
4480: 2c 20 73 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 , session ticket
4490: 2c 20 61 6e 64 20 6c 69 66 65 74 69 6d 65 20 61 , and lifetime a
44a0: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
44b0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
44c0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
44d0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 allback);. Tc
44e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
44f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4500: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
4510: 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e ringObj("session
4520: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
4530: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4540: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4550: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
4560: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
4570: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
4580: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
4590: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 -1));.. /* Se
45a0: 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 ssion id */.
45b0: 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c session_id = SSL
45c0: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 _SESSION_get_id(
45d0: 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b session, &ulen);
45e0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
45f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4600: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4610: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 l_NewByteArrayOb
4620: 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 j(session_id, (T
4630: 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b cl_Size) ulen));
4640: 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e .. /* Session
4650: 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 ticket */. S
4660: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
4670: 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 ticket(session,
4680: 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b &ticket, &len2);
4690: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
46a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
46b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
46c0: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 l_NewByteArrayOb
46d0: 6a 28 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 j(ticket, (Tcl_S
46e0: 69 7a 65 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 ize) len2));..
46f0: 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 /* Lifetime -
4700: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 number of second
4710: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 s */. Tcl_Lis
4720: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4730: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4740: 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 ,..Tcl_NewLongOb
4750: 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 j((long) SSL_SES
4760: 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f SION_get_ticket_
4770: 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 lifetime_hint(se
4780: 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f ssion)));.. /
4790: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
47a0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
47b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
47c0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 cmdPtr);. Eva
47d0: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
47e0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
47f0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 tr);. Tcl_Dec
4800: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
4810: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b );. return 0;
4820: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4870: 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 . * ALPN Callbac
4880: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e k for Servers an
4890: 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 d NPN Callback f
48a0: 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a or Clients --. *
48b0: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74 . *.Perform prot
48c0: 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 ocol (http/1.1,
48d0: 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65 h2, h3, etc.) se
48e0: 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a lection for the.
48f0: 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e *.incoming conn
4900: 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 ection. Called a
4910: 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 fter Hello and s
4920: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e erver callbacks.
4930: 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20 . *.Where 'out'
4940: 69 73 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 is selected prot
4950: 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73 ocol and 'in' is
4960: 20 74 68 65 20 70 65 65 72 20 61 64 76 65 72 74 the peer advert
4970: 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a ised list.. *. *
4980: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
4990: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
49a0: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 ects:. *.Calls c
49b0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 allback (if defi
49c0: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ned). *. * Retur
49d0: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f n codes:. *.SSL_
49e0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 TLSEXT_ERR_OK: A
49f0: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c LPN protocol sel
4a00: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 ected. The conne
4a10: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
4a20: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
4a30: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 RR_ALERT_FATAL:
4a40: 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 There was no ove
4a50: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 68 65 rlap between the
4a60: 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 client's. *.
4a70: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61 supplied list a
4a80: 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 63 6f nd the server co
4a90: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 nfiguration. The
4aa0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c connection will
4ab0: 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 be aborted.. *.
4ac0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
4ad0: 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f OACK: ALPN proto
4ae0: 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 col not selected
4af0: 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 , e.g., because
4b00: 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 no ALPN. *. p
4b10: 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e rotocols are con
4b20: 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 figured for this
4b30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 connection. The
4b40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
4b50: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d inues.. *. *----
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4ba0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 */.static int.A
4bb0: 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 LPNCallback(SSL
4bc0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 *ssl, const unsi
4bd0: 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c gned char **out,
4be0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
4bf0: 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 outlen,..const u
4c00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e nsigned char *in
4c10: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 , unsigned int i
4c20: 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 nlen, void *arg)
4c30: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 {. State *st
4c40: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a atePtr = (State*
4c50: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e )arg;. Tcl_In
4c60: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 terp *interp.= s
4c70: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b tatePtr->interp;
4c80: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d . Tcl_Obj *cm
4c90: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f dPtr;. int co
4ca0: 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 de, res;.. dp
4cb0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
4cc0: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d .. if (ssl ==
4cd0: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 NULL || arg ==
4ce0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
4cf0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
4d00: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
4d10: 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f /* Select proto
4d20: 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 col */. if (S
4d30: 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 SL_select_next_p
4d40: 72 6f 74 6f 28 28 75 6e 73 69 67 6e 65 64 20 63 roto((unsigned c
4d50: 68 61 72 20 2a 2a 29 20 6f 75 74 2c 20 6f 75 74 har **) out, out
4d60: 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 len, statePtr->p
4d70: 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d rotos, statePtr-
4d80: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e >protos_len,..in
4d90: 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e , inlen) == OPEN
4da0: 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 SSL_NPN_NEGOTIAT
4db0: 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 ED) {../* Match
4dc0: 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d 20 found */..res =
4dd0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
4de0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a K;. } else {.
4df0: 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f ./* OPENSSL_NPN_
4e00: 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f 20 NO_OVERLAP = No
4e10: 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 73 65 20 overlap, so use
4e20: 66 69 72 73 74 20 69 74 65 6d 20 66 72 6f 6d 20 first item from
4e30: 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 client protocol
4e40: 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20 53 list */..res = S
4e50: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
4e60: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ACK;. }..
4e70: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 if (statePtr->vc
4e80: 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 md == (Tcl_Obj*)
4e90: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
4ea0: 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 res;. }..
4eb0: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
4ec0: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 d to eval with f
4ed0: 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 n, chan, depth,
4ee0: 63 65 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 cert info list,
4ef0: 73 74 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f status, and erro
4f00: 72 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d r args */. cm
4f10: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
4f20: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
4f30: 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c ->vcmd);. Tcl
4f40: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
4f50: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
4f60: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
4f70: 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d ingObj("alpn", -
4f80: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
4f90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
4fa0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
4fb0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
4fc0: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
4fd0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
4fe0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
4ff0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
5000: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5010: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
5020: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
5030: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 2a (const char *) *
5040: 6f 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 out, -1));. T
5050: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
5060: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
5070: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 cmdPtr, Tcl_NewB
5080: 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d ooleanObj(res ==
5090: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
50a0: 4f 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 OK));.. /* Ev
50b0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
50c0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
50d0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
50e0: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f tr);. if ((co
50f0: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 de = EvalCallbac
5100: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
5110: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 tr, cmdPtr)) > 1
5120: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 ) {..res = SSL_T
5130: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
5140: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
5150: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 code == 1) {..re
5160: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
5170: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 RR_OK;. } els
5180: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 e {..res = SSL_T
5190: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
51a0: 46 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 FATAL;. }.
51b0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
51c0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 t(cmdPtr);. r
51d0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f eturn res;.}.../
51e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 -------. *. * Ad
5230: 76 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c vertise Protocol
5240: 73 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e s Callback for N
5250: 65 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 ext Protocol Neg
5260: 6f 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 otiation (NPN) i
5270: 6e 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d n ServerHello --
5280: 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 . *. *.called wh
5290: 65 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 en a TLS server
52a0: 6e 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 needs a list of
52b0: 73 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 supported protoc
52c0: 6f 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 ols for Next. *.
52d0: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 Protocol Negotia
52e0: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 tion.. *. * Resu
52f0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
5300: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
5310: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
5320: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
5330: 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 XT_ERR_OK: NPN p
5340: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
5350: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
5360: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
5370: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
5380: 41 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f ACK: NPN protoco
5390: 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 l not selected.
53a0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 The connection c
53b0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d ontinues.. *. *-
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5400: 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 --. */.#ifdef US
5410: 45 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 E_NPN.static int
5420: 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e .NPNCallback(con
5430: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e st SSL *ssl, con
5440: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
5450: 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 **out, unsigned
5460: 20 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f int *outlen, vo
5470: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
5480: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
5490: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 (State*)arg;..
54a0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
54b0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
54c0: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 sl == NULL || ar
54d0: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 g == NULL) {..re
54e0: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
54f0: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
5500: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f .. /* Set pro
5510: 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 tocols list */.
5520: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
5530: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 >protos != NULL)
5540: 20 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 {..*out = state
5550: 50 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f Ptr->protos;..*o
5560: 75 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 utlen = statePtr
5570: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 ->protos_len;.
5580: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 } else {..*out
5590: 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 = NULL;..*outle
55a0: 6e 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 n = 0;..return S
55b0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
55c0: 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ACK;. }. r
55d0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
55e0: 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 _ERR_OK;.}.#endi
55f0: 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d f.../*. *-------
5600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
5640: 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 * SNI Callback
5650: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 for Servers --.
5660: 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 *. *.Perform ser
5670: 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 ver-side SNI hos
5680: 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 tname selection
5690: 61 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 after receiving
56a0: 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a SNI extension. *
56b0: 09 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f .in Client Hello
56c0: 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 . Called after h
56d0: 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 ello callback bu
56e0: 74 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 t before ALPN ca
56f0: 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 llback.. *. * Re
5700: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
5710: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
5720: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
5730: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
5740: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 ). *. * Return c
5750: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 odes:. *.SSL_TLS
5760: 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 EXT_ERR_OK: SNI
5770: 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 hostname is acce
5780: 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 pted. The connec
5790: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a tion continues..
57a0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
57b0: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 R_ALERT_FATAL: S
57c0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e NI hostname is n
57d0: 6f 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 ot accepted. The
57e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 connection. *.
57f0: 20 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 is aborted. D
5800: 65 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 efault for alert
5810: 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 is SSL_AD_UNREC
5820: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a OGNIZED_NAME.. *
5830: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f .SSL_TLSEXT_ERR_
5840: 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 ALERT_WARNING: S
5850: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e NI hostname is n
5860: 6f 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 ot accepted, war
5870: 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 ning alert. *.
5880: 20 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 sent (not supp
5890: 6f 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 orted in TLSv1.3
58a0: 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f ). The connectio
58b0: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 n continues.. *.
58c0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
58d0: 4f 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 OACK: SNI hostna
58e0: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 me is not accept
58f0: 65 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f ed and not ackno
5900: 77 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 wledged,. *.
5910: 65 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 e.g. if SNI has
5920: 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 not been configu
5930: 72 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 red. The connect
5940: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
5950: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5990: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
59a0: 69 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 ic int.SNICallba
59b0: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 ck(const SSL *ss
59c0: 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 l, int *alert, v
59d0: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 oid *arg) {.
59e0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
59f0: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 = (State*)arg;.
5a00: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
5a10: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
5a20: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
5a30: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
5a40: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 int code, res
5a50: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
5a60: 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e *servername = N
5a70: 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ULL;.. dprint
5a80: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
5a90: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c if (ssl == NUL
5aa0: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c L || arg == NULL
5ab0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
5ac0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
5ad0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5ae0: 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54 Only works for T
5af0: 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69 LS 1.2 and earli
5b00: 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72 er */. server
5b10: 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 name = SSL_get_s
5b20: 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 ervername(ssl, T
5b30: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 LSEXT_NAMETYPE_h
5b40: 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 ost_name);. i
5b50: 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c f (!servername |
5b60: 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 | servername[0]
5b70: 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75 == '\0') {..retu
5b80: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
5b90: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
5ba0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
5bb0: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f ->vcmd == (Tcl_O
5bc0: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 bj*)NULL) {..ret
5bd0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
5be0: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 RR_OK;. }..
5bf0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
5c00: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 and to eval with
5c10: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 fn, chan, and s
5c20: 65 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 erver name args
5c30: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 */. cmdPtr =
5c40: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
5c50: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
5c60: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
5c70: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5c80: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
5c90: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
5ca0: 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 "sni", -1));.
5cb0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5cc0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5cd0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
5ce0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
5cf0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
5d00: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
5d10: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 f), -1));. Tc
5d20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
5d30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
5d40: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
5d50: 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 ringObj(serverna
5d60: 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 me , -1));..
5d70: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b /* Eval callback
5d80: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
5d90: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
5da0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 (cmdPtr);. if
5db0: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 ((code = EvalCa
5dc0: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 llback(interp, s
5dd0: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 tatePtr, cmdPtr)
5de0: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 ) > 1) {..res =
5df0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5e00: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a LERT_WARNING;..*
5e10: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 alert = SSL_AD_U
5e20: 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 NRECOGNIZED_NAME
5e30: 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 ; /* Not support
5e40: 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f ed by TLS 1.3 */
5e50: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
5e60: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 code == 1) {..re
5e70: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
5e80: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 RR_OK;. } els
5e90: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 e {..res = SSL_T
5ea0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f LSEXT_ERR_ALERT_
5eb0: 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d FATAL;..*alert =
5ec0: 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e SSL_AD_UNRECOGN
5ed0: 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f IZED_NAME; /* No
5ee0: 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 t supported by T
5ef0: 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a LS 1.3 */. }.
5f00: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
5f10: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
5f20: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a return res;.}.
5f30: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
5f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
5f80: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e ClientHello Han
5f90: 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 dshake Callback
5fa0: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 for Servers --.
5fb0: 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 73 65 72 *. *.Used by ser
5fc0: 76 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 ver to examine t
5fd0: 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 he server name i
5fe0: 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 ndication (SNI)
5ff0: 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f extension. *.pro
6000: 76 69 64 65 64 20 62 79 20 74 68 65 20 63 6c 69 vided by the cli
6010: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 ent in order to
6020: 73 65 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70 select an approp
6030: 72 69 61 74 65 20 63 65 72 74 69 66 69 63 61 74 riate certificat
6040: 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c e to. *.present,
6050: 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 and make other
6060: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64 configuration ad
6070: 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 justments releva
6080: 6e 74 20 74 6f 20 74 68 61 74 20 73 65 72 76 65 nt to that serve
6090: 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 r. *.name and it
60a0: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e s configuration.
60b0: 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73 This includes s
60c0: 77 61 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20 wapping out the
60d0: 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 associated. *.SS
60e0: 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d L_CTX pointer, m
60f0: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 65 72 odifying the ser
6100: 76 65 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65 ver's list of pe
6110: 72 6d 69 74 74 65 64 20 54 4c 53 20 76 65 72 73 rmitted TLS vers
6120: 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e ions,. *.changin
6130: 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20 63 g the server's c
6140: 69 70 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65 ipher list in re
6150: 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c sponse to the cl
6160: 69 65 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69 ient's cipher li
6170: 73 74 2c 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c st, etc.. *.Call
6180: 65 64 20 62 65 66 6f 72 65 20 53 4e 49 20 61 6e ed before SNI an
6190: 64 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 d ALPN callbacks
61a0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
61b0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
61c0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
61d0: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
61e0: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
61f0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
6200: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 *.SSL_CLIENT_HE
6210: 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 75 73 70 65 LLO_RETRY: suspe
6220: 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 nd the handshake
6230: 2c 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 , and the handsh
6240: 61 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c ake function wil
6250: 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 l return immedia
6260: 74 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 tely. *.SSL_CLIE
6270: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 NT_HELLO_ERROR:
6280: 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 failure, termina
6290: 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 te connection. S
62a0: 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f et alert to erro
62b0: 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 r code.. *.SSL_C
62c0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 LIENT_HELLO_SUCC
62d0: 45 53 53 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a ESS: success. *.
62e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
62f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6320: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
6330: 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 int.HelloCallba
6340: 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 ck(SSL *ssl, int
6350: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 *alert, void *a
6360: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 rg) {. State
6370: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
6380: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c te*)arg;. Tcl
6390: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
63a0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
63b0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
63c0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 *cmdPtr;. int
63d0: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 code, res;.
63e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76 const char *serv
63f0: 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 ername;. cons
6400: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
6410: 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c *p;. size_t l
6420: 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a en, remaining;..
6430: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
6440: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
6450: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
6460: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
6470: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
6480: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 CLIENT_HELLO_SUC
6490: 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 CESS;. } else
64a0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 28 63 6f 6e if (ssl == (con
64b0: 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c st SSL *)NULL ||
64c0: 20 61 72 67 20 3d 3d 20 28 76 6f 69 64 20 2a 29 arg == (void *)
64d0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
64e0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
64f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6500: 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20 /* Get names
6510: 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f */. if (!SSL_
6520: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 client_hello_get
6530: 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c 53 45 58 0_ext(ssl, TLSEX
6540: 54 5f 54 59 50 45 5f 73 65 72 76 65 72 5f 6e 61 T_TYPE_server_na
6550: 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e 69 me, &p, &remaini
6560: 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 ng) || remaining
6570: 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 <= 2) {..*alert
6580: 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 = SSL_R_SSLV3_A
6590: 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 LERT_ILLEGAL_PAR
65a0: 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 AMETER;..return
65b0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
65c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
65d0: 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 /* Extract th
65e0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 e length of the
65f0: 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 supplied list of
6600: 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c names. */. l
6610: 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 en = (*(p++) <<
6620: 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 8);. len += *
6630: 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c (p++);. if (l
6640: 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e en + 2 != remain
6650: 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d ing) {..*alert =
6660: 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 SSL_R_SSLV3_ALE
6670: 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d RT_ILLEGAL_PARAM
6680: 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 ETER;..return SS
6690: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
66a0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
66b0: 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b remaining = len;
66c0: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 .. /* The lis
66d0: 74 20 69 6e 20 70 72 61 63 74 69 63 65 20 6f 6e t in practice on
66e0: 6c 79 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20 ly has a single
66f0: 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f element, so we o
6700: 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 74 68 65 nly consider the
6710: 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 first one. */.
6720: 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 if (remaining
6730: 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d == 0 || *p++ !=
6740: 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 TLSEXT_NAMETYPE
6750: 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a _host_name) {..*
6760: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
6770: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e SV1_ALERT_INTERN
6780: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 AL_ERROR;..retur
6790: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
67a0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
67b0: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b remaining--;
67c0: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 .. /* Now we
67d0: 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c can finally pull
67e0: 20 6f 75 74 20 74 68 65 20 62 79 74 65 20 61 72 out the byte ar
67f0: 72 61 79 20 77 69 74 68 20 74 68 65 20 61 63 74 ray with the act
6800: 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f ual hostname. */
6810: 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 . if (remaini
6820: 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 ng <= 2) {..*ale
6830: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 rt = SSL_R_TLSV1
6840: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f _ALERT_INTERNAL_
6850: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 ERROR;..return S
6860: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
6870: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
6880: 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c len = (*(p++) <
6890: 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d < 8);. len +=
68a0: 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 *(p++);. if
68b0: 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 (len + 2 > remai
68c0: 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 ning) {..*alert
68d0: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c = SSL_R_TLSV1_AL
68e0: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 ERT_INTERNAL_ERR
68f0: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f OR;..return SSL_
6900: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6910: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
6920: 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 maining = len;.
6930: 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 servername =
6940: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 3b (const char *)p;
6950: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
6960: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
6970: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 with fn, chan, a
6980: 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61 nd server name a
6990: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
69a0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
69b0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
69c0: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
69d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
69e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
69f0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
6a00: 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 Obj("hello", -1)
6a10: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
6a20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
6a30: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
6a40: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
6a50: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 ngObj(Tcl_GetCha
6a60: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
6a70: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a r->self), -1));.
6a80: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
6a90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6aa0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
6ab0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 _NewStringObj(se
6ac0: 72 76 65 72 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 rvername, (Tcl_S
6ad0: 69 7a 65 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 ize) len));..
6ae0: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
6af0: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
6b00: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
6b10: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 t(cmdPtr);. i
6b20: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 f ((code = EvalC
6b30: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
6b40: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
6b50: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d )) > 1) {..res =
6b60: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c SSL_CLIENT_HELL
6b70: 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 O_RETRY;..*alert
6b80: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
6b90: 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c LERT_USER_CANCEL
6ba0: 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 LED;. } else
6bb0: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b if (code == 1) {
6bc0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 ..res = SSL_CLIE
6bd0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 NT_HELLO_SUCCESS
6be0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
6bf0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 res = SSL_CLIENT
6c00: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a _HELLO_ERROR;..*
6c10: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
6c20: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e SV1_ALERT_INTERN
6c30: 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a AL_ERROR;. }.
6c40: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
6c50: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
6c60: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a return res;.}.
6c70: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
6c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
6cc0: 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d CiphersObjCmd -
6cd0: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 - list available
6ce0: 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 ciphers. *. *.T
6cf0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
6d00: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
6d10: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 ess the "tls::ci
6d20: 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 phers" command.
6d30: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 *.to list availa
6d40: 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 ble ciphers, bas
6d50: 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c ed upon protocol
6d60: 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a selected.. *. *
6d70: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
6d80: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
6d90: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 lt list.. *. * S
6da0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
6db0: 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 constructs and d
6dc0: 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 estroys SSL cont
6dd0: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d ext (CTX). *. *-
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e20: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f --. */.static co
6e30: 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 nst char *protoc
6e40: 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 73 ols[] = {. "s
6e50: 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 sl2", "ssl3", "t
6e60: 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 ls1", "tls1.1",
6e70: 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e "tls1.2", "tls1.
6e80: 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 3", NULL.};.enum
6e90: 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 protocol {.
6ea0: 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 TLS_SSL2, TLS_SS
6eb0: 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c L3, TLS_TLS1, TL
6ec0: 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c S_TLS1_1, TLS_TL
6ed0: 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 S1_2, TLS_TLS1_3
6ee0: 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 , TLS_NONE.};..s
6ef0: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 tatic int.Cipher
6f00: 73 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c sObjCmd(. TCL
6f10: 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c _UNUSED(void *),
6f20: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
6f30: 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 *interp,. int
6f40: 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f objc,. Tcl_O
6f50: 62 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj.*const objv[]
6f60: 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 ).{. Tcl_Obj
6f70: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a *objPtr = NULL;.
6f80: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
6f90: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c = NULL;. SSL
6fa0: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ssl = NULL;.
6fb0: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 STACK_OF(SSL_C
6fc0: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 IPHER) *sk;.
6fd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 70 3b 0a const char *cp;.
6fe0: 20 20 20 20 63 68 61 72 20 62 75 66 5b 42 55 46 char buf[BUF
6ff0: 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e SIZ];. int in
7000: 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 dex, verbose = 0
7010: 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 , use_supported
7020: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 = 0;. const S
7030: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f SL_METHOD *metho
7040: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 d;.. dprintf(
7050: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
7060: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c if ((objc < 2) |
7070: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a | (objc > 4)) {.
7080: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
7090: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
70a0: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 v, "protocol ?ve
70b0: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 rbose? ?supporte
70c0: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 d?");..return TC
70d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
70e0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
70f0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
7100: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 p, objv[1], prot
7110: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c ocols, "protocol
7120: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d ", 0, &index) !=
7130: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
7140: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7150: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a }. if ((obj
7160: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 c > 2) && Tcl_Ge
7170: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 tBooleanFromObj(
7180: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c interp, objv[2],
7190: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 &verbose) != TC
71a0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
71b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
71c0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e . if ((objc >
71d0: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 3) && Tcl_GetBo
71e0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 oleanFromObj(int
71f0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 erp, objv[3], &u
7200: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d se_supported) !=
7210: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
7220: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7230: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
7240: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
7250: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 switch ((enum p
7260: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b rotocol)index) {
7270: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 . case TLS_SS
7280: 4c 32 3a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 L2:..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 53 53 4c 33 3a case TLS_SSL3:
7300: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
7310: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
7320: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
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 53 53 4c 33 5f 4d 45 54 NSSL_NO_SSL3_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 53 else..method = S
73d0: 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 SLv3_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 3a 0a case TLS_TLS1:.
7400: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
7410: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
7420: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
7430: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7440: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 SSL_NO_TLS1_METH
7450: 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 OD)..Tcl_AppendR
7460: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
7470: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
7480: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
7490: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
74a0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 r *)NULL);..retu
74b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
74c0: 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c lse..method = TL
74d0: 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 Sv1_method(); br
74e0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
74f0: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a case TLS_TLS1_1:
7500: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
7510: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e TLS1_1) || defin
7520: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7530: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
7540: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
7550: 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f _1_METHOD)..Tcl_
7560: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7570: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 erp, protocols[i
7580: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 ndex], ": protoc
7590: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
75a0: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
75b0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
75c0: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68 ROR;.#else..meth
75d0: 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 od = TLSv1_1_met
75e0: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 hod(); break;.#e
75f0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c ndif. case TL
7600: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 S_TLS1_2:.#if de
7610: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
7620: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
7630: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c SSL_NO_TLS1_2) |
7640: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
7650: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 L_NO_TLS1_2_METH
7660: 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 OD)..Tcl_AppendR
7670: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
7680: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
7690: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
76a0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 supported", (cha
76b0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 r *)NULL);..retu
76c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
76d0: 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c lse..method = TL
76e0: 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 Sv1_2_method();
76f0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 break;.#endif.
7700: 20 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f case TLS_TLS1_
7710: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 3:.#if defined(N
7720: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
7730: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
7740: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e TLS1_3) || defin
7750: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7760: 53 31 5f 33 5f 4d 45 54 48 4f 44 29 0a 09 54 63 S1_3_METHOD)..Tc
7770: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
7780: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
7790: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
77a0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
77b0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c ed", (char *)NUL
77c0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
77d0: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 ERROR;.#else..me
77e0: 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f thod = TLS_metho
77f0: 64 28 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 d();..SSL_CTX_se
7800: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 t_min_proto_vers
7810: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f ion(ctx, TLS1_3_
7820: 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 VERSION);..SSL_C
7830: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f TX_set_max_proto
7840: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
7850: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 S1_3_VERSION);..
7860: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 break;.#endif.
7870: 20 20 64 65 66 61 75 6c 74 3a 0a 09 6d 65 74 68 default:..meth
7880: 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 od = TLS_method(
7890: 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d );..break;. }
78a0: 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 . ctx = SSL_C
78b0: 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a TX_new(method);.
78c0: 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e if (ctx == N
78d0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
78e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
78f0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
7900: 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ), (char *)NULL)
7910: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
7920: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 ROR;. }. s
7930: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 sl = SSL_new(ctx
7940: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d );. if (ssl =
7950: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
7960: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7970: 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 rp, GET_ERR_REAS
7980: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 ON(), (char *)NU
7990: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
79a0: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
79b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
79c0: 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 }.. /* Use li
79d0: 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 st and order as
79e0: 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e would be sent in
79f0: 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f a ClientHello o
7a00: 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 r all available
7a10: 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 ciphers */. i
7a20: 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 f (use_supported
7a30: 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 ) {..sk = SSL_ge
7a40: 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 t1_supported_cip
7a50: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d hers(ssl);. }
7a60: 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 else {..sk = SS
7a70: 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 L_get_ciphers(ss
7a80: 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 l);. }.. i
7a90: 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b f (sk != NULL) {
7aa0: 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 ..if (!verbose)
7ab0: 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 {.. objPtr =
7ac0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
7ad0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f , NULL);.. fo
7ae0: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
7af0: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f < sk_SSL_CIPHER_
7b00: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a num(sk); i++) {.
7b10: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 ..const SSL_CIPH
7b20: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 ER *c = sk_SSL_C
7b30: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 IPHER_value(sk,
7b40: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e i);...if (c == N
7b50: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a ULL) continue;..
7b60: 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 ../* cipher name
7b70: 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 or (NONE) */...
7b80: 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f cp = SSL_CIPHER_
7b90: 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 get_name(c);...i
7ba0: 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 f (cp == NULL) b
7bb0: 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 reak;...Tcl_List
7bc0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
7bd0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
7be0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
7bf0: 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 j(cp, -1));..
7c00: 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 }...} else {..
7c10: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
7c20: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c NewStringObj("",
7c30: 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 0);.. for (in
7c40: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
7c50: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 SSL_CIPHER_num(s
7c60: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e k); i++) {...con
7c70: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
7c80: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 = sk_SSL_CIPHER
7c90: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 _value(sk, i);..
7ca0: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 .if (c == NULL)
7cb0: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 continue;..../*
7cc0: 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 textual descript
7cd0: 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 ion of the ciphe
7ce0: 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 r */...if (SSL_C
7cf0: 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f IPHER_descriptio
7d00: 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 n(c, buf, sizeof
7d10: 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 (buf)) != NULL)
7d20: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {... Tcl_Appe
7d30: 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 ndToObj(objPtr,
7d40: 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 buf, (Tcl_Size)
7d50: 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 strlen(buf));...
7d60: 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 } else {... T
7d70: 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f cl_AppendToObj(o
7d80: 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c bjPtr, "UNKNOWN\
7d90: 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 n", 8);...}..
7da0: 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 }..}..if (use_s
7db0: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 upported) {..
7dc0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 sk_SSL_CIPHER_f
7dd0: 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 ree(sk);..}.
7de0: 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 }. SSL_free(s
7df0: 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 sl);. SSL_CTX
7e00: 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 _free(ctx);..
7e10: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
7e20: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
7e30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
7e40: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e90: 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f --. *. * Protoco
7ea0: 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 lsObjCmd -- list
7eb0: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f available proto
7ec0: 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 cols. *. *.This
7ed0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
7ee0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
7ef0: 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 the "tls::protoc
7f00: 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ols" command. *.
7f10: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c to list availabl
7f20: 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a e protocols.. *.
7f30: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
7f40: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
7f50: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a sult list.. *. *
7f60: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
7f70: 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d *.none. *. *----
7f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7fc0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a */..static int.
7fd0: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 ProtocolsObjCmd(
7fe0: 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 . TCL_UNUSED(
7ff0: 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c void *),. Tcl
8000: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
8010: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 . int objc,.
8020: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 Tcl_Obj *cons
8030: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
8040: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
8050: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
8060: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
8070: 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 (objc != 1) {..
8080: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
8090: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
80a0: 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 , "");..return T
80b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
80c0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
80d0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a rror();.. obj
80e0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
80f0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
8100: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
8110: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
8120: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
8130: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
8140: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d PENSSL_NO_SSL3_M
8150: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c ETHOD). Tcl_L
8160: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
8170: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
8180: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
8190: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
81a0: 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a LS_SSL3], -1));.
81b0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
81c0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 ned(NO_TLS1) &&
81d0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
81e0: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 _NO_TLS1) && !de
81f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
8200: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 _TLS1_METHOD).
8210: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
8220: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
8230: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
8240: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
8250: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c ocols[TLS_TLS1],
8260: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 -1));.#endif.#i
8270: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
8280: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
8290: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
82a0: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
82b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
82c0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 _1_METHOD). T
82d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
82e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
82f0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
8300: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
8310: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 ls[TLS_TLS1_1],
8320: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
8330: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
8340: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
8350: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8360: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
8370: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
8380: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 2_METHOD). Tc
8390: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
83a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
83b0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
83c0: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
83d0: 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d s[TLS_TLS1_2], -
83e0: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
83f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
8400: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
8410: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
8420: 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 3). Tcl_ListO
8430: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
8440: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
8450: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
8460: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
8470: 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 LS1_3], -1));.#e
8480: 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 ndif.. Tcl_Se
8490: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
84a0: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
84b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
84c0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
84d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
8510: 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d * HandshakeObjCm
8520: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
8530: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 command is used
8540: 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 65 to verify whethe
8550: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 r the handshake
8560: 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f is complete. *.o
8570: 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 r not.. *. * Res
8580: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
8590: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 ard Tcl result.
85a0: 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 1 means handshak
85b0: 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 e complete, 0 me
85c0: 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a ans pending.. *.
85d0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
85e0: 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 . *.May force SS
85f0: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f L negotiation to
8600: 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a take place.. *.
8610: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
8620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8650: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
8660: 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f c int HandshakeO
8670: 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 bjCmd(. TCL_U
8680: 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 NUSED(void *),.
8690: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
86a0: 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f nterp,. int o
86b0: 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a bjc,. Tcl_Obj
86c0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a *const objv[]).
86d0: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
86e0: 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f l chan; /
86f0: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
8700: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 set a mode on.
8710: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
8720: 61 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f atePtr; /
8730: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
8740: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
8750: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
8760: 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a *errStr = NULL;.
8770: 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b int ret = 1;
8780: 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 . int err = 0
8790: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
87a0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
87b0: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
87c0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
87d0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
87e0: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
87f0: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
8800: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 );. }.. ER
8810: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
8820: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
8830: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
8840: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
8850: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c g(objv[1]), NULL
8860: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
8870: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
8880: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
8890: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
88a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 }.. /* Make
88b0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
88c0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
88d0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
88e0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 an = Tcl_GetTopC
88f0: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 hannel(chan);.
8900: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
8910: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
8920: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
8930: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 e()) {..Tcl_Appe
8940: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
8950: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
8960: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
8970: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 lName(chan),..."
8980: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
8990: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 annel", (char *)
89a0: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 NULL);..Tcl_SetE
89b0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
89c0: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 "TLS", "HANDSHA
89d0: 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 KE", "CHANNEL",
89e0: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
89f0: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *)NULL);..retur
8a00: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
8a10: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
8a20: 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f = (State *)Tcl_
8a30: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
8a40: 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 ceData(chan);..
8a50: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
8a60: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 ing Tls_WaitForC
8a70: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 onnect");. re
8a80: 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 t = Tls_WaitForC
8a90: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c onnect(statePtr,
8aa0: 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 &err, 1);. d
8ab0: 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 printf("Tls_Wait
8ac0: 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 ForConnect retur
8ad0: 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a ned: %i", ret);.
8ae0: 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 . if (ret < 0
8af0: 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e && ((statePtr->
8b00: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
8b10: 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d ASYNC) && (err =
8b20: 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 = EAGAIN))) {..d
8b30: 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 printf("Async se
8b40: 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 t and err = EAGA
8b50: 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a IN");..ret = 0;.
8b60: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 } else if (r
8b70: 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 et < 0) {..long
8b80: 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 result;..errStr
8b90: 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b = statePtr->err;
8ba0: 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c ..Tcl_ResetResul
8bb0: 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f t(interp);..Tcl_
8bc0: 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a SetErrno(err);..
8bd0: 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 .if (!errStr ||
8be0: 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 (*errStr == 0))
8bf0: 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 {.. errStr =
8c00: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 Tcl_PosixError(i
8c10: 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c nterp);..}...Tcl
8c20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
8c30: 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 terp, "handshake
8c40: 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 failed: ", errS
8c50: 74 72 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c tr, (char *)NULL
8c60: 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 );..if ((result
8c70: 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 = SSL_get_verify
8c80: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 _result(statePtr
8c90: 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f ->ssl)) != X509_
8ca0: 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c V_OK) {.. Tcl
8cb0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
8cc0: 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f 20 5c terp, " due to \
8cd0: 22 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f "", X509_verify_
8ce0: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e cert_error_strin
8cf0: 67 28 72 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c g(result), "\"",
8d00: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
8d10: 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 .}..Tcl_SetError
8d20: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
8d30: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c S", "HANDSHAKE",
8d40: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 "FAILED", (char
8d50: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e *)NULL);..dprin
8d60: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 tf("Returning TC
8d70: 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e L_ERROR with han
8d80: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 dshake failed: %
8d90: 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 s", errStr);..re
8da0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b turn(TCL_ERROR);
8db0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 . } else {..i
8dc0: 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 f (err != 0) {..
8dd0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 dprintf("Got
8de0: 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 an error with a
8df0: 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 completed hands
8e00: 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c hake: err = %i",
8e10: 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d err);..}..ret =
8e20: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 1;. }.. d
8e30: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
8e40: 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 g TCL_OK with da
8e50: 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 ta \"%i\"", ret)
8e60: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
8e70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
8e80: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 cl_NewIntObj(ret
8e90: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 ));. return(T
8ea0: 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a CL_OK);.}../*. *
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ef0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 ---. *. * Import
8f00: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
8f10: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
8f20: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
8f30: 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 cess the "ssl" c
8f40: 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 ommand. *. *.The
8f50: 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 ssl command pus
8f60: 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 hes SSL over a (
8f70: 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 newly connected)
8f80: 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 tcp socket. *.
8f90: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
8fa0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
8fb0: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
8fc0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
8fd0: 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 modify the behav
8fe0: 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 ior of an IO cha
8ff0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
9000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
9040: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 */..static int.I
9050: 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 0a 20 20 20 mportObjCmd(.
9060: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 TCL_UNUSED(void
9070: 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 *),. Tcl_Int
9080: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 erp *interp,.
9090: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 int objc,. T
90a0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
90b0: 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f jv[]).{. Tcl_
90c0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
90d0: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
90e0: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 set a mode on.
90f0: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 */. State *st
9100: 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 atePtr;../* clie
9110: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
9120: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 socket */. S
9130: 53 4c 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e SL_CTX *ctx..= N
9140: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
9150: 20 2a 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c *script..= NULL
9160: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 ;. Tcl_Obj *p
9170: 61 73 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b assword..= NULL;
9180: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 . Tcl_Obj *vc
9190: 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 md..= NULL;.
91a0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 Tcl_DString uppe
91b0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
91c0: 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ion, upperChanne
91d0: 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 lBlocking, upper
91e0: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c ChannelEncoding,
91f0: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 upperChannelEOF
9200: 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 Char;. int id
9210: 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 x;. Tcl_Size
9220: 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 len;. int fla
9230: 67 73 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 gs...= TLS_TCL_I
9240: 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 NIT;. int ser
9250: 76 65 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 ver...= 0;./* is
9260: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f connection inco
9270: 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 ming or outgoing
9280: 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b ? */. char *k
9290: 65 79 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a eyfile..= NULL;.
92a0: 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 char *certfi
92b0: 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 le..= NULL;.
92c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b unsigned char *k
92d0: 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ey..= NULL;.
92e0: 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e Tcl_Size key_len
92f0: 09 09 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 ..= 0;. unsig
9300: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 ned char *cert..
9310: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
9320: 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d Size cert_len..=
9330: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 0;. char *ci
9340: 70 68 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 phers..= NULL;.
9350: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 char *ciphers
9360: 75 69 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 uites..= NULL;.
9370: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 char *CAfile.
9380: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 .= NULL;. cha
9390: 72 20 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c r *CApath..= NUL
93a0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 L;. char *DHp
93b0: 61 72 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 arams..= NULL;.
93c0: 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 char *model..
93d0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 .= NULL;. cha
93e0: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d r *servername..=
93f0: 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 NULL;./* hostna
9400: 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 me for Server Na
9410: 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f me Indication */
9420: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
9430: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f ned char *sessio
9440: 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 n_id = NULL;.
9450: 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 Tcl_Obj *alpn..
9460: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
9470: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d ssl2 = 0, ssl3 =
9480: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 0;. int tls1
9490: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 = 1, tls1_1 = 1
94a0: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c , tls1_2 = 1, tl
94b0: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e s1_3 = 1;. in
94c0: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 t proto = 0, lev
94d0: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 el = -1;. int
94e0: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 verify = 0, req
94f0: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 uire = 0, reques
9500: 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 t = 1, post_hand
9510: 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20 shake = 0;..
9520: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
9530: 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
9540: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 NO_TLS1) || defi
9550: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
9560: 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 LS1). tls1 =
9570: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
9580: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
9590: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
95a0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 SSL_NO_TLS1_1).
95b0: 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 tls1_1 = 0;.#
95c0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
95d0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 d(NO_TLS1_2) ||
95e0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
95f0: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 NO_TLS1_2). t
9600: 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 ls1_2 = 0;.#endi
9610: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
9620: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 _TLS1_3) || defi
9630: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
9640: 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f LS1_3). tls1_
9650: 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 3 = 0;.#endif..
9660: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 if (objc < 2)
9670: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
9680: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
9690: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f objv, "channel ?
96a0: 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 options?");..ret
96b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
96c0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
96d0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
96e0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
96f0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
9700: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
9710: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 jv[1]), NULL);.
9720: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
9730: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
9740: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
9750: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
9760: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b /*. * Mak
9770: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
9780: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
9790: 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f channel. */
97a0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
97b0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
97c0: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 an);.. for (i
97d0: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 dx = 2; idx < ob
97e0: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 jc; idx++) {..ch
97f0: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 ar *opt = Tcl_Ge
9800: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78 tString(objv[idx
9810: 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d ]);...if (opt[0]
9820: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 != '-').. br
9830: 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d eak;...OPTOBJ("-
9840: 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f alpn", alpn);..O
9850: 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20 PTSTR("-cadir",
9860: 43 41 70 61 74 68 29 3b 0a 09 4f 50 54 53 54 52 CApath);..OPTSTR
9870: 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 ("-cafile", CAfi
9880: 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d le);..OPTBYTE("-
9890: 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 cert", cert, cer
98a0: 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 t_len);..OPTSTR(
98b0: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 "-certfile", cer
98c0: 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 tfile);..OPTSTR(
98d0: 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 "-cipher", ciphe
98e0: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 rs);..OPTSTR("-c
98f0: 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73 iphers", ciphers
9900: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 );..OPTSTR("-cip
9910: 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68 hersuites", ciph
9920: 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f ersuites);..OPTO
9930: 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 BJ("-command", s
9940: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 cript);..OPTSTR(
9950: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 "-dhparams", DHp
9960: 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 arams);..OPTBYTE
9970: 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 ("-key", key, ke
9980: 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 y_len);..OPTSTR(
9990: 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 "-keyfile", keyf
99a0: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ile);..OPTSTR("-
99b0: 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a model", model);.
99c0: 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f .OPTOBJ("-passwo
99d0: 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a rd", password);.
99e0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f .OPTBOOL("-post_
99f0: 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 handshake", post
9a00: 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 _handshake);..OP
9a10: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 TBOOL("-request"
9a20: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 , request);..OPT
9a30: 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c BOOL("-require",
9a40: 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 require);..OPTI
9a50: 4e 54 28 22 2d 73 65 63 75 72 69 74 79 5f 6c 65 NT("-security_le
9a60: 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f vel", level);..O
9a70: 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 PTBOOL("-server"
9a80: 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 , server);..OPTS
9a90: 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 TR("-servername"
9aa0: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 , servername);..
9ab0: 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e OPTSTR("-session
9ac0: 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 _id", session_id
9ad0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 );..OPTBOOL("-ss
9ae0: 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 l2", ssl2);..OPT
9af0: 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 BOOL("-ssl3", ss
9b00: 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d l3);..OPTBOOL("-
9b10: 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f tls1", tls1);..O
9b20: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 PTBOOL("-tls1.1"
9b30: 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 , tls1_1);..OPTB
9b40: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 OOL("-tls1.2", t
9b50: 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c ls1_2);..OPTBOOL
9b60: 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 ("-tls1.3", tls1
9b70: 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 _3);..OPTOBJ("-v
9b80: 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c alidatecommand",
9b90: 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 vcmd);..OPTOBJ(
9ba0: 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a "-vcmd", vcmd);.
9bb0: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e ..OPTBAD("option
9bc0: 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 ", "-alpn, -cadi
9bd0: 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 r, -cafile, -cer
9be0: 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 t, -certfile, -c
9bf0: 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 ipher, -ciphersu
9c00: 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 ites, -command,
9c10: 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c -dhparams, -key,
9c20: 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 -keyfile, -mode
9c30: 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 l, -password, -p
9c40: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d ost_handshake, -
9c50: 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 request, -requir
9c60: 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 e, -security_lev
9c70: 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 el, -server, -se
9c80: 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 rvername, -sessi
9c90: 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 on_id, -ssl2, -s
9ca0: 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 sl3, -tls1, -tls
9cb0: 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 1.1, -tls1.2, -t
9cc0: 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 ls1.3, or -valid
9cd0: 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 atecommand");...
9ce0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9cf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
9d00: 72 65 71 75 65 73 74 29 09 20 20 20 20 76 65 72 request). ver
9d10: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
9d20: 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 Y_CLIENT_ONCE |
9d30: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b SSL_VERIFY_PEER;
9d40: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 . if (request
9d50: 20 26 26 20 72 65 71 75 69 72 65 29 20 76 65 72 && require) ver
9d60: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 ify |= SSL_VERIF
9d70: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 Y_FAIL_IF_NO_PEE
9d80: 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 R_CERT;. if (
9d90: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f request && post_
9da0: 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 handshake).verif
9db0: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
9dc0: 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a POST_HANDSHAKE;.
9dd0: 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d if (verify =
9de0: 3d 20 30 29 09 76 65 72 69 66 79 20 3d 20 53 53 = 0).verify = SS
9df0: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a L_VERIFY_NONE;..
9e00: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 proto |= (ss
9e10: 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 l2 ? TLS_PROTO_S
9e20: 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 SL2 : 0);. pr
9e30: 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 oto |= (ssl3 ? T
9e40: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 LS_PROTO_SSL3 :
9e50: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
9e60: 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f (tls1 ? TLS_PRO
9e70: 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 TO_TLS1 : 0);.
9e80: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
9e90: 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _1 ? TLS_PROTO_T
9ea0: 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 LS1_1 : 0);.
9eb0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 proto |= (tls1_2
9ec0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
9ed0: 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 1_2 : 0);. pr
9ee0: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f oto |= (tls1_3 ?
9ef0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
9f00: 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 3 : 0);.. /*
9f10: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 reset to NULL if
9f20: 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 blank string pr
9f30: 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 ovided */. if
9f40: 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 (cert && !*cert
9f50: 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 ).. cert.
9f60: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
9f70: 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 if (key && !
9f80: 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b *key).. k
9f90: 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c ey. = NUL
9fa0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 L;. if (certf
9fb0: 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c ile && !*certfil
9fc0: 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 e) certf
9fd0: 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ile.= NULL;.
9fe0: 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 if (keyfile && !
9ff0: 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 *keyfile)..keyfi
a000: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c le. = NUL
a010: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 L;. if (ciphe
a020: 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 rs && !*ciphers)
a030: 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 . ciphers
a040: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
a050: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 . if (ciphers
a060: 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 uites && !*ciphe
a070: 72 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 rsuites) ciphers
a080: 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b uites = NULL;
a090: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 . if (CAfile
a0a0: 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 && !*CAfile).
a0b0: 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 CAfile.
a0c0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a0d0: 69 66 20 28 43 41 70 61 74 68 20 26 26 20 21 2a if (CApath && !*
a0e0: 43 41 70 61 74 68 29 09 20 20 20 20 20 20 20 20 CApath).
a0f0: 43 41 70 61 74 68 09 20 20 20 20 20 20 20 20 3d CApath. =
a100: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 NULL;. if (D
a110: 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 Hparams && !*DHp
a120: 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 arams). D
a130: 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d Hparams =
a140: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e NULL;.. /* n
a150: 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a ew SSL state */.
a160: 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 statePtr..=
a170: 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f (State *) ckallo
a180: 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a c((unsigned) siz
a190: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 eof(State));.
a1a0: 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 memset(statePtr
a1b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 , 0, sizeof(Stat
a1c0: 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 e));.. stateP
a1d0: 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 tr->flags.= flag
a1e0: 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d s;. statePtr-
a1f0: 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 >interp.= interp
a200: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
a210: 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b vflags.= verify;
a220: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 . statePtr->e
a230: 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a rr.= "";.. /*
a240: 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 allocate script
a250: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 */. if (scri
a260: 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 pt) {..(void) Tc
a270: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
a280: 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 bj(script, &len)
a290: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 ;..if (len) {..
a2a0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c statePtr->cal
a2b0: 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a lback = script;.
a2c0: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
a2d0: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
a2e0: 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 callback);..}.
a2f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f }.. /* allo
a300: 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f cate password */
a310: 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 . if (passwor
a320: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c d) {..(void) Tcl
a330: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
a340: 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e j(password, &len
a350: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
a360: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 statePtr->pa
a370: 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 ssword = passwor
a380: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 d;.. Tcl_Incr
a390: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
a3a0: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d r->password);..}
a3b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 . }.. /* a
a3c0: 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 llocate validate
a3d0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
a3e0: 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f if (vcmd) {..(vo
a3f0: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e id) Tcl_GetStrin
a400: 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 gFromObj(vcmd, &
a410: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 len);..if (len)
a420: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d {.. statePtr-
a430: 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 >vcmd = vcmd;..
a440: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
a450: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 unt(statePtr->vc
a460: 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 md);..}. }..
a470: 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 if (model !=
a480: 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 NULL) {..int mod
a490: 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 e;../* Get the "
a4a0: 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a model" context *
a4b0: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
a4c0: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
a4d0: 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a model, &mode);.
a4e0: 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 .if (chan == (Tc
a4f0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
a500: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
a510: 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 ((void *)statePt
a520: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
a530: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
a540: 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 /*.. * Make sure
a550: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
a560: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
a570: 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 el.. */..chan =
a580: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
a590: 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 l(chan);..if (Tc
a5a0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
a5b0: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 (chan) != Tls_Ch
a5c0: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 annelType()) {..
a5d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
a5e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
a5f0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
a600: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
a610: 65 28 63 68 61 6e 29 2c 0a 09 09 20 20 20 20 22 e(chan),... "
a620: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
a630: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 annel", (char *)
a640: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
a650: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
a660: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
a670: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c ORT", "CHANNEL",
a680: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
a690: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
a6a0: 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a Tls_Free((void *
a6b0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 )statePtr);..
a6c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
a6d0: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 R;..}..ctx = ((S
a6e0: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
a6f0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
a700: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 a(chan))->ctx;.
a710: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
a720: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 ((ctx = CTX_Init
a730: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 (statePtr, serve
a740: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c r, proto, keyfil
a750: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 e, certfile, key
a760: 2c 20 63 65 72 74 2c 20 28 69 6e 74 29 20 6b 65 , cert, (int) ke
a770: 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74 y_len,.. (int
a780: 29 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 ) cert_len, CApa
a790: 74 68 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 th, CAfile, ciph
a7a0: 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 ers, ciphersuite
a7b0: 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 s, level, DHpara
a7c0: 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a ms)) == NULL) {.
a7d0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76 . Tls_Free((v
a7e0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
a7f0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
a800: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
a810: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
a820: 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 ctx = ctx;..
a830: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 /*. * We nee
a840: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 d to make sure t
a850: 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 hat the channel
a860: 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 works in binary
a870: 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 (for the. *
a880: 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 encryption not t
a890: 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 o get goofed up)
a8a0: 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 .. * We only
a8b0: 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 want to adjust
a8c0: 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e the buffering in
a8d0: 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 pre-v2 channels
a8e0: 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 , where. * e
a8f0: 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 ach channel in t
a900: 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 he stack maintai
a910: 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 ned its own buff
a920: 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ers.. */.
a930: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
a940: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 (&upperChannelTr
a950: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 anslation);.
a960: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
a970: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
a980: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f cking);. Tcl_
a990: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
a9a0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
a9b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
a9c0: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
a9d0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 nnelEncoding);.
a9e0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
a9f0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
aa00: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 chan, "-eofchar"
aa10: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 , &upperChannelE
aa20: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
aa30: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
aa40: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
aa50: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 "-encoding", &up
aa60: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
aa70: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ng);. Tcl_Get
aa80: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
aa90: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
aaa0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 anslation", &upp
aab0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
aac0: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 tion);. Tcl_G
aad0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
aae0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
aaf0: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 blocking", &uppe
ab00: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
ab10: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
ab20: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
ab30: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e rp, chan, "-tran
ab40: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 slation", "binar
ab50: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 y");. Tcl_Set
ab60: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
ab70: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c terp, chan, "-bl
ab80: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 ocking", "true")
ab90: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 ;. dprintf("C
aba0: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 onsuming Tcl cha
abb0: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 nnel %s", Tcl_Ge
abc0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
abd0: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 n));. statePt
abe0: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 r->self = Tcl_St
abf0: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 ackChannel(inter
ac00: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 p, Tls_ChannelTy
ac10: 70 65 28 29 2c 20 73 74 61 74 65 50 74 72 2c 20 pe(), statePtr,
ac20: 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 (TCL_READABLE |
ac30: 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 TCL_WRITABLE), c
ac40: 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 han);. dprint
ac50: 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e f("Created chann
ac60: 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 el named %s", Tc
ac70: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
ac80: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
ac90: 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 );. if (state
aca0: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 Ptr->self == (Tc
acb0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
acc0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 {../*.. * No us
acd0: 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 e of Tcl_Eventua
ace0: 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20 llyFree because
acf0: 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f no possible Tcl_
ad00: 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 Preserve... */..
ad10: 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a Tls_Free((void *
ad20: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 )statePtr);..ret
ad30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
ad40: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 }.. Tcl_Se
ad50: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
ad60: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
ad70: 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 >self, "-transla
ad80: 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 tion", Tcl_DStri
ad90: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
ada0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
adb0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ));. Tcl_SetC
adc0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
add0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
ade0: 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 elf, "-encoding"
adf0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
ae00: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
ae10: 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 Encoding));.
ae20: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
ae30: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
ae40: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 tePtr->self, "-e
ae50: 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 ofchar", Tcl_DSt
ae60: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
ae70: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 ChannelEOFChar))
ae80: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
ae90: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
aea0: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
aeb0: 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 f, "-blocking",
aec0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
aed0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
aee0: 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 ocking));. Tc
aef0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 l_DStringFree(&u
af00: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
af10: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c lation);. Tcl
af20: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 _DStringFree(&up
af30: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
af40: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ng);. Tcl_DSt
af50: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 ringFree(&upperC
af60: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a hannelEOFChar);.
af70: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
af80: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 ree(&upperChanne
af90: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 lBlocking);..
afa0: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 /*. * SSL I
afb0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 nitialization.
afc0: 20 20 20 2a 2f 0a 0a 20 20 20 20 73 74 61 74 65 */.. state
afd0: 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e Ptr->ssl = SSL_n
afe0: 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ew(statePtr->ctx
aff0: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 );. if (!stat
b000: 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a ePtr->ssl) {../*
b010: 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 SSL library err
b020: 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e or */..Tcl_Appen
b030: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
b040: 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 "couldn't constr
b050: 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a uct ssl session:
b060: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
b070: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 ON(), (char *)NU
b080: 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 LL);..Tcl_SetErr
b090: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b0a0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
b0b0: 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22 "INIT", "FAILED"
b0c0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
b0d0: 0a 09 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 ..Tls_Free((void
b0e0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 72 *)statePtr);..r
b0f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b100: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
b110: 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e et host server n
b120: 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 ame */. if (s
b130: 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a ervername) {../*
b140: 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 Sets the server
b150: 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e name indication
b160: 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 (SNI) in Client
b170: 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 Hello extension
b180: 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 */../* Per RFC 6
b190: 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 066, hostname is
b1a0: 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 a ASCII encoded
b1b0: 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 string, though
b1c0: 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55 54 RFC 4366 says UT
b1d0: 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 F-8. */..if (!SS
b1e0: 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 L_set_tlsext_hos
b1f0: 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d t_name(statePtr-
b200: 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 >ssl, servername
b210: 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a ) && require) {.
b220: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
b230: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
b240: 65 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e et SNI extension
b250: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f failed: ", GET_
b260: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
b270: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 har *)NULL);..
b280: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
b290: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b2a0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 , "IMPORT", "SNI
b2b0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 ", "FAILED", (ch
b2c0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 ar *)NULL);..
b2d0: 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 Tls_Free((void
b2e0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 *)statePtr);..
b2f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
b300: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 OR;..}.../* Set
b310: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 hostname for pee
b320: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f r certificate ho
b330: 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 stname verificat
b340: 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a ion in clients..
b350: 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 . Don't use SS
b360: 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 L_set1_host sinc
b370: 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 e it has limitat
b380: 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 ions. */..if (!S
b390: 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 SL_add1_host(sta
b3a0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 tePtr->ssl, serv
b3b0: 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 ername)) {..
b3c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
b3d0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 44 4e (interp, "Set DN
b3e0: 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65 S hostname faile
b3f0: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 d: ", GET_ERR_RE
b400: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
b410: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
b420: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
b430: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
b440: 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 ORT", "HOSTNAME"
b450: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
b460: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
b470: 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a Tls_Free((void *
b480: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 )statePtr);..
b490: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
b4a0: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 R;..}. }..
b4b0: 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69 /* Resume sessi
b4c0: 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 on id */. if
b4d0: 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 (session_id && s
b4e0: 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 trlen(session_id
b4f0: 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 ) <= SSL_MAX_SID
b500: 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 _CTX_LENGTH) {..
b510: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 /* SSL_set_sessi
b520: 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 on() */..if (!SS
b530: 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 L_SESSION_set1_i
b540: 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 d_context(SSL_ge
b550: 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 t_session(stateP
b560: 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f tr->ssl), sessio
b570: 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 n_id, (unsigned
b580: 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 int) strlen(sess
b590: 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 ion_id))) {..
b5a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
b5b0: 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d t(interp, "Resum
b5c0: 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64 e session failed
b5d0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
b5e0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e SON(), (char *)N
b5f0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
b600: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
b610: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
b620: 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 RT", "SESSION",
b630: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
b640: 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c *)NULL);.. Tl
b650: 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 s_Free((void *)s
b660: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
b670: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b680: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
b690: 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 * Enable Applica
b6a0: 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f tion-Layer Proto
b6b0: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e col Negotiation.
b6c0: 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 Examples are: h
b6d0: 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 ttp/1.0,..http/1
b6e0: 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c .1, h2, h3, ftp,
b6f0: 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 imap, pop3, xmp
b700: 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 p-client, xmpp-s
b710: 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 erver, mqtt, irc
b720: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 , etc. */. if
b730: 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f (alpn) {../* Co
b740: 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 nvert a TCL list
b750: 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c into a protocol
b760: 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f -list in wire-fo
b770: 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 rmat */..unsigne
b780: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 d char *protos,
b790: 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e *p;..unsigned in
b7a0: 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 t protos_len = 0
b7b0: 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c ;..Tcl_Size cnt,
b7c0: 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c i;..int j;..Tcl
b7d0: 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 _Obj **list;...i
b7e0: 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 f (Tcl_ListObjGe
b7f0: 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 tElements(interp
b800: 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c , alpn, &cnt, &l
b810: 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ist) != TCL_OK)
b820: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 {.. Tls_Free(
b830: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
b840: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
b850: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
b860: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 * Determine the
b870: 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 memory required
b880: 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c for the protocol
b890: 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 -list */..for (i
b8a0: 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 = 0; i < cnt; i
b8b0: 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 ++) {.. Tcl_G
b8c0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
b8d0: 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a list[i], &len);.
b8e0: 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 . if (len > 2
b8f0: 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 55) {...Tcl_Appe
b900: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
b910: 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 "ALPN protocol
b920: 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f 6e 67 22 2c names too long",
b930: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
b940: 09 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
b950: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b960: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 , "IMPORT", "ALP
b970: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 N", "FAILED", (c
b980: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 54 har *)NULL);...T
b990: 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 ls_Free((void *)
b9a0: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 statePtr);...ret
b9b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
b9c0: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f }.. proto
b9d0: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e s_len += 1 + (in
b9e0: 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 t) len;..}.../*
b9f0: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 Build the comple
ba00: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 te protocol-list
ba10: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b */..protos = ck
ba20: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e alloc(protos_len
ba30: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d );../* protocol-
ba40: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 lists consist of
ba50: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 8-bit length-pr
ba60: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 efixed, byte str
ba70: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 ings */..for (j
ba80: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b = 0, p = protos;
ba90: 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b j < cnt; j++) {
baa0: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 .. char *str
bab0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
bac0: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 romObj(list[j],
bad0: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b &len);.. *p++
bae0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 = (unsigned cha
baf0: 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d r) len;.. mem
bb00: 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a cpy(p, str, (siz
bb10: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 e_t) len);..
bb20: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f p += len;..}.../
bb30: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 * SSL_set_alpn_p
bb40: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f rotos makes a co
bb50: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 py of the protoc
bb60: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e ol-list */../* N
bb70: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 ote: This functi
bb80: 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 65 ons reverses the
bb90: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f return value co
bba0: 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 nvention */..if
bbb0: 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 (SSL_set_alpn_pr
bbc0: 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 otos(statePtr->s
bbd0: 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 sl, protos, prot
bbe0: 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 os_len)) {..
bbf0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
bc00: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c (interp, "Set AL
bc10: 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 PN protocols fai
bc20: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f led: ", GET_ERR_
bc30: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
bc40: 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 *)NULL);.. Tc
bc50: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
bc60: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
bc70: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 MPORT", "ALPN",
bc80: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
bc90: 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c *)NULL);.. Tl
bca0: 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 s_Free((void *)s
bcb0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 tatePtr);.. c
bcc0: 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 kfree(protos);..
bcd0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
bce0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 RROR;..}.../* St
bcf0: 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 ore protocols li
bd00: 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d st */..statePtr-
bd10: 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 >protos = protos
bd20: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ;..statePtr->pro
bd30: 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 tos_len = protos
bd40: 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 _len;. } else
bd50: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 {..statePtr->pr
bd60: 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 otos = NULL;..st
bd70: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
bd80: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 en = 0;. }..
bd90: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c /*. * SSL
bda0: 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 Callbacks.
bdb0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 */. SSL_set_a
bdc0: 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 pp_data(statePtr
bdd0: 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 ->ssl, (void *)s
bde0: 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 tatePtr);./* poi
bdf0: 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f nt back to us */
be00: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 . SSL_set_ver
be10: 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ify(statePtr->ss
be20: 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 l, verify, Verif
be30: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 yCallback);.
be40: 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c SSL_set_info_cal
be50: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e lback(statePtr->
be60: 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 ssl, InfoCallbac
be70: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c k);.. /* Call
be80: 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 back for observi
be90: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 ng protocol mess
bea0: 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 ages */.#ifndef
beb0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 OPENSSL_NO_SSL_T
bec0: 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 RACE. /* void
bed0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 SSL_CTX_set_msg
bee0: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 _callback_arg(st
bef0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f atePtr->ctx, (vo
bf00: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
bf10: 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 void SSL_CTX
bf20: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 _set_msg_callbac
bf30: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c k(statePtr->ctx,
bf40: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b MessageCallback
bf50: 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 ); */. SSL_se
bf60: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 t_msg_callback_a
bf70: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c rg(statePtr->ssl
bf80: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
bf90: 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 tr);. SSL_set
bfa0: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 _msg_callback(st
bfb0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 atePtr->ssl, Mes
bfc0: 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 sageCallback);.#
bfd0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 endif.. /* Cr
bfe0: 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c eate Tcl_Channel
bff0: 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a BIO Handler */.
c000: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f statePtr->p_
c010: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 bio.= BIO_new_tc
c020: 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f l(statePtr, BIO_
c030: 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 NOCLOSE);. st
c040: 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 atePtr->bio.= BI
c050: 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 O_new(BIO_f_ssl(
c060: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 ));.. if (ser
c070: 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 ver) {../* Serve
c080: 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 r callbacks */..
c090: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 SSL_CTX_set_tlse
c0a0: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 xt_servername_ar
c0b0: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c g(statePtr->ctx,
c0c0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c0d0: 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 r);..SSL_CTX_set
c0e0: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 _tlsext_serverna
c0f0: 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 me_callback(stat
c100: 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 ePtr->ctx, SNICa
c110: 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 llback);..SSL_CT
c120: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c X_set_client_hel
c130: 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e lo_cb(statePtr->
c140: 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 ctx, HelloCallba
c150: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
c160: 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 ePtr);..if (stat
c170: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
c180: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c NULL) {.. SSL
c190: 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 _CTX_set_alpn_se
c1a0: 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 lect_cb(statePtr
c1b0: 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 ->ctx, ALPNCallb
c1c0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
c1d0: 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 tePtr);.#ifdef U
c1e0: 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 SE_NPN.. if (
c1f0: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 tls1_2 == 0 && t
c200: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 ls1_3 == 0) {...
c210: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 SSL_CTX_set_next
c220: 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 _protos_advertis
c230: 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ed_cb(statePtr->
c240: 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b ctx, NPNCallback
c250: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
c260: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 tr);.. }.#end
c270: 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c if..}.../* Enabl
c280: 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 e server to send
c290: 20 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66 cert request af
c2a0: 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 ter handshake (T
c2b0: 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a LS 1.3 only) */.
c2c0: 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 ./* A write oper
c2d0: 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 ation must take
c2e0: 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 place for the Ce
c2f0: 72 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73 rtificate Reques
c300: 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 t to be.. sent
c310: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 to the client,
c320: 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 this can be done
c330: 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e with SSL_do_han
c340: 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 dshake(). */..if
c350: 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 (request && pos
c360: 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 t_handshake && t
c370: 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 ls1_3) {.. SS
c380: 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f L_verify_client_
c390: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 post_handshake(s
c3a0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
c3b0: 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d }.../* set autom
c3c0: 61 74 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 atic curve selec
c3d0: 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 tion */..SSL_set
c3e0: 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 _ecdh_auto(state
c3f0: 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 Ptr->ssl, 1);...
c400: 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f /* Set server mo
c410: 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d de */..statePtr-
c420: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 >flags |= TLS_TC
c430: 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 L_SERVER;..SSL_s
c440: 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 et_accept_state(
c450: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
c460: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a } else {../*
c470: 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b Client callback
c480: 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f s */.#ifdef USE_
c490: 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 NPN..if (statePt
c4a0: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c r->protos != NUL
c4b0: 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 L && tls1_2 == 0
c4c0: 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 && tls1_3 == 0)
c4d0: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f {.. SSL_CTX_
c4e0: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 set_next_proto_s
c4f0: 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 elect_cb(statePt
c500: 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c r->ctx, ALPNCall
c510: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 back, (void *)st
c520: 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 atePtr);..}.#end
c530: 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 if.../* Session
c540: 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f caching */..SSL_
c550: 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f CTX_set_session_
c560: 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 cache_mode(state
c570: 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 Ptr->ctx, SSL_SE
c580: 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 SS_CACHE_CLIENT
c590: 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 | SSL_SESS_CACHE
c5a0: 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f _NO_INTERNAL_STO
c5b0: 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 RE);..SSL_CTX_se
c5c0: 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 ss_set_new_cb(st
c5d0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 atePtr->ctx, Ses
c5e0: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a sionCallback);..
c5f0: 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 ./* Enable post
c600: 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e handshake Authen
c610: 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 tication extensi
c620: 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 on. TLS 1.3 only
c630: 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f , not http/2. */
c640: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 ..if (request &&
c650: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 post_handshake)
c660: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f {.. SSL_set_
c670: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 post_handshake_a
c680: 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 uth(statePtr->ss
c690: 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 l, 1);..}.../* S
c6a0: 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a et client mode *
c6b0: 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 /..SSL_set_conne
c6c0: 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 ct_state(statePt
c6d0: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
c6e0: 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 SSL_set_bio(s
c6f0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 tatePtr->ssl, st
c700: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 atePtr->p_bio, s
c710: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b tatePtr->p_bio);
c720: 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c . BIO_set_ssl
c730: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 (statePtr->bio,
c740: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 statePtr->ssl, B
c750: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 IO_NOCLOSE);..
c760: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 /*. * End
c770: 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 of SSL Init.
c780: 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 */. dprintf(
c790: 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 "Returning %s",
c7a0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
c7b0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
c7c0: 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 f));. Tcl_Set
c7d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 Result(interp, (
c7e0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 char *) Tcl_GetC
c7f0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
c800: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f Ptr->self), TCL_
c810: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 VOLATILE);. r
c820: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
c830: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
c840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
c880: 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 UnimportObjCmd
c890: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
c8a0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
c8b0: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 ed to remove the
c8c0: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
c8d0: 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 filter.. *. * R
c8e0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
c8f0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
c900: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
c910: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 ects:. *.May mod
c920: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 ify the behavior
c930: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 of an IO channe
c940: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
c950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
c990: 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d .static int.Unim
c9a0: 70 6f 72 74 4f 62 6a 43 6d 64 28 0a 20 20 20 20 portObjCmd(.
c9b0: 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 TCL_UNUSED(void
c9c0: 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 *),. Tcl_Inte
c9d0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 rp *interp,.
c9e0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 int objc,. Tc
c9f0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
ca00: 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]).{. Tcl_C
ca10: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
ca20: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
ca30: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
ca40: 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 /.. dprintf("
ca50: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
ca60: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
ca70: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
ca80: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
ca90: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
caa0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
cab0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 ;. }.. cha
cac0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
cad0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
cae0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d etString(objv[1]
caf0: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ), NULL);. if
cb00: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
cb10: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
cb20: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
cb30: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
cb40: 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 . * Make sur
cb50: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
cb60: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
cb70: 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 nel. */.
cb80: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
cb90: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
cba0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
cbb0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
cbc0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
cbd0: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
cbe0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
cbf0: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
cc00: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
cc10: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
cc20: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 .."\": not a TLS
cc30: 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 channel", (char
cc40: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 *)NULL);.. T
cc50: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
cc60: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
cc70: 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e UNIMPORT", "CHAN
cc80: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
cc90: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
cca0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
ccb0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 R;. }.. if
ccc0: 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 (Tcl_UnstackCha
ccd0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 nnel(interp, cha
cce0: 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 n) == TCL_ERROR)
ccf0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
cd00: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
cd10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
cd20: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
cd70: 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 * CTX_Init -- c
cd80: 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 onstruct a SSL_C
cd90: 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 TX instance. *.
cda0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
cdb0: 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e valid SSL_CTX in
cdc0: 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a stance or NULL..
cdd0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
cde0: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 ts:. *.construct
cdf0: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 s SSL context (C
ce00: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d TX). *. *-------
ce10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
ce50: 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 ..static SSL_CTX
ce60: 20 2a 0a 43 54 58 5f 49 6e 69 74 28 0a 20 20 20 *.CTX_Init(.
ce70: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
ce80: 2c 0a 20 20 20 20 69 6e 74 20 69 73 53 65 72 76 ,. int isServ
ce90: 65 72 2c 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 er,. int prot
cea0: 6f 2c 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 o,. char *key
ceb0: 66 69 6c 65 2c 0a 20 20 20 20 63 68 61 72 20 2a file,. char *
cec0: 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e certfile,. un
ced0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 signed char *key
cee0: 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ,. unsigned c
cef0: 68 61 72 20 2a 63 65 72 74 2c 0a 20 20 20 20 69 har *cert,. i
cf00: 6e 74 20 6b 65 79 5f 6c 65 6e 2c 0a 20 20 20 20 nt key_len,.
cf10: 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 0a 20 20 int cert_len,.
cf20: 20 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c 0a char *CApath,.
cf30: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 char *CAfile
cf40: 2c 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ,. char *ciph
cf50: 65 72 73 2c 0a 20 20 20 20 63 68 61 72 20 2a 63 ers,. char *c
cf60: 69 70 68 65 72 73 75 69 74 65 73 2c 0a 20 20 20 iphersuites,.
cf70: 20 69 6e 74 20 6c 65 76 65 6c 2c 0a 20 20 20 20 int level,.
cf80: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 0a char *DHparams).
cf90: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 {. Tcl_Interp
cfa0: 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 *interp = state
cfb0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
cfc0: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 SSL_CTX *ctx =
cfd0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 NULL;. Tcl_DS
cfe0: 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 69 6e tring ds;. in
cff0: 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72 74 t off = 0, abort
d000: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f = 0;. int lo
d010: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a ad_private_key;.
d020: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 const SSL_ME
d030: 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 THOD *method;..
d040: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
d050: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 ed");.. if (!
d060: 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 proto) {..Tcl_Ap
d070: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
d080: 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f p, "no valid pro
d090: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c tocol selected",
d0a0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
d0b0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
d0c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 }.. /* crea
d0d0: 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a te SSL context *
d0e0: 2f 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 /. if (ENABLE
d0f0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
d100: 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c TO_SSL2)) {..Tcl
d110: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d120: 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 terp, "SSL2 prot
d130: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
d140: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c ed", (char *)NUL
d150: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
d160: 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 ;. }.#if defi
d170: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 ned(NO_SSL3) ||
d180: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d190: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 NO_SSL3) || defi
d1a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
d1b0: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 SL3_METHOD).
d1c0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
d1d0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c o, TLS_PROTO_SSL
d1e0: 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 3)) {..Tcl_Appen
d1f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
d200: 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e "SSL3 protocol n
d210: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
d220: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
d230: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
d240: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
d250: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c ined(NO_TLS1) ||
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 29 20 7c 7c 20 64 65 66 _NO_TLS1) || def
d280: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d290: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 TLS1_METHOD).
d2a0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
d2b0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
d2c0: 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 S1)) {..Tcl_Appe
d2d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
d2e0: 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 "TLS 1.0 protoc
d2f0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
d300: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
d310: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
d320: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
d330: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
d340: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
d350: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
d360: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
d370: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d NSSL_NO_TLS1_1_M
d380: 45 54 48 4f 44 29 0a 20 20 20 20 69 66 20 28 45 ETHOD). if (E
d390: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
d3a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 S_PROTO_TLS1_1))
d3b0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
d3c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
d3d0: 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.1 protocol n
d3e0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
d3f0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
d400: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
d410: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
d420: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
d430: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
d440: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c SL_NO_TLS1_2) ||
d450: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
d460: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f _NO_TLS1_2_METHO
d470: 44 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c D). if (ENABL
d480: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
d490: 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 OTO_TLS1_2)) {..
d4a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d4b0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
d4c0: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 2 protocol not s
d4d0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
d4e0: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *)NULL);..retur
d4f0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
d500: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
d510: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
d520: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
d530: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
d540: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
d550: 54 4c 53 31 5f 33 5f 4d 45 54 48 4f 44 29 0a 20 TLS1_3_METHOD).
d560: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
d570: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
d580: 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f TLS1_3)) {..Tcl_
d590: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d5a0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 erp, "TLS 1.3 pr
d5b0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
d5c0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e rted", (char *)N
d5d0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
d5e0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
d5f0: 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d . if (proto =
d600: 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 = 0) {../* Use f
d610: 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 ull range */..SS
d620: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 L_CTX_set_min_pr
d630: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c oto_version(ctx,
d640: 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 0);..SSL_CTX_se
d650: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 t_max_proto_vers
d660: 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 ion(ctx, 0);.
d670: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 }.. switch (
d680: 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 21 64 65 proto) {.#if !de
d690: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
d6a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d6b0: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 SL_NO_SSL3) && !
d6c0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
d6d0: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
d6e0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
d6f0: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 TO_SSL3:..method
d700: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 = isServer ? SS
d710: 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f Lv3_server_metho
d720: 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 d() : SSLv3_clie
d730: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
d740: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
d750: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
d760: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
d770: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
d780: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
d790: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
d7a0: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
d7b0: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 PROTO_TLS1:..met
d7c0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
d7d0: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 TLSv1_server_me
d7e0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 thod() : TLSv1_c
d7f0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
d800: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
d810: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
d820: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
d830: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
d840: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
d850: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d860: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_1_METHOD).
d870: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
d880: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_1:..method =
d890: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
d8a0: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_1_server_metho
d8b0: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c d() : TLSv1_1_cl
d8c0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
d8d0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
d8e0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
d8f0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
d900: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
d910: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
d920: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d930: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _2_METHOD). c
d940: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
d950: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_2:..method =
d960: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
d970: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 _2_server_method
d980: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 () : TLSv1_2_cli
d990: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
d9a0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
d9b0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
d9c0: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
d9d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
d9e0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
d9f0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
da00: 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 3_METHOD). ca
da10: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
da20: 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 1_3:../* Use the
da30: 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 generic method
da40: 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 and constraint r
da50: 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 ange after conte
da60: 78 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f xt is created */
da70: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 ..method = isSer
da80: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 ver ? TLS_server
da90: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f _method() : TLS_
daa0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
dab0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
dac0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a default:../*
dad0: 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 Negotiate highe
dae0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c st available SSL
daf0: 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a /TLS version */.
db00: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 .method = isServ
db10: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f er ? TLS_server_
db20: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 method() : TLS_c
db30: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
db40: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
db50: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
db60: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
db70: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
db80: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d PENSSL_NO_SSL3_M
db90: 45 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 ETHOD)..off |= (
dba0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
dbb0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 LS_PROTO_SSL3)
dbc0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
dbd0: 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a _SSLv3);.#endif.
dbe0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
dbf0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 TLS1) && !define
dc00: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
dc10: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
dc20: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d PENSSL_NO_TLS1_M
dc30: 45 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 ETHOD)..off |= (
dc40: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
dc50: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 LS_PROTO_TLS1)
dc60: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
dc70: 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a _TLSv1);.#endif.
dc80: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
dc90: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
dca0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
dcb0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
dcc0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
dcd0: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 6f 66 S1_1_METHOD)..of
dce0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
dcf0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
dd00: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c LS1_1) ? 0 : SSL
dd10: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b _OP_NO_TLSv1_1);
dd20: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
dd30: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
dd40: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
dd50: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 SSL_NO_TLS1_2) &
dd60: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
dd70: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 SL_NO_TLS1_2_MET
dd80: 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e HOD)..off |= (EN
dd90: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
dda0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f _PROTO_TLS1_2) ?
ddb0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
ddc0: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a LSv1_2);.#endif.
ddd0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
dde0: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
ddf0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
de00: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
de10: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
de20: 53 31 5f 33 5f 4d 45 54 48 4f 44 29 0a 09 6f 66 S1_3_METHOD)..of
de30: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
de40: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
de50: 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c LS1_3) ? 0 : SSL
de60: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b _OP_NO_TLSv1_3);
de70: 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a .#endif..break;.
de80: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 }.. ERR_c
de90: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 lear_error();..
dea0: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 ctx = SSL_CTX
deb0: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 _new(method);.
dec0: 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 if (!ctx) {..r
ded0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 eturn(NULL);.
dee0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 }.. if (gete
def0: 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 nv(SSLKEYLOGFILE
df00: 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 )) {..SSL_CTX_se
df10: 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 t_keylog_callbac
df20: 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c k(ctx, KeyLogCal
df30: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 lback);. }..#
df40: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
df50: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e LS1_3) && !defin
df60: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
df70: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 S1_3). if (pr
df80: 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f oto == TLS_PROTO
df90: 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f _TLS1_3) {..SSL_
dfa0: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 CTX_set_min_prot
dfb0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 o_version(ctx, T
dfc0: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a LS1_3_VERSION);.
dfd0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 .SSL_CTX_set_max
dfe0: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
dff0: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 tx, TLS1_3_VERSI
e000: 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ON);. }.#endi
e010: 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 f.. /* Force
e020: 63 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e cipher selection
e030: 20 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72 order by server
e040: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 */. if (!isS
e050: 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 erver) {..SSL_CT
e060: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
e070: 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 x, SSL_OP_CIPHER
e080: 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e _SERVER_PREFEREN
e090: 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 CE);. }..
e0a0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f SSL_CTX_set_app_
e0b0: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a data(ctx, (void*
e0c0: 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d )interp);./* rem
e0d0: 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 ember the interp
e0e0: 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c reter */. SSL
e0f0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
e100: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c (ctx, SSL_OP_ALL
e110: 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 );./* all SSL bu
e120: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f g workarounds */
e130: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
e140: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 _options(ctx, SS
e150: 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 L_OP_NO_COMPRESS
e160: 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65 ION);./* disable
e170: 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 65 compression eve
e180: 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 2a n if supported *
e190: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 /. SSL_CTX_se
e1a0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f t_options(ctx, o
e1b0: 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 ff);../* disable
e1c0: 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f protocol versio
e1d0: 6e 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 ns */. SSL_CT
e1e0: 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 X_sess_set_cache
e1f0: 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b _size(ctx, 128);
e200: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 .. /* Set use
e210: 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 r defined cipher
e220: 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73 s, cipher suites
e230: 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c , and security l
e240: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 evel */. if (
e250: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c (ciphers != NULL
e260: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 ) && !SSL_CTX_se
e270: 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 t_cipher_list(ct
e280: 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 x, ciphers)) {..
e290: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
e2a0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 (interp, "Set ci
e2b0: 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f phers failed: No
e2c0: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c valid ciphers",
e2d0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
e2e0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
e2f0: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c x);..return NULL
e300: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
e310: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21 3d (ciphersuites !=
e320: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 NULL) && !SSL_C
e330: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69 TX_set_ciphersui
e340: 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 73 tes(ctx, ciphers
e350: 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 uites)) {..Tcl_A
e360: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
e370: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 20 rp, "Set cipher
e380: 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e suites failed: N
e390: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 o valid ciphers"
e3a0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
e3b0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e3c0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
e3d0: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a L;. }.. /*
e3e0: 20 53 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 Set security le
e3f0: 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c vel */. if (l
e400: 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 evel > -1 && lev
e410: 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 el < 6) {../* SS
e420: 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c L_set_security_l
e430: 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 evel */..SSL_CTX
e440: 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _set_security_le
e450: 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b vel(ctx, level);
e460: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 . }.. /* s
e470: 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b et some callback
e480: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 s */. SSL_CTX
e490: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 _set_default_pas
e4a0: 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 swd_cb(ctx, Pass
e4b0: 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 wordCallback);.
e4c0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 SSL_CTX_set_d
e4d0: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 efault_passwd_cb
e4e0: 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 _userdata(ctx, (
e4f0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
e500: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 ;.. /* read a
e510: 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 Diffie-Hellman
e520: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c parameters file,
e530: 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 6c or use the buil
e540: 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 t-in one */.#ifd
e550: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 ef OPENSSL_NO_DH
e560: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d . if (DHparam
e570: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 s != NULL) {..Tc
e580: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e590: 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d nterp, "DH param
e5a0: 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 eter support not
e5b0: 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 available", (ch
e5c0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c ar *)NULL);..SSL
e5d0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
e5e0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
e5f0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a }.#else. {.
e600: 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 .DH* dh;..if (DH
e610: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 params != NULL)
e620: 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b {.. BIO *bio;
e630: 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f .. bio = BIO_
e640: 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 new_file(F2N(DHp
e650: 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 arams, &ds), "r"
e660: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f );.. if (!bio
e670: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
e680: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 gFree(&ds);...Tc
e690: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
e6a0: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f nterp, "Could no
e6b0: 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 t find DH parame
e6c0: 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 ters file", (cha
e6d0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c r *)NULL);...SSL
e6e0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
e6f0: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
e700: 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d }... dh =
e710: 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 PEM_read_bio_DH
e720: 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c params(bio, NULL
e730: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 , NULL, NULL);..
e740: 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f BIO_free(bio
e750: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 );.. Tcl_DStr
e760: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
e770: 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 if (!dh) {...
e780: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
e790: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 (interp, "Could
e7a0: 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 not read DH para
e7b0: 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 meters from file
e7c0: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ", (char *)NULL)
e7d0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
e7e0: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
e7f0: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 NULL;.. }..
e800: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d SSL_CTX_set_tm
e810: 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 p_dh(ctx, dh);..
e820: 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 29 3b DH_free(dh);
e830: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
e840: 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 /* Use well know
e850: 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 n DH parameters
e860: 74 68 61 74 20 68 61 76 65 20 62 75 69 6c 74 2d that have built-
e870: 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 4f 70 in support in Op
e880: 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66 enSSL */.. if
e890: 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 (!SSL_CTX_set_d
e8a0: 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 29 20 h_auto(ctx, 1))
e8b0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
e8c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f sult(interp, "Co
e8d0: 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73 uld not enable s
e8e0: 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c 20 47 et DH auto: ", G
e8f0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
e900: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
e910: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e920: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
e930: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 LL;.. }..}.
e940: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
e950: 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 /* set our certi
e960: 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f ficate */. lo
e970: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
e980: 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 0;. if (cert
e990: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
e9a0: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 .load_private_ke
e9b0: 79 20 3d 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c y = 1;...if (SSL
e9c0: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 _CTX_use_certifi
e9d0: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 cate_file(ctx, F
e9e0: 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 2N(certfile, &ds
e9f0: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ), SSL_FILETYPE_
ea00: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 PEM) <= 0) {..
ea10: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
ea20: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c e(&ds);.. Tcl
ea30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
ea40: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
ea50: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 set certificate
ea60: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c file ", certfil
ea70: 65 2c 20 22 3a 20 22 2c 0a 09 09 20 20 20 20 47 e, ": ",... G
ea80: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
ea90: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
eaa0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 . SSL_CTX_fre
eab0: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 e(ctx);.. ret
eac0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 urn NULL;..}..Tc
ead0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
eae0: 73 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 s);.. } else
eaf0: 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c if (cert != NULL
eb00: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 ) {..load_privat
eb10: 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 e_key = 1;..if (
eb20: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 SSL_CTX_use_cert
eb30: 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 ificate_ASN1(ctx
eb40: 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 , cert_len, cert
eb50: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 ) <= 0) {.. T
eb60: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
eb70: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
eb80: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 to set certifica
eb90: 74 65 3a 20 22 2c 0a 09 09 20 20 20 20 47 45 54 te: ",... GET
eba0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
ebb0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 char *)NULL);..
ebc0: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
ebd0: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ctx);.. retur
ebe0: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d n NULL;..}. }
ebf0: 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c else {..certfil
ec00: 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f e = (char*)X509_
ec10: 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 get_default_cert
ec20: 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 _file();...if (S
ec30: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 SL_CTX_use_certi
ec40: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c ficate_file(ctx,
ec50: 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 certfile, SSL_F
ec60: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 ILETYPE_PEM) <=
ec70: 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 0) {.#if 0..
ec80: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
ec90: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
eca0: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 to use default
ecb0: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 certificate file
ecc0: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a ", certfile, ":
ecd0: 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 ",... GET_ER
ece0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
ecf0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
ed00: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
ed10: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
ed20: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 ULL;.#endif..}.
ed30: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 }.. /* set
ed40: 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 our private key
ed50: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 */. if (load
ed60: 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a _private_key) {.
ed70: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 .if (keyfile ==
ed80: 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e NULL && key == N
ed90: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 ULL) {.. keyf
eda0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a ile = certfile;.
edb0: 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 .}...if (keyfile
edc0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
edd0: 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 /* get the priv
ede0: 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 ate key associat
edf0: 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 ed with this cer
ee00: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 tificate */..
ee10: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 if (keyfile ==
ee20: 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c NULL) {...keyfil
ee30: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 e = certfile;..
ee40: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 }... if (S
ee50: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 SL_CTX_use_Priva
ee60: 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 teKey_file(ctx,
ee70: 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 F2N(keyfile, &ds
ee80: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ), SSL_FILETYPE_
ee90: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 PEM) <= 0) {...T
eea0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
eeb0: 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 ds);.../* flush
eec0: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 the passphrase w
eed0: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 hich might be le
eee0: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 ft in the result
eef0: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 */...Tcl_SetRes
ef00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c ult(interp, NULL
ef10: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 , TCL_STATIC);..
ef20: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
ef30: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
ef40: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 e to set public
ef50: 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 key file ", keyf
ef60: 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 47 45 54 ile, " ",....GET
ef70: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
ef80: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 char *)NULL);...
ef90: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
efa0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
efb0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
efc0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
efd0: 73 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 s);..} else if (
efe0: 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 key != NULL) {..
eff0: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f if (SSL_CTX_
f000: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 use_PrivateKey_A
f010: 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 SN1(EVP_PKEY_RSA
f020: 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c , ctx, key,key_l
f030: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a en) <= 0) {.../*
f040: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
f050: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
f060: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
f070: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
f080: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
f090: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
f0a0: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
f0b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
f0c0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
f0d0: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 public key: ", G
f0e0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
f0f0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
f100: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
f110: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
f120: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f LL;.. }..}../
f130: 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 * Now we know th
f140: 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 at a key and cer
f150: 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 t have been set
f160: 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 against.. * the
f170: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 SSL context */..
f180: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 if (!SSL_CTX_che
f190: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 ck_private_key(c
f1a0: 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f tx)) {.. Tcl_
f1b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f1c0: 65 72 70 2c 0a 09 09 20 20 20 20 22 70 72 69 76 erp,... "priv
f1d0: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 ate key does not
f1e0: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 match the certi
f1f0: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 ficate public ke
f200: 79 22 2c 0a 09 09 20 20 20 20 28 63 68 61 72 20 y",... (char
f210: 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 *)NULL);.. SS
f220: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
f230: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
f240: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 L;..}. }..
f250: 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20 64 /* Set to use d
f260: 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 efault location
f270: 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65 72 and file for Cer
f280: 74 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 tificate Authori
f290: 74 79 20 28 43 41 29 20 63 65 72 74 69 66 69 63 ty (CA) certific
f2a0: 61 74 65 73 2e 20 54 68 65 0a 20 20 20 20 20 2a ates. The. *
f2b0: 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 verify path and
f2c0: 20 73 74 6f 72 65 20 63 61 6e 20 62 65 20 6f 76 store can be ov
f2d0: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 erridden by the
f2e0: 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 SSL_CERT_DIR env
f2f0: 20 76 61 72 2e 20 54 68 65 20 76 65 72 69 66 79 var. The verify
f300: 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 20 20 2a file can. *
f310: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 be overridden b
f320: 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 y the SSL_CERT_F
f330: 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a ILE env var. */.
f340: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 if (!SSL_CTX
f350: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 _set_default_ver
f360: 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 ify_paths(ctx))
f370: 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 {..abort++;.
f380: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 }.. /* Overri
f390: 64 65 73 20 66 6f 72 20 74 68 65 20 43 41 20 76 des for the CA v
f3a0: 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 66 erify path and f
f3b0: 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 ile */. {.#if
f3c0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
f3d0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
f3e0: 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61 74 0000L..if (CApat
f3f0: 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 h != NULL || CAf
f400: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile != NULL) {..
f410: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
f420: 64 73 31 3b 0a 09 20 20 20 20 69 66 20 28 21 53 ds1;.. if (!S
f430: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 SL_CTX_load_veri
f440: 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 fy_locations(ctx
f450: 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 , F2N(CAfile, &d
f460: 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 s), F2N(CApath,
f470: 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 &ds1))) {...abor
f480: 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 t++;.. }..
f490: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
f4a0: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
f4b0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 DStringFree(&ds1
f4c0: 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 );... /* Set
f4d0: 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 list of CAs to s
f4e0: 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 end to client wh
f4f0: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 en requesting a
f500: 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 client certifica
f510: 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 te */.. /* ht
f520: 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 tps://sourceforg
f530: 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 e.net/p/tls/bugs
f540: 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 /57/ */.. /*
f550: 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 XXX:TODO: Let th
f560: 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 e user supply va
f570: 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 lues here instea
f580: 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 d of something t
f590: 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 hat exists on th
f5a0: 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a e filesystem */.
f5b0: 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 . STACK_OF(X5
f5c0: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 09_NAME) *certNa
f5d0: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 mes = SSL_load_c
f5e0: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 lient_CA_file(F2
f5f0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b N(CAfile, &ds));
f600: 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 .. if (certNa
f610: 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 mes != NULL) {..
f620: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 .SSL_CTX_set_cli
f630: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c ent_CA_list(ctx,
f640: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 certNames);..
f650: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
f660: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
f670: 7d 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 41 }..#else..if (CA
f680: 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a path != NULL) {.
f690: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
f6a0: 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 X_load_verify_di
f6b0: 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 r(ctx, F2N(CApat
f6c0: 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 h, &ds))) {...ab
f6d0: 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 ort++;.. }..
f6e0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
f6f0: 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 ee(&ds);..}..if
f700: 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 (CAfile != NULL)
f710: 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c {.. if (!SSL
f720: 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 _CTX_load_verify
f730: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 _file(ctx, F2N(C
f740: 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a Afile, &ds))) {.
f750: 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 ..abort++;..
f760: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
f770: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 ngFree(&ds);...
f780: 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f /* Set list o
f790: 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f f CAs to send to
f7a0: 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 client when req
f7b0: 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 uesting a client
f7c0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
f7d0: 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 . STACK_OF(X5
f7e0: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 09_NAME) *certNa
f7f0: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 mes = SSL_load_c
f800: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 lient_CA_file(F2
f810: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b N(CAfile, &ds));
f820: 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 .. if (certNa
f830: 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 mes != NULL) {..
f840: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 .SSL_CTX_set_cli
f850: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c ent_CA_list(ctx,
f860: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 certNames);..
f870: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
f880: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
f890: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a }.#endif. }..
f8a0: 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a return ctx;.
f8b0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
f8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
f900: 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 * StatusObjCmd
f910: 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 -- return certif
f920: 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 icate for connec
f930: 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 ted peer.. *. *
f940: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
f950: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
f960: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
f970: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
f980: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
f990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f9c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
f9d0: 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 tic int.StatusOb
f9e0: 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e jCmd(. TCL_UN
f9f0: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 USED(void *),.
fa00: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
fa10: 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 terp,. int ob
fa20: 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 jc,. Tcl_Obj.
fa30: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b *const objv[]).{
fa40: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
fa50: 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a ePtr;. X509 *
fa60: 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 peer;. Tcl_Ob
fa70: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 j *objPtr;. T
fa80: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
fa90: 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e . char *chann
faa0: 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 elName, *ciphers
fab0: 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a ;. int mode;.
fac0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
fad0: 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a ed char *proto;.
fae0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
faf0: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 len;. int ni
fb00: 64 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 d, res;.. dpr
fb10: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
fb20: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
fb30: 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 2 || objc > 3 ||
fb40: 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 (objc == 3 && !
fb50: 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 strcmp(Tcl_GetSt
fb60: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 ring(objv[1]), "
fb70: 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 -local"))) {..Tc
fb80: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
fb90: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
fba0: 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 "?-local? channe
fbb0: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
fbc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
fbd0: 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d channelName =
fbe0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
fbf0: 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f bjv[(objc == 2 ?
fc00: 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 1 : 2)]);. c
fc10: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 han = Tcl_GetCha
fc20: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 nnel(interp, cha
fc30: 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 nnelName, &mode)
fc40: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
fc50: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
fc60: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
fc70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
fc80: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d . /*. * M
fc90: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
fca0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
fcb0: 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 st channel.
fcc0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
fcd0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
fce0: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
fcf0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
fd00: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
fd10: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
fd20: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
fd30: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
fd40: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
fd50: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
fd60: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 han),..."\": not
fd70: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
fd80: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
fd90: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
fda0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
fdb0: 20 22 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e "STATUS", "CHAN
fdc0: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
fdd0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a (char *)NULL);.
fde0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
fdf0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 R;. }. sta
fe00: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
fe10: 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c ) Tcl_GetChannel
fe20: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
fe30: 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 n);.. /* Get
fe40: 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 certificate for
fe50: 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a peer or self */.
fe60: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
fe70: 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 2) {..peer = SSL
fe80: 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 _get_peer_certif
fe90: 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e icate(statePtr->
fea0: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ssl);. } else
feb0: 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 {..peer = SSL_g
fec0: 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 et_certificate(s
fed0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
fee0: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 }. /* Get
fef0: 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 X509 certificate
ff00: 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 info */. if
ff10: 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 (peer) {..objPtr
ff20: 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 = Tls_NewX509Ob
ff30: 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b j(interp, peer);
ff40: 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 ..if (objc == 2)
ff50: 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65 {.. X509_fre
ff60: 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65 e(peer);.. pe
ff70: 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 er = NULL;..}.
ff80: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 } else {..objP
ff90: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
ffa0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 Obj(0, NULL);.
ffb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 }.. /* Peer
ffc0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 name */. LAP
ffd0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
ffe0: 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 objPtr, "peerna
fff0: 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 me", SSL_get0_pe
10000 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d ername(statePtr-
10010 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 >ssl), -1);.
10020 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
10030 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 rp, objPtr, "sbi
10040 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 ts", SSL_get_cip
10050 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74 her_bits(statePt
10060 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a r->ssl, NULL));.
10070 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 . ciphers = (
10080 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 char*)SSL_get_ci
10090 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 pher(statePtr->s
100a0 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 sl);. LAPPEND
100b0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
100c0 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 63 Ptr, "cipher", c
100d0 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 iphers, -1);..
100e0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 /* Verify the
100f0 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 X509 certificate
10100 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 presented by th
10110 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 e peer */. LA
10120 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
10130 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 , objPtr, "verif
10140 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f yResult",..X509_
10150 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f verify_cert_erro
10160 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 r_string(SSL_get
10170 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 _verify_result(s
10180 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 tatePtr->ssl)),
10190 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 -1);.. /* Ver
101a0 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 ify mode */.
101b0 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 mode = SSL_get_v
101c0 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 erify_mode(state
101d0 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 Ptr->ssl);. i
101e0 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 f (mode && SSL_V
101f0 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c ERIFY_NONE) {..L
10200 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10210 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 p, objPtr, "veri
10220 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c fyMode", "none",
10230 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 -1);. } else
10240 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 {..Tcl_Obj *lis
10250 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 tObjPtr = Tcl_Ne
10260 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
10270 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 );..if (mode &&
10280 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29 SSL_VERIFY_PEER)
10290 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
102a0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
102b0 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a (interp, listObj
102c0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
102d0 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 ngObj("peer", -1
102e0 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 ));..}..if (mode
102f0 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 && SSL_VERIFY_F
10300 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 AIL_IF_NO_PEER_C
10310 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ERT) {.. Tcl_
10320 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10330 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
10340 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
10350 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 StringObj("fail
10360 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22 if no peer cert"
10370 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
10380 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
10390 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 FY_CLIENT_ONCE)
103a0 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f {.. Tcl_ListO
103b0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
103c0 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 interp, listObjP
103d0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
103e0 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 gObj("client onc
103f0 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 e", -1));..}..if
10400 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 (mode && SSL_VE
10410 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 RIFY_POST_HANDSH
10420 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f AKE) {.. Tcl_
10430 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10440 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
10450 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
10460 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 StringObj("post
10470 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 handshake", -1))
10480 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 ;..}..LAPPEND_OB
10490 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 J(interp, objPtr
104a0 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 , "verifyMode",
104b0 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 listObjPtr).
104c0 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 }.. /* Verify
104d0 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 mode depth */.
104e0 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 LAPPEND_INT(i
104f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10500 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 53 53 verifyDepth", SS
10510 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70 L_get_verify_dep
10520 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c th(statePtr->ssl
10530 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f ));.. /* Repo
10540 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 rt the selected
10550 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 protocol as a re
10560 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f sult of the nego
10570 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 tiation */. S
10580 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c SL_get0_alpn_sel
10590 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e ected(statePtr->
105a0 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 ssl, &proto, &le
105b0 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f n);. LAPPEND_
105c0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
105d0 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 tr, "alpn", (cha
105e0 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f r *)proto, (Tcl_
105f0 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 Size) len);.
10600 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
10610 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f rp, objPtr, "pro
10620 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f tocol", SSL_get_
10630 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 version(statePtr
10640 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 ->ssl), -1);..
10650 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e /* Valid for n
10660 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 on-RSA signature
10670 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a and TLS 1.3 */.
10680 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
10690 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 2) {..res = SSL_
106a0 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 get_peer_signatu
106b0 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d re_nid(statePtr-
106c0 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 >ssl, &nid);.
106d0 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
106e0 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 SSL_get_signatu
106f0 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d re_nid(statePtr-
10700 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 >ssl, &nid);.
10710 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 }. if (!res)
10720 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 {nid = 0;}.
10730 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
10740 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 rp, objPtr, "sig
10750 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 natureHashAlgori
10760 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e thm", OBJ_nid2ln
10770 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 (nid), -1);..
10780 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
10790 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
107a0 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f _peer_signature_
107b0 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 type_nid(statePt
107c0 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 r->ssl, &nid);.
107d0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 } else {..res
107e0 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 = SSL_get_signa
107f0 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 ture_type_nid(st
10800 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 atePtr->ssl, &ni
10810 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 d);. }. if
10820 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 (!res) {nid = 0
10830 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 ;}. LAPPEND_S
10840 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10850 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 70 r, "signatureTyp
10860 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e e", OBJ_nid2ln(n
10870 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 id), -1);.. T
10880 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
10890 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
108a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
108b0 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
108c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
108d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
108e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
108f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10900 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f . *. * Connectio
10910 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 nInfoObjCmd -- r
10920 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e eturn connection
10930 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 info from OpenS
10940 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 SL.. *. * Result
10950 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 s:. *.A list of
10960 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a connection info.
10970 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *----------
10980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
109a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
109b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
109c0 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 tatic int Connec
109d0 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 0a tionInfoObjCmd(.
109e0 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 TCL_UNUSED(v
109f0 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f oid *),. Tcl_
10a00 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a Interp *interp,.
10a10 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 int objc,.
10a20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 Tcl_Obj *const
10a30 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 objv[]).{. T
10a40 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
10a50 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c ../* The channel
10a60 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
10a70 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a n */. State *
10a80 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c statePtr;../* cl
10a90 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 ient state for s
10aa0 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 sl socket */.
10ab0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
10ac0 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 , *listPtr;.
10ad0 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a const SSL *ssl;.
10ae0 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 const SSL_CI
10af0 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 PHER *cipher;.
10b00 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 const SSL_SESS
10b10 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 ION *session;.
10b20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a const EVP_MD *
10b30 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a md;.. if (obj
10b40 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
10b50 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
10b60 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
10b70 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
10b80 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 (TCL_ERROR);.
10b90 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
10ba0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
10bb0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
10bc0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 ing(objv[1]), NU
10bd0 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
10be0 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
10bf0 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
10c00 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
10c10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b }.. /* Mak
10c20 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
10c30 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
10c40 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
10c50 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f chan = Tcl_GetTo
10c60 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a pChannel(chan);.
10c70 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
10c80 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
10c90 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
10ca0 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
10cb0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
10cc0 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
10cd0 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
10ce0 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
10cf0 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 "\": not a T
10d00 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
10d10 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f L);..Tcl_SetErro
10d20 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
10d30 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e LS", "CONNECTION
10d40 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
10d50 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
10d60 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 )NULL);..return(
10d70 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
10d80 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 }.. objPtr =
10d90 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 Tcl_NewListObj(0
10da0 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a , NULL);.. /*
10db0 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f Connection info
10dc0 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
10dd0 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f = (State *)Tcl_
10de0 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
10df0 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 ceData(chan);.
10e00 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72 ssl = statePtr
10e10 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 ->ssl;. if (s
10e20 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f sl != NULL) {../
10e30 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 * connection sta
10e40 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 te */..LAPPEND_S
10e50 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10e60 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 4c 5f r, "state", SSL_
10e70 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e state_string_lon
10e80 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f g(ssl), -1);.../
10e90 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 73 * Get SNI reques
10ea0 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 ted server 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 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 "servername", SS
10ee0 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 L_get_servername
10ef0 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d (ssl, TLSEXT_NAM
10f00 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 ETYPE_host_name)
10f10 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
10f20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 protocol */..LAP
10f30 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10f40 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
10f50 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 ol", SSL_get_ver
10f60 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a sion(ssl), -1);.
10f70 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 ../* Renegotiati
10f80 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c on allowed */..L
10f90 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
10fa0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e rp, objPtr, "ren
10fb0 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 egotiation_allow
10fc0 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 ed", SSL_get_sec
10fd0 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f ure_renegotiatio
10fe0 6e 5f 73 75 70 70 6f 72 74 28 28 53 53 4c 20 2a n_support((SSL *
10ff0 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 ) ssl));.../* Ge
11000 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c t security level
11010 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
11020 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11030 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c "security_level
11040 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 ", SSL_get_secur
11050 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b ity_level(ssl));
11060 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e .../* Session in
11070 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 fo */..LAPPEND_B
11080 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
11090 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 tr, "session_reu
110a0 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f sed", SSL_sessio
110b0 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a n_reused(ssl));.
110c0 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 ../* Is server i
110d0 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f nfo */..LAPPEND_
110e0 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
110f0 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22 Ptr, "is_server"
11100 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 , SSL_is_server(
11110 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 ssl));.../* Is D
11120 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f TLS */..LAPPEND_
11130 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
11140 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 Ptr, "is_dtls",
11150 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 SSL_is_dtls(ssl)
11160 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
11170 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a Cipher info */.
11180 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c cipher = SSL
11190 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 _get_current_cip
111a0 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 her(ssl);. if
111b0 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c (cipher != NULL
111c0 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 ) {..char buf[BU
111d0 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e FSIZ] = {0};..in
111e0 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 t bits, alg_bits
111f0 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 ;.../* Cipher na
11200 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 me */..LAPPEND_S
11210 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11220 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 4c r, "cipher", SSL
11230 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 _CIPHER_get_name
11240 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
11250 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 ./* RFC name of
11260 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 cipher */..LAPPE
11270 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
11280 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 64 bjPtr, "standard
11290 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 _name", SSL_CIPH
112a0 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
112b0 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
112c0 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 ./* OpenSSL name
112d0 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c of cipher */..L
112e0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
112f0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e p, objPtr, "open
11300 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 ssl_name", OPENS
11310 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 SL_cipher_name(S
11320 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 SL_CIPHER_standa
11330 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 29 rd_name(cipher))
11340 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 , -1);.../* numb
11350 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 74 er of secret bit
11360 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 65 s used for ciphe
11370 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c r */..bits = SSL
11380 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 _CIPHER_get_bits
11390 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 (cipher, &alg_bi
113a0 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e ts);..LAPPEND_IN
113b0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
113c0 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c , "secret_bits",
113d0 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 bits);..LAPPEND
113e0 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
113f0 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f Ptr, "algorithm_
11400 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 bits", alg_bits)
11410 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 ;../* alg_bits i
11420 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 s actual key sec
11430 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 ret bits. If use
11440 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 bits and secret
11450 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 (algorithm) bit
11460 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68 s differ,.. th
11470 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 e rest of the bi
11480 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e ts are fixed, i.
11490 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 e. for limited e
114a0 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 xport ciphers (b
114b0 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f its < 56) */.../
114c0 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 63 * Indicates whic
114d0 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 h SSL/TLS protoc
114e0 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 74 ol version first
114f0 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 70 defined the cip
11500 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
11510 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11520 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e tr, "min_version
11530 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ", SSL_CIPHER_ge
11540 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 t_version(cipher
11550 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 ), -1);.../* Cip
11560 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 her NID */..LAPP
11570 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11580 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e objPtr, "cipherN
11590 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
115a0 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
115b0 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 ER_get_cipher_ni
115c0 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b d(cipher)), -1);
115d0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
115e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 terp, objPtr, "d
115f0 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72 igestNID", (char
11600 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 *)OBJ_nid2ln(SS
11610 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67 L_CIPHER_get_dig
11620 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29 est_nid(cipher))
11630 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
11640 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
11650 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65 tr, "keyExchange
11660 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 NID", (char *)OB
11670 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 J_nid2ln(SSL_CIP
11680 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 HER_get_kx_nid(c
11690 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c ipher)), -1);..L
116a0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
116b0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 p, objPtr, "auth
116c0 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 enticationNID",
116d0 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 (char *)OBJ_nid2
116e0 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ln(SSL_CIPHER_ge
116f0 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65 t_auth_nid(ciphe
11700 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d r)), -1);.../* m
11710 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 essage authentic
11720 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 ation code - Cip
11730 68 65 72 20 69 73 20 41 45 41 44 20 28 65 2e 67 her is AEAD (e.g
11740 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32 . GCM or ChaCha2
11750 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 0/Poly1305) or n
11760 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e ot */../* Authen
11770 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 69 ticated Encrypti
11780 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 on with associat
11790 65 64 20 64 61 74 61 20 28 41 45 41 44 29 20 63 ed data (AEAD) c
117a0 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 heck */..LAPPEND
117b0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
117c0 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73 jPtr, "cipher_is
117d0 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 _aead", SSL_CIPH
117e0 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65 ER_is_aead(ciphe
117f0 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74 r));.../* Digest
11800 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 65 used during the
11810 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 SSL/TLS handsha
11820 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 ke when using th
11830 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 e cipher. */..md
11840 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 = SSL_CIPHER_ge
11850 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 t_handshake_dige
11860 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 st(cipher);..LAP
11870 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
11880 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 objPtr, "handsh
11890 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 68 ake_digest", (ch
118a0 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 ar *)EVP_MD_name
118b0 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 (md), -1);.../*
118c0 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 Get OpenSSL-spec
118d0 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e ific ID, not IAN
118e0 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 A ID */..LAPPEND
118f0 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
11900 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 22 Ptr, "cipher_id"
11910 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 , (int) SSL_CIPH
11920 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 ER_get_id(cipher
11930 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 ));.../* Two-byt
11940 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 65 e ID used in the
11950 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 TLS protocol of
11960 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 65 the given ciphe
11970 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e r */..LAPPEND_IN
11980 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
11990 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c , "protocol_id",
119a0 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 (int) SSL_CIPHE
119b0 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 R_get_protocol_i
119c0 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a d(cipher));.../*
119d0 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 Textual descrip
119e0 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 tion of the ciph
119f0 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 er */..if (SSL_C
11a00 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f IPHER_descriptio
11a10 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 n(cipher, buf, s
11a20 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e izeof(buf)) != N
11a30 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 ULL) {.. LAPP
11a40 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
11a50 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70 objPtr, "descrip
11a60 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b tion", buf, -1);
11a70 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
11a80 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a * Session info *
11a90 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 /. session =
11aa0 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_get_session(
11ab0 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 ssl);. if (se
11ac0 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b ssion != NULL) {
11ad0 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
11ae0 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 char *ticket;..
11af0 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e size_t len2;..un
11b00 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
11b10 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
11b20 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
11b30 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 d, *proto;..unsi
11b40 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65 72 gned char buffer
11b50 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f [SSL_MAX_MASTER_
11b60 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f KEY_LENGTH];.../
11b70 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c * Report the sel
11b80 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
11b90 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 s a result of th
11ba0 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 e ALPN negotiati
11bb0 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 on */..SSL_SESSI
11bc0 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c ON_get0_alpn_sel
11bd0 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 ected(session, &
11be0 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 proto, &len2);..
11bf0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11c00 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 rp, objPtr, "alp
11c10 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f n", (char *) pro
11c20 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c to, (Tcl_Size) l
11c30 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 en2);.../* Repor
11c40 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 t the selected p
11c50 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 rotocol as a res
11c60 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e ult of the NPN n
11c70 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 egotiation */.#i
11c80 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 fdef USE_NPN..SS
11c90 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 L_get0_next_prot
11ca0 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c o_negotiated(ssl
11cb0 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 , &proto, &ulen)
11cc0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
11cd0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
11ce0 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 npn", (char *) p
11cf0 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 roto, (Tcl_Size)
11d00 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a ulen);.#endif..
11d10 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 ./* Resumable se
11d20 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e ssion */..LAPPEN
11d30 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
11d40 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 6c bjPtr, "resumabl
11d50 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f e", SSL_SESSION_
11d60 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 is_resumable(ses
11d70 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 sion));.../* Ses
11d80 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20 sion start time
11d90 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 (seconds since e
11da0 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e poch) */..LAPPEN
11db0 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f D_LONG(interp, o
11dc0 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 69 bjPtr, "start_ti
11dd0 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e me", SSL_SESSION
11de0 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f _get_time(sessio
11df0 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 n));.../* Timeou
11e00 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 t value - SSL_CT
11e10 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 X_get_timeout (i
11e20 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c n seconds) */..L
11e30 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 APPEND_LONG(inte
11e40 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d rp, objPtr, "tim
11e50 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 eout", SSL_SESSI
11e60 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 ON_get_timeout(s
11e70 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 ession));.../* S
11e80 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 ession id - TLSv
11e90 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 1.2 and below on
11ea0 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 ly */..session_i
11eb0 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f d = SSL_SESSION_
11ec0 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 get_id(session,
11ed0 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 &ulen);..LAPPEND
11ee0 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
11ef0 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
11f00 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 _id", session_id
11f10 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
11f20 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e n);.../* Session
11f30 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 context */..ses
11f40 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 sion_id = SSL_SE
11f50 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f SSION_get0_id_co
11f60 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 ntext(session, &
11f70 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f ulen);..LAPPEND_
11f80 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f BARRAY(interp, o
11f90 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f bjPtr, "session_
11fa0 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 6f context", sessio
11fb0 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 n_id, (Tcl_Size)
11fc0 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 ulen);.../* Ses
11fd0 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c sion ticket - cl
11fe0 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 ient only */..SS
11ff0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 L_SESSION_get0_t
12000 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 icket(session, &
12010 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a ticket, &len2);.
12020 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
12030 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12040 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 "session_ticket"
12050 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 , ticket, (Tcl_S
12060 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a ize) len2);.../*
12070 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 Session ticket
12080 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69 lifetime hint (i
12090 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c n seconds) */..L
120a0 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 APPEND_LONG(inte
120b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 rp, objPtr, "lif
120c0 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 etime", SSL_SESS
120d0 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c ION_get_ticket_l
120e0 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 ifetime_hint(ses
120f0 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 sion));.../* Tic
12100 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a ket app data */.
12110 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
12120 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
12130 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f 53 45 0000000L..SSL_SE
12140 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 SSION_get0_ticke
12150 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c 5f 53 t_appdata((SSL_S
12160 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 69 6f ESSION *) sessio
12170 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e n, &ticket, &len
12180 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 2);..LAPPEND_BAR
12190 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 RAY(interp, objP
121a0 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f tr, "ticket_app_
121b0 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 data", ticket, (
121c0 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b Tcl_Size) len2);
121d0 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 74 .#endif.../* Get
121e0 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 master key */..
121f0 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 len2 = SSL_SESSI
12200 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 ON_get_master_ke
12210 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 y(session, buffe
12220 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 r, SSL_MAX_MASTE
12230 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 R_KEY_LENGTH);..
12240 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
12250 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12260 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 master_key", buf
12270 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 fer, (Tcl_Size)
12280 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 len2);.../* Comp
12290 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 ression id */..u
122a0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 3d nsigned int id =
122b0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
122c0 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 73 _compress_id(ses
122d0 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f sion);..LAPPEND_
122e0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
122f0 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e tr, "compression
12300 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 _id", id == 1 ?
12310 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c "zlib" : "none",
12320 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 -1);. }..
12330 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 /* Compression
12340 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 info */. if (
12350 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 ssl != NULL) {.#
12360 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 ifdef HAVE_SSL_C
12370 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 OMPRESSION..cons
12380 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 t COMP_METHOD *c
12390 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d omp, *expn;..com
123a0 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 p = SSL_get_curr
123b0 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 ent_compression(
123c0 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 ssl);..expn = SS
123d0 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 L_get_current_ex
123e0 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 pansion(ssl);...
123f0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
12400 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d rp, objPtr, "com
12410 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 pression", comp
12420 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e ? SSL_COMP_get_n
12430 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e ame(comp) : "non
12440 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e e", -1);..LAPPEN
12450 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
12460 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e jPtr, "expansion
12470 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f ", expn ? SSL_CO
12480 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e MP_get_name(expn
12490 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b ) : "none", -1);
124a0 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f .#else..LAPPEND_
124b0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
124c0 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e tr, "compression
124d0 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a ", "none", -1);.
124e0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
124f0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 erp, objPtr, "ex
12500 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 pansion", "none"
12510 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 , -1);.#endif.
12520 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 }.. /* Serv
12530 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b er info */. {
12540 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 ..long mode = SS
12550 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f L_CTX_get_sessio
12560 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 n_cache_mode(sta
12570 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 tePtr->ctx);..ch
12580 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d ar *msg;...if (m
12590 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 ode & SSL_SESS_C
125a0 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 ACHE_OFF) {..
125b0 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d msg = "off";..}
125c0 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 else if (mode &
125d0 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
125e0 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d CLIENT) {.. m
125f0 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 sg = "client";..
12600 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 } else if (mode
12610 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
12620 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 _SERVER) {..
12630 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a msg = "server";.
12640 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 .} else if (mode
12650 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
12660 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d E_BOTH) {.. m
12670 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 sg = "both";..}
12680 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 else {.. msg
12690 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a = "unknown";..}.
126a0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
126b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
126c0 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 ssion_cache_mode
126d0 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 ", msg, -1);.
126e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 }.. /* CA Li
126f0 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 st */. /* IF
12700 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 61 not a server, sa
12710 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 me as SSL_get0_p
12720 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 eer_CA_list. If
12730 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 53 server same as S
12740 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e SL_CTX_get_clien
12750 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 t_CA_list */.
12760 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e listPtr = Tcl_N
12770 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
12780 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 L);. STACK_OF
12790 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f (X509_NAME) *ca_
127a0 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63 list;. if ((c
127b0 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 a_list = SSL_get
127c0 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 _client_CA_list(
127d0 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b ssl)) != NULL) {
127e0 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 55 ..char buffer[BU
127f0 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 FSIZ];..for (int
12800 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 i = 0; i < sk_X
12810 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 509_NAME_num(ca_
12820 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 list); i++) {..
12830 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 X509_NAME *na
12840 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d me = sk_X509_NAM
12850 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c E_value(ca_list,
12860 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 i);.. if (na
12870 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d me) {...X509_NAM
12880 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 E_oneline(name,
12890 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b buffer, BUFSIZ);
128a0 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
128b0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
128c0 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c rp, listPtr, Tcl
128d0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 _NewStringObj(bu
128e0 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 ffer, -1));..
128f0 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 }..}. }.
12900 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 LAPPEND_OBJ(inte
12910 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c rp, objPtr, "caL
12920 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a ist", listPtr);.
12930 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 LAPPEND_INT(
12940 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12950 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 "caListCount", s
12960 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 k_X509_NAME_num(
12970 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20 ca_list));..
12980 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
12990 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
129a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
129b0 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
129c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a00 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f -. *. * VersionO
12a10 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 bjCmd -- return
12a20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 version string f
12a30 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a rom OpenSSL.. *.
12a40 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
12a50 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
12a60 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
12a70 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
12a80 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
12a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
12ad0 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 static int.Versi
12ae0 6f 6e 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 onObjCmd(. TC
12af0 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 L_UNUSED(void *)
12b00 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ,. Tcl_Interp
12b10 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 54 43 *interp,. TC
12b20 4c 5f 55 4e 55 53 45 44 28 69 6e 74 29 20 2f 2a L_UNUSED(int) /*
12b30 20 6f 62 6a 63 20 2a 2f 2c 0a 20 20 20 20 54 43 objc */,. TC
12b40 4c 5f 55 4e 55 53 45 44 28 54 63 6c 5f 4f 62 6a L_UNUSED(Tcl_Obj
12b50 20 2a 63 6f 6e 73 74 20 2a 29 20 2f 2a 20 6f 62 *const *) /* ob
12b60 6a 76 20 2a 2f 29 0a 7b 0a 20 20 20 20 54 63 6c jv */).{. Tcl
12b70 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 _Obj *objPtr;..
12b80 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
12b90 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 ed");.. objPt
12ba0 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e r = Tcl_NewStrin
12bb0 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 gObj(OPENSSL_VER
12bc0 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a SION_TEXT, -1);.
12bd0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
12be0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 esult(interp, ob
12bf0 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
12c00 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
12c10 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
12c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c50 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 ------. *. * Mis
12c60 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 cObjCmd -- misc
12c70 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 commands. *. * R
12c80 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
12c90 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
12ca0 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
12cb0 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
12cc0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
12cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d00 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
12d10 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d ic int.MiscObjCm
12d20 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 d(. TCL_UNUSE
12d30 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 D(void *),. T
12d40 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
12d50 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c p,. int objc,
12d60 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f . Tcl_Obj.*co
12d70 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 nst objv[]).{.
12d80 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 static const c
12d90 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d har *commands []
12da0 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 = { "req", "str
12db0 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 req", NULL };.
12dc0 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b enum command {
12dd0 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 C_REQ, C_STRREQ
12de0 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 , C_DUMMY };.
12df0 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 Tcl_Size cmd;.
12e00 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 int isStr;.
12e10 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 char buffer[16
12e20 33 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 384];.. dprin
12e30 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
12e40 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 if (objc < 2)
12e50 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
12e60 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
12e70 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e objv, "subcomman
12e80 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 d ?args?");..ret
12e90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
12ea0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c }. if (Tcl
12eb0 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a _GetIndexFromObj
12ec0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d (interp, objv[1]
12ed0 2c 20 63 6f 6d 6d 61 6e 64 73 2c 0a 09 20 20 20 , commands,..
12ee0 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63 "command", 0,&c
12ef0 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b md) != TCL_OK) {
12f00 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
12f10 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 OR;. }.. E
12f20 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
12f30 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 ;.. isStr = (
12f40 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 cmd == C_STRREQ)
12f50 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 ;. switch ((e
12f60 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 num command) cmd
12f70 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a ) {..case C_REQ:
12f80 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a ..case C_STRREQ:
12f90 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 {.. EVP_PKEY
12fa0 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 *pkey=NULL;..
12fb0 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c X509 *cert=NUL
12fc0 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d L;.. X509_NAM
12fd0 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 E *name=NULL;..
12fe0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 Tcl_Obj **lis
12ff0 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a tv;.. Tcl_Siz
13000 65 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 e listc,i;...
13010 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a BIO *out=NULL;.
13020 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 .. const char
13030 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 *k_C="",*k_ST="
13040 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 ",*k_L="",*k_O="
13050 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e ",*k_OU="",*k_CN
13060 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b ="",*k_Email="";
13070 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f .. char *keyo
13080 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b ut,*pemout,*str;
13090 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a .. int keysiz
130a0 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d e,serial=0,days=
130b0 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 365;..#if OPENSS
130c0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
130d0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
130e0 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 BIGNUM *bne
130f0 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 = NULL;.. RSA
13100 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 *rsa = NULL;.#e
13110 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 lse.. EVP_PKE
13120 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c Y_CTX *ctx = NUL
13130 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 L;.#endif...
13140 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 if ((objc<5) ||
13150 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 (objc>6)) {...Tc
13160 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
13170 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 nterp, 2, objv,
13180 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 "keysize keyfile
13190 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f certfile ?info?
131a0 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c ");...return TCL
131b0 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a _ERROR;.. }..
131c0 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
131d0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 IntFromObj(inter
131e0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 p, objv[2], &key
131f0 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 size) != TCL_OK)
13200 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f {...return TCL_
13210 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 ERROR;.. }..
13220 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 keyout=Tcl_Ge
13230 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 tString(objv[3])
13240 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 ;.. pemout=Tc
13250 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
13260 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 [4]);.. if (i
13270 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 sStr) {...Tcl_Se
13280 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f tVar(interp,keyo
13290 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f ut,"",0);...Tcl_
132a0 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 SetVar(interp,pe
132b0 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 mout,"",0);..
132c0 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a }... if (obj
132d0 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 c>=6) {...if (Tc
132e0 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d l_ListObjGetElem
132f0 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a ents(interp, obj
13300 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 26 6c v[5], &listc, &l
13310 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 istv) != TCL_OK)
13320 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 {... return
13330 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
13340 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 ..if ((listc%2)
13350 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 != 0) {... Tc
13360 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
13370 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 rp,"Information
13380 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 list must have e
13390 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 ven number of ar
133a0 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a guments",NULL);.
133b0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
133c0 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f _ERROR;...}...fo
133d0 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b r (i=0; i<listc;
133e0 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 i+=2) {... s
133f0 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 tr=Tcl_GetString
13400 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 (listv[i]);...
13410 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 if (strcmp(str
13420 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 ,"days")==0) {..
13430 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 ..if (Tcl_GetInt
13440 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c FromObj(interp,l
13450 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 istv[i+1],&days)
13460 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 !=TCL_OK)....
13470 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
13480 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 R;... } else
13490 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
134a0 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 serial")==0) {..
134b0 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 ..if (Tcl_GetInt
134c0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c FromObj(interp,l
134d0 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 istv[i+1],&seria
134e0 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 l)!=TCL_OK)....
134f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
13500 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
13510 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
13520 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"C")==0) {....k
13530 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _C=Tcl_GetString
13540 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
13550 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
13560 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d trcmp(str,"ST")=
13570 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 =0) {....k_ST=Tc
13580 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
13590 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
135a0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
135b0 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a (str,"L")==0) {.
135c0 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 ...k_L=Tcl_GetSt
135d0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
135e0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
135f0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f f (strcmp(str,"O
13600 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d ")==0) {....k_O=
13610 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
13620 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
13630 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
13640 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 mp(str,"OU")==0)
13650 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 {....k_OU=Tcl_G
13660 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
13670 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
13680 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
13690 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 r,"CN")==0) {...
136a0 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 .k_CN=Tcl_GetStr
136b0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
136c0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
136d0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d (strcmp(str,"Em
136e0 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ail")==0) {....k
136f0 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 _Email=Tcl_GetSt
13700 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
13710 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b ;... } else {
13720 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c ....Tcl_SetResul
13730 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 t(interp,"Unknow
13740 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c n parameter",NUL
13750 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 L);....return TC
13760 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d L_ERROR;... }
13770 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 ...}.. }..#if
13780 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
13790 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
137a0 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 0000L.. bne =
137b0 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 BN_new();..
137c0 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b rsa = RSA_new();
137d0 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 .. pkey = EVP
137e0 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 _PKEY_new();..
137f0 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c if (bne == NUL
13800 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c L || rsa == NULL
13810 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c || pkey == NULL
13820 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 || !BN_set_word
13830 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a (bne,RSA_F4) ||.
13840 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f ..!RSA_generate_
13850 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 key_ex(rsa, keys
13860 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 ize, bne, NULL)
13870 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 || !EVP_PKEY_ass
13880 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 ign_RSA(pkey, rs
13890 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 a)) {...EVP_PKEY
138a0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f _free(pkey);.../
138b0 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b * RSA_free(rsa);
138c0 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b freed by EVP_PK
138d0 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f EY_free */...BN_
138e0 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 free(bne);.#else
138f0 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 .. pkey = EVP
13900 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e _RSA_gen((unsign
13910 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 ed int) keysize)
13920 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 ;.. ctx = EVP
13930 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b _PKEY_CTX_new(pk
13940 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 ey,NULL);.. i
13950 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 f (pkey == NULL
13960 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c || ctx == NULL |
13970 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 | !EVP_PKEY_keyg
13980 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a en_init(ctx) ||.
13990 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f ..!EVP_PKEY_CTX_
139a0 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 set_rsa_keygen_b
139b0 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 its(ctx, keysize
139c0 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b ) || !EVP_PKEY_k
139d0 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 eygen(ctx, &pkey
139e0 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f )) {...EVP_PKEY_
139f0 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 free(pkey);...EV
13a00 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 P_PKEY_CTX_free(
13a10 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 ctx);.#endif...T
13a20 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
13a30 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 erp,"Error gener
13a40 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 ating private ke
13a50 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 y",NULL);...retu
13a60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
13a70 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 } else {...if
13a80 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 (isStr) {...
13a90 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f out=BIO_new(BIO
13aa0 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 _s_mem());...
13ab0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 PEM_write_bio_P
13ac0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b rivateKey(out,pk
13ad0 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e ey,NULL,NULL,0,N
13ae0 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ULL,NULL);...
13af0 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c i=BIO_read(out,
13b00 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 buffer,sizeof(bu
13b10 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 ffer)-1);...
13b20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b i=(i<0) ? 0 : i;
13b30 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d ... buffer[i]
13b40 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c ='\0';... Tcl
13b50 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b _SetVar(interp,k
13b60 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b eyout,buffer,0);
13b70 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 ... BIO_flush
13b80 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f (out);... BIO
13b90 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 _free(out);...}
13ba0 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 else {... out
13bb0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 =BIO_new(BIO_s_f
13bc0 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 ile());... BI
13bd0 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 O_write_filename
13be0 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 (out,keyout);...
13bf0 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
13c00 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 o_PrivateKey(out
13c10 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c ,pkey,NULL,NULL,
13c20 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 0,NULL,NULL);...
13c30 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 /* PEM_write
13c40 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b _bio_RSAPrivateK
13c50 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c ey(out, rsa, NUL
13c60 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c L, NULL, 0, NULL
13c70 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 , NULL); */...
13c80 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f BIO_free_all(o
13c90 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 ut);.. .}....if
13ca0 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 ((cert=X509_new(
13cb0 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 ))==NULL) {...
13cc0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
13cd0 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 interp,"Error ge
13ce0 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 nerating certifi
13cf0 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 cate request",NU
13d00 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 LL);... EVP_P
13d10 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
13d20 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
13d30 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
13d40 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 0000000L... B
13d50 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e N_free(bne);.#en
13d60 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e dif... return
13d70 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d (TCL_ERROR);...}
13d80 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 ....X509_set_ver
13d90 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 sion(cert,2);...
13da0 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 ASN1_INTEGER_set
13db0 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c (X509_get_serial
13dc0 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 Number(cert),ser
13dd0 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ial);...X509_gmt
13de0 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
13df0 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 m_notBefore(cert
13e00 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 ),0);...X509_gmt
13e10 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 ime_adj(X509_get
13e20 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 m_notAfter(cert)
13e30 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a ,(long)60*60*24*
13e40 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 days);...X509_se
13e50 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b t_pubkey(cert,pk
13e60 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 ey);....name=X50
13e70 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 9_get_subject_na
13e80 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 me(cert);....X50
13e90 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
13ea0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 _by_txt(name,"C"
13eb0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
13ec0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
13ed0 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 ) k_C, -1, -1, 0
13ee0 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
13ef0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
13f00 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 name,"ST", MBSTR
13f10 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e ING_ASC, (unsign
13f20 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c ed char *) k_ST,
13f30 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
13f40 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
13f50 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
13f60 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 L", MBSTRING_ASC
13f70 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 , (unsigned char
13f80 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c *) k_L, -1, -1,
13f90 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 0);...X509_NAME
13fa0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 _add_entry_by_tx
13fb0 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 t(name,"O", MBST
13fc0 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 RING_ASC, (unsig
13fd0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c ned char *) k_O,
13fe0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
13ff0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
14000 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
14010 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 OU", MBSTRING_AS
14020 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 C, (unsigned cha
14030 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d r *) k_OU, -1, -
14040 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
14050 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
14060 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d txt(name,"CN", M
14070 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e BSTRING_ASC, (un
14080 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
14090 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b _CN, -1, -1, 0);
140a0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
140b0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
140c0 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 me,"Email", MBST
140d0 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 RING_ASC, (unsig
140e0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d ned char *) k_Em
140f0 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b ail, -1, -1, 0);
14100 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 ....X509_set_sub
14110 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e ject_name(cert,n
14120 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 ame);....if (!X5
14130 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 09_sign(cert,pke
14140 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 y,EVP_sha256()))
14150 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 {... X509_fr
14160 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ee(cert);...
14170 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
14180 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c ey);.#if OPENSSL
14190 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
141a0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 < 0x30000000L...
141b0 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 BN_free(bne)
141c0 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 ;.#endif... T
141d0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
141e0 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 erp,"Error signi
141f0 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c ng certificate",
14200 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 NULL);... ret
14210 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
14220 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 .}....if (isStr)
14230 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
14240 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 _new(BIO_s_mem()
14250 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 );... PEM_wri
14260 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c te_bio_X509(out,
14270 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 cert);... i=B
14280 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 IO_read(out,buff
14290 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 er,sizeof(buffer
142a0 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 )-1);... i=(i
142b0 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 <0) ? 0 : i;...
142c0 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 buffer[i]='\0
142d0 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 ';... Tcl_Set
142e0 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 Var(interp,pemou
142f0 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 t,buffer,0);...
14300 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 BIO_flush(out
14310 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
14320 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 e(out);...} else
14330 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
14340 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 _new(BIO_s_file(
14350 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 ));... BIO_wr
14360 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 ite_filename(out
14370 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 ,pemout);...
14380 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 PEM_write_bio_X5
14390 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 09(out,cert);...
143a0 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c BIO_free_all
143b0 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 (out);...}....X5
143c0 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09_free(cert);..
143d0 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 .EVP_PKEY_free(p
143e0 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 key);.#if OPENSS
143f0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
14400 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
14410 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 .BN_free(bne);.#
14420 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a endif.. }..}.
14430 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 .break;. defa
14440 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 ult:..break;.
14450 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }. return TC
14460 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
14470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144b0 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 --. *. * Tls_Fre
144c0 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 e --. *. *.This
144d0 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 procedure cleans
144e0 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 up when a SSL s
144f0 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e ocket based chan
14500 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 nel. *.is closed
14510 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e and its referen
14520 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 ce count falls b
14530 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 elow 1. *. * Res
14540 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
14550 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
14560 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
14570 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
14580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
145c0 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 23 69 66 20 54 -. */.void.#if T
145d0 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
145e0 20 3e 20 38 0a 54 6c 73 5f 46 72 65 65 28 20 76 > 8.Tls_Free( v
145f0 6f 69 64 20 2a 62 6c 6f 63 6b 50 74 72 20 29 0a oid *blockPtr ).
14600 23 65 6c 73 65 0a 54 6c 73 5f 46 72 65 65 28 20 #else.Tls_Free(
14610 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 20 29 char *blockPtr )
14620 0a 23 65 6e 64 69 66 0a 7b 0a 20 20 20 20 53 74 .#endif.{. St
14630 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
14640 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 (State *)blockPt
14650 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 r;.. dprintf(
14660 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
14670 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 Tls_Clean(stateP
14680 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 tr);. ckfree(
14690 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f blockPtr);.}.../
146a0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
146b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
146c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
146d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
146e0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
146f0 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a s_Clean --. *. *
14700 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
14710 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 cleans up when a
14720 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
14730 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 d channel. *.is
14740 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 closed and its r
14750 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 eference count f
14760 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 alls below 1. T
14770 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 his should. *.be
14780 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e called synchron
14790 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f ously by the Clo
147a0 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 seProc, not in t
147b0 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 he. *.Eventually
147c0 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 Free callback..
147d0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
147e0 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .none. *. * Side
147f0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 effects:. *.Fre
14800 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 es all the state
14810 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
14820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14850 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
14860 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 id Tls_Clean(Sta
14870 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a te *statePtr) {.
14880 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
14890 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 led");.. /*.
148a0 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 * we're assu
148b0 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 ming here that w
148c0 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 e're single-thre
148d0 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 aded. */.
148e0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 if (statePtr->t
148f0 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d imer != (Tcl_Tim
14900 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b erToken) NULL) {
14910 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 ..Tcl_DeleteTime
14920 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 rHandler(statePt
14930 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 r->timer);..stat
14940 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 ePtr->timer = NU
14950 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 LL;. }.. i
14960 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f f (statePtr->pro
14970 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 tos) {..ckfree(s
14980 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 tatePtr->protos)
14990 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f ;..statePtr->pro
149a0 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 tos = NULL;.
149b0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
149c0 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 tr->bio) {../* T
149d0 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 his will call SS
149e0 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 L_shutdown. Bug
149f0 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 1414045 */..dpri
14a00 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c ntf("BIO_free_al
14a10 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 l(%p)", statePtr
14a20 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 ->bio);..BIO_fre
14a30 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e e_all(statePtr->
14a40 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d bio);..statePtr-
14a50 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >bio = NULL;.
14a60 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
14a70 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 Ptr->ssl) {..dpr
14a80 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 intf("SSL_free(%
14a90 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 p)", statePtr->s
14aa0 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 sl);..SSL_free(s
14ab0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
14ac0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 statePtr->ssl =
14ad0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
14ae0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 if (statePtr->ct
14af0 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 x) {..SSL_CTX_fr
14b00 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ee(statePtr->ctx
14b10 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 );..statePtr->ct
14b20 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a x = NULL;. }.
14b30 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
14b40 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 ->callback) {..T
14b50 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
14b60 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
14b70 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e ck);..statePtr->
14b80 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b callback = NULL;
14b90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
14ba0 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
14bb0 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 d) {..Tcl_DecrRe
14bc0 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
14bd0 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 >password);..sta
14be0 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 tePtr->password
14bf0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
14c00 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
14c10 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 vcmd) {..Tcl_Dec
14c20 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
14c30 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 tr->vcmd);..stat
14c40 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c ePtr->vcmd = NUL
14c50 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 L;. }.. dp
14c60 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
14c70 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ");.}.../*. *---
14c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14cc0 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 . *. * Tls_Init
14cd0 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 --. *. *.This is
14ce0 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 a package initi
14cf0 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 alization proced
14d00 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 ure, which is ca
14d10 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 lled. *.by Tcl w
14d20 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 hen this package
14d30 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 is to be added
14d40 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 to an interprete
14d50 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
14d60 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 : Ssl configure
14d70 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a d and loaded. *.
14d80 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
14d90 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 . *. create the
14da0 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 ssl command, ini
14db0 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 tialize ssl cont
14dc0 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ext. *. *-------
14dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
14e10 0a 0a 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 ..#ifndef STRING
14e20 49 46 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 IFY.# define ST
14e30 52 49 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e RINGIFY(x) STRIN
14e40 47 49 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 GIFY1(x).# defi
14e50 6e 65 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 ne STRINGIFY1(x)
14e60 20 23 78 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 #x.#endif..stat
14e70 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c ic const char tl
14e80 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d sTclInitScript[]
14e90 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 = {.#include "t
14ea0 6c 73 2e 74 63 6c 2e 68 22 0a 20 20 20 20 30 78 ls.tcl.h". 0x
14eb0 30 30 0a 7d 3b 0a 0a 44 4c 4c 45 58 50 4f 52 54 00.};..DLLEXPORT
14ec0 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 0a 20 int Tls_Init(.
14ed0 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
14ee0 6e 74 65 72 70 29 0a 7b 0a 20 20 20 20 54 63 6c nterp).{. Tcl
14ef0 5f 43 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a _CmdInfo info;..
14f00 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
14f10 6c 65 64 22 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 led");.../*.. *
14f20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 We only support
14f30 54 63 6c 20 38 2e 36 20 6f 72 20 6e 65 77 65 72 Tcl 8.6 or newer
14f40 0a 09 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 .. */. if (Tc
14f50 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 l_InitStubs(inte
14f60 72 70 2c 20 22 38 2e 36 2d 22 2c 20 30 29 20 3d rp, "8.6-", 0) =
14f70 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
14f80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
14f90 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c }.. if (TlsL
14fa0 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c ibInit(0) != TCL
14fb0 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _OK) {..Tcl_Appe
14fc0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
14fd0 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 "could not init
14fe0 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 ialize SSL libra
14ff0 72 79 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c ry", (char *)NUL
15000 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
15010 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
15020 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
15030 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
15040 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 tls::ciphers", C
15050 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 4e 55 iphersObjCmd, NU
15060 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f LL, 0);. Tcl_
15070 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
15080 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 (interp, "tls::c
15090 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e onnection", Conn
150a0 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 ectionInfoObjCmd
150b0 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 , NULL, 0);.
150c0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
150d0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
150e0 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 s::handshake", H
150f0 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 andshakeObjCmd,
15100 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 NULL, 0);. Tc
15110 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
15120 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
15130 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 :import", Import
15140 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 ObjCmd, NULL, 0)
15150 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
15160 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
15170 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 p, "tls::unimpor
15180 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 t", UnimportObjC
15190 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 md, NULL, 0);.
151a0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
151b0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
151c0 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 tls::status", St
151d0 61 74 75 73 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c atusObjCmd, NULL
151e0 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 , 0);. Tcl_Cr
151f0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
15200 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 nterp, "tls::ver
15210 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 sion", VersionOb
15220 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a jCmd, NULL, 0);.
15230 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
15240 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
15250 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 "tls::misc", Mi
15260 73 63 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 scObjCmd, NULL,
15270 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 0);. Tcl_Crea
15280 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
15290 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f erp, "tls::proto
152a0 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 cols", Protocols
152b0 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 ObjCmd, NULL, 0)
152c0 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 ;.. if (inter
152d0 70 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 p) {..if (Tcl_Ev
152e0 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 al(interp, tlsTc
152f0 6c 49 6e 69 74 53 63 72 69 70 74 29 20 21 3d 20 lInitScript) !=
15300 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 TCL_OK) {.. r
15310 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
15320 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 ..}. }.. i
15330 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e f (Tcl_GetComman
15340 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22 3a dInfo(interp, ":
15350 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f :tcl::build-info
15360 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54 63 ", &info)) {..Tc
15370 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
15380 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c nd(interp, "::tl
15390 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 0a s::build-info",.
153a0 09 09 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 ..info.objProc,
153b0 28 76 6f 69 64 20 2a 29 28 0a 09 09 20 20 20 20 (void *)(...
153c0 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 PACKAGE_VERSION
153d0 22 2b 22 20 53 54 52 49 4e 47 49 46 59 28 54 4c "+" STRINGIFY(TL
153e0 53 5f 56 45 52 53 49 4f 4e 5f 55 55 49 44 29 0a S_VERSION_UUID).
153f0 09 09 09 20 20 20 20 22 2e 62 6f 68 61 67 61 6e ... ".bohagan
15400 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f ".#if defined(__
15410 63 6c 61 6e 67 5f 5f 29 20 26 26 20 64 65 66 69 clang__) && defi
15420 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f ned(__clang_majo
15430 72 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63 6c r__).... ".cl
15440 61 6e 67 2d 22 20 53 54 52 49 4e 47 49 46 59 28 ang-" STRINGIFY(
15450 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 __clang_major__)
15460 0a 23 69 66 20 5f 5f 63 6c 61 6e 67 5f 6d 69 6e .#if __clang_min
15470 6f 72 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 or__ < 10....
15480 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 "0".#endif....
15490 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 STRINGIFY(__c
154a0 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 29 0a 23 65 lang_minor__).#e
154b0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
154c0 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 20 26 26 (__cplusplus) &&
154d0 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 42 4a 43 !defined(__OBJC
154e0 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63 70 6c __).... ".cpl
154f0 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 usplus".#endif.#
15500 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 09 09 ifndef NDEBUG...
15510 09 20 20 20 20 22 2e 64 65 62 75 67 22 0a 23 65 . ".debug".#e
15520 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
15530 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 d(__clang__) &&
15540 21 64 65 66 69 6e 65 64 28 5f 5f 49 4e 54 45 4c !defined(__INTEL
15550 5f 43 4f 4d 50 49 4c 45 52 29 20 26 26 20 64 65 _COMPILER) && de
15560 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a fined(__GNUC__).
15570 09 09 09 20 20 20 20 22 2e 67 63 63 2d 22 20 53 ... ".gcc-" S
15580 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f TRINGIFY(__GNUC_
15590 5f 29 0a 23 69 66 20 5f 5f 47 4e 55 43 5f 4d 49 _).#if __GNUC_MI
155a0 4e 4f 52 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 NOR__ < 10....
155b0 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 "0".#endif....
155c0 20 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f 5f STRINGIFY(__
155d0 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 29 0a 23 65 GNUC_MINOR__).#e
155e0 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 49 4e ndif.#ifdef __IN
155f0 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 0a 09 09 09 TEL_COMPILER....
15600 20 20 20 20 22 2e 69 63 63 2d 22 20 53 54 52 49 ".icc-" STRI
15610 4e 47 49 46 59 28 5f 5f 49 4e 54 45 4c 5f 43 4f NGIFY(__INTEL_CO
15620 4d 50 49 4c 45 52 29 0a 23 65 6e 64 69 66 0a 23 MPILER).#endif.#
15630 69 66 64 65 66 20 54 43 4c 5f 4d 45 4d 5f 44 45 ifdef TCL_MEM_DE
15640 42 55 47 0a 09 09 09 20 20 20 20 22 2e 6d 65 6d BUG.... ".mem
15650 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 debug".#endif.#i
15660 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 f defined(_MSC_V
15670 45 52 29 0a 09 09 09 20 20 20 20 22 2e 6d 73 76 ER).... ".msv
15680 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 4d c-" STRINGIFY(_M
15690 53 43 5f 56 45 52 29 0a 23 65 6e 64 69 66 0a 23 SC_VER).#endif.#
156a0 69 66 64 65 66 20 55 53 45 5f 4e 4d 41 4b 45 0a ifdef USE_NMAKE.
156b0 09 09 09 20 20 20 20 22 2e 6e 6d 61 6b 65 22 0a ... ".nmake".
156c0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 54 #endif.#ifndef T
156d0 43 4c 5f 43 46 47 5f 4f 50 54 49 4d 49 5a 45 44 CL_CFG_OPTIMIZED
156e0 0a 09 09 09 20 20 20 20 22 2e 6e 6f 2d 6f 70 74 .... ".no-opt
156f0 69 6d 69 7a 65 22 0a 23 65 6e 64 69 66 0a 23 69 imize".#endif.#i
15700 66 64 65 66 20 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 fdef __OBJC__...
15710 09 20 20 20 20 22 2e 6f 62 6a 65 63 74 69 76 65 . ".objective
15720 2d 63 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28 -c".#if defined(
15730 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 09 09 09 __cplusplus)....
15740 20 20 20 20 22 70 6c 75 73 70 6c 75 73 22 0a 23 "plusplus".#
15750 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 endif.#endif.#if
15760 64 65 66 20 54 43 4c 5f 43 46 47 5f 50 52 4f 46 def TCL_CFG_PROF
15770 49 4c 45 44 0a 09 09 09 20 20 20 20 22 2e 70 72 ILED.... ".pr
15780 6f 66 69 6c 65 22 0a 23 65 6e 64 69 66 0a 23 69 ofile".#endif.#i
15790 66 64 65 66 20 50 55 52 49 46 59 0a 09 09 09 20 fdef PURIFY....
157a0 20 20 20 22 2e 70 75 72 69 66 79 22 0a 23 65 6e ".purify".#en
157b0 64 69 66 0a 23 69 66 64 65 66 20 53 54 41 54 49 dif.#ifdef STATI
157c0 43 5f 42 55 49 4c 44 0a 09 09 09 20 20 20 20 22 C_BUILD.... "
157d0 2e 73 74 61 74 69 63 22 0a 23 65 6e 64 69 66 0a .static".#endif.
157e0 09 09 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 ..), NULL);.
157f0 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 }.. return Tc
15800 6c 5f 50 6b 67 50 72 6f 76 69 64 65 45 78 28 69 l_PkgProvideEx(i
15810 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e nterp, PACKAGE_N
15820 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 AME, PACKAGE_VER
15830 53 49 4f 4e 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a SION, NULL);.}..
15840 2f 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 0a -----------*. *.
15880 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 *.Tls_SafeInit
15890 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d --. *. *.-------
158a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 ---------*. *.St
158d0 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 andard procedure
158e0 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f required by 'lo
158f0 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 ad'.. *.Initiali
15900 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 zes this extensi
15910 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e on for a safe in
15920 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d terpreter.. *.--
15930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
15960 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 *. *.Side effec
15970 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 ts:. *..As of 'T
15980 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 ls_Init'. *. *.R
15990 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 esult:. *..A sta
159a0 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 ndard Tcl error
159b0 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d code.. *. *-----
159c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159f0 2d 2a 0a 20 2a 2f 0a 0a 44 4c 4c 45 58 50 4f 52 -*. */..DLLEXPOR
15a00 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e T int Tls_SafeIn
15a10 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 it(Tcl_Interp *i
15a20 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 nterp) {. dpr
15a30 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
15a40 20 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 return(Tls_I
15a50 6e 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a nit(interp));.}.
15a60 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
15a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
15aa0 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d . *.TlsLibInit -
15ab0 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d -. *. *.--------
15ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15ae0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 --------*. *.Ini
15af0 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 tializes SSL lib
15b00 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 rary once per ap
15b10 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d plication. *.---
15b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
15b50 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 *. *.Side effect
15b60 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a s:. *..initializ
15b70 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 es SSL library.
15b80 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 *. *.Result:. *.
15b90 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .none. *. *-----
15ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15bd0 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e -*. */.static in
15be0 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 t TlsLibInit(int
15bf0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b uninitialize) {
15c00 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 . static int
15c10 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b initialized = 0;
15c20 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 . int status
15c30 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 = TCL_OK;.#if de
15c40 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
15c50 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
15c60 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
15c70 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f size_t num_lo
15c80 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 cks;.#endif..
15c90 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a if (uninitializ
15ca0 65 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 e) {..if (!initi
15cb0 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 alized) {.. d
15cc0 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f printf("Asked to
15cd0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 uninitialize, b
15ce0 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e ut we are not in
15cf0 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 itialized");...
15d00 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b return(TCL_OK
15d10 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 );..}...dprintf(
15d20 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 "Asked to uninit
15d30 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 ialize");..#if d
15d40 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
15d50 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
15d60 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
15d70 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 .Tcl_MutexLock(&
15d80 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 init_mx);...if (
15d90 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 locks) {.. fr
15da0 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 ee(locks);..
15db0 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 locks = NULL;..
15dc0 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 locksCount =
15dd0 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 0;..}.#endif..in
15de0 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a itialized = 0;..
15df0 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
15e00 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
15e10 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
15e20 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 ADS)..Tcl_MutexU
15e30 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b nlock(&init_mx);
15e40 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e .#endif...return
15e50 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a (TCL_OK);. }.
15e60 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c . if (initial
15e70 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 ized) {..dprintf
15e80 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 ("Called, but us
15e90 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 ing cached value
15ea0 22 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 74 ");..return(stat
15eb0 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 us);. }..
15ec0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
15ed0 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
15ee0 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
15ef0 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
15f00 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c THREADS). Tcl
15f10 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 _MutexLock(&init
15f20 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 _mx);.#endif.
15f30 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 initialized = 1
15f40 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
15f50 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
15f60 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
15f70 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f HREADS). num_
15f80 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c locks = 1;. l
15f90 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 ocksCount = (int
15fa0 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 ) num_locks;.
15fb0 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 locks = malloc(
15fc0 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a sizeof(*locks) *
15fd0 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 num_locks);.
15fe0 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 memset(locks, 0
15ff0 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 , sizeof(*locks)
16000 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 * num_locks);.#
16010 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e endif.. /* In
16020 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 itialize BOTH li
16030 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 bcrypto and libs
16040 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 sl. */. OPENS
16050 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e SL_init_ssl(OPEN
16060 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 SSL_INIT_LOAD_SS
16070 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e L_STRINGS | OPEN
16080 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 SSL_INIT_LOAD_CR
16090 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 YPTO_STRINGS..|
160a0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 OPENSSL_INIT_ADD
160b0 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f _ALL_CIPHERS | O
160c0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f PENSSL_INIT_ADD_
160d0 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c ALL_DIGESTS, NUL
160e0 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 L);.. BIO_new
160f0 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a _tcl(NULL, 0);..
16100 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e #if defined(OPEN
16110 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 SSL_THREADS) &&
16120 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 defined(TCL_THRE
16130 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 ADS). Tcl_Mut
16140 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d exUnlock(&init_m
16150 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 x);.#endif..
16160 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a return(status);.
16170 7d 0a }.