0000: 2f 2a 0a 20 2a 20 54 4c 53 20 43 68 61 6e 6e 65 /*. * TLS Channe
0010: 6c 20 2d 20 54 68 69 73 20 65 78 74 65 6e 73 69 l - This extensi
0020: 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 65 6e on provides a en
0030: 63 72 79 70 74 65 64 20 63 6f 6d 6d 75 6e 69 63 crypted communic
0040: 61 74 69 6f 6e 20 63 68 61 6e 6e 65 6c 0a 20 2a ation channel. *
0050: 20 75 73 69 6e 67 20 74 68 65 20 54 4c 53 20 6f using the TLS o
0060: 72 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 73 2e r SSL protocols.
0070: 20 49 74 20 63 61 6e 20 62 65 20 6c 61 79 65 72 It can be layer
0080: 65 64 20 6f 6e 20 74 6f 70 20 6f 66 20 61 6e 79 ed on top of any
0090: 0a 20 2a 20 62 69 2d 64 69 72 65 63 74 69 6f 6e . * bi-direction
00a0: 61 6c 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 2e 0a al Tcl_Channel..
00b0: 20 2a 0a 20 2a 20 54 68 69 73 20 77 61 73 20 69 *. * This was i
00c0: 6e 69 74 69 61 6c 6c 79 20 62 75 69 6c 74 20 28 nitially built (
00d0: 61 6c 6d 6f 73 74 29 20 66 72 6f 6d 20 73 63 72 almost) from scr
00e0: 61 74 63 68 20 62 61 73 65 64 20 75 70 6f 6e 20 atch based upon
00f0: 6f 62 73 65 72 76 61 74 69 6f 6e 20 6f 66 0a 20 observation of.
0100: 2a 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 32 42 * OpenSSL 0.9.2B
0110: 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 .. *. * Copyrigh
0120: 74 20 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 t (C) 1997-1999
0130: 4d 61 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 Matt Newman <mat
0140: 74 40 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a t@novadigm.com>.
0150: 20 2a 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 * some modifica
0160: 74 69 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 tions:. *.Copyri
0170: 67 68 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 ght (C) 2000 Aju
0180: 62 61 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 ba Solutions. *.
0190: 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 30 Copyright (C) 20
01a0: 30 32 20 41 63 74 69 76 65 53 74 61 74 65 20 43 02 ActiveState C
01b0: 6f 72 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f orporation. *.Co
01c0: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 34 pyright (C) 2004
01d0: 20 53 74 61 72 66 69 73 68 20 53 79 73 74 65 6d Starfish System
01e0: 73 0a 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 s. *.Copyright (
01f0: 43 29 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 C) 2023 Brian O'
0200: 48 61 67 61 6e 0a 20 2a 0a 20 2a 20 41 64 64 69 Hagan. *. * Addi
0210: 74 69 6f 6e 61 6c 20 63 72 65 64 69 74 20 69 73 tional credit is
0220: 20 64 75 65 20 66 6f 72 20 41 6e 64 72 65 61 73 due for Andreas
0230: 20 4b 75 70 72 69 65 73 20 28 61 2e 6b 75 70 72 Kupries (a.kupr
0240: 69 65 73 40 77 65 73 74 65 6e 64 2e 63 6f 6d 29 ies@westend.com)
0250: 2c 20 66 6f 72 0a 20 2a 20 70 72 6f 76 69 64 69 , for. * providi
0260: 6e 67 20 74 68 65 20 54 63 6c 5f 52 65 70 6c 61 ng the Tcl_Repla
0270: 63 65 43 68 61 6e 6e 65 6c 20 6d 65 63 68 61 6e ceChannel mechan
0280: 69 73 6d 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 ism and working
0290: 63 6c 6f 73 65 6c 79 20 77 69 74 68 20 6d 65 0a closely with me.
02a0: 20 2a 20 74 6f 20 65 6e 68 61 6e 63 65 20 69 74 * to enhance it
02b0: 20 74 6f 20 73 75 70 70 6f 72 74 20 66 75 6c 6c to support full
02c0: 20 66 69 6c 65 65 76 65 6e 74 20 73 65 6d 61 6e fileevent seman
02d0: 74 69 63 73 2e 0a 20 2a 0a 20 2a 20 41 6c 73 6f tics.. *. * Also
02e0: 20 77 6f 72 6b 20 64 6f 6e 65 20 62 79 20 74 68 work done by th
02f0: 65 20 66 6f 6c 6c 6f 77 20 70 65 6f 70 6c 65 20 e follow people
0300: 70 72 6f 76 69 64 65 64 20 74 68 65 20 69 6d 70 provided the imp
0310: 65 74 75 73 20 74 6f 20 64 6f 20 74 68 69 73 20 etus to do this
0320: 22 72 69 67 68 74 22 3a 0a 20 2a 09 74 63 6c 53 "right":. *.tclS
0330: 53 4c 20 28 43 6f 6c 69 6e 20 4d 63 43 6f 72 6d SL (Colin McCorm
0340: 61 63 6b 2c 20 53 68 61 72 65 64 20 54 65 63 68 ack, Shared Tech
0350: 6e 6f 6c 6f 67 79 29 0a 20 2a 09 53 53 4c 74 63 nology). *.SSLtc
0360: 6c 20 28 50 65 74 65 72 20 41 6e 74 6d 61 6e 29 l (Peter Antman)
0370: 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 . *. */..#includ
0380: 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e e "tlsInt.h".#in
0390: 63 6c 75 64 65 20 22 74 63 6c 4f 70 74 73 2e 68 clude "tclOpts.h
03a0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 55 ".#include "tlsU
03b0: 75 69 64 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 uid.h".#include
03c0: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 <stdio.h>.#inclu
03d0: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 de <stdlib.h>.#i
03e0: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
03f0: 73 73 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 ssl.h>.#include
0400: 3c 6f 70 65 6e 73 73 6c 2f 63 72 79 70 74 6f 2e <openssl/crypto.
0410: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 h>.#include <ope
0420: 6e 73 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e 66 nssl/opensslconf
0430: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 .h>.#include <op
0440: 65 6e 73 73 6c 2f 72 73 61 2e 68 3e 0a 23 69 6e enssl/rsa.h>.#in
0450: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 clude <openssl/s
0460: 61 66 65 73 74 61 63 6b 2e 68 3e 0a 0a 2f 2a 20 afestack.h>../*
0470: 4d 69 6e 20 4f 70 65 6e 53 53 4c 20 76 65 72 73 Min OpenSSL vers
0480: 69 6f 6e 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 ion */.#if OPENS
0490: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
04a0: 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a R < 0x10101000L.
04b0: 23 65 72 72 6f 72 20 22 4f 6e 6c 79 20 4f 70 65 #error "Only Ope
04c0: 6e 53 53 4c 20 76 31 2e 31 2e 31 20 6f 72 20 6c nSSL v1.1.1 or l
04d0: 61 74 65 72 20 69 73 20 73 75 70 70 6f 72 74 65 ater is supporte
04e0: 64 22 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 20 d".#endif.../*.
04f0: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 * Forward declar
0500: 61 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 ations. */..#def
0510: 69 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64 73 70 ine F2N(key, dsp
0520: 29 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20 ) \..(((key) ==
0530: 4e 55 4c 4c 29 20 3f 20 28 63 68 61 72 20 2a 29 NULL) ? (char *)
0540: 20 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f NULL : \...Tcl_
0550: 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d TranslateFileNam
0560: 65 28 69 6e 74 65 72 70 2c 20 28 6b 65 79 29 2c e(interp, (key),
0570: 20 28 64 73 70 29 29 29 0a 0a 73 74 61 74 69 63 (dsp)))..static
0580: 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e SSL_CTX *CTX_In
0590: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 it(State *stateP
05a0: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 tr, int isServer
05b0: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 , int proto, cha
05c0: 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 2a r *key,...char *
05d0: 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 6e certfile, unsign
05e0: 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 6e ed char *key_asn
05f0: 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 1, unsigned char
0600: 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 54 *cert_asn1,...T
0610: 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 61 73 6e 31 cl_Size key_asn1
0620: 5f 6c 65 6e 2c 20 54 63 6c 5f 53 69 7a 65 20 63 _len, Tcl_Size c
0630: 65 72 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 ert_asn1_len, ch
0640: 61 72 20 2a 43 41 70 61 74 68 2c 20 63 68 61 72 ar *CApath, char
0650: 20 2a 43 41 73 74 6f 72 65 2c 0a 09 09 63 68 61 *CAstore,...cha
0660: 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20 r *CAfile, char
0670: 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a *ciphers, char *
0680: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e ciphersuites, in
0690: 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 t level, char *D
06a0: 48 70 61 72 61 6d 73 29 3b 0a 0a 23 64 65 66 69 Hparams);..#defi
06b0: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ne TLS_PROTO_SSL
06c0: 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20 2..0x01.#define
06d0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 09 TLS_PROTO_SSL3..
06e0: 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c 53 0x02.#define TLS
06f0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 30 _PROTO_TLS1..0x0
0700: 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4.#define TLS_PR
0710: 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 0a OTO_TLS1_1.0x08.
0720: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 #define TLS_PROT
0730: 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 64 O_TLS1_2.0x10.#d
0740: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f efine TLS_PROTO_
0750: 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 66 TLS1_3.0x20.#def
0760: 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67 ine ENABLED(flag
0770: 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29 , mask).(((flag)
0780: 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d & (mask)) == (m
0790: 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 53 ask))..#define S
07a0: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 53 SLKEYLOGFILE.."S
07b0: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a 0c SLKEYLOGFILE"...
07c0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
07d0: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c 62 ******/./* Callb
07e0: 61 63 6b 73 20 20 20 20 20 20 20 20 2a 2f 0a 2f acks */./
07f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0800: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ****/../*. *----
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0850: 20 2a 0a 20 2a 20 45 76 61 6c 20 43 61 6c 6c 62 *. * Eval Callb
0860: 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 ack Command --.
0870: 2a 0a 20 2a 09 45 76 61 6c 20 63 61 6c 6c 62 61 *. *.Eval callba
0880: 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 63 ck command and c
0890: 61 74 63 68 20 61 6e 79 20 65 72 72 6f 72 73 0a atch any errors.
08a0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
08b0: 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 *.0 = Command re
08c0: 74 75 72 6e 65 64 20 66 61 69 6c 20 6f 72 20 65 turned fail or e
08d0: 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c val returned TCL
08e0: 5f 45 52 52 4f 52 0a 20 2a 09 31 20 3d 20 43 6f _ERROR. *.1 = Co
08f0: 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 73 mmand returned s
0900: 75 63 63 65 73 73 20 6f 72 20 65 76 61 6c 20 72 uccess or eval r
0910: 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f 4b 0a 20 eturned TCL_OK.
0920: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
0930: 73 3a 0a 20 2a 09 45 76 61 6c 75 61 74 65 73 20 s:. *.Evaluates
0940: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 callback command
0950: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0980: 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 0a 20 2a 2f 0a 73 74 ---------. */.st
09a0: 61 74 69 63 20 69 6e 74 0a 45 76 61 6c 43 61 6c atic int.EvalCal
09b0: 6c 62 61 63 6b 28 54 63 6c 5f 49 6e 74 65 72 70 lback(Tcl_Interp
09c0: 20 2a 69 6e 74 65 72 70 2c 20 53 74 61 74 65 20 *interp, State
09d0: 2a 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 4f *statePtr, Tcl_O
09e0: 62 6a 20 2a 63 6d 64 50 74 72 29 20 7b 0a 20 20 bj *cmdPtr) {.
09f0: 20 20 69 6e 74 20 63 6f 64 65 2c 20 6f 6b 20 3d int code, ok =
0a00: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 0;.. dprintf
0a10: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
0a20: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 Tcl_Preserve((C
0a30: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 lientData) inter
0a40: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 p);. Tcl_Pres
0a50: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 erve((ClientData
0a60: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 ) statePtr);..
0a70: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 /* Eval callba
0a80: 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73 20 ck with success
0a90: 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72 6e for ok or return
0aa0: 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20 66 value 1, fail f
0ab0: 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74 75 or error or retu
0ac0: 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20 20 rn value 0 */.
0ad0: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c Tcl_ResetResul
0ae0: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 63 t(interp);. c
0af0: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 ode = Tcl_EvalOb
0b00: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 jEx(interp, cmdP
0b10: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f tr, TCL_EVAL_GLO
0b20: 42 41 4c 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 BAL);. dprint
0b30: 66 28 22 45 76 61 6c 43 61 6c 6c 62 61 63 6b 3a f("EvalCallback:
0b40: 20 25 64 22 2c 20 63 6f 64 65 29 3b 0a 20 20 20 %d", code);.
0b50: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c if (code == TCL
0b60: 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43 68 65 63 6b _OK) {../* Check
0b70: 20 72 65 73 75 6c 74 20 66 6f 72 20 72 65 74 75 result for retu
0b80: 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 54 63 6c rn value */..Tcl
0b90: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 20 3d 20 54 _Obj *result = T
0ba0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_GetObjResult(
0bb0: 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 28 72 65 interp);..if (re
0bc0: 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 sult == NULL ||
0bd0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
0be0: 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 j(interp, result
0bf0: 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c 5f 4f 4b , &ok) != TCL_OK
0c00: 29 20 7b 0a 09 20 20 20 20 6f 6b 20 3d 20 31 3b ) {.. ok = 1;
0c10: 0a 09 7d 0a 09 64 70 72 69 6e 74 66 28 22 52 65 ..}..dprintf("Re
0c20: 73 75 6c 74 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a sult: %d", ok);.
0c30: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a } else {../*
0c40: 20 45 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 Error - reject
0c50: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
0c60: 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 54 63 6c */..dprintf("Tcl
0c70: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
0c80: 22 29 3b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a ");.#if (TCL_MAJ
0c90: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 OR_VERSION == 8)
0ca0: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 && (TCL_MINOR_V
0cb0: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c ERSION < 6)..Tcl
0cc0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
0cd0: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a (interp);.#else.
0ce0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
0cf0: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c xception(interp,
0d00: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 code);.#endif.
0d10: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 52 65 }.. Tcl_Re
0d20: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 lease((ClientDat
0d30: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 a) statePtr);.
0d40: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 Tcl_Release((C
0d50: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 lientData) inter
0d60: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f p);. return o
0d70: 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d k;.}.../*. *----
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0dc0: 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 *. * InfoCallba
0dd0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 ck --. *. *.Moni
0de0: 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 tors SSL connect
0df0: 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 ion process. *.
0e00: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
0e10: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
0e20: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
0e30: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
0e40: 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ined). *. *-----
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0e90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 49 */.static void.I
0ea0: 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 nfoCallback(cons
0eb0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 t SSL *ssl, int
0ec0: 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 20 where, int ret)
0ed0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
0ee0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
0ef0: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 SSL_get_app_data
0f00: 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 ((SSL *)ssl);.
0f10: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
0f20: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
0f30: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
0f40: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
0f50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 61 const char *ma
0f60: 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 jor, *minor;..
0f70: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
0f80: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 d");.. if (st
0f90: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
0fa0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
0fb0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 LL) {..return;.
0fc0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 77 68 }.. if (wh
0fd0: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e ere & SSL_CB_HAN
0fe0: 44 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a DSHAKE_START) {.
0ff0: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 .major = "handsh
1000: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 ake";..minor = "
1010: 73 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c start";. } el
1020: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
1030: 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f SL_CB_HANDSHAKE_
1040: 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d DONE) {..major =
1050: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d "handshake";..m
1060: 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 inor = "done";.
1070: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
1080: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1090: 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 ALERT)..major =
10a0: 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 "alert";..else i
10b0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 f (where & SSL_S
10c0: 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 T_CONNECT).major
10d0: 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 = "connect";..e
10e0: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
10f0: 53 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09 SSL_ST_ACCEPT)..
1100: 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22 major = "accept"
1110: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f ;..else.....majo
1120: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a r = "unknown";..
1130: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c .if (where & SSL
1140: 5f 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 _CB_READ)..minor
1150: 20 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 = "read";..else
1160: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
1170: 5f 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f _CB_WRITE)..mino
1180: 72 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c r = "write";..el
1190: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
11a0: 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e SL_CB_LOOP)..min
11b0: 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c or = "loop";..el
11c0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
11d0: 53 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e SL_CB_EXIT)..min
11e0: 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c or = "exit";..el
11f0: 73 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 se.....minor = "
1200: 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a unknown";. }.
1210: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
1220: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
1230: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 6d 61 ith fn, chan, ma
1240: 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d 65 73 73 jor, minor, mess
1250: 61 67 65 2c 20 61 6e 64 20 74 79 70 65 20 61 72 age, and type ar
1260: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 gs */. cmdPtr
1270: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
1280: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
1290: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c llback);. Tcl
12a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
12b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
12c0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
12d0: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d ingObj("info", -
12e0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
12f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1300: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
1310: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
1320: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 ringObj(Tcl_GetC
1330: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
1340: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 Ptr->self), -1))
1350: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1360: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1370: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1390: 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20 major, -1));.
13a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
13b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
13c0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
13d0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 wStringObj(minor
13e0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20 , -1));.. if
13f0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1400: 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69 ALERT) {..Tcl_Li
1410: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1420: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1430: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1440: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 tringObj(SSL_ale
1450: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c rt_desc_string_l
1460: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a ong(ret), -1));.
1470: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
1480: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
1490: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
14a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
14b0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 SSL_alert_type_s
14c0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c tring_long(ret),
14d0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 -1));. } els
14e0: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a e {..Tcl_ListObj
14f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1500: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
1510: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
1520: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 Obj(SSL_state_st
1530: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 ring_long(ssl),
1540: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
1550: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1560: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1570: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1580: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 ("info", -1));.
1590: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 }.. /* Eva
15a0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
15b0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
15c0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
15d0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
15e0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
15f0: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
1600: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
1610: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
1620: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
1630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
1670: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b MessageCallback
1680: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f --. *. *.Monito
1690: 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 rs SSL protocol
16a0: 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52 messages. *. * R
16b0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a esults:. *.None.
16c0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
16d0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c ts:. *.Calls cal
16e0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 lback (if define
16f0: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d). *. *--------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
1740: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f #ifndef OPENSSL_
1750: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61 NO_SSL_TRACE.sta
1760: 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65 tic void.Message
1770: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69 Callback(int wri
1780: 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f te_p, int versio
1790: 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74 n, int content_t
17a0: 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 ype, const void
17b0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e *buf, size_t len
17c0: 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64 , SSL *ssl, void
17d0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
17e0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
17f0: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
1800: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
1810: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
1820: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
1830: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
1840: 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65 char *ver, *type
1850: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a ;. BIO *bio;.
1860: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b char buffer[
1870: 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66 15000];. buff
1880: 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 er[0] = 0;..
1890: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
18a0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 );.. if (stat
18b0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
18c0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
18d0: 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 ) {..return;.
18e0: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76 }.. switch(v
18f0: 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f 50 ersion) {.#if OP
1900: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
1910: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
1920: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
1930: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
1940: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
1950: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 53 SL2). case SS
1960: 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 L2_VERSION:..ver
1970: 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65 = "SSLv2";..bre
1980: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
1990: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
19a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
19b0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 NSSL_NO_SSL3).
19c0: 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53 case SSL3_VERS
19d0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c ION:..ver = "SSL
19e0: 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e v3";..break;.#en
19f0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53 dif. case TLS
1a00: 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 1_VERSION:..ver
1a10: 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61 = "TLSv1";..brea
1a20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 k;. case TLS1
1a30: 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 _1_VERSION:..ver
1a40: 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62 = "TLSv1.1";..b
1a50: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
1a60: 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 LS1_2_VERSION:..
1a70: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b ver = "TLSv1.2";
1a80: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1a90: 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e e TLS1_3_VERSION
1aa0: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e :..ver = "TLSv1.
1ab0: 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 3";..break;.
1ac0: 63 61 73 65 20 30 3a 0a 09 76 65 72 20 3d 20 22 case 0:..ver = "
1ad0: 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 none";..break;.
1ae0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 72 default:..ver
1af0: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 = "unknown";..b
1b00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
1b10: 20 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e 74 switch (content
1b20: 5f 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73 _type) {. cas
1b30: 65 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 52 e SSL3_RT_HEADER
1b40: 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64 65 :..type = "Heade
1b50: 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 r";..break;.
1b60: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e case SSL3_RT_INN
1b70: 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a ER_CONTENT_TYPE:
1b80: 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20 ..type = "Inner
1b90: 43 6f 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 09 Content Type";..
1ba0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1bb0: 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47 45 5f 43 SSL3_RT_CHANGE_C
1bc0: 49 50 48 45 52 5f 53 50 45 43 3a 0a 09 74 79 70 IPHER_SPEC:..typ
1bd0: 65 20 3d 20 22 43 68 61 6e 67 65 20 43 69 70 68 e = "Change Ciph
1be0: 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 er";..break;.
1bf0: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 4c case SSL3_RT_AL
1c00: 45 52 54 3a 0a 09 74 79 70 65 20 3d 20 22 41 6c ERT:..type = "Al
1c10: 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 ert";..break;.
1c20: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 case SSL3_RT_H
1c30: 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 70 65 20 ANDSHAKE:..type
1c40: 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 3b 0a 09 = "Handshake";..
1c50: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1c60: 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43 41 54 SSL3_RT_APPLICAT
1c70: 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70 65 20 ION_DATA:..type
1c80: 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a 09 62 = "App Data";..b
1c90: 72 65 61 6b 3b 0a 23 69 66 20 4f 50 45 4e 53 53 reak;.#if OPENSS
1ca0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
1cb0: 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 20 < 0x30000000L.
1cc0: 20 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54 case DTLS1_RT
1cd0: 5f 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70 _HEARTBEAT:..typ
1ce0: 65 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b e = "Heartbeat";
1cf0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
1d00: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79 default:..ty
1d10: 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a pe = "unknown";.
1d20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65 }.. /* Ne
1d30: 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 eds compile time
1d40: 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d option "enable-
1d50: 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20 ssl-trace". */.
1d60: 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49 if ((bio = BI
1d70: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 O_new(BIO_s_mem(
1d80: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ))) != NULL) {..
1d90: 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63 int n;..SSL_trac
1da0: 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69 e(write_p, versi
1db0: 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 on, content_type
1dc0: 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c , buf, len, ssl,
1dd0: 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09 (void *)bio);..
1de0: 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f n = BIO_read(bio
1df0: 2c 20 62 75 66 66 65 72 2c 20 42 49 4f 5f 70 65 , buffer, BIO_pe
1e00: 6e 64 69 6e 67 28 62 69 6f 29 20 3c 20 31 35 30 nding(bio) < 150
1e10: 30 30 20 3f 20 42 49 4f 5f 70 65 6e 64 69 6e 67 00 ? BIO_pending
1e20: 28 62 69 6f 29 20 3a 20 31 34 39 39 39 29 3b 0a (bio) : 14999);.
1e30: 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20 3a .n = (n<0) ? 0 :
1e40: 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20 3d n;..buffer[n] =
1e50: 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66 0;..(void)BIO_f
1e60: 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42 49 4f 5f lush(bio);..BIO_
1e70: 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 7d 0a free(bio);. }.
1e80: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 4d 65 . dprintf("Me
1e90: 73 73 61 67 65 20 64 69 72 65 63 74 69 6f 6e 3d ssage direction=
1ea0: 25 64 2c 20 76 65 72 3d 25 73 2c 20 74 79 70 65 %d, ver=%s, type
1eb0: 3d 25 73 2c 20 6d 65 73 73 61 67 65 3d 25 73 22 =%s, message=%s"
1ec0: 2c 20 77 72 69 74 65 5f 70 2c 20 76 65 72 2c 20 , write_p, ver,
1ed0: 74 79 70 65 2c 20 26 62 75 66 66 65 72 5b 30 5d type, &buffer[0]
1ee0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 );.. /* Creat
1ef0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
1f00: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c l with fn, chan,
1f10: 20 64 69 72 65 63 74 69 6f 6e 2c 20 76 65 72 73 direction, vers
1f20: 69 6f 6e 2c 20 74 79 70 65 2c 20 61 6e 64 20 6d ion, type, and m
1f30: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 essage args */.
1f40: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
1f50: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
1f60: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
1f70: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
1f80: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1f90: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
1fa0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1fb0: 22 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29 3b "message", -1));
1fc0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1fd0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
1fe0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
1ff0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
2000: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
2010: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
2020: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
2030: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2040: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2050: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2060: 65 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 ewStringObj(writ
2070: 65 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 e_p ? "Sent" : "
2080: 52 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29 3b Received", -1));
2090: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
20a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
20b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
20c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 l_NewStringObj(v
20d0: 65 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 er, -1));. Tc
20e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
20f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
2100: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
2110: 72 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 ringObj(type, -1
2120: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2130: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2140: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2150: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2160: 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a j(buffer, -1));.
2170: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
2180: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
2190: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
21a0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
21b0: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 EvalCallback(
21c0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
21d0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 , cmdPtr);. T
21e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
21f0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 cmdPtr);.}.#endi
2200: 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d f.../*. *-------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
2250: 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 * VerifyCallbac
2260: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 k --. *. *.Monit
2270: 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 63 ors SSL certific
2280: 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 ate validation p
2290: 72 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f 20 rocess. Used to
22a0: 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 control the. *.b
22b0: 65 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65 ehavior when the
22c0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 SSL_VERIFY_PEER
22d0: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 flag is set. Th
22e0: 69 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 is is called. *.
22f0: 77 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 whenever a certi
2300: 66 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 ficate is inspec
2310: 74 65 64 20 6f 72 20 64 65 63 69 64 65 64 20 69 ted or decided i
2320: 6e 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 nvalid. Called f
2330: 6f 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74 69 or. *.each certi
2340: 66 69 63 61 74 65 20 69 6e 20 74 68 65 20 63 65 ficate in the ce
2350: 72 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 rt chain.. *. *
2360: 43 68 65 63 6b 73 3a 0a 20 2a 09 54 68 65 20 63 Checks:. *.The c
2370: 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69 6e ertificate chain
2380: 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61 72 is checked star
2390: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64 65 ting with the de
23a0: 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c 65 epest nesting le
23b0: 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72 6f vel. *. (the ro
23c0: 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 ot CA certificat
23d0: 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75 70 e) and worked up
23e0: 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65 72 ward to the peer
23f0: 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a 's certificate..
2400: 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72 65 *.All signature
2410: 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75 72 s are valid, cur
2420: 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69 74 rent time is wit
2430: 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c 61 hin first and la
2440: 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d 65 st validity time
2450: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74 20 .. *.Check that
2460: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
2470: 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68 65 is issued by the
2480: 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69 63 issuer certific
2490: 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09 43 ate issuer.. *.C
24a0: 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61 74 heck the revocat
24b0: 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20 65 ion status for e
24c0: 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65 2e ach certificate.
24d0: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76 61 . *.Check the va
24e0: 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67 69 lidity of the gi
24f0: 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65 20 ven CRL and the
2500: 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e 20 cert revocation
2510: 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b status.. *.Check
2520: 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f 66 the policies of
2530: 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66 69 all the certifi
2540: 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73 cates. *. * Args
2550: 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f 6b . *.preverify_ok
2560: 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68 indicates wheth
2570: 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63 61 er the certifica
2580: 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 te verification
2590: 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e 6f passed (1) or no
25a0: 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75 t (0). *. * Resu
25b0: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 lts:. *.A callba
25c0: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 ck bound to the
25d0: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72 socket may retur
25e0: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 n one of:. *.
25f0: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 0...- the certi
2600: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 ficate is deemed
2610: 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20 76 invalid, send v
2620: 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09 erification. *..
2630: 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65 72 .. failure aler
2640: 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20 74 t to peer, and t
2650: 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68 61 erminate handsha
2660: 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09 2d ke.. *. 1...-
2670: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
2680: 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 64 is deemed valid
2690: 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 , continue with
26a0: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 handshake.. *.
26b0: 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d empty string.-
26c0: 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65 no change to ce
26d0: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 rtificate valida
26e0: 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 tion. *. * Side
26f0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 effects:. *.The
2700: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 err field of the
2710: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 currently opera
2720: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 tive State is se
2730: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 t. *. to a stri
2740: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 ng describing th
2750: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f e SSL negotiatio
2760: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e n failure reason
2770: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
27c0: 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 43 atic int.VerifyC
27d0: 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 allback(int ok,
27e0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a X509_STORE_CTX *
27f0: 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f ctx) {. Tcl_O
2800: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
2810: 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 53 SSL *ssl..= (S
2820: 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 SL*)X509_STORE_C
2830: 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63 TX_get_ex_data(c
2840: 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 tx, SSL_get_ex_d
2850: 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 ata_X509_STORE_C
2860: 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58 TX_idx());. X
2870: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35 509 *cert..= X5
2880: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
2890: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 _current_cert(ct
28a0: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 x);. State *s
28b0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 tatePtr.= (State
28c0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
28d0: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c ta(ssl);. Tcl
28e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
28f0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
2900: 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 74 rp;. int dept
2910: 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f h..= X509_STORE_
2920: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65 CTX_get_error_de
2930: 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 6e pth(ctx);. in
2940: 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 54 t err..= X509_ST
2950: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f ORE_CTX_get_erro
2960: 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 72 r(ctx);.. dpr
2970: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
2980: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 dprintf("Ver
2990: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 ifyCallback: %d"
29a0: 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 , ok);.. if (
29b0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d statePtr->vcmd =
29c0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c = (Tcl_Obj*)NULL
29d0: 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f 6b 20 76 ) {../* Use ok v
29e0: 61 6c 75 65 20 69 66 20 76 65 72 69 66 69 63 61 alue if verifica
29f0: 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 tion is required
2a00: 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 */..if (statePt
2a10: 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c 5f r->vflags & SSL_
2a20: 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e VERIFY_FAIL_IF_N
2a30: 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 O_PEER_CERT) {..
2a40: 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 return ok;..
2a50: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 } else {.. re
2a60: 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d turn 1;..}. }
2a70: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 3d else if (cert =
2a80: 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d = NULL || ssl ==
2a90: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
2aa0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 0;. }.. d
2ab0: 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 printf("VerifyCa
2ac0: 6c 6c 62 61 63 6b 3a 20 63 72 65 61 74 65 20 63 llback: create c
2ad0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 22 allback command"
2ae0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 );.. /* Creat
2af0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
2b00: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c l with fn, chan,
2b10: 20 64 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 depth, cert inf
2b20: 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 o list, status,
2b30: 61 6e 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a and error args *
2b40: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 /. cmdPtr = T
2b50: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
2b60: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
2b70: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2b80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2b90: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
2ba0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
2bb0: 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 verify", -1));.
2bc0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2bd0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2be0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c rp, cmdPtr,..Tcl
2bf0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
2c00: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
2c10: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
2c20: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
2c30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2c40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
2c50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
2c60: 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 bj(depth));.
2c70: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2c80: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2c90: 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 cmdPtr, Tls_New
2ca0: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 X509Obj(interp,
2cb0: 63 65 72 74 2c 20 30 29 29 3b 0a 20 20 20 20 54 cert, 0));. T
2cc0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2cd0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2ce0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 cmdPtr, Tcl_NewI
2cf0: 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 ntObj(ok));.
2d00: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2d10: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2d20: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 cmdPtr,..Tcl_Ne
2d30: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 wStringObj((char
2d40: 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 *)X509_verify_ce
2d50: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
2d60: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 err), -1));..
2d70: 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20 /* Prevent I/O
2d80: 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69 while callback i
2d90: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f s in progress */
2da0: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 . /* statePtr
2db0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 ->flags |= TLS_T
2dc0: 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a CL_CALLBACK; */.
2dd0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 . dprintf("Ve
2de0: 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 rifyCallback: ev
2df0: 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a al callback");..
2e00: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
2e10: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
2e20: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
2e30: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
2e40: 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c 62 ok = EvalCallb
2e50: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
2e60: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 ePtr, cmdPtr);.
2e70: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
2e80: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 unt(cmdPtr);..
2e90: 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 dprintf("Verif
2ea0: 79 43 61 6c 6c 62 61 63 6b 3a 20 63 6f 6d 6d 61 yCallback: comma
2eb0: 6e 64 20 72 65 73 75 6c 74 20 3d 20 25 64 22 2c nd result = %d",
2ec0: 20 6f 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 ok);.. /* st
2ed0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d atePtr->flags &=
2ee0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 ~(TLS_TCL_CALLB
2ef0: 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 ACK); */. ret
2f00: 75 72 6e 20 6f 6b 3b 09 2f 2a 20 42 79 20 64 65 urn ok;./* By de
2f10: 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 fault, leave ver
2f20: 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e ification unchan
2f30: 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 ged. */.}.../*.
2f40: 2a 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 2d 2d ----------------
2f80: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 ----. *. * Tls_E
2f90: 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 rror --. *. *.Ca
2fa0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 lls callback wit
2fb0: 68 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e h error message.
2fc0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
2fd0: 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 cts:. *.The err
2fe0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 field of the cur
2ff0: 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 rently operative
3000: 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a State is set. *
3010: 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 . to a string d
3020: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 escribing the SS
3030: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 L negotiation fa
3040: 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a ilure reason. *.
3050: 20 2a 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: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 -----. */.void.T
30a0: 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a ls_Error(State *
30b0: 73 74 61 74 65 50 74 72 2c 20 63 6f 6e 73 74 20 statePtr, const
30c0: 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 char *msg) {.
30d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
30e0: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
30f0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
3100: 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 Obj *cmdPtr, *li
3110: 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 stPtr;. unsig
3120: 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 ned long err;.
3130: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 statePtr->err
3140: 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 69 = msg;.. dpri
3150: 6e 74 66 28 22 43 61 6c 6c 65 64 20 77 69 74 68 ntf("Called with
3160: 20 6d 65 73 73 61 67 65 20 25 73 22 2c 20 6d 73 message %s", ms
3170: 67 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 g);.. if (sta
3180: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
3190: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
31a0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 L) {..return;.
31b0: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
31c0: 28 22 54 6c 73 5f 45 72 72 6f 72 3a 20 63 72 65 ("Tls_Error: cre
31d0: 61 74 65 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d ate callback com
31e0: 6d 61 6e 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 mand");.. /*
31f0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 Create command t
3200: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 o eval with fn,
3210: 63 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67 chan, and messag
3220: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d e args */. cm
3230: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
3240: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
3250: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 ->callback);.
3260: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3270: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
3280: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
3290: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f wStringObj("erro
32a0: 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 r", -1));. Tc
32b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
32c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
32d0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
32e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
32f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
3300: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
3310: 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d -1));. if (m
3320: 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 sg != NULL) {..T
3330: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3340: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
3350: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 cmdPtr, Tcl_NewS
3360: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 tringObj(msg, -1
3370: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 ));.. } else
3380: 69 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 if ((msg = Tcl_G
3390: 65 74 53 74 72 69 6e 67 28 54 63 6c 5f 47 65 74 etString(Tcl_Get
33a0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
33b0: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ))) != NULL) {..
33c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
33d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
33e0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
33f0: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d StringObj(msg, -
3400: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 1));.. } else
3410: 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 {..listPtr = Tc
3420: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
3430: 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 NULL);..while ((
3440: 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 err = ERR_get_er
3450: 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 ror()) != 0) {..
3460: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3470: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3480: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 erp, listPtr, Tc
3490: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 l_NewStringObj(E
34a0: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f RR_reason_error_
34b0: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 string(err), -1)
34c0: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f );..}..Tcl_ListO
34d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
34e0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
34f0: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a listPtr);. }.
3500: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c . dprintf("Tl
3510: 73 5f 45 72 72 6f 72 3a 20 65 76 61 6c 20 63 61 s_Error: eval ca
3520: 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20 2f llback");.. /
3530: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
3540: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
3550: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
3560: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 cmdPtr);. Eva
3570: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
3580: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
3590: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 tr);. Tcl_Dec
35a0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
35b0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3600: 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c *. * KeyLogCall
3610: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 back --. *. *.Wr
3620: 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 ite received key
3630: 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c data to log fil
3640: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
3650: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 fects:. *.none.
3660: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
36b0: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 KeyLogCallback(
36c0: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 const SSL *ssl,
36d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 const char *line
36e0: 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 ) {. char *st
36f0: 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 r = getenv(SSLKE
3700: 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 YLOGFILE);. F
3710: 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 ILE *fd;.. dp
3720: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
3730: 0a 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b .. if (str) {
3740: 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 ..fd = fopen(str
3750: 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 , "a");..fprintf
3760: 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 (fd, "%s\n",line
3770: 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a );..fclose(fd);.
3780: 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d }.}.../*. *-
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37d0: 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 --. *. * Passwor
37e0: 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a d Callback --. *
37f0: 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 . *.Called when
3800: 61 20 70 61 73 73 77 6f 72 64 20 69 73 20 6e 65 a password is ne
3810: 65 64 65 64 20 66 6f 72 20 61 20 70 72 69 76 61 eded for a priva
3820: 74 65 20 6b 65 79 20 77 68 65 6e 20 6c 6f 61 64 te key when load
3830: 69 6e 67 0a 20 2a 09 6f 72 20 73 74 6f 72 69 6e ing. *.or storin
3840: 67 20 61 20 50 45 4d 20 63 65 72 74 69 66 69 63 g a PEM certific
3850: 61 74 65 20 77 69 74 68 20 65 6e 63 72 79 70 74 ate with encrypt
3860: 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 ion. Evals callb
3870: 61 63 6b 0a 20 2a 09 73 63 72 69 70 74 20 61 6e ack. *.script an
3880: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 d returns the re
3890: 73 75 6c 74 20 61 73 20 74 68 65 20 70 61 73 73 sult as the pass
38a0: 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20 62 word string in b
38b0: 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 uf.. *. * Result
38c0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
38d0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
38e0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
38f0: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
3900: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
3910: 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69 6e Password size in
3920: 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 bytes or -1 for
3930: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a an error.. *. *
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3980: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
3990: 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 nt.PasswordCallb
39a0: 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 ack(char *buf, i
39b0: 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 nt size, int rwf
39c0: 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 lag, void *udata
39d0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
39e0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 tatePtr.= (State
39f0: 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54 *) udata;. T
3a00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3a10: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
3a20: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
3a30: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 j *cmdPtr;. i
3a40: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 54 63 6c nt code;. Tcl
3a50: 5f 53 69 7a 65 20 6c 65 6e 3b 0a 0a 20 20 20 20 _Size len;..
3a60: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
3a70: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f );.. /* If no
3a80: 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 callback, use d
3a90: 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 efault callback
3aa0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
3ab0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d Ptr->password ==
3ac0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 NULL) {..if (Tc
3ad0: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c l_EvalEx(interp,
3ae0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 "tls::password"
3af0: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 , -1, TCL_EVAL_G
3b00: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b LOBAL) == TCL_OK
3b10: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 ) {.. char *r
3b20: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 et = (char *) Tc
3b30: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
3b40: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 bj(Tcl_GetObjRes
3b50: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c 65 ult(interp), &le
3b60: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e n);.. if (len
3b70: 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 > (Tcl_Size) si
3b80: 7a 65 2d 31 29 20 7b 0a 09 09 6c 65 6e 20 3d 20 ze-1) {...len =
3b90: 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d (Tcl_Size) size-
3ba0: 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 1;.. }.. s
3bb0: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c trncpy(buf, ret,
3bc0: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a (size_t) len);.
3bd0: 09 20 20 20 20 62 75 66 5b 6c 65 6e 5d 20 3d 20 . buf[len] =
3be0: 27 5c 30 27 3b 0a 09 20 20 20 20 72 65 74 75 72 '\0';.. retur
3bf0: 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 20 n (int) len;..}
3c00: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 else {.. retu
3c10: 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a rn -1;..}. }.
3c20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 50 61 . dprintf("Pa
3c30: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 3a 20 sswordCallback:
3c40: 63 72 65 61 74 65 20 63 61 6c 6c 62 61 63 6b 20 create callback
3c50: 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 20 20 20 20 command");..
3c60: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
3c70: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 d to eval with f
3c80: 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73 n, rwflag, and s
3c90: 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 ize args */.
3ca0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
3cb0: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
3cc0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 tr->password);.
3cd0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3ce0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3cf0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3d00: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 NewStringObj("pa
3d10: 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 ssword", -1));.
3d20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3d30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
3d40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
3d50: 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 NewIntObj(rwflag
3d60: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
3d70: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3d80: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3d90: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 Tcl_NewIntObj(s
3da0: 69 7a 65 29 29 3b 0a 0a 20 20 20 20 64 70 72 69 ize));.. dpri
3db0: 6e 74 66 28 22 50 61 73 73 77 6f 72 64 43 61 6c ntf("PasswordCal
3dc0: 6c 62 61 63 6b 3a 20 65 76 61 6c 20 63 61 6c 6c lback: eval call
3dd0: 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20 54 63 6c back");.. Tcl
3de0: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
3df0: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
3e00: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
3e10: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
3e20: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a atePtr);.. /*
3e30: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
3e40: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
3e50: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
3e60: 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 mdPtr);. code
3e70: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 = Tcl_EvalObjEx
3e80: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
3e90: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
3ea0: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 );. if (code
3eb0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 != TCL_OK) {.#if
3ec0: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 (TCL_MAJOR_VERS
3ed0: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 ION == 8) && (TC
3ee0: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MINOR_VERSION
3ef0: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 < 6)..Tcl_Backgr
3f00: 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 oundError(interp
3f10: 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 );.#else..Tcl_Ba
3f20: 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f ckgroundExceptio
3f30: 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b n(interp, code);
3f40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 .#endif. }.
3f50: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
3f60: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 nt(cmdPtr);..
3f70: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c Tcl_Release((Cl
3f80: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
3f90: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 tr);.. /* If
3fa0: 73 75 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 successful, pass
3fb0: 20 62 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 back password s
3fc0: 74 72 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 tring and trunca
3fd0: 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a te if too long *
3fe0: 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d /. if (code =
3ff0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 = TCL_OK) {..cha
4000: 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a r *ret = (char *
4010: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
4020: 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 romObj(Tcl_GetOb
4030: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c jResult(interp),
4040: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e &len);..if (len
4050: 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 > (Tcl_Size) si
4060: 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e ze-1) {.. len
4070: 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 = (Tcl_Size) si
4080: 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 ze-1;..}..strncp
4090: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a y(buf, ret, (siz
40a0: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b e_t) len);..buf[
40b0: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 len] = '\0';..Tc
40c0: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
40d0: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
40e0: 09 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 .return (int) le
40f0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c n;. }. Tcl
4100: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
4110: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 Data) interp);.
4120: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a return -1;.}.
4130: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
4180: 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 Session Callbac
4190: 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d k for Clients --
41a0: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 . *. *.Called wh
41b0: 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e en a new session
41c0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 is added to the
41d0: 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 cache. In TLS 1
41e0: 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 .3. *.this may b
41f0: 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 e received multi
4200: 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 ple times after
4210: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 the handshake. F
4220: 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 or. *.earlier ve
4230: 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c rsions, this wil
4240: 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 l be received du
4250: 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 ring the handsha
4260: 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 ke.. *.This is t
4270: 68 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 he preferred way
4280: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 to obtain a res
4290: 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a umable session..
42a0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
42b0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.None. *. * Sid
42c0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 e effects:. *.Ca
42d0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 lls callback (if
42e0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 defined). *. *
42f0: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a Return codes:. *
4300: 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 .0 = error where
4310: 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 session will be
4320: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d immediately rem
4330: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e oved from the in
4340: 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a ternal cache.. *
4350: 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 .1 = success whe
4360: 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 re app retains s
4370: 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f ession in sessio
4380: 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 n cache, and mus
4390: 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 t call SSL_SESSI
43a0: 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 ON_free() when d
43b0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4400: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 /.static int.Ses
4410: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c sionCallback(SSL
4420: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 *ssl, SSL_SESSI
4430: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 ON *session) {.
4440: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
4450: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
4460: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
4470: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
4480: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4490: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e p.= statePtr->in
44a0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 terp;. Tcl_Ob
44b0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
44c0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
44d0: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 ar *ticket;.
44e0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
44f0: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b har *session_id;
4500: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 . size_t len2
4510: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 ;. unsigned i
4520: 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 nt ulen;.. dp
4530: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
4540: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
4550: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 tr->callback ==
4560: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
4570: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
4580: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
4590: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 } else if (ssl
45a0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
45b0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
45c0: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
45d0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f /* Create co
45e0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 mmand to eval wi
45f0: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 th fn, chan, ses
4600: 73 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e sion id, session
4610: 20 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 ticket, and lif
4620: 65 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 etime args */.
4630: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
4640: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
4650: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
4660: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
4670: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
4680: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
4690: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
46a0: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a session", -1));.
46b0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
46c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
46d0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
46e0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
46f0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 bj(Tcl_GetChanne
4700: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
4710: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 self), -1));..
4720: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 /* Session id
4730: 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 */. session_i
4740: 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f d = SSL_SESSION_
4750: 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 get_id(session,
4760: 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f &ulen);. Tcl_
4770: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4780: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
4790: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
47a0: 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e ArrayObj(session
47b0: 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 _id, (Tcl_Size)
47c0: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 ulen));.. /*
47d0: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a Session ticket *
47e0: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f /. SSL_SESSIO
47f0: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
4800: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
4810: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f &len2);. Tcl_
4820: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
4830: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
4840: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 Ptr, Tcl_NewByte
4850: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c ArrayObj(ticket,
4860: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
4870: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 ));.. /* Life
4880: 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 time - number of
4890: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 seconds */.
48a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
48b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
48c0: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 cmdPtr,..Tcl_Ne
48d0: 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 wLongObj((long)
48e0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
48f0: 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f ticket_lifetime_
4900: 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b hint(session)));
4910: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
4920: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
4930: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
4940: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
4950: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b EvalCallback
4960: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
4970: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 r, cmdPtr);.
4980: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
4990: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f (cmdPtr);.. /
49a0: 2a 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e * Return 0 for n
49b0: 6f 77 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e ow until session
49c0: 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d handling is com
49d0: 70 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 plete */. ret
49e0: 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a urn 0;.}.../*. *
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a30: 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 ---. *. * ALPN C
4a40: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 allback for Serv
4a50: 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c ers and NPN Call
4a60: 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 back for Clients
4a70: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 --. *. *.Perfor
4a80: 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 m protocol (http
4a90: 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 /1.1, h2, h3, et
4aa0: 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f c.) selection fo
4ab0: 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e r the. *.incomin
4ac0: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 g connection. Ca
4ad0: 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f lled after Hello
4ae0: 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c and server call
4af0: 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 backs.. *.Where
4b00: 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 'out' is selecte
4b10: 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 d protocol and '
4b20: 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20 in' is the peer
4b30: 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e advertised list.
4b40: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
4b50: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
4b60: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
4b70: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
4b80: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
4b90: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 Return codes:.
4ba0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
4bb0: 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 _OK: ALPN protoc
4bc0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 ol selected. The
4bd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 connection cont
4be0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c inues.. *.SSL_TL
4bf0: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 SEXT_ERR_ALERT_F
4c00: 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 ATAL: There was
4c10: 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 no overlap betwe
4c20: 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a en the client's.
4c30: 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 *. supplied
4c40: 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 list and the ser
4c50: 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f ver configuratio
4c60: 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f n. The connectio
4c70: 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 n will be aborte
4c80: 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 d.. *.SSL_TLSEXT
4c90: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e _ERR_NOACK: ALPN
4ca0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 protocol not se
4cb0: 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 lected, e.g., be
4cc0: 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a cause no ALPN. *
4cd0: 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 . protocols a
4ce0: 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f re configured fo
4cf0: 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f r this connectio
4d00: 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f n. The connectio
4d10: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a n continues.. *.
4d20: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d60: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
4d70: 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 int.ALPNCallbac
4d80: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 k(SSL *ssl, cons
4d90: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
4da0: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 **out, unsigned
4db0: 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 char *outlen,..c
4dc0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
4dd0: 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 ar *in, unsigned
4de0: 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 int inlen, void
4df0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 *arg) {. Sta
4e00: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
4e10: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 State*)arg;.
4e20: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
4e30: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
4e40: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
4e50: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
4e60: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a int code, res;..
4e70: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
4e80: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
4e90: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 ssl == NULL || a
4ea0: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 rg == NULL) {..r
4eb0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 eturn SSL_TLSEXT
4ec0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 _ERR_NOACK;.
4ed0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 }.. /* Select
4ee0: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 protocol */.
4ef0: 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f if (SSL_select_
4f00: 6e 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 next_proto((unsi
4f10: 67 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 gned char **) ou
4f20: 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 t, outlen, state
4f30: 50 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 Ptr->protos, sta
4f40: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 tePtr->protos_le
4f50: 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d n,..in, inlen) =
4f60: 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 = OPENSSL_NPN_NE
4f70: 47 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 GOTIATED) {../*
4f80: 4d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 Match found */..
4f90: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
4fa0: 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 _ERR_OK;. } e
4fb0: 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 lse {../* OPENSS
4fc0: 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 L_NPN_NO_OVERLAP
4fd0: 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 = No overlap, s
4fe0: 6f 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d o use first item
4ff0: 20 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f from client pro
5000: 74 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 tocol list */..r
5010: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
5020: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
5030: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
5040: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c tr->vcmd == (Tcl
5050: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 _Obj*)NULL) {..r
5060: 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d eturn res;. }
5070: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
5080: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
5090: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 with fn, chan, d
50a0: 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 epth, cert info
50b0: 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e list, status, an
50c0: 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a d error args */.
50d0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
50e0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
50f0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 atePtr->vcmd);.
5100: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5110: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5120: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
5130: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c NewStringObj("al
5140: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 pn", -1));. T
5150: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
5160: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
5170: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
5180: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
5190: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
51a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
51b0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
51c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
51d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
51e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
51f0: 6e 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 ngObj((const cha
5200: 72 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b r *) *out, -1));
5210: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
5220: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
5230: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
5240: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 l_NewBooleanObj(
5250: 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 res == SSL_TLSEX
5260: 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 T_ERR_OK));..
5270: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
5280: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
5290: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
52a0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 t(cmdPtr);. i
52b0: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 f ((code = EvalC
52c0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
52d0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
52e0: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d )) > 1) {..res =
52f0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5300: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 NOACK;. } els
5310: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 e if (code == 1)
5320: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
5330: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
5340: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
5350: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
5360: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 ALERT_FATAL;.
5370: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
5380: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
5390: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b . return res;
53a0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a -------------. *
53f0: 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 . * Advertise Pr
5400: 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b otocols Callback
5410: 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 for Next Protoc
5420: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 ol Negotiation (
5430: 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 NPN) in ServerHe
5440: 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c llo --. *. *.cal
5450: 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 led when a TLS s
5460: 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 erver needs a li
5470: 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 st of supported
5480: 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 protocols for Ne
5490: 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e xt. *.Protocol N
54a0: 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 egotiation.. *.
54b0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
54c0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
54d0: 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 fects:. *. * Ret
54e0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 urn codes:. *.SS
54f0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a L_TLSEXT_ERR_OK:
5500: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 NPN protocol se
5510: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e lected. The conn
5520: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 ection continues
5530: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
5540: 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 ERR_NOACK: NPN p
5550: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 rotocol not sele
5560: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 cted. The connec
5570: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a tion continues..
5580: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
5590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 --------. */.#if
55d0: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 def USE_NPN.stat
55e0: 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 ic int.NPNCallba
55f0: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 ck(const SSL *ss
5600: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 l, const unsigne
5610: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e d char **out, un
5620: 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c signed int *outl
5630: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b en, void *arg) {
5640: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
5650: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
5660: 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 rg;.. dprintf
5670: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
5680: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
5690: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 || arg == NULL)
56a0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
56b0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
56c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
56d0: 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 et protocols lis
56e0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 t */. if (sta
56f0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d tePtr->protos !=
5700: 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d NULL) {..*out =
5710: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f statePtr->proto
5720: 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 s;..*outlen = st
5730: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c atePtr->protos_l
5740: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b en;. } else {
5750: 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 ..*out = NULL;..
5760: 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 *outlen = 0;..re
5770: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
5780: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
5790: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f . return SSL_
57a0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d TLSEXT_ERR_OK;.}
57b0: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d .#endif.../*. *-
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5800: 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c --. *. * SNI Cal
5810: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 lback for Server
5820: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f s --. *. *.Perfo
5830: 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 rm server-side S
5840: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 NI hostname sele
5850: 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 ction after rece
5860: 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 iving SNI extens
5870: 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 ion. *.in Client
5880: 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 Hello. Called a
5890: 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 fter hello callb
58a0: 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 ack but before A
58b0: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a LPN callback.. *
58c0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
58d0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
58e0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
58f0: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
5900: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 efined). *. * Re
5910: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 turn codes:. *.S
5920: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b SL_TLSEXT_ERR_OK
5930: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 : SNI hostname i
5940: 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 s accepted. The
5950: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 connection conti
5960: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 nues.. *.SSL_TLS
5970: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 EXT_ERR_ALERT_FA
5980: 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d TAL: SNI hostnam
5990: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 e is not accepte
59a0: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f d. The connectio
59b0: 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 n. *. is abor
59c0: 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 ted. Default for
59d0: 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 alert is SSL_AD
59e0: 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 _UNRECOGNIZED_NA
59f0: 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 ME.. *.SSL_TLSEX
5a00: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e T_ERR_ALERT_WARN
5a10: 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d ING: SNI hostnam
5a20: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 e is not accepte
5a30: 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 d, warning alert
5a40: 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f . *. sent (no
5a50: 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 t supported in T
5a60: 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e LSv1.3). The con
5a70: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
5a80: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 s.. *.SSL_TLSEXT
5a90: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 _ERR_NOACK: SNI
5aa0: 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 hostname is not
5ab0: 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 accepted and not
5ac0: 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 acknowledged,.
5ad0: 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e *. e.g. if SN
5ae0: 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 I has not been c
5af0: 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 onfigured. The c
5b00: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
5b10: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ues.. *. *------
5b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5b60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 /.static int.SNI
5b70: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
5b80: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c SL *ssl, int *al
5b90: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 ert, void *arg)
5ba0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
5bb0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
5bc0: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 arg;. Tcl_Int
5bd0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
5be0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
5bf0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
5c00: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 Ptr;. int cod
5c10: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 e, res;. cons
5c20: 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 t char *serverna
5c30: 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 me = NULL;..
5c40: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
5c50: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 );.. if (ssl
5c60: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d == NULL || arg =
5c70: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
5c80: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
5c90: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 _NOACK;. }..
5ca0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 /* Only works
5cb0: 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 for TLS 1.2 and
5cc0: 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 earlier */.
5cd0: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c servername = SSL
5ce0: 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 _get_servername(
5cf0: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 ssl, TLSEXT_NAME
5d00: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b TYPE_host_name);
5d10: 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 . if (!server
5d20: 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 name || serverna
5d30: 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b me[0] == '\0') {
5d40: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
5d50: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
5d60: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
5d70: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 atePtr->vcmd ==
5d80: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 (Tcl_Obj*)NULL)
5d90: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c {..return SSL_TL
5da0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
5db0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
5dc0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
5dd0: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c l with fn, chan,
5de0: 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 and server name
5df0: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 args */. cmd
5e00: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
5e10: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
5e20: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f >vcmd);. Tcl_
5e30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
5e40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
5e50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
5e60: 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 ngObj("sni", -1)
5e70: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
5e80: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
5e90: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
5ea0: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
5eb0: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 ngObj(Tcl_GetCha
5ec0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
5ed0: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a r->self), -1));.
5ee0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
5ef0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
5f00: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
5f10: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 _NewStringObj(se
5f20: 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b rvername , -1));
5f30: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 .. /* Eval ca
5f40: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a llback command *
5f50: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 /. Tcl_IncrRe
5f60: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
5f70: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 if ((code =
5f80: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 EvalCallback(int
5f90: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 erp, statePtr, c
5fa0: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 mdPtr)) > 1) {..
5fb0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 res = SSL_TLSEXT
5fc0: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 _ERR_ALERT_WARNI
5fd0: 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 NG;..*alert = SS
5fe0: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 L_AD_UNRECOGNIZE
5ff0: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 D_NAME; /* Not s
6000: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 upported by TLS
6010: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 1.3 */. } els
6020: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 e if (code == 1)
6030: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
6040: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 SEXT_ERR_OK;.
6050: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d } else {..res =
6060: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
6070: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 ALERT_FATAL;..*a
6080: 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e lert = SSL_AD_UN
6090: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b RECOGNIZED_NAME;
60a0: 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 /* Not supporte
60b0: 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a d by TLS 1.3 */.
60c0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
60d0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
60e0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 r);. return r
60f0: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d es;.}.../*. *---
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6140: 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c . *. * ClientHel
6150: 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c lo Handshake Cal
6160: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 lback for Server
6170: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 s --. *. *.Used
6180: 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 by server to exa
6190: 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 mine the server
61a0: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 name indication
61b0: 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a (SNI) extension.
61c0: 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 *.provided by t
61d0: 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 he client in ord
61e0: 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 er to select an
61f0: 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 appropriate cert
6200: 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 ificate to. *.pr
6210: 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 esent, and make
6220: 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 other configurat
6230: 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 ion adjustments
6240: 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 relevant to that
6250: 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 server. *.name
6260: 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 and its configur
6270: 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c ation. This incl
6280: 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 udes swapping ou
6290: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 t the associated
62a0: 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e . *.SSL_CTX poin
62b0: 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 ter, modifying t
62c0: 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 he server's list
62d0: 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c of permitted TL
62e0: 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 S versions,. *.c
62f0: 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 hanging the serv
6300: 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 er's cipher list
6310: 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 in response to
6320: 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 the client's cip
6330: 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 her list, etc..
6340: 2a 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 *.Called before
6350: 53 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c SNI and ALPN cal
6360: 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 lbacks.. *. * Re
6370: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
6380: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
6390: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
63a0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
63b0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 ). *. * Return c
63c0: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 odes:. *.SSL_CLI
63d0: 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a ENT_HELLO_RETRY:
63e0: 20 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e suspend the han
63f0: 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 dshake, and the
6400: 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 handshake functi
6410: 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 on will return i
6420: 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 mmediately. *.SS
6430: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 L_CLIENT_HELLO_E
6440: 52 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 RROR: failure, t
6450: 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 erminate connect
6460: 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 ion. Set alert t
6470: 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a o error code.. *
6480: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c .SSL_CLIENT_HELL
6490: 4f 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 O_SUCCESS: succe
64a0: 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ss. *. *--------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
64f0: 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f static int.Hello
6500: 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 Callback(SSL *ss
6510: 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 l, int *alert, v
6520: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 oid *arg) {.
6530: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
6540: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 = (State*)arg;.
6550: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
6560: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
6570: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
6580: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
6590: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 int code, res
65a0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
65b0: 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 *servername;.
65c0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
65d0: 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 char *p;. si
65e0: 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e ze_t len, remain
65f0: 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ing;.. dprint
6600: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
6610: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
6620: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a vcmd == (Tcl_Obj
6630: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
6640: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
6650: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 LO_SUCCESS;.
6660: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d } else if (ssl =
6670: 3d 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e = (const SSL *)N
6680: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 ULL || arg == (v
6690: 6f 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 oid *)NULL) {..r
66a0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
66b0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
66c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
66d0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 names */. if
66e0: 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c (!SSL_client_hel
66f0: 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c lo_get0_ext(ssl,
6700: 20 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 TLSEXT_TYPE_ser
6710: 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 ver_name, &p, &r
6720: 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d emaining) || rem
6730: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 aining <= 2) {..
6740: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 *alert = SSL_R_S
6750: 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 SLV3_ALERT_ILLEG
6760: 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 AL_PARAMETER;..r
6770: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6780: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
6790: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 }.. /* Extr
67a0: 61 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f act the length o
67b0: 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c f the supplied l
67c0: 69 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f ist of names. */
67d0: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b . len = (*(p+
67e0: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 +) << 8);. le
67f0: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 n += *(p++);.
6800: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 if (len + 2 !=
6810: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 remaining) {..*a
6820: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c lert = SSL_R_SSL
6830: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c V3_ALERT_ILLEGAL
6840: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 _PARAMETER;..ret
6850: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
6860: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
6870: 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 }. remaining
6880: 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 = len;.. /* T
6890: 68 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 he list in pract
68a0: 69 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 ice only has a s
68b0: 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 ingle element, s
68c0: 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 o we only consid
68d0: 65 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 er the first one
68e0: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d . */. if (rem
68f0: 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a aining == 0 || *
6900: 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 p++ != TLSEXT_NA
6910: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 METYPE_host_name
6920: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
6930: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
6940: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a INTERNAL_ERROR;.
6950: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 .return SSL_CLIE
6960: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
6970: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e }. remain
6980: 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e ing--;.. /* N
6990: 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c ow we can finall
69a0: 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 y pull out the b
69b0: 79 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 yte array with t
69c0: 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 he actual hostna
69d0: 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 me. */. if (r
69e0: 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b emaining <= 2) {
69f0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 ..*alert = SSL_R
6a00: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 _TLSV1_ALERT_INT
6a10: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 ERNAL_ERROR;..re
6a20: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f turn SSL_CLIENT_
6a30: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 HELLO_ERROR;.
6a40: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 }. len = (*(
6a50: 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 p++) << 8);.
6a60: 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 len += *(p++);.
6a70: 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e if (len + 2 >
6a80: 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a remaining) {..*
6a90: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c alert = SSL_R_TL
6aa0: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e SV1_ALERT_INTERN
6ab0: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 AL_ERROR;..retur
6ac0: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
6ad0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
6ae0: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 remaining =
6af0: 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e len;. servern
6b00: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 ame = (const cha
6b10: 72 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 r *)p;.. /* C
6b20: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
6b30: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 eval with fn, c
6b40: 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 han, and server
6b50: 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 name args */.
6b60: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
6b70: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
6b80: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 Ptr->vcmd);.
6b90: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
6ba0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
6bb0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
6bc0: 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f StringObj("hello
6bd0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
6be0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
6bf0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
6c00: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
6c10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
6c20: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
6c30: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
6c40: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
6c50: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6c60: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
6c70: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
6c80: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 Obj(servername,
6c90: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 (Tcl_Size) len))
6ca0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
6cb0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
6cc0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
6cd0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
6ce0: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d . if ((code =
6cf0: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
6d00: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
6d10: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a cmdPtr)) > 1) {.
6d20: 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e .res = SSL_CLIEN
6d30: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 T_HELLO_RETRY;..
6d40: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 *alert = SSL_R_T
6d50: 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f LSV1_ALERT_USER_
6d60: 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d CANCELLED;. }
6d70: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d else if (code =
6d80: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 = 1) {..res = SS
6d90: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 L_CLIENT_HELLO_S
6da0: 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c UCCESS;. } el
6db0: 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f se {..res = SSL_
6dc0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6dd0: 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 OR;..*alert = SS
6de0: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f L_R_TLSV1_ALERT_
6df0: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a INTERNAL_ERROR;.
6e00: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 }. Tcl_De
6e10: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
6e20: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 r);. return r
6e30: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a es;.}.../*******
6e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f *************/./
6e50: 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 * Commands
6e60: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a */./*********
6e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a ***********/../*
6e80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ec0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 ------. *. * Cip
6ed0: 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 hersObjCmd -- li
6ee0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 st available cip
6ef0: 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 hers. *. *.This
6f00: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
6f10: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
6f20: 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 the "tls::cipher
6f30: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f s" command. *.to
6f40: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 list available
6f50: 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 ciphers, based u
6f60: 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c pon protocol sel
6f70: 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 ected.. *. * Res
6f80: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
6f90: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c ard Tcl result l
6fa0: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ist.. *. * Side
6fb0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 effects:. *.cons
6fc0: 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 tructs and destr
6fd0: 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 oys SSL context
6fe0: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d (CTX). *. *-----
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
7030: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 */.static const
7040: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b char *protocols[
7050: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 ] = {.."ssl2", "
7060: 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 ssl3", "tls1", "
7070: 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 tls1.1", "tls1.2
7080: 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c ", "tls1.3", NUL
7090: 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 L.};.enum protoc
70a0: 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c ol {. TLS_SSL
70b0: 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 2, TLS_SSL3, TLS
70c0: 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f _TLS1, TLS_TLS1_
70d0: 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 1, TLS_TLS1_2, T
70e0: 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e LS_TLS1_3, TLS_N
70f0: 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 ONE.};..static i
7100: 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 nt.CiphersObjCmd
7110: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
7120: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
7130: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
7140: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
7150: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
7160: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
7170: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 tr = NULL;. S
7180: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 SL_CTX *ctx = NU
7190: 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c LL;. SSL *ssl
71a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 = NULL;. STA
71b0: 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 CK_OF(SSL_CIPHER
71c0: 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 ) *sk;. char
71d0: 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 buf[BUFSIZ];.
71e0: 20 54 63 6c 5f 53 69 7a 65 20 69 6e 64 65 78 3b Tcl_Size index;
71f0: 0a 20 20 20 20 69 6e 74 20 76 65 72 62 6f 73 65 . int verbose
7200: 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 = 0, use_suppor
7210: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e ted = 0;. con
7220: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d st SSL_METHOD *m
7230: 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f 69 64 ethod;. (void
7240: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
7250: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
7260: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 ed");.. if ((
7270: 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 objc < 2) || (ob
7280: 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f jc > 4)) {..Tcl_
7290: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
72a0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 erp, 1, objv, "p
72b0: 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 rotocol ?verbose
72c0: 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b ? ?supported?");
72d0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
72e0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
72f0: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 (Tcl_GetIndexFr
7300: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
7310: 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 jv[1], protocols
7320: 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c , "protocol", 0,
7330: 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f &index) != TCL_
7340: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
7350: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
7360: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32 if ((objc > 2
7370: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c ) && Tcl_GetBool
7380: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 eanFromObj(inter
7390: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72 p, objv[2], &ver
73a0: 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 bose) != TCL_OK)
73b0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
73c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
73d0: 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26 if ((objc > 3) &
73e0: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e & Tcl_GetBoolean
73f0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
7400: 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75 objv[3], &use_su
7410: 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f pported) != TCL_
7420: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
7430: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
7440: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
7450: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74 ror();.. swit
7460: 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 ch ((enum protoc
7470: 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 ol)index) {..cas
7480: 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 e TLS_SSL2:.#if
7490: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
74a0: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 NUMBER >= 0x1010
74b0: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 0000L || defined
74c0: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 (NO_SSL2) || def
74d0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
74e0: 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 SSL2).. Tcl_A
74f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7500: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e rp, protocols[in
7510: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f dex], ": protoco
7520: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
7530: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
7540: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
7550: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
7560: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c method = SSL
7570: 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 v2_method(); bre
7580: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 ak;.#endif..case
7590: 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 TLS_SSL3:.#if d
75a0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
75b0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
75c0: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 SL_NO_SSL3) || d
75d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
75e0: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 O_SSL3_METHOD)..
75f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
7600: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
7610: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
7620: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
7630: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 upported", (char
7640: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
7650: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7660: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 ;.#else.. met
7670: 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 hod = SSLv3_meth
7680: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e od(); break;.#en
7690: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c dif..case TLS_TL
76a0: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 S1:.#if defined(
76b0: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 NO_TLS1) || defi
76c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
76d0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
76e0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
76f0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c METHOD).. Tcl
7700: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
7710: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b terp, protocols[
7720: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f index], ": proto
7730: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
7740: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
7750: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
7760: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
7770: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 .. method = T
7780: 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 LSv1_method(); b
7790: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 reak;.#endif..ca
77a0: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 se TLS_TLS1_1:.#
77b0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
77c0: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 S1_1) || defined
77d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
77e0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
77f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
7800: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
7810: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
7820: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
7830: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
7840: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
7850: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
7860: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
7870: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
7880: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 e.. method =
7890: 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 TLSv1_1_method()
78a0: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
78b0: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 .case TLS_TLS1_2
78c0: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
78d0: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
78e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
78f0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
7900: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
7910: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 1_2_METHOD)..
7920: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
7930: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
7940: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
7950: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
7960: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
7970: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 NULL);.. ret
7980: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
7990: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 else.. method
79a0: 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f = TLSv1_2_metho
79b0: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 d(); break;.#end
79c0: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
79d0: 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 1_3:.#if defined
79e0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 (NO_TLS1_3) || d
79f0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7a00: 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 O_TLS1_3).. T
7a10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7a20: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
7a30: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
7a40: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
7a50: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
7a60: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
7a70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
7a80: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d se.. method =
7a90: 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 TLS_method();..
7aa0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
7ab0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
7ac0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
7ad0: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c RSION);.. SSL
7ae0: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f _CTX_set_max_pro
7af0: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
7b00: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b TLS1_3_VERSION);
7b10: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e .. break;.#en
7b20: 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 dif..default:..
7b30: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f method = TLS_
7b40: 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62 method();.. b
7b50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
7b60: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e ctx = SSL_CTX_n
7b70: 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 ew(method);.
7b80: 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 if (ctx == NULL)
7b90: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
7ba0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54 sult(interp, GET
7bb0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
7bc0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
7bd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7be0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c ;. }.. ssl
7bf0: 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b = SSL_new(ctx);
7c00: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 . if (ssl ==
7c10: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
7c20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7c30: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
7c40: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
7c50: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
7c60: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
7c70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7c80: 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 .. /* Use lis
7c90: 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77 t and order as w
7ca0: 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20 ould be sent in
7cb0: 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 a ClientHello or
7cc0: 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 all available c
7cd0: 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 iphers */. if
7ce0: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 (use_supported)
7cf0: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 {..sk = SSL_get
7d00: 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68 1_supported_ciph
7d10: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 ers(ssl);. }
7d20: 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c else {..sk = SSL
7d30: 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c _get_ciphers(ssl
7d40: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
7d50: 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (sk != NULL) {.
7d60: 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b .if (!verbose) {
7d70: 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 .. const char
7d80: 20 2a 63 70 3b 0a 09 20 20 20 20 6f 62 6a 50 74 *cp;.. objPt
7d90: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
7da0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 bj(0, NULL);..
7db0: 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 for (int i = 0
7dc0: 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 ; i < sk_SSL_CIP
7dd0: 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b HER_num(sk); i++
7de0: 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f ) {...const SSL_
7df0: 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 CIPHER *c = sk_S
7e00: 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 SL_CIPHER_value(
7e10: 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 sk, i);...if (c
7e20: 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 == NULL) continu
7e30: 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 e;..../* cipher
7e40: 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a name or (NONE) *
7e50: 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 /...cp = SSL_CIP
7e60: 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b HER_get_name(c);
7e70: 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c ...if (cp == NUL
7e80: 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f L) break;...Tcl_
7e90: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
7ea0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
7eb0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
7ec0: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 20 63 ngObj((char *) c
7ed0: 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a p, -1));.. }.
7ee0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
7ef0: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
7f00: 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b StringObj("",0);
7f10: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 .. for (int i
7f20: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c = 0; i < sk_SSL
7f30: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b _CIPHER_num(sk);
7f40: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 i++) {...const
7f50: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 SSL_CIPHER *c =
7f60: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 sk_SSL_CIPHER_va
7f70: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 lue(sk, i);...if
7f80: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e (c == NULL) con
7f90: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 tinue;..../* tex
7fa0: 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e tual description
7fb0: 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a of the cipher *
7fc0: 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 /...if (SSL_CIPH
7fd0: 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 ER_description(c
7fe0: 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 , buf, sizeof(bu
7ff0: 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 f)) != NULL) {..
8000: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 . Tcl_AppendT
8010: 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 oObj(objPtr, buf
8020: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 74 72 , (Tcl_Size) str
8030: 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 65 len(buf));...} e
8040: 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f lse {... Tcl_
8050: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 AppendToObj(objP
8060: 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c tr, "UNKNOWN\n",
8070: 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 8);...}.. }.
8080: 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 70 70 .}..if (use_supp
8090: 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 73 6b orted) {.. sk
80a0: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 65 _SSL_CIPHER_free
80b0: 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 (sk);..}. }.
80c0: 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 SSL_free(ssl)
80d0: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 ;. SSL_CTX_fr
80e0: 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 ee(ctx);.. Tc
80f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
8100: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
8110: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
8120: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
8170: 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f *. * ProtocolsO
8180: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 bjCmd -- list av
8190: 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c ailable protocol
81a0: 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f s. *. *.This pro
81b0: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
81c0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 d to process the
81d0: 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 "tls::protocols
81e0: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 " command. *.to
81f0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 list available p
8200: 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 rotocols.. *. *
8210: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
8220: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
8230: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 t list.. *. * Si
8240: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e de effects:. *.n
8250: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d one. *. *-------
8260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
82a0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 .static int.Prot
82b0: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 ocolsObjCmd(Clie
82c0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
82d0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
82e0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
82f0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
8300: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
8310: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 l_Obj *objPtr;.
8320: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 (void) client
8330: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e Data;.. dprin
8340: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
8350: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 if (objc != 1
8360: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
8370: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
8380: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 objv, "");..ret
8390: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
83a0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c }.. ERR_cl
83b0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 ear_error();..
83c0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
83d0: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
83e0: 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c L);..#if OPENSSL
83f0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
8400: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
8410: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
8420: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
8430: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
8440: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
8450: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
8460: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c erp, objPtr, Tcl
8470: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 _NewStringObj(pr
8480: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 otocols[TLS_SSL2
8490: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
84a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
84b0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 SSL3) && !define
84c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
84d0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
84e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d PENSSL_NO_SSL3_M
84f0: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c ETHOD). Tcl_L
8500: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
8510: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
8520: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
8530: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 gObj(protocols[T
8540: 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a LS_SSL3], -1));.
8550: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
8560: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 ned(NO_TLS1) &&
8570: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
8580: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 _NO_TLS1) && !de
8590: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
85a0: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 _TLS1_METHOD).
85b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
85c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
85d0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
85e0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
85f0: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c ocols[TLS_TLS1],
8600: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 -1));.#endif.#i
8610: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
8620: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
8630: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
8640: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_1) && !defined
8650: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8660: 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 _1_METHOD). T
8670: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
8680: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
8690: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
86a0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
86b0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 ls[TLS_TLS1_1],
86c0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 -1));.#endif.#if
86d0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
86e0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
86f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
8700: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _2) && !defined(
8710: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
8720: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 2_METHOD). Tc
8730: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
8740: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
8750: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
8760: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
8770: 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d s[TLS_TLS1_2], -
8780: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 1));.#endif.#if
8790: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
87a0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _3) && !defined(
87b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
87c0: 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 3). Tcl_ListO
87d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
87e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
87f0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
8800: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 (protocols[TLS_T
8810: 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 LS1_3], -1));.#e
8820: 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 ndif.. Tcl_Se
8830: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
8840: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
8850: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
8860: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
88b0: 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d * HandshakeObjCm
88c0: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
88d0: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 command is used
88e0: 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 65 to verify whethe
88f0: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 r the handshake
8900: 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f is complete. *.o
8910: 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 r not.. *. * Res
8920: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
8930: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 ard Tcl result.
8940: 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 1 means handshak
8950: 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 e complete, 0 me
8960: 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a ans pending.. *.
8970: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
8980: 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 . *.May force SS
8990: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f L negotiation to
89a0: 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a take place.. *.
89b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
89c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89f0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
8a00: 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 int HandshakeOb
8a10: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
8a20: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
8a30: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
8a40: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
8a50: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
8a60: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e {. Tcl_Chann
8a70: 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 el chan;
8a80: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 /* The channel t
8a90: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e o set a mode on.
8aa0: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 */. State *s
8ab0: 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 tatePtr;
8ac0: 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 /* client state
8ad0: 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a for ssl socket *
8ae0: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 /. const char
8af0: 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b *errStr = NULL;
8b00: 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 . int ret = 1
8b10: 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 ;. int err =
8b20: 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 0;. (void) cl
8b30: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 ientData;.. d
8b40: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
8b50: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
8b60: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
8b70: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
8b80: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
8b90: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 nel");..return T
8ba0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
8bb0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
8bc0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 rror();.. cha
8bd0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
8be0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
8bf0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d etString(objv[1]
8c00: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ), NULL);. if
8c10: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
8c20: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
8c30: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
8c40: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
8c50: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
8c60: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
8c70: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a most channel */.
8c80: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
8c90: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
8ca0: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f n);. if (Tcl_
8cb0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
8cc0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
8cd0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 nelType()) {..Tc
8ce0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
8cf0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
8d00: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
8d10: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
8d20: 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 ),.. "\": not
8d30: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
8d40: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
8d50: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
8d60: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
8d70: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 , "HANDSHAKE", "
8d80: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
8d90: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ID", (char *) NU
8da0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
8db0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
8dc0: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 statePtr = (St
8dd0: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
8de0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
8df0: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 (chan);.. dpr
8e00: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c intf("Calling Tl
8e10: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
8e20: 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c ");. ret = Tl
8e30: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
8e40: 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c (statePtr, &err,
8e50: 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 1);. dprintf
8e60: 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e ("Tls_WaitForCon
8e70: 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 nect returned: %
8e80: 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 i", ret);.. i
8e90: 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 f (ret < 0 && ((
8ea0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
8eb0: 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 & TLS_TCL_ASYNC)
8ec0: 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 && (err == EAGA
8ed0: 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 IN))) {..dprintf
8ee0: 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 ("Async set and
8ef0: 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a err = EAGAIN");.
8f00: 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 .ret = 0;. }
8f10: 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 else if (ret < 0
8f20: 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 ) {..long result
8f30: 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 ;..errStr = stat
8f40: 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f ePtr->err;..Tcl_
8f50: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 ResetResult(inte
8f60: 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 rp);..Tcl_SetErr
8f70: 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 no(err);...if (!
8f80: 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 errStr || (*errS
8f90: 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 tr == 0)) {..
8fa0: 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f errStr = Tcl_Po
8fb0: 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 sixError(interp)
8fc0: 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e ;..}...Tcl_Appen
8fd0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
8fe0: 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 "handshake faile
8ff0: 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 d: ", errStr, (c
9000: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 69 har *) NULL);..i
9010: 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53 53 4c f ((result = SSL
9020: 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 _get_verify_resu
9030: 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c lt(statePtr->ssl
9040: 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 )) != X509_V_OK)
9050: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
9060: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
9070: 20 22 20 64 75 65 20 74 6f 20 5c 22 22 2c 20 58 " due to \"", X
9080: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 509_verify_cert_
9090: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 error_string(res
90a0: 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63 68 61 ult), "\"", (cha
90b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 r *) NULL);..}..
90c0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
90d0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
90e0: 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 "HANDSHAKE", "FA
90f0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
9100: 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 NULL);..dprintf(
9110: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 "Returning TCL_E
9120: 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 RROR with handsh
9130: 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c ake failed: %s",
9140: 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 errStr);..retur
9150: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
9160: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 } else {..if (e
9170: 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 rr != 0) {..
9180: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 dprintf("Got an
9190: 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d error with a com
91a0: 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 pleted handshake
91b0: 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 : err = %i", err
91c0: 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a );..}..ret = 1;.
91d0: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
91e0: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 tf("Returning TC
91f0: 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c L_OK with data \
9200: 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 "%i\"", ret);.
9210: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
9220: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
9230: 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a ewIntObj(ret));.
9240: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
9250: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
9260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
92a0: 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 *. * ImportObjC
92b0: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 md --. *. *.This
92c0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
92d0: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
92e0: 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 the "ssl" comma
92f0: 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c nd. *. *.The ssl
9300: 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 command pushes
9310: 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c SSL over a (newl
9320: 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 y connected) tcp
9330: 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 socket. *. * Re
9340: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
9350: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
9360: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
9370: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 cts:. *.May modi
9380: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 fy the behavior
9390: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c of an IO channel
93a0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
93b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
93c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
93d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
93e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
93f0: 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 tatic int.Import
9400: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
9410: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
9420: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
9430: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
9440: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
9450: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
9460: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
9470: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
9480: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
9490: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
94a0: 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 Ptr;../* client
94b0: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f state for ssl so
94c0: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f cket */. SSL_
94d0: 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c 4c CTX *ctx..= NULL
94e0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 ;. Tcl_Obj *s
94f0: 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 cript..= NULL;.
9500: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 Tcl_Obj *pass
9510: 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 word..= NULL;.
9520: 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 Tcl_Obj *vcmd.
9530: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c .= NULL;. Tcl
9540: 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 _DString upperCh
9550: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
9560: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c , upperChannelBl
9570: 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 ocking, upperCha
9580: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 nnelEncoding, up
9590: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
95a0: 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b 0a r;. int idx;.
95b0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e Tcl_Size len
95c0: 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 ;. int flags.
95d0: 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 ..= TLS_TCL_INIT
95e0: 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 ;. int server
95f0: 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f ...= 0;./* is co
9600: 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e nnection incomin
9610: 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a g or outgoing? *
9620: 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 /. char *keyf
9630: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ile..= NULL;.
9640: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 char *certfile.
9650: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 .= NULL;. uns
9660: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 09 igned char *key.
9670: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c .= NULL;. Tcl
9680: 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09 3d _Size key_len..=
9690: 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 0;. unsigned
96a0: 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20 4e char *cert..= N
96b0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a ULL;. Tcl_Siz
96c0: 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30 3b e cert_len..= 0;
96d0: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 . char *ciphe
96e0: 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 rs..= NULL;.
96f0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 char *ciphersuit
9700: 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 es..= NULL;.
9710: 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d 20 char *CAfile..=
9720: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
9730: 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b 0a CApath..= NULL;.
9740: 20 20 20 20 63 68 61 72 20 2a 43 41 73 74 6f 72 char *CAstor
9750: 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 e..= NULL;. c
9760: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 09 3d har *DHparams..=
9770: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
9780: 2a 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b *model...= NULL;
9790: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 . char *serve
97a0: 72 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f rname..= NULL;./
97b0: 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 * hostname for S
97c0: 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 erver Name Indic
97d0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 68 61 ation */. cha
97e0: 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 09 09 3d r *session_id..=
97f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f NULL;. Tcl_O
9800: 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c bj *alpn..= NULL
9810: 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d ;. int ssl2 =
9820: 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 0, ssl3 = 0;.
9830: 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 int tls1 = 1,
9840: 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 tls1_1 = 1, tls1
9850: 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d _2 = 1, tls1_3 =
9860: 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 1;. int prot
9870: 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d o = 0, level = -
9880: 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 1;. int verif
9890: 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d y = 0, require =
98a0: 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 0, request = 1,
98b0: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 post_handshake
98c0: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 = 0;. (void)
98d0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
98e0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
98f0: 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 ");..#if defined
9900: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
9910: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
9920: 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d TLS1). tls1 =
9930: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 0;.#endif.#if d
9940: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
9950: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
9960: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a NSSL_NO_TLS1_1).
9970: 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a tls1_1 = 0;.
9980: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
9990: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c ed(NO_TLS1_2) ||
99a0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
99b0: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 _NO_TLS1_2).
99c0: 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 tls1_2 = 0;.#end
99d0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
99e0: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
99f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
9a00: 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 TLS1_3). tls1
9a10: 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a _3 = 0;.#endif..
9a20: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
9a30: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
9a40: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
9a50: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 objv, "channel
9a60: 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 ?options?");..re
9a70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9a80: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 }.. ERR_c
9a90: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 lear_error();..
9aa0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
9ab0: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
9ac0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
9ad0: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a bjv[1]), NULL);.
9ae0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
9af0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
9b00: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
9b10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
9b20: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
9b30: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
9b40: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
9b50: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
9b60: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
9b70: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 el(chan);.. f
9b80: 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 or (idx = 2; idx
9b90: 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 < objc; idx++)
9ba0: 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 {..char *opt = T
9bb0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
9bc0: 76 5b 69 64 78 5d 29 3b 0a 0a 09 69 66 20 28 6f v[idx]);...if (o
9bd0: 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 pt[0] != '-')..
9be0: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f break;...OPTO
9bf0: 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e BJ("-alpn", alpn
9c00: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 );..OPTSTR("-cad
9c10: 69 72 22 2c 20 43 41 70 61 74 68 29 3b 0a 09 4f ir", CApath);..O
9c20: 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c PTSTR("-cafile",
9c30: 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 CAfile);..OPTST
9c40: 52 28 22 2d 63 61 73 74 6f 72 65 22 2c 20 43 41 R("-castore", CA
9c50: 73 74 6f 72 65 29 3b 0a 09 4f 50 54 42 59 54 45 store);..OPTBYTE
9c60: 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20 ("-cert", cert,
9c70: 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 cert_len);..OPTS
9c80: 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 TR("-certfile",
9c90: 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 certfile);..OPTS
9ca0: 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 TR("-cipher", ci
9cb0: 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 phers);..OPTSTR(
9cc0: 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70 68 "-ciphers", ciph
9cd0: 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ers);..OPTSTR("-
9ce0: 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 63 ciphersuites", c
9cf0: 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f iphersuites);..O
9d00: 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 PTOBJ("-command"
9d10: 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 , script);..OPTS
9d20: 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 TR("-dhparams",
9d30: 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 DHparams);..OPTB
9d40: 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c YTE("-key", key,
9d50: 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 key_len);..OPTS
9d60: 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b TR("-keyfile", k
9d70: 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 eyfile);..OPTSTR
9d80: 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c ("-model", model
9d90: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 );..OPTOBJ("-pas
9da0: 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64 sword", password
9db0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f );..OPTBOOL("-po
9dc0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 st_handshake", p
9dd0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a ost_handshake);.
9de0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 .OPTBOOL("-reque
9df0: 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 st", request);..
9e00: 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 OPTBOOL("-requir
9e10: 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f e", require);..O
9e20: 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 PTINT("-security
9e30: 5f 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b _level", level);
9e40: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 ..OPTBOOL("-serv
9e50: 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f er", server);..O
9e60: 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 PTSTR("-serverna
9e70: 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 me", servername)
9e80: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 ;..OPTSTR("-sess
9e90: 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e ion_id", session
9ea0: 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 _id);..OPTBOOL("
9eb0: 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 -ssl2", ssl2);..
9ec0: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c OPTBOOL("-ssl3",
9ed0: 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c ssl3);..OPTBOOL
9ee0: 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b ("-tls1", tls1);
9ef0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
9f00: 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f .1", tls1_1);..O
9f10: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 PTBOOL("-tls1.2"
9f20: 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 , tls1_2);..OPTB
9f30: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 OOL("-tls1.3", t
9f40: 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 ls1_3);..OPTOBJ(
9f50: 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e "-validatecomman
9f60: 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f d", vcmd);..OPTO
9f70: 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 BJ("-vcmd", vcmd
9f80: 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 );...OPTBAD("opt
9f90: 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 ion", "-alpn, -c
9fa0: 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d adir, -cafile, -
9fb0: 63 61 73 74 6f 72 65 2c 20 2d 63 65 72 74 2c 20 castore, -cert,
9fc0: 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 -certfile, -ciph
9fd0: 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 er, -ciphersuite
9fe0: 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 s, -command, -dh
9ff0: 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b params, -key, -k
a000: 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 eyfile, -model,
a010: 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 -password, -post
a020: 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 _handshake, -req
a030: 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 uest, -require,
a040: 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c -security_level,
a050: 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 -server, -serve
a060: 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f rname, -session_
a070: 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 id, -ssl2, -ssl3
a080: 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 , -tls1, -tls1.1
a090: 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 , -tls1.2, -tls1
a0a0: 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 .3, or -validate
a0b0: 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 command");...ret
a0c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
a0d0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 }. if (req
a0e0: 75 65 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d uest)..verify |=
a0f0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 SSL_VERIFY_CLIE
a100: 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 NT_ONCE | SSL_VE
a110: 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 RIFY_PEER;. i
a120: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65 f (request && re
a130: 71 75 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d quire).verify |=
a140: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c SSL_VERIFY_FAIL
a150: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 _IF_NO_PEER_CERT
a160: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 ;. if (reques
a170: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 t && post_handsh
a180: 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 ake).verify |= S
a190: 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 SL_VERIFY_POST_H
a1a0: 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 ANDSHAKE;. if
a1b0: 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 (verify == 0)..
a1c0: 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 verify = SSL_VER
a1d0: 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 IFY_NONE;.. p
a1e0: 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 roto |= (ssl2 ?
a1f0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a TLS_PROTO_SSL2 :
a200: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
a210: 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 = (ssl3 ? TLS_PR
a220: 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 OTO_SSL3 : 0);.
a230: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 proto |= (tls
a240: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 1 ? TLS_PROTO_TL
a250: 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f S1 : 0);. pro
a260: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 to |= (tls1_1 ?
a270: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 TLS_PROTO_TLS1_1
a280: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f : 0);. proto
a290: 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c |= (tls1_2 ? TL
a2a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a S_PROTO_TLS1_2 :
a2b0: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 0);. proto |
a2c0: 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f = (tls1_3 ? TLS_
a2d0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 PROTO_TLS1_3 : 0
a2e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 );.. /* reset
a2f0: 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e to NULL if blan
a300: 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 k string provide
a310: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 d */. if (cer
a320: 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 t && !*cert)..
a330: 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 cert.
a340: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
a350: 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 f (key && !*key)
a360: 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 .. key.
a370: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
a380: 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 if (certfile &
a390: 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 & !*certfile)
a3a0: 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d certfile.=
a3b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b NULL;. if (k
a3c0: 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 eyfile && !*keyf
a3d0: 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 ile)..keyfile.
a3e0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
a3f0: 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 if (ciphers &&
a400: 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 !*ciphers).
a410: 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 ciphers.
a420: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a430: 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 if (ciphersuites
a440: 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 && !*ciphersuit
a450: 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 es) ciphersuites
a460: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
a470: 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a if (CAfile && !*
a480: 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 CAfile).
a490: 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d CAfile. =
a4a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 NULL;. if (C
a4b0: 41 70 61 74 68 20 26 26 20 21 2a 43 41 70 61 74 Apath && !*CApat
a4c0: 68 29 09 20 20 20 20 20 20 20 20 43 41 70 61 74 h). CApat
a4d0: 68 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c h. = NULL
a4e0: 3b 0a 20 20 20 20 69 66 20 28 43 41 73 74 6f 72 ;. if (CAstor
a4f0: 65 20 26 26 20 21 2a 43 41 73 74 6f 72 65 29 09 e && !*CAstore).
a500: 20 20 20 20 20 20 20 20 43 41 73 74 6f 72 65 09 CAstore.
a510: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a520: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 if (DHparams
a530: 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 && !*DHparams).
a540: 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73 DHparams
a550: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
a560: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 . /* new SSL
a570: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 state */. sta
a580: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 tePtr..= (State
a590: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 *) ckalloc((unsi
a5a0: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 gned) sizeof(Sta
a5b0: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 te));. memset
a5c0: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 (statePtr, 0, si
a5d0: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 zeof(State));..
a5e0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 statePtr->fla
a5f0: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 gs.= flags;.
a600: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
a610: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 .= interp;. s
a620: 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 09 3d 20 tatePtr->want.=
a630: 30 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 0;. statePtr-
a640: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 >vflags.= verify
a650: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
a660: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f err.= "";.. /
a670: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 * allocate scrip
a680: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 t */. if (scr
a690: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 ipt) {..(void) T
a6a0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
a6b0: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e Obj(script, &len
a6c0: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
a6d0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 statePtr->ca
a6e0: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b llback = script;
a6f0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
a700: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
a710: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 >callback);..}.
a720: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
a730: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a ocate password *
a740: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f /. if (passwo
a750: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 rd) {..(void) Tc
a760: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
a770: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 bj(password, &le
a780: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
a790: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 . statePtr->p
a7a0: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f assword = passwo
a7b0: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 rd;.. Tcl_Inc
a7c0: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
a7d0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
a7e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
a7f0: 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 allocate validat
a800: 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 e command */.
a810: 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 if (vcmd) {..(v
a820: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 oid) Tcl_GetStri
a830: 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 ngFromObj(vcmd,
a840: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 &len);..if (len)
a850: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 {.. statePtr
a860: 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 ->vcmd = vcmd;..
a870: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
a880: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 ount(statePtr->v
a890: 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a cmd);..}. }..
a8a0: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d if (model !=
a8b0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f NULL) {..int mo
a8c0: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 de;../* Get the
a8d0: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 "model" context
a8e0: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 */..chan = Tcl_G
a8f0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
a900: 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b , model, &mode);
a910: 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 ..if (chan == (T
a920: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
a930: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 ) {.. Tls_Fre
a940: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 e((tls_free_type
a950: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
a960: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
a970: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 RROR;..}.../*..
a980: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
a990: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
a9a0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 pmost channel..
a9b0: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 */..chan = Tcl_G
a9c0: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
a9d0: 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 n);..if (Tcl_Get
a9e0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
a9f0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
aa00: 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 Type()) {.. T
aa10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
aa20: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
aa30: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
aa40: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
aa50: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 n),..."\": not a
aa60: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 TLS channel", (
aa70: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
aa80: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
aa90: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
aaa0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 S", "IMPORT", "C
aab0: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
aac0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
aad0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
aae0: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 e((tls_free_type
aaf0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
ab00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
ab10: 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 RROR;..}..ctx =
ab20: 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 ((State *)Tcl_Ge
ab30: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
ab40: 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 Data(chan))->ctx
ab50: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
ab60: 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 if ((ctx = CTX_I
ab70: 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 nit(statePtr, se
ab80: 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 rver, proto, key
ab90: 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 file, certfile,
aba0: 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c key, cert, key_l
abb0: 65 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 en,.. cert_le
abc0: 6e 2c 20 43 41 70 61 74 68 2c 20 43 41 73 74 6f n, CApath, CAsto
abd0: 72 65 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 re, CAfile, ciph
abe0: 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 ers, ciphersuite
abf0: 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 s, level, DHpara
ac00: 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a ms)) == NULL) {.
ac10: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 . Tls_Free((t
ac20: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 ls_free_type *)
ac30: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
ac40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
ac50: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
ac60: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 statePtr->ctx =
ac70: 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 ctx;.. /* Pre
ac80: 73 65 72 76 65 20 63 68 61 6e 6e 65 6c 20 63 6f serve channel co
ac90: 6e 66 69 67 20 2a 2f 0a 20 20 20 20 54 63 6c 5f nfig */. Tcl_
aca0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
acb0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
acc0: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 tion);. Tcl_D
acd0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
ace0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
acf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
ad00: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
ad10: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 nnelEOFChar);.
ad20: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
ad30: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 t(&upperChannelE
ad40: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 ncoding);. Tc
ad50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_GetChannelOpti
ad60: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
ad70: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 "-eofchar", &up
ad80: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 perChannelEOFCha
ad90: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 r);. Tcl_GetC
ada0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
adb0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 erp, chan, "-enc
adc0: 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 oding", &upperCh
add0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a annelEncoding);.
ade0: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e Tcl_GetChann
adf0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
ae00: 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 chan, "-transla
ae10: 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 tion", &upperCha
ae20: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 nnelTranslation)
ae30: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 ;. Tcl_GetCha
ae40: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
ae50: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b p, chan, "-block
ae60: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e ing", &upperChan
ae70: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 nelBlocking);..
ae80: 20 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 /* Ensure the
ae90: 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 channel works i
aea0: 6e 20 62 69 6e 61 72 79 20 6d 6f 64 65 20 28 66 n binary mode (f
aeb0: 6f 72 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f or the encryptio
aec0: 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f n not to get goo
aed0: 66 65 64 20 75 70 29 2e 20 2a 2f 0a 20 20 20 20 fed up). */.
aee0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
aef0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
af00: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
af10: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 ", "binary");.
af20: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
af30: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
af40: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 han, "-blocking"
af50: 2c 20 22 74 72 75 65 22 29 3b 0a 0a 20 20 20 20 , "true");..
af60: 2f 2a 20 43 72 65 61 74 65 20 73 74 61 63 6b 65 /* Create stacke
af70: 64 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 d channel */.
af80: 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d dprintf("Consum
af90: 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 ing Tcl channel
afa0: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e %s", Tcl_GetChan
afb0: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a nelName(chan));.
afc0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 statePtr->se
afd0: 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 lf = Tcl_StackCh
afe0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c annel(interp, Tl
aff0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c s_ChannelType(),
b000: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 (ClientData) st
b010: 61 74 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52 45 atePtr,..(TCL_RE
b020: 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 ADABLE | TCL_WRI
b030: 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 TABLE), chan);.
b040: 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 dprintf("Crea
b050: 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 ted channel name
b060: 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 d %s", Tcl_GetCh
b070: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
b080: 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 tr->self));.
b090: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 if (statePtr->se
b0a0: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e lf == (Tcl_Chann
b0b0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a el) NULL) {../*.
b0c0: 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 . * No use of Tc
b0d0: 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 l_EventuallyFree
b0e0: 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 because no poss
b0f0: 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76 ible Tcl_Preserv
b100: 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 e... */..Tls_Fre
b110: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 e((tls_free_type
b120: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
b130: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
b140: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
b150: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 09 54 63 6c 5f nslation);..Tcl_
b160: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 DStringFree(&upp
b170: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e erChannelEncodin
b180: 67 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 g);..Tcl_DString
b190: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
b1a0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 09 54 63 6c elEOFChar);..Tcl
b1b0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 _DStringFree(&up
b1c0: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 perChannelBlocki
b1d0: 6e 67 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ng);..return TCL
b1e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
b1f0: 20 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 63 68 /* Restore ch
b200: 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a annel config */.
b210: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
b220: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
b230: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
b240: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c "-translation",
b250: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
b260: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 e(&upperChannelT
b270: 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 ranslation));.
b280: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
b290: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 Option(interp, s
b2a0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 tatePtr->self, "
b2b0: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f -encoding", Tcl_
b2c0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
b2d0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
b2e0: 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 ng));. Tcl_Se
b2f0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
b300: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
b310: 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 >self, "-eofchar
b320: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ", Tcl_DStringVa
b330: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 lue(&upperChanne
b340: 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20 lEOFChar));.
b350: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
b360: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
b370: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 tePtr->self, "-b
b380: 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 locking", Tcl_DS
b390: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 tringValue(&uppe
b3a0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
b3b0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 ));. Tcl_DStr
b3c0: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 ingFree(&upperCh
b3d0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
b3e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
b3f0: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 ngFree(&upperCha
b400: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 nnelEncoding);.
b410: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
b420: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ee(&upperChannel
b430: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 EOFChar);. Tc
b440: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 l_DStringFree(&u
b450: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
b460: 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ing);.. /*.
b470: 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c * SSL Initial
b480: 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a ization. */.
b490: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 statePtr->ss
b4a0: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 l = SSL_new(stat
b4b0: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 ePtr->ctx);.
b4c0: 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 if (!statePtr->s
b4d0: 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 sl) {../* SSL li
b4e0: 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 brary error */..
b4f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
b500: 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e (interp, "couldn
b510: 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 't construct ssl
b520: 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54 session: ", GET
b530: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
b540: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
b550: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
b560: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
b570: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 S", "IMPORT", "I
b580: 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 NIT", "FAILED",
b590: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
b5a0: 09 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 .Tls_Free((tls_f
b5b0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 ree_type *) stat
b5c0: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 ePtr);..return T
b5d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
b5e0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 . /* Set host
b5f0: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a server name */.
b600: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 if (serverna
b610: 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 me) {../* Sets t
b620: 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 he server name i
b630: 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 ndication (SNI)
b640: 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 in ClientHello e
b650: 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 xtension */../*
b660: 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f Per RFC 6066, ho
b670: 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49 stname is a ASCI
b680: 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 I encoded string
b690: 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 33 36 , though RFC 436
b6a0: 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f 6 says UTF-8. */
b6b0: 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 ..if (!SSL_set_t
b6c0: 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 lsext_host_name(
b6d0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 statePtr->ssl, s
b6e0: 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 ervername) && re
b6f0: 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 quire) {.. Tc
b700: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
b710: 6e 74 65 72 70 2c 20 22 53 65 74 20 53 4e 49 20 nterp, "Set SNI
b720: 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 extension failed
b730: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
b740: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
b750: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
b760: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
b770: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 erp, "TLS", "IMP
b780: 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 ORT", "SNI", "FA
b790: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
b7a0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
b7b0: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 Free((tls_free_t
b7c0: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 ype *) statePtr)
b7d0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
b7e0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
b7f0: 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f Set hostname fo
b800: 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63 61 r peer certifica
b810: 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 te hostname veri
b820: 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 fication in clie
b830: 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 nts... Don't u
b840: 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 se SSL_set1_host
b850: 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69 since it has li
b860: 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 mitations. */..i
b870: 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 f (!SSL_add1_hos
b880: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c t(statePtr->ssl,
b890: 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a servername)) {.
b8a0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
b8b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
b8c0: 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 et DNS hostname
b8d0: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 failed: ", GET_E
b8e0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
b8f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
b900: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
b910: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 de(interp, "TLS"
b920: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 , "IMPORT", "HOS
b930: 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 TNAME", "FAILED"
b940: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
b950: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
b960: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a (tls_free_type *
b970: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 ) statePtr);..
b980: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
b990: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
b9a0: 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73 /* Resume sess
b9b0: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 ion id */. if
b9c0: 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 (session_id &&
b9d0: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 strlen(session_i
b9e0: 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 d) <= SSL_MAX_SI
b9f0: 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a D_CTX_LENGTH) {.
ba00: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 ./* SSL_set_sess
ba10: 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 ion() */..if (!S
ba20: 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f SL_SESSION_set1_
ba30: 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 id_context(SSL_g
ba40: 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 et_session(state
ba50: 50 74 72 2d 3e 73 73 6c 29 2c 0a 09 09 28 63 6f Ptr->ssl),...(co
ba60: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
ba70: 72 20 2a 29 20 73 65 73 73 69 6f 6e 5f 69 64 2c r *) session_id,
ba80: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 (unsigned int)
ba90: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 strlen(session_i
baa0: 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f d))) {.. Tcl_
bab0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
bac0: 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 erp, "Resume ses
bad0: 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 sion failed: ",
bae0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
baf0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
bb00: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
bb10: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
bb20: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
bb30: 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49 "SESSION", "FAI
bb40: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
bb50: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
bb60: 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 ree((tls_free_ty
bb70: 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b pe *) statePtr);
bb80: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
bb90: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
bba0: 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 .. /* Enable
bbb0: 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 Application-Laye
bbc0: 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 r Protocol Negot
bbd0: 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 iation. Examples
bbe0: 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a are: http/1.0,.
bbf0: 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 .http/1.1, h2, h
bc00: 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 3, ftp, imap, po
bc10: 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c p3, xmpp-client,
bc20: 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 xmpp-server, mq
bc30: 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f tt, irc, etc. */
bc40: 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b . if (alpn) {
bc50: 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 ../* Convert a T
bc60: 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 CL list into a p
bc70: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 rotocol-list in
bc80: 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 wire-format */..
bc90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
bca0: 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 rotos, *p;..unsi
bcb0: 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f gned int protos_
bcc0: 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 len = 0;..Tcl_Si
bcd0: 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 ze cnt, i;..int
bce0: 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 j;..Tcl_Obj **li
bcf0: 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 st;...if (Tcl_Li
bd00: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
bd10: 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 (interp, alpn, &
bd20: 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 cnt, &list) != T
bd30: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c CL_OK) {.. Tl
bd40: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 s_Free((tls_free
bd50: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 _type *) statePt
bd60: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
bd70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
bd80: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 /* Determine the
bd90: 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 memory required
bda0: 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f for the protoco
bdb0: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 l-list */..for (
bdc0: 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 i = 0; i < cnt;
bdd0: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f i++) {.. Tcl_
bde0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
bdf0: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b (list[i], &len);
be00: 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 .. if (len >
be10: 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 255) {...Tcl_App
be20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
be30: 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c , "ALPN protocol
be40: 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f 6e 67 22 names too long"
be50: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
be60: 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 ;...Tcl_SetError
be70: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
be80: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 S", "IMPORT", "A
be90: 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 LPN", "FAILED",
bea0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
beb0: 09 09 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f ..Tls_Free((tls_
bec0: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 free_type *) sta
bed0: 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e tePtr);...return
bee0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
bef0: 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c }.. protos_l
bf00: 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 en += 1 + (int)
bf10: 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 len;..}.../* Bui
bf20: 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 ld the complete
bf30: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f protocol-list */
bf40: 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c ..protos = ckall
bf50: 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a oc(protos_len);.
bf60: 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 ./* protocol-lis
bf70: 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d ts consist of 8-
bf80: 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 bit length-prefi
bf90: 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 xed, byte string
bfa0: 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 s */..for (j = 0
bfb0: 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 , p = protos; j
bfc0: 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 < cnt; j++) {..
bfd0: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 char *str = T
bfe0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
bff0: 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 Obj(list[j], &le
c000: 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 n);.. *p++ =
c010: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20 (unsigned char)
c020: 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 len;.. memcpy
c030: 28 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 (p, str, (size_t
c040: 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b ) len);.. p +
c050: 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 = len;..}.../* S
c060: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 SL_set_alpn_prot
c070: 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 os makes a copy
c080: 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d of the protocol-
c090: 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 list */../* Note
c0a0: 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 : This function
c0b0: 72 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74 reverses the ret
c0c0: 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e urn value conven
c0d0: 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c tion */..if (SSL
c0e0: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 _set_alpn_protos
c0f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
c100: 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c protos, protos_l
c110: 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f en)) {.. Tcl_
c120: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
c130: 65 72 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 erp, "Set ALPN p
c140: 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a rotocols failed:
c150: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
c160: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
c170: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 ULL);.. Tcl_S
c180: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
c190: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
c1a0: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 RT", "ALPN", "FA
c1b0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
c1c0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
c1d0: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 Free((tls_free_t
c1e0: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 ype *) statePtr)
c1f0: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72 ;.. ckfree(pr
c200: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75 otos);.. retu
c210: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
c220: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 .../* Store prot
c230: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 ocols list */..s
c240: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 tatePtr->protos
c250: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 = protos;..state
c260: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 Ptr->protos_len
c270: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 = protos_len;.
c280: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 } else {..stat
c290: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e ePtr->protos = N
c2a0: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e ULL;..statePtr->
c2b0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a protos_len = 0;.
c2c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
c2d0: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 * SSL Callbac
c2e0: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 ks. */. S
c2f0: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_set_app_data(
c300: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 statePtr->ssl, (
c310: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
c320: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 ;./* point back
c330: 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c to us */. SSL
c340: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 _set_verify(stat
c350: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 ePtr->ssl, verif
c360: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 y, VerifyCallbac
c370: 6b 29 3b 0a 20 20 20 20 2f 2a 53 53 4c 5f 73 65 k);. /*SSL_se
c380: 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 53 t_verify_depth(S
c390: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 5f 64 65 SL_set_verify_de
c3a0: 70 74 68 2c 20 30 29 3b 2a 2f 0a 20 20 20 20 53 pth, 0);*/. S
c3b0: 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c SL_set_info_call
c3c0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 back(statePtr->s
c3d0: 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b sl, InfoCallback
c3e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 );.. /* Callb
c3f0: 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e ack for observin
c400: 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 g protocol messa
c410: 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f ges */.#ifndef O
c420: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 PENSSL_NO_SSL_TR
c430: 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 ACE. /* void
c440: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f SSL_CTX_set_msg_
c450: 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 callback_arg(sta
c460: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 tePtr->ctx, (voi
c470: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 d *)statePtr);.
c480: 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f void SSL_CTX_
c490: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
c4a0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c4b0: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 MessageCallback)
c4c0: 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 ; */. SSL_set
c4d0: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 _msg_callback_ar
c4e0: 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c g(statePtr->ssl,
c4f0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c500: 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f r);. SSL_set_
c510: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 msg_callback(sta
c520: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 tePtr->ssl, Mess
c530: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 ageCallback);.#e
c540: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 ndif.. /* Cre
c550: 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 ate Tcl_Channel
c560: 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 BIO Handler */.
c570: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 statePtr->p_b
c580: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c io.= BIO_new_tcl
c590: 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e (statePtr, BIO_N
c5a0: 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 OCLOSE);. sta
c5b0: 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f tePtr->bio.= BIO
c5c0: 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 _new(BIO_f_ssl()
c5d0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 );.. if (serv
c5e0: 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 er) {../* Server
c5f0: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 callbacks */..S
c600: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 SL_CTX_set_tlsex
c610: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 t_servername_arg
c620: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
c630: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
c640: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
c650: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d tlsext_servernam
c660: 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 e_callback(state
c670: 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c Ptr->ctx, SNICal
c680: 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 lback);..SSL_CTX
c690: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c _set_client_hell
c6a0: 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 o_cb(statePtr->c
c6b0: 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 tx, HelloCallbac
c6c0: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
c6d0: 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 Ptr);..if (state
c6e0: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e Ptr->protos != N
c6f0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f ULL) {.. SSL_
c700: 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c CTX_set_alpn_sel
c710: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d ect_cb(statePtr-
c720: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 >ctx, ALPNCallba
c730: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
c740: 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 ePtr);.#ifdef US
c750: 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 E_NPN.. if (t
c760: 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c ls1_2 == 0 && tl
c770: 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 s1_3 == 0) {...S
c780: 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f SL_CTX_set_next_
c790: 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 protos_advertise
c7a0: 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 d_cb(statePtr->c
c7b0: 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c tx, NPNCallback,
c7c0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
c7d0: 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 r);.. }.#endi
c7e0: 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 f..}.../* Enable
c7f0: 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 server to send
c800: 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74 cert request aft
c810: 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c er handshake (TL
c820: 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 S 1.3 only) */..
c830: 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 /* A write opera
c840: 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 tion must take p
c850: 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 lace for the Cer
c860: 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74 tificate Request
c870: 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 to be.. sent
c880: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 to the client, t
c890: 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 his can be done
c8a0: 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 with SSL_do_hand
c8b0: 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 shake(). */..if
c8c0: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 (request && post
c8d0: 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c _handshake && tl
c8e0: 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c s1_3) {.. SSL
c8f0: 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 _verify_client_p
c900: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 ost_handshake(st
c910: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d atePtr->ssl);..}
c920: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 .../* Set server
c930: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 mode */..stateP
c940: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
c950: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 _TCL_SERVER;..SS
c960: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 L_set_accept_sta
c970: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
c980: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
c990: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 ./* Client callb
c9a0: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 acks */.#ifdef U
c9b0: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 SE_NPN..if (stat
c9c0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 ePtr->protos !=
c9d0: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d NULL && tls1_2 =
c9e0: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d = 0 && tls1_3 ==
c9f0: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 0) {.. SSL_C
ca00: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 TX_set_next_prot
ca10: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 o_select_cb(stat
ca20: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 ePtr->ctx, ALPNC
ca30: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
ca40: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 )statePtr);..}.#
ca50: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 endif.../* Sessi
ca60: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 on caching */..S
ca70: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 SL_CTX_set_sessi
ca80: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 on_cache_mode(st
ca90: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c atePtr->ctx, SSL
caa0: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 _SESS_CACHE_CLIE
cab0: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 NT | SSL_SESS_CA
cac0: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f CHE_NO_INTERNAL_
cad0: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 STORE);..SSL_CTX
cae0: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 _sess_set_new_cb
caf0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
cb00: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 SessionCallback)
cb10: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f ;.../* Enable po
cb20: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 st handshake Aut
cb30: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 hentication exte
cb40: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f nsion. TLS 1.3 o
cb50: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e nly, not http/2.
cb60: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 */..if (request
cb70: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 && post_handsha
cb80: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 ke) {.. SSL_s
cb90: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b et_post_handshak
cba0: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d e_auth(statePtr-
cbb0: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f >ssl, 1);..}.../
cbc0: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 * Set client mod
cbd0: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f e */..SSL_set_co
cbe0: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 nnect_state(stat
cbf0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
cc00: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 42 49 }.. /* Set BI
cc10: 4f 20 66 6f 72 20 72 65 61 64 20 61 6e 64 20 77 O for read and w
cc20: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 rite operations
cc30: 6f 6e 20 53 53 4c 20 6f 62 6a 65 63 74 20 2a 2f on SSL object */
cc40: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f . SSL_set_bio
cc50: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
cc60: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c statePtr->p_bio,
cc70: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
cc80: 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 );. BIO_set_s
cc90: 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f sl(statePtr->bio
cca0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c , statePtr->ssl,
ccb0: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 BIO_NOCLOSE);.
ccc0: 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 5f 6d BIO_set_ssl_m
ccd0: 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 62 69 ode(statePtr->bi
cce0: 6f 2c 20 28 6c 6f 6e 67 29 20 21 73 65 72 76 65 o, (long) !serve
ccf0: 72 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 r);.. /*.
cd00: 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e * End of SSL In
cd10: 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 it. */. d
cd20: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
cd30: 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 g %s", Tcl_GetCh
cd40: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
cd50: 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 tr->self));.
cd60: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
cd70: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 terp, (char *) T
cd80: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
cd90: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
cda0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 ), TCL_VOLATILE)
cdb0: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
cdc0: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce10: 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 --. *. * Unimpor
ce20: 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a tObjCmd --. *. *
ce30: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
ce40: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 is invoked to re
ce50: 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 move the topmost
ce60: 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e channel filter.
ce70: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
ce80: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
ce90: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
cea0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
ceb0: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 .May modify the
cec0: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 behavior of an I
ced0: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a O channel.. *. *
cee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf20: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
cf30: 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d nt.UnimportObjCm
cf40: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
cf50: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
cf60: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
cf70: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
cf80: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
cf90: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
cfa0: 63 68 61 6e 2c 20 70 61 72 65 6e 74 3b 09 2f 2a chan, parent;./*
cfb0: 20 54 68 65 20 73 74 61 63 6b 65 64 20 61 6e 64 The stacked and
cfc0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e underlying chan
cfd0: 6e 65 6c 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f nels */. Tcl_
cfe0: 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 DString upperCha
cff0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c nnelTranslation,
d000: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f upperChannelBlo
d010: 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e cking, upperChan
d020: 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 nelEncoding, upp
d030: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
d040: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 ;. int res =
d050: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 28 76 6f 69 TCL_OK;. (voi
d060: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a d) clientData;..
d070: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
d080: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
d090: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
d0a0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
d0b0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
d0c0: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 "channel");..ret
d0d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
d0e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 61 6c }.. /* Val
d0f0: 69 64 61 74 65 20 63 68 61 6e 6e 65 6c 20 6e 61 idate channel na
d100: 6d 65 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d me */. chan =
d110: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
d120: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
d130: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 tring(objv[1]),
d140: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 NULL);. if (c
d150: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
d160: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
d170: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
d180: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
d190: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
d1a0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
d1b0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
d1c0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
d1d0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
d1e0: 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63 . parent = Tc
d1f0: 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e l_GetStackedChan
d200: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 nel(chan);..
d210: 2f 2a 20 56 65 72 69 66 79 20 69 73 20 61 20 73 /* Verify is a s
d220: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 2a tacked channel *
d230: 2f 0a 20 20 20 20 69 66 20 28 70 61 72 65 6e 74 /. if (parent
d240: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c == NULL) {..Tcl
d250: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d260: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
d270: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
d280: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
d290: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 73 ,..."\": not a s
d2a0: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 22 2c tacked channel",
d2b0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d2c0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
d2d0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
d2e0: 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 TLS", "UNIMPORT"
d2f0: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e , "CHANNEL", "IN
d300: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 VALID", (char *)
d310: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
d320: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
d330: 0a 0a 20 20 20 20 2f 2a 20 46 6c 75 73 68 20 61 .. /* Flush a
d340: 6e 79 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 ny pending data
d350: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 4f */. if (Tcl_O
d360: 75 74 70 75 74 42 75 66 66 65 72 65 64 28 63 68 utputBuffered(ch
d370: 61 6e 29 20 3e 20 30 20 26 26 20 54 63 6c 5f 46 an) > 0 && Tcl_F
d380: 6c 75 73 68 28 63 68 61 6e 29 20 21 3d 20 54 43 lush(chan) != TC
d390: 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 L_OK) {..Tcl_App
d3a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
d3b0: 2c 20 22 63 61 6e 27 74 20 66 6c 75 73 68 20 63 , "can't flush c
d3c0: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a hannel", (char *
d3d0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
d3e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
d3f0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 20 73 }.. /* Init s
d400: 74 6f 72 61 67 65 20 2a 2f 0a 20 20 20 20 54 63 torage */. Tc
d410: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
d420: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
d430: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c lation);. Tcl
d440: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 _DStringInit(&up
d450: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 perChannelBlocki
d460: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ng);. Tcl_DSt
d470: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
d480: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a hannelEOFChar);.
d490: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
d4a0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
d4b0: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 0a 20 20 20 lEncoding);..
d4c0: 20 2f 2a 20 50 72 65 73 65 72 76 65 20 63 75 72 /* Preserve cur
d4d0: 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 63 6f 6e rent channel con
d4e0: 66 69 67 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 47 fig */. Tcl_G
d4f0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
d500: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
d510: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 blocking", &uppe
d520: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
d530: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
d540: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
d550: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f rp, chan, "-enco
d560: 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 ding", &upperCha
d570: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 nnelEncoding);.
d580: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
d590: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
d5a0: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 chan, "-eofchar"
d5b0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 , &upperChannelE
d5c0: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
d5d0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
d5e0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
d5f0: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 "-translation",
d600: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
d610: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 0a 20 20 20 20 nslation);..
d620: 2f 2a 20 55 6e 73 74 61 63 6b 20 74 68 65 20 63 /* Unstack the c
d630: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 hannel */. if
d640: 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 (Tcl_UnstackCha
d650: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 nnel(interp, cha
d660: 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a n) != TCL_OK) {.
d670: 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 .res = TCL_ERROR
d680: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
d690: 52 65 73 74 6f 72 65 20 63 68 61 6e 6e 65 6c 20 Restore channel
d6a0: 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20 54 63 config */. Tc
d6b0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
d6c0: 6f 6e 28 69 6e 74 65 72 70 2c 20 70 61 72 65 6e on(interp, paren
d6d0: 74 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 t, "-encoding",
d6e0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
d6f0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
d700: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 coding));. Tc
d710: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
d720: 6f 6e 28 69 6e 74 65 72 70 2c 20 70 61 72 65 6e on(interp, paren
d730: 74 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 t, "-eofchar", T
d740: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
d750: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
d760: 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f Char));. Tcl_
d770: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
d780: 28 69 6e 74 65 72 70 2c 20 70 61 72 65 6e 74 2c (interp, parent,
d790: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c "-translation",
d7a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
d7b0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 e(&upperChannelT
d7c0: 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 ranslation));.
d7d0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
d7e0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 70 Option(interp, p
d7f0: 61 72 65 6e 74 2c 20 22 2d 62 6c 6f 63 6b 69 6e arent, "-blockin
d800: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 g", Tcl_DStringV
d810: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
d820: 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 elBlocking));..
d830: 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a /* Clean-up *
d840: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e /. Tcl_DStrin
d850: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e gFree(&upperChan
d860: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b nelTranslation);
d870: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d880: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e Free(&upperChann
d890: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 elEncoding);.
d8a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
d8b0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f (&upperChannelEO
d8c0: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f FChar);. Tcl_
d8d0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 DStringFree(&upp
d8e0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e erChannelBlockin
d8f0: 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 g);. return r
d900: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d es;.}.../*. *---
d910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d950: 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 . *. * CTX_Init
d960: 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 -- construct a S
d970: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a SL_CTX instance.
d980: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
d990: 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 *.A valid SSL_CT
d9a0: 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 X instance or NU
d9b0: 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 LL.. *. * Side e
d9c0: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 ffects:. *.const
d9d0: 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 ructs SSL contex
d9e0: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d t (CTX). *. *---
d9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da30: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f . */.static SSL_
da40: 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 CTX *.CTX_Init(S
da50: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
da60: 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e int isServer, in
da70: 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b t proto, char *k
da80: 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 eyfile, char *ce
da90: 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 rtfile,. unsi
daa0: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 gned char *key,
dab0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 unsigned char *c
dac0: 65 72 74 2c 20 54 63 6c 5f 53 69 7a 65 20 6b 65 ert, Tcl_Size ke
dad0: 79 5f 6c 65 6e 2c 20 54 63 6c 5f 53 69 7a 65 20 y_len, Tcl_Size
dae0: 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a cert_len, char *
daf0: 43 41 70 61 74 68 2c 0a 20 20 20 20 63 68 61 72 CApath,. char
db00: 20 2a 43 41 73 74 6f 72 65 2c 20 63 68 61 72 20 *CAstore, char
db10: 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 *CAfile, char *c
db20: 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 iphers, char *ci
db30: 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 phersuites, int
db40: 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 level, char *DHp
db50: 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c arams) {. Tcl
db60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 _Interp *interp
db70: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
db80: 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 rp;. SSL_CTX
db90: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ctx = NULL;.
dba0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b Tcl_DString ds;
dbb0: 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 . int off = 0
dbc0: 2c 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20 20 20 , abort = 0;.
dbd0: 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 int load_privat
dbe0: 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 e_key;. const
dbf0: 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 SSL_METHOD *met
dc00: 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 hod;.. dprint
dc10: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
dc20: 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a if (!proto) {.
dc30: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
dc40: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 t(interp, "no va
dc50: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c lid protocol sel
dc60: 65 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 ected", (char *)
dc70: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
dc80: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
dc90: 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 /* create SSL c
dca0: 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 ontext */.#if OP
dcb0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
dcc0: 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 MBER >= 0x101000
dcd0: 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 00L || defined(N
dce0: 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e O_SSL2) || defin
dcf0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 ed(OPENSSL_NO_SS
dd00: 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 L2). if (ENAB
dd10: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
dd20: 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 ROTO_SSL2)) {..T
dd30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
dd40: 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 interp, "SSL2 pr
dd50: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
dd60: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
dd70: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
dd80: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
dd90: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
dda0: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
ddb0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
ddc0: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 3). if (ENABL
ddd0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
dde0: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 OTO_SSL3)) {..Tc
ddf0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
de00: 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f nterp, "SSL3 pro
de10: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
de20: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
de30: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
de40: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
de50: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
de60: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
de70: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
de80: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
de90: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
dea0: 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c TO_TLS1)) {..Tcl
deb0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
dec0: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 terp, "TLS 1.0 p
ded0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
dee0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
def0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
df00: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
df10: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
df20: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 O_TLS1_1) || def
df30: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
df40: 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 TLS1_1). if (
df50: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
df60: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 LS_PROTO_TLS1_1)
df70: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
df80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 esult(interp, "T
df90: 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 LS 1.1 protocol
dfa0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
dfb0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
dfc0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
dfd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 }.#endif.#if d
dfe0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 efined(NO_TLS1_2
dff0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
e000: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
e010: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
e020: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
e030: 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c _TLS1_2)) {..Tcl
e040: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
e050: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 terp, "TLS 1.2 p
e060: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
e070: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 orted", (char *)
e080: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
e090: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 NULL;. }.#end
e0a0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
e0b0: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
e0c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e0d0: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 TLS1_3). if (
e0e0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
e0f0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 LS_PROTO_TLS1_3)
e100: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
e110: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 esult(interp, "T
e120: 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 LS 1.3 protocol
e130: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
e140: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
e150: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
e160: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 }.#endif. i
e170: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b f (proto == 0) {
e180: 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 ../* Use full ra
e190: 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f nge */..SSL_CTX_
e1a0: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 set_min_proto_ve
e1b0: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 rsion(ctx, 0);..
e1c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f SSL_CTX_set_max_
e1d0: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
e1e0: 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 x, 0);. }..
e1f0: 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 switch (proto)
e200: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 {.#if OPENSSL_V
e210: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
e220: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 0x10100000L && !
e230: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
e240: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e250: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 NSSL_NO_SSL2).
e260: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
e270: 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d _SSL2:..method =
e280: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 isServer ? SSLv
e290: 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 2_server_method(
e2a0: 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 ) : SSLv2_client
e2b0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
e2c0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
e2d0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
e2e0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e2f0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 SSL_NO_SSL3) &&
e300: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
e310: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 _NO_SSL3_METHOD)
e320: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
e330: 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f OTO_SSL3:..metho
e340: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 d = isServer ? S
e350: 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 SLv3_server_meth
e360: 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 od() : SSLv3_cli
e370: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
e380: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
e390: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
e3a0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
e3b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 PENSSL_NO_TLS1)
e3c0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
e3d0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 SSL_NO_TLS1_METH
e3e0: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 OD). case TLS
e3f0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 _PROTO_TLS1:..me
e400: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 thod = isServer
e410: 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d ? TLSv1_server_m
e420: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f ethod() : TLSv1_
e430: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b client_method();
e440: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
e450: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
e460: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 TLS1_1) && !defi
e470: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
e480: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
e490: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e4a0: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 S1_1_METHOD).
e4b0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
e4c0: 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 TLS1_1:..method
e4d0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
e4e0: 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 v1_1_server_meth
e4f0: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 od() : TLSv1_1_c
e500: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
e510: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
e520: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
e530: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e LS1_2) && !defin
e540: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
e550: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
e560: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e570: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_2_METHOD).
e580: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
e590: 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_2:..method =
e5a0: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
e5b0: 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_2_server_metho
e5c0: 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c d() : TLSv1_2_cl
e5d0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
e5e0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
e5f0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
e600: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 S1_3) && !define
e610: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
e620: 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 1_3). case TL
e630: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a S_PROTO_TLS1_3:.
e640: 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 ./* Use the gene
e650: 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 ric method and c
e660: 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 onstraint range
e670: 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 after context is
e680: 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 created */..met
e690: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
e6a0: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 TLS_server_meth
e6b0: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e od() : TLS_clien
e6c0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
e6d0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 ak;.#endif. d
e6e0: 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f efault:../* Nego
e6f0: 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 tiate highest av
e700: 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 ailable SSL/TLS
e710: 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 version */..meth
e720: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
e730: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
e740: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
e750: 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f _method();.#if O
e760: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
e770: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 UMBER < 0x101000
e780: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 00L && !defined(
e790: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
e7a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
e7b0: 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 SSL2)..off |= (E
e7c0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
e7d0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 S_PROTO_SSL2)
e7e0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f ? 0 : SSL_OP_NO_
e7f0: 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 SSLv2);.#endif.#
e800: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
e810: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL3) && !defined
e820: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
e830: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
e840: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
e850: 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 OTO_SSL3) ? 0
e860: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 : SSL_OP_NO_SSLv
e870: 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 3);.#endif.#if !
e880: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
e890: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e8a0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f NSSL_NO_TLS1)..o
e8b0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
e8c0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
e8d0: 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 TLS1) ? 0 : SS
e8e0: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a L_OP_NO_TLSv1);.
e8f0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
e900: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 ned(NO_TLS1_1) &
e910: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
e920: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f SL_NO_TLS1_1)..o
e930: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
e940: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
e950: 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 TLS1_1) ? 0 : SS
e960: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 L_OP_NO_TLSv1_1)
e970: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
e980: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
e990: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
e9a0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a NSSL_NO_TLS1_2).
e9b0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
e9c0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
e9d0: 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 O_TLS1_2) ? 0 :
e9e0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
e9f0: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 2);.#endif.#if !
ea00: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
ea10: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 3) && !defined(O
ea20: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 PENSSL_NO_TLS1_3
ea30: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
ea40: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
ea50: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 OTO_TLS1_3) ? 0
ea60: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
ea70: 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 1_3);.#endif..br
ea80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 eak;. }..
ea90: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
eaa0: 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 );.. ctx = SS
eab0: 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 L_CTX_new(method
eac0: 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 );. if (!ctx)
ead0: 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b {..return NULL;
eae0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
eaf0: 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 getenv(SSLKEYLOG
eb00: 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 FILE)) {..SSL_CT
eb10: 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c X_set_keylog_cal
eb20: 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f lback(ctx, KeyLo
eb30: 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 gCallback);.
eb40: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 }..#if !defined(
eb50: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
eb60: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
eb70: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 O_TLS1_3). if
eb80: 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 (proto == TLS_P
eb90: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 ROTO_TLS1_3) {..
eba0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f SSL_CTX_set_min_
ebb0: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
ebc0: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f x, TLS1_3_VERSIO
ebd0: 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 N);..SSL_CTX_set
ebe0: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _max_proto_versi
ebf0: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 on(ctx, TLS1_3_V
ec00: 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 ERSION);. }.#
ec10: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f endif.. /* Fo
ec20: 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 rce cipher selec
ec30: 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 tion order by se
ec40: 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 rver */. if (
ec50: 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 !isServer) {..SS
ec60: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e L_CTX_set_option
ec70: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 s(ctx, SSL_OP_CI
ec80: 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 PHER_SERVER_PREF
ec90: 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a ERENCE);. }..
eca0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
ecb0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
ecc0: 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 0100000L. Ope
ecd0: 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 nSSL_add_all_alg
ece0: 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f orithms(); /* Lo
ecf0: 61 64 20 63 69 70 68 65 72 73 20 61 6e 64 20 64 ad ciphers and d
ed00: 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 igests */.#endif
ed10: 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
ed20: 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 t_app_data(ctx,
ed30: 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 (void*)interp);.
ed40: 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 /* remember the
ed50: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 interpreter */.
ed60: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f SSL_CTX_set_o
ed70: 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f ptions(ctx, SSL_
ed80: 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 45 6e 61 62 OP_ALL);./* Enab
ed90: 6c 65 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 le all SSL bug w
eda0: 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 orkarounds */.
edb0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
edc0: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
edd0: 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e P_NO_COMPRESSION
ede0: 29 3b 09 2f 2a 20 44 69 73 61 62 6c 65 20 63 6f );./* Disable co
edf0: 6d 70 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 mpression even i
ee00: 66 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 f supported */.
ee10: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f SSL_CTX_set_o
ee20: 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 ptions(ctx, off)
ee30: 3b 09 09 2f 2a 20 44 69 73 61 62 6c 65 20 73 70 ;../* Disable sp
ee40: 65 63 69 66 69 65 64 20 70 72 6f 74 6f 63 6f 6c ecified protocol
ee50: 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 0a 20 20 versions */..
ee60: 20 20 2f 2a 20 41 6c 6c 6f 77 20 77 72 69 74 65 /* Allow write
ee70: 73 20 74 6f 20 72 65 70 6f 72 74 20 73 75 63 63 s to report succ
ee80: 65 73 73 20 77 68 65 6e 20 6c 65 73 73 20 74 68 ess when less th
ee90: 61 6e 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 68 an all records h
eea0: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e ave been written
eeb0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
eec0: 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 set_mode(ctx, SS
eed0: 4c 5f 4d 4f 44 45 5f 45 4e 41 42 4c 45 5f 50 41 L_MODE_ENABLE_PA
eee0: 52 54 49 41 4c 5f 57 52 49 54 45 29 3b 0a 0a 20 RTIAL_WRITE);..
eef0: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 61 74 /* Disable at
ef00: 74 65 6d 70 74 73 20 74 6f 20 74 72 79 20 74 6f tempts to try to
ef10: 20 70 72 6f 63 65 73 73 20 74 68 65 20 6e 65 78 process the nex
ef20: 74 20 72 65 63 6f 72 64 20 69 6e 73 74 65 61 64 t record instead
ef30: 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 66 of returning af
ef40: 74 65 72 20 61 0a 20 20 20 20 20 20 20 6e 6f 6e ter a. non
ef50: 2d 61 70 70 20 72 65 63 6f 72 64 2e 20 41 76 6f -app record. Avo
ef60: 69 64 73 20 68 61 6e 67 73 20 69 6e 20 62 6c 6f ids hangs in blo
ef70: 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 77 68 65 6e cking mode, when
ef80: 20 75 73 69 6e 67 20 53 53 4c 5f 72 65 61 64 28 using SSL_read(
ef90: 29 20 61 6e 64 20 61 0a 20 20 20 20 20 20 20 6e ) and a. n
efa0: 6f 6e 2d 61 70 70 6c 69 63 61 74 69 6f 6e 20 72 on-application r
efb0: 65 63 6f 72 64 20 77 61 73 20 73 65 6e 74 20 77 ecord was sent w
efc0: 69 74 68 6f 75 74 20 61 6e 79 20 61 70 70 6c 69 ithout any appli
efd0: 63 61 74 69 6f 6e 20 64 61 74 61 2e 20 2a 2f 0a cation data. */.
efe0: 20 20 20 20 2f 2a 53 53 4c 5f 43 54 58 5f 63 6c /*SSL_CTX_cl
eff0: 65 61 72 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 ear_mode(ctx, SS
f000: 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 L_MODE_AUTO_RETR
f010: 59 29 3b 2a 2f 0a 0a 20 20 20 20 53 53 4c 5f 43 Y);*/.. SSL_C
f020: 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 TX_sess_set_cach
f030: 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 e_size(ctx, 128)
f040: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 ;.. /* Set us
f050: 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 er defined ciphe
f060: 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 rs, cipher suite
f070: 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 s, and security
f080: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 level */. if
f090: 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c ((ciphers != NUL
f0a0: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 L) && !SSL_CTX_s
f0b0: 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 et_cipher_list(c
f0c0: 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a tx, ciphers)) {.
f0d0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
f0e0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 t(interp, "Set c
f0f0: 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e iphers failed: N
f100: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 o valid ciphers"
f110: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
f120: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
f130: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ctx);..return NU
f140: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
f150: 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 ((ciphersuites
f160: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c != NULL) && !SSL
f170: 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 _CTX_set_ciphers
f180: 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 uites(ctx, ciphe
f190: 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c rsuites)) {..Tcl
f1a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
f1b0: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 terp, "Set ciphe
f1c0: 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a r suites failed:
f1d0: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 No valid cipher
f1e0: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c s", (char *) NUL
f1f0: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
f200: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
f210: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
f220: 20 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69 /* set automati
f230: 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f c curve selectio
f240: 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 n */. SSL_CTX
f250: 5f 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 63 _set_ecdh_auto(c
f260: 74 78 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 tx, 1);.. /*
f270: 53 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 Set security lev
f280: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 el */. if (le
f290: 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 vel > -1 && leve
f2a0: 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c l < 6) {../* SSL
f2b0: 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _set_security_le
f2c0: 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f vel */..SSL_CTX_
f2d0: 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 set_security_lev
f2e0: 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a el(ctx, level);.
f2f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 }.. /* se
f300: 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 t some callbacks
f310: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
f320: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 set_default_pass
f330: 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 wd_cb(ctx, Passw
f340: 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 ordCallback);.
f350: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 SSL_CTX_set_de
f360: 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f fault_passwd_cb_
f370: 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 userdata(ctx, (v
f380: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
f390: 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 .. /* read a
f3a0: 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 Diffie-Hellman p
f3b0: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 arameters file,
f3c0: 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 or use the built
f3d0: 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 54 -in one */. T
f3e0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
f3f0: 64 73 29 3b 0a 23 69 66 64 65 66 20 4f 50 45 4e ds);.#ifdef OPEN
f400: 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 SSL_NO_DH. if
f410: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
f420: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
f430: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
f440: 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 "DH parameter su
f450: 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 pport not availa
f460: 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ble", (char *) N
f470: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
f480: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
f490: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 n NULL;. }.#e
f4a0: 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 lse. {..DH* d
f4b0: 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 h;..if (DHparams
f4c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
f4d0: 20 42 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20 20 BIO *bio;...
f4e0: 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 bio = BIO_new_f
f4f0: 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 ile(F2N(DHparams
f500: 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 , &ds), "r");..
f510: 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 if (!bio) {..
f520: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
f530: 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 (&ds);...Tcl_App
f540: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
f550: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e , "Could not fin
f560: 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 d DH parameters
f570: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 file", (char *)
f580: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
f590: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
f5a0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
f5b0: 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d }... dh = PEM
f5c0: 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 _read_bio_DHpara
f5d0: 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 ms(bio, NULL, NU
f5e0: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 LL, NULL);..
f5f0: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 BIO_free(bio);..
f600: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
f610: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 ree(&ds);.. i
f620: 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f f (!dh) {...Tcl_
f630: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f640: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 erp, "Could not
f650: 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 read DH paramete
f660: 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 rs from file", (
f670: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
f680: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
f690: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
f6a0: 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53 L;.. }.. S
f6b0: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 SL_CTX_set_tmp_d
f6c0: 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 h(ctx, dh);..
f6d0: 20 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 DH_free(dh);...
f6e0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a } else {.. /*
f6f0: 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 Use well known
f700: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 DH parameters th
f710: 61 74 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e at have built-in
f720: 20 73 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e support in Open
f730: 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 SSL */.. if (
f740: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f !SSL_CTX_set_dh_
f750: 61 75 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a auto(ctx, 1)) {.
f760: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
f770: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c lt(interp, "Coul
f780: 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 d not enable set
f790: 20 44 48 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 DH auto: ", GET
f7a0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
f7b0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
f7c0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
f7d0: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c x);...return NUL
f7e0: 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 L;.. }..}.
f7f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f }.#endif.. /
f800: 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 * set our certif
f810: 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 icate */. loa
f820: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 d_private_key =
f830: 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 0;. if (certf
f840: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile != NULL) {..
f850: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 load_private_key
f860: 20 3d 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f = 1;...if (SSL_
f870: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
f880: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 ate_file(ctx, F2
f890: 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 N(certfile, &ds)
f8a0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 , SSL_FILETYPE_P
f8b0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 EM) <= 0) {..
f8c0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
f8d0: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
f8e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
f8f0: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
f900: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 set certificate
f910: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 file ", certfile
f920: 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 , ": ",...GET_ER
f930: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
f940: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
f950: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
f960: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
f970: 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 NULL;..}..Tcl_DS
f980: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
f990: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
f9a0: 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a cert != NULL) {.
f9b0: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 .load_private_ke
f9c0: 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f y = 1;..if (SSL_
f9d0: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
f9e0: 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 28 69 ate_ASN1(ctx, (i
f9f0: 6e 74 29 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 nt) cert_len, ce
fa00: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 rt) <= 0) {..
fa10: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
fa20: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c t(interp, "unabl
fa30: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 e to set certifi
fa40: 63 61 74 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45 cate: ",...GET_E
fa50: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
fa60: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
fa70: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
fa80: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tx);.. return
fa90: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 NULL;..}. }
faa0: 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 else {..certfile
fab0: 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 = (char*)X509_g
fac0: 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f et_default_cert_
fad0: 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 file();...if (SS
fae0: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 L_CTX_use_certif
faf0: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 icate_file(ctx,
fb00: 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 certfile, SSL_FI
fb10: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
fb20: 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 ) {.#if 0.. T
fb30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
fb40: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
fb50: 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 to use default c
fb60: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 ertificate file
fb70: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 ", certfile, ":
fb80: 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 ",...GET_ERR_REA
fb90: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
fba0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
fbb0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
fbc0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
fbd0: 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d .#endif..}. }
fbe0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 .. /* set our
fbf0: 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a private key */.
fc00: 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 if (load_pri
fc10: 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 vate_key) {..if
fc20: 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c (keyfile == NULL
fc30: 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 && key == NULL)
fc40: 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 {.. keyfile
fc50: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a = certfile;..}..
fc60: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 .if (keyfile !=
fc70: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 NULL) {.. /*
fc80: 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 20 get the private
fc90: 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 key associated w
fca0: 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 69 ith this certifi
fcb0: 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 cate */.. if
fcc0: 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c (keyfile == NULL
fcd0: 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 ) {...keyfile =
fce0: 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d certfile;.. }
fcf0: 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 ... if (SSL_C
fd00: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 TX_use_PrivateKe
fd10: 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 y_file(ctx, F2N(
fd20: 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 keyfile, &ds), S
fd30: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
fd40: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 <= 0) {...Tcl_D
fd50: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
fd60: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 .../* flush the
fd70: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 passphrase which
fd80: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 might be left i
fd90: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a n the result */.
fda0: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
fdb0: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 interp, NULL, TC
fdc0: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c L_STATIC);...Tcl
fdd0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
fde0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
fdf0: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 set public key
fe00: 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c file ", keyfile,
fe10: 20 22 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f " ",... GET_
fe20: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
fe30: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
fe40: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
fe50: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
fe60: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 ;.. }.. Tc
fe70: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
fe80: 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 s);...} else if
fe90: 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (key != NULL) {.
fea0: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 . if (SSL_CTX
feb0: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f _use_PrivateKey_
fec0: 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 ASN1(EVP_PKEY_RS
fed0: 41 2c 20 63 74 78 2c 20 6b 65 79 2c 20 28 69 6e A, ctx, key, (in
fee0: 74 29 20 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 t) key_len) <= 0
fef0: 29 20 7b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 ) {.../* flush t
ff00: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 he passphrase wh
ff10: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 ich might be lef
ff20: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 t in the result
ff30: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 */...Tcl_SetResu
ff40: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c lt(interp, NULL,
ff50: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 TCL_STATIC);...
ff60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
ff70: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 (interp, "unable
ff80: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b to set public k
ff90: 65 79 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 ey: ", GET_ERR_R
ffa0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
ffb0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 ) NULL);...SSL_C
ffc0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 TX_free(ctx);...
ffd0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 return NULL;..
ffe0: 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 }..}../* Now w
fff0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 e know that a ke
10000 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 y and cert have
10010 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 been set against
10020 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e .. * the SSL con
10030 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 text */..if (!SS
10040 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 L_CTX_check_priv
10050 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a ate_key(ctx)) {.
10060 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
10070 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 esult(interp, "p
10080 72 69 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 rivate key does
10090 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 not match the ce
100a0 72 74 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 rtificate public
100b0 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 key",.... (
100c0 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
100d0 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
100e0 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
100f0 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 rn NULL;..}.
10100 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 6f }.. /* Set to
10110 20 75 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 use the default
10120 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 66 69 location and fi
10130 6c 65 20 66 6f 72 20 43 65 72 74 69 66 69 63 61 le for Certifica
10140 74 65 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 te Authority (CA
10150 29 20 63 65 72 74 69 66 69 63 61 74 65 73 2e 0a ) certificates..
10160 20 20 20 20 20 2a 20 54 68 65 20 64 65 66 61 75 * The defau
10170 6c 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 lt CA certificat
10180 65 73 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 es directory is
10190 63 61 6c 6c 65 64 20 63 65 72 74 73 20 69 6e 20 called certs in
101a0 74 68 65 20 64 65 66 61 75 6c 74 20 4f 70 65 6e the default Open
101b0 53 53 4c 0a 20 20 20 20 20 2a 20 64 69 72 65 63 SSL. * direc
101c0 74 6f 72 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e tory. It contain
101d0 73 20 74 68 65 20 43 41 20 63 65 72 74 69 66 69 s the CA certifi
101e0 63 61 74 65 73 20 69 6e 20 50 45 4d 20 66 6f 72 cates in PEM for
101f0 6d 61 74 2c 20 77 69 74 68 20 6f 6e 65 20 63 65 mat, with one ce
10200 72 74 69 66 69 63 61 74 65 20 70 65 72 0a 20 20 rtificate per.
10210 20 20 20 2a 20 66 69 6c 65 2e 20 54 68 65 20 76 * file. The v
10220 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 73 erify path and s
10230 74 6f 72 65 20 63 61 6e 20 62 65 20 6f 76 65 72 tore can be over
10240 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 ridden by the SS
10250 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 L_CERT_DIR env v
10260 61 72 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 64 ar. The. * d
10270 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 69 66 efault CA certif
10280 69 63 61 74 65 73 20 66 69 6c 65 20 69 73 20 63 icates file is c
10290 61 6c 6c 65 64 20 63 65 72 74 2e 70 65 6d 20 69 alled cert.pem i
102a0 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 4f 70 n the default Op
102b0 65 6e 53 53 4c 20 64 69 72 65 63 74 6f 72 79 2e enSSL directory.
102c0 0a 20 20 20 20 20 2a 20 54 68 65 20 76 65 72 69 . * The veri
102d0 66 79 20 66 69 6c 65 20 63 61 6e 20 62 65 20 6f fy file can be o
102e0 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 verridden by the
102f0 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 SSL_CERT_FILE e
10300 6e 76 20 76 61 72 2e 20 2a 2f 0a 20 20 20 20 69 nv var. */. i
10310 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f f (!SSL_CTX_set_
10320 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 default_verify_p
10330 61 74 68 73 28 63 74 78 29 29 20 7b 0a 09 61 62 aths(ctx)) {..ab
10340 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 ort++;. }..
10350 20 20 2f 2a 20 4f 76 65 72 72 69 64 65 73 20 66 /* Overrides f
10360 6f 72 20 74 68 65 20 43 41 20 76 65 72 69 66 79 or the CA verify
10370 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 2a path and file *
10380 2f 0a 20 20 20 20 7b 0a 23 69 66 20 4f 50 45 4e /. {.#if OPEN
10390 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
103a0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
103b0 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 ..if (CApath !=
103c0 4e 55 4c 4c 20 7c 7c 20 43 41 66 69 6c 65 20 21 NULL || CAfile !
103d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 = NULL) {.. T
103e0 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a cl_DString ds1;.
103f0 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
10400 49 6e 69 74 28 26 64 73 31 29 3b 0a 0a 09 20 20 Init(&ds1);...
10410 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c if (!SSL_CTX_l
10420 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 oad_verify_locat
10430 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 ions(ctx, F2N(CA
10440 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 file, &ds), F2N(
10450 43 41 70 61 74 68 2c 20 26 64 73 31 29 29 29 20 CApath, &ds1)))
10460 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 09 72 {...abort++;...r
10470 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
10480 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 }.. Tcl_DStr
10490 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
104a0 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
104b0 65 65 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 ee(&ds1);...
104c0 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 /* Set list of C
104d0 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c As to send to cl
104e0 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 ient when reques
104f0 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 ting a client ce
10500 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 rtificate */..
10510 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 /* https://sou
10520 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 rceforge.net/p/t
10530 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09 ls/bugs/57/ */..
10540 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a /* XXX:TODO:
10550 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 Let the user su
10560 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 pply values here
10570 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 instead of some
10580 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 thing that exist
10590 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 s on the filesys
105a0 74 65 6d 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 tem */.. STAC
105b0 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 K_OF(X509_NAME)
105c0 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c *certNames = SSL
105d0 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f _load_client_CA_
105e0 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c file(F2N(CAfile,
105f0 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 &ds));.. if
10600 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 (certNames != NU
10610 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f LL) {...SSL_CTX_
10620 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 set_client_CA_li
10630 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 st(ctx, certName
10640 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 s);.. }..
10650 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
10660 26 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65 0a &ds);..}..#else.
10670 09 2f 2a 20 53 65 74 20 64 69 72 65 63 74 6f 72 ./* Set director
10680 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 43 41 20 y containing CA
10690 63 65 72 74 69 66 69 63 61 74 65 73 20 69 6e 20 certificates in
106a0 50 45 4d 20 66 6f 72 6d 61 74 2e 20 2a 2f 0a 09 PEM format. */..
106b0 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 if (CApath != NU
106c0 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 LL) {.. if (!
106d0 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 SSL_CTX_load_ver
106e0 69 66 79 5f 64 69 72 28 63 74 78 2c 20 46 32 4e ify_dir(ctx, F2N
106f0 28 43 41 70 61 74 68 2c 20 26 64 73 29 29 29 20 (CApath, &ds)))
10700 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 {...abort++;..
10710 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
10720 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
10730 7d 0a 0a 09 2f 2a 20 53 65 74 20 55 52 49 20 66 }.../* Set URI f
10740 6f 72 20 74 6f 20 61 20 73 74 6f 72 65 2c 20 77 or to a store, w
10750 68 69 63 68 20 6d 61 79 20 62 65 20 61 20 73 69 hich may be a si
10760 6e 67 6c 65 20 63 6f 6e 74 61 69 6e 65 72 20 6f ngle container o
10770 72 20 61 20 63 61 74 61 6c 6f 67 20 6f 66 20 63 r a catalog of c
10780 6f 6e 74 61 69 6e 65 72 73 2e 20 2a 2f 0a 09 69 ontainers. */..i
10790 66 20 28 43 41 73 74 6f 72 65 20 21 3d 20 4e 55 f (CAstore != NU
107a0 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 LL) {.. if (!
107b0 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 SSL_CTX_load_ver
107c0 69 66 79 5f 73 74 6f 72 65 28 63 74 78 2c 20 46 ify_store(ctx, F
107d0 32 4e 28 43 41 73 74 6f 72 65 2c 20 26 64 73 29 2N(CAstore, &ds)
107e0 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a )) {...abort++;.
107f0 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f . }.. Tcl_
10800 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
10810 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 66 69 ;..}.../* Set fi
10820 6c 65 20 6f 66 20 43 41 20 63 65 72 74 69 66 69 le of CA certifi
10830 63 61 74 65 73 20 69 6e 20 50 45 4d 20 66 6f 72 cates in PEM for
10840 6d 61 74 2e 20 20 2a 2f 0a 09 69 66 20 28 43 41 mat. */..if (CA
10850 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
10860 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 . if (!SSL_CT
10870 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 X_load_verify_fi
10880 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 le(ctx, F2N(CAfi
10890 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 le, &ds))) {...a
108a0 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 bort++;.. }..
108b0 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
108c0 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 ree(&ds);...
108d0 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 /* Set list of C
108e0 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c As to send to cl
108f0 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 ient when reques
10900 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 ting a client ce
10910 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 rtificate */..
10920 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f STACK_OF(X509_
10930 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 NAME) *certNames
10940 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 = SSL_load_clie
10950 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 nt_CA_file(F2N(C
10960 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 Afile, &ds));..
10970 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 if (certNames
10980 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 != NULL) {...SS
10990 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 L_CTX_set_client
109a0 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 _CA_list(ctx, ce
109b0 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d rtNames);.. }
109c0 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
109d0 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 gFree(&ds);..}.#
109e0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 endif. }..
109f0 20 69 66 20 28 61 62 6f 72 74 20 3e 20 30 29 20 if (abort > 0)
10a00 7b 0a 09 2f 2a 20 72 65 74 75 72 6e 20 65 72 72 {../* return err
10a10 6f 72 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 or */. }.
10a20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a return ctx;.}...
10a30 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
10a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a70 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
10a80 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 tatusObjCmd -- r
10a90 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 eturn certificat
10aa0 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 e for connected
10ab0 70 65 65 72 20 69 6e 66 6f 2e 0a 20 2a 0a 20 2a peer info.. *. *
10ac0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
10ad0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
10ae0 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
10af0 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
10b00 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
10b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
10b50 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f atic int.StatusO
10b60 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
10b70 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
10b80 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
10b90 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
10ba0 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
10bb0 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
10bc0 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 tatePtr;. X50
10bd0 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 9 *peer;. Tcl
10be0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 _Obj *objPtr;.
10bf0 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
10c00 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 an;. char *ch
10c10 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 annelName, *ciph
10c20 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 ers;. int mod
10c30 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
10c40 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 igned char *prot
10c50 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 o;. unsigned
10c60 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 int len;. int
10c70 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 nid, res;. (
10c80 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
10c90 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
10ca0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
10cb0 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f f (objc < 2 || o
10cc0 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 bjc > 3 || (objc
10cd0 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 == 3 && !strcmp
10ce0 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f (Tcl_GetString(o
10cf0 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c bjv[1]), "-local
10d00 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e "))) {..Tcl_Wron
10d10 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
10d20 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 1, objv, "?-loc
10d30 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 al? channel");..
10d40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
10d50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
10d60 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a Get channel Id *
10d70 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d /. channelNam
10d80 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e e = Tcl_GetStrin
10d90 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 g(objv[(objc ==
10da0 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 2 ? 1 : 2)]);.
10db0 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
10dc0 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
10dd0 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f channelName, &mo
10de0 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 de);. if (cha
10df0 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
10e00 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
10e10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
10e20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
10e30 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
10e40 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
10e50 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
10e60 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
10e70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 Channel(chan);.
10e80 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
10e90 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
10ea0 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 != Tls_ChannelTy
10eb0 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 pe()) {..Tcl_App
10ec0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
10ed0 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
10ee0 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
10ef0 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 elName(chan),...
10f00 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
10f10 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a hannel", (char *
10f20 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 ) NULL);..Tcl_Se
10f30 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
10f40 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 p, "TLS", "STATU
10f50 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 S", "CHANNEL", "
10f60 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 INVALID", (char
10f70 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
10f80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
10f90 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 }. statePtr
10fa0 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f = (State *) Tcl_
10fb0 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
10fc0 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 ceData(chan);..
10fd0 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66 /* Get certif
10fe0 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f icate for peer o
10ff0 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 r self */. if
11000 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 (objc == 2) {..
11010 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 peer = SSL_get_p
11020 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 eer_certificate(
11030 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
11040 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 } else {..pe
11050 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 er = SSL_get_cer
11060 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 tificate(statePt
11070 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 r->ssl);. }.
11080 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 /* Get X509 c
11090 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 ertificate info
110a0 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 */. if (peer)
110b0 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 {..objPtr = Tls
110c0 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 _NewX509Obj(inte
110d0 72 70 2c 20 70 65 65 72 2c 20 31 29 3b 0a 09 69 rp, peer, 1);..i
110e0 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a f (objc == 2) {.
110f0 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 . X509_free(p
11100 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 eer);.. peer
11110 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d = NULL;..}. }
11120 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 else {..objPtr
11130 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
11140 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d (0, NULL);. }
11150 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 .. /* Peer na
11160 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e me */. LAPPEN
11170 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11180 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 jPtr, "peername"
11190 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e , SSL_get0_peern
111a0 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ame(statePtr->ss
111b0 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 l), -1);. LAP
111c0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
111d0 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 objPtr, "sbits"
111e0 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 , SSL_get_cipher
111f0 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e _bits(statePtr->
11200 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 ssl, NULL));..
11210 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 ciphers = (cha
11220 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 r*)SSL_get_ciphe
11230 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 r(statePtr->ssl)
11240 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 ;. LAPPEND_ST
11250 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
11260 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 , "cipher", ciph
11270 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f ers, -1);.. /
11280 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 * Verify the X50
11290 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 9 certificate pr
112a0 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 esented by the p
112b0 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 eer */. LAPPE
112c0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
112d0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 bjPtr, "verifyRe
112e0 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 sult",..X509_ver
112f0 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 ify_cert_error_s
11300 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 tring(SSL_get_ve
11310 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
11320 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 ePtr->ssl)), -1)
11330 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 ;.. /* Verify
11340 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 mode */. mod
11350 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 e = SSL_get_veri
11360 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 fy_mode(statePtr
11370 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 ->ssl);. if (
11380 6d 6f 64 65 20 26 20 53 53 4c 5f 56 45 52 49 46 mode & SSL_VERIF
11390 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 Y_NONE) {..LAPPE
113a0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
113b0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f bjPtr, "verifyMo
113c0 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 de", "none", -1)
113d0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
113e0 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a Tcl_Obj *listObj
113f0 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
11400 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 tObj(0, NULL);..
11410 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 56 if (mode & SSL_V
11420 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 ERIFY_PEER) {..
11430 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
11440 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
11450 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 rp, listObjPtr,
11460 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
11470 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 ("peer", -1));..
11480 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 }..if (mode & SS
11490 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 L_VERIFY_FAIL_IF
114a0 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b _NO_PEER_CERT) {
114b0 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
114c0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
114d0 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 nterp, listObjPt
114e0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
114f0 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 Obj("fail if no
11500 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 peer cert", -1))
11510 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 ;..}..if (mode &
11520 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 SSL_VERIFY_CLIE
11530 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 NT_ONCE) {..
11540 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
11550 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
11560 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
11570 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 _NewStringObj("c
11580 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 lient once", -1)
11590 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 );..}..if (mode
115a0 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 & SSL_VERIFY_POS
115b0 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 T_HANDSHAKE) {..
115c0 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
115d0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
115e0 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c erp, listObjPtr,
115f0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
11600 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b j("post handshak
11610 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 e", -1));..}..LA
11620 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
11630 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 , objPtr, "verif
11640 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 yMode", listObjP
11650 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f tr). }.. /
11660 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 * Verify mode de
11670 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 pth */. LAPPE
11680 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
11690 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 bjPtr, "verifyDe
116a0 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 pth", SSL_get_ve
116b0 72 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 rify_depth(state
116c0 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 Ptr->ssl));..
116d0 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 /* Report the s
116e0 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
116f0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
11700 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 the negotiation
11710 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f */. SSL_get0_
11720 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 alpn_selected(st
11730 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 atePtr->ssl, &pr
11740 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 oto, &len);.
11750 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
11760 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 rp, objPtr, "alp
11770 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 n", (char *)prot
11780 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 o, (Tcl_Size) le
11790 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f n);. LAPPEND_
117a0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
117b0 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 tr, "protocol",
117c0 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 SSL_get_version(
117d0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 statePtr->ssl),
117e0 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c -1);.. /* Val
117f0 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 id for non-RSA s
11800 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 ignature and TLS
11810 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 1.3 */. if (
11820 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 objc == 2) {..re
11830 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 s = SSL_get_peer
11840 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 _signature_nid(s
11850 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e tatePtr->ssl, &n
11860 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 id);. } else
11870 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 {..res = SSL_get
11880 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 _signature_nid(s
11890 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e tatePtr->ssl, &n
118a0 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 id);. }. i
118b0 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 f (!res) {nid =
118c0 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 0;}. LAPPEND_
118d0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
118e0 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 tr, "signatureHa
118f0 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 shAlgorithm", OB
11900 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d J_nid2ln(nid), -
11910 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 65 1);.. /* Adde
11920 64 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 d in OpenSSL 1.1
11930 2e 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 .1a */.#if OPENS
11940 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
11950 52 20 3e 20 30 78 31 30 31 30 31 30 30 30 4c 0a R > 0x10101000L.
11960 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
11970 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 2) {..res = SSL_
11980 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 get_peer_signatu
11990 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 re_type_nid(stat
119a0 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 ePtr->ssl, &nid)
119b0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
119c0 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 res = SSL_get_si
119d0 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 gnature_type_nid
119e0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
119f0 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 &nid);. }.
11a00 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 if (!res) {nid
11a10 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e = 0;}. LAPPEN
11a20 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
11a30 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 jPtr, "signature
11a40 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c Type", OBJ_nid2l
11a50 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23 65 6e n(nid), -1);.#en
11a60 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 dif.. Tcl_Set
11a70 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
11a80 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
11a90 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
11aa0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
11ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
11af0 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f ConnectionInfoO
11b00 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 bjCmd -- return
11b10 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 connection info
11b20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a from OpenSSL.. *
11b30 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
11b40 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 A list of connec
11b50 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a tion info. *. *
11b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ba0 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 ---. */..static
11bb0 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e int ConnectionIn
11bc0 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 foObjCmd(ClientD
11bd0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
11be0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
11bf0 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
11c00 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
11c10 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
11c20 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
11c30 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
11c40 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f set a mode on */
11c50 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
11c60 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 ePtr;../* client
11c70 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
11c80 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c ocket */. Tcl
11c90 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c _Obj *objPtr, *l
11ca0 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 istPtr;. cons
11cb0 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 t SSL *ssl;.
11cc0 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 const SSL_CIPHER
11cd0 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f *cipher;. co
11ce0 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 nst SSL_SESSION
11cf0 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f *session;. co
11d00 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a nst EVP_MD *md;.
11d10 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e (void) clien
11d20 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 tData;.. dpri
11d30 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
11d40 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 if (objc !=
11d50 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
11d60 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
11d70 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c , objv, "channel
11d80 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
11d90 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
11da0 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
11db0 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
11dc0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
11dd0 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 jv[1]), NULL);.
11de0 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
11df0 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
11e00 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
11e10 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
11e20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
11e30 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
11e40 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
11e50 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
11e60 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
11e70 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 l(chan);. if
11e80 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
11e90 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
11ea0 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
11eb0 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
11ec0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
11ed0 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
11ee0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
11ef0 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 (chan),.. "\"
11f00 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
11f10 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e nel", (char *) N
11f20 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
11f30 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
11f40 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 "TLS", "CONNECTI
11f50 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 ON", "CHANNEL",
11f60 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
11f70 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
11f80 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
11f90 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 }.. objPtr
11fa0 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
11fb0 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 (0, NULL);..
11fc0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e /* Connection in
11fd0 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 fo */. stateP
11fe0 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
11ff0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
12000 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
12010 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 ssl = stateP
12020 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 tr->ssl;. if
12030 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl != NULL) {.
12040 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 .const unsigned
12050 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e char *proto;..un
12060 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
12070 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 61 .../* Initializa
12080 74 69 6f 6e 20 66 69 6e 69 73 68 65 64 20 2a 2f tion finished */
12090 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
120a0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
120b0 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 22 2c 20 init_finished",
120c0 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 SSL_is_init_fini
120d0 73 68 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a shed(ssl));.../*
120e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 connection stat
120f0 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 e */..LAPPEND_ST
12100 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
12110 2c 20 22 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 , "state", SSL_s
12120 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 tate_string_long
12130 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a (ssl), -1);.../*
12140 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 Get SNI request
12150 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a ed server name *
12160 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
12170 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12180 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c servername", SSL
12190 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 _get_servername(
121a0 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 ssl, TLSEXT_NAME
121b0 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c TYPE_host_name),
121c0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 -1);.../* Repor
121d0 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 t the selected p
121e0 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 rotocol as a res
121f0 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 ult of the negot
12200 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 67 iation */..SSL_g
12210 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 et0_alpn_selecte
12220 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
12230 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b &proto, &ulen);
12240 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
12250 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 terp, objPtr, "a
12260 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72 lpn", (char *)pr
12270 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 oto, (Tcl_Size)
12280 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 ulen);.../* Get
12290 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 protocol */..LAP
122a0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
122b0 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 objPtr, "protoc
122c0 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 ol", SSL_get_ver
122d0 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a sion(ssl), -1);.
122e0 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 ../* Renegotiati
122f0 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c on allowed */..L
12300 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 APPEND_BOOL(inte
12310 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e rp, objPtr, "ren
12320 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 egotiation_allow
12330 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 ed", SSL_get_sec
12340 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f ure_renegotiatio
12350 6e 5f 73 75 70 70 6f 72 74 28 28 53 53 4c 20 2a n_support((SSL *
12360 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 ) ssl));.../* Ge
12370 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c t security level
12380 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
12390 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
123a0 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c "security_level
123b0 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 ", SSL_get_secur
123c0 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b ity_level(ssl));
123d0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e .../* Session in
123e0 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 fo */..LAPPEND_B
123f0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
12400 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 tr, "session_reu
12410 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f sed", SSL_sessio
12420 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a n_reused(ssl));.
12430 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 ../* Is server i
12440 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f nfo */..LAPPEND_
12450 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
12460 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22 Ptr, "is_server"
12470 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 , SSL_is_server(
12480 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 ssl));.../* Is D
12490 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f TLS */..LAPPEND_
124a0 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
124b0 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 Ptr, "is_dtls",
124c0 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 SSL_is_dtls(ssl)
124d0 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f );..#if OPENSSL_
124e0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e VERSION_NUMBER >
124f0 3d 20 30 78 33 30 32 30 30 30 30 30 4c 0a 09 2f = 0x30200000L../
12500 2a 20 49 73 20 51 55 49 43 20 2a 2f 0a 09 4c 41 * Is QUIC */..LA
12510 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
12520 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 71 p, objPtr, "is_q
12530 75 69 63 22 2c 20 53 53 4c 5f 69 73 5f 71 75 69 uic", SSL_is_qui
12540 63 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 c(ssl));.../* Is
12550 20 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 TLS */..LAPPEND
12560 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
12570 6a 50 74 72 2c 20 22 69 73 5f 74 6c 73 22 2c 20 jPtr, "is_tls",
12580 53 53 4c 5f 69 73 5f 74 6c 73 28 73 73 6c 29 29 SSL_is_tls(ssl))
12590 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 44 41 ;.#endif.../* DA
125a0 4e 45 20 54 4c 53 20 61 75 74 68 65 6e 74 69 63 NE TLS authentic
125b0 61 74 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e ation */..LAPPEN
125c0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f D_BOOL(interp, o
125d0 62 6a 50 74 72 2c 20 22 64 61 6e 65 5f 61 75 74 bjPtr, "dane_aut
125e0 68 22 2c 20 53 53 4c 5f 67 65 74 30 5f 64 61 6e h", SSL_get0_dan
125f0 65 28 28 53 53 4c 20 2a 29 73 73 6c 29 20 21 3d e((SSL *)ssl) !=
12600 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 57 61 69 NULL);.../* Wai
12610 74 69 6e 67 20 66 6f 72 20 61 73 79 6e 63 20 2a ting for async *
12620 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
12630 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12640 22 77 61 69 74 69 6e 67 5f 66 6f 72 5f 61 73 79 "waiting_for_asy
12650 6e 63 22 2c 20 53 53 4c 5f 77 61 69 74 69 6e 67 nc", SSL_waiting
12660 5f 66 6f 72 5f 61 73 79 6e 63 28 28 53 53 4c 20 _for_async((SSL
12670 2a 29 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 54 69 *)ssl));.../* Ti
12680 6d 65 2d 6f 75 74 20 2a 2f 0a 09 4c 41 50 50 45 me-out */..LAPPE
12690 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
126a0 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 2d 6f 75 objPtr, "time-ou
126b0 74 22 2c 20 53 53 4c 5f 67 65 74 5f 64 65 66 61 t", SSL_get_defa
126c0 75 6c 74 5f 74 69 6d 65 6f 75 74 28 73 73 6c 29 ult_timeout(ssl)
126d0 29 3b 0a 0a 09 2f 2a 20 49 73 20 43 65 72 74 69 );.../* Is Certi
126e0 66 69 63 61 74 65 20 54 72 61 6e 73 70 61 72 65 ficate Transpare
126f0 6e 63 79 20 76 61 6c 69 64 61 74 69 6f 6e 20 65 ncy validation e
12700 6e 61 62 6c 65 64 20 2a 2f 0a 09 4c 41 50 50 45 nabled */..LAPPE
12710 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
12720 6f 62 6a 50 74 72 2c 20 22 63 74 5f 65 6e 61 62 objPtr, "ct_enab
12730 6c 65 64 22 2c 20 53 53 4c 5f 63 74 5f 69 73 5f led", SSL_ct_is_
12740 65 6e 61 62 6c 65 64 28 73 73 6c 29 29 3b 0a 20 enabled(ssl));.
12750 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 }.. /* Cip
12760 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 her info */.
12770 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 cipher = SSL_get
12780 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 _current_cipher(
12790 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 ssl);. if (ci
127a0 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a pher != NULL) {.
127b0 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a .char buf[BUFSIZ
127c0 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 ] = {0};..int bi
127d0 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 ts, alg_bits;...
127e0 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a /* Cipher name *
127f0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
12800 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
12810 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 cipher", SSL_CIP
12820 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 HER_get_name(cip
12830 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 her), -1);.../*
12840 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 RFC name of ciph
12850 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 er */..LAPPEND_S
12860 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
12870 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d r, "standard_nam
12880 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 e", SSL_CIPHER_s
12890 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 tandard_name(cip
128a0 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 her), -1);.../*
128b0 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 OpenSSL name of
128c0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 cipher */..LAPPE
128d0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
128e0 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f bjPtr, "openssl_
128f0 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 name", OPENSSL_c
12900 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 ipher_name(SSL_C
12910 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e IPHER_standard_n
12920 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 ame(cipher)), -1
12930 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f );.../* number o
12940 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73 f secret bits us
12950 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f ed for cipher */
12960 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 ..bits = SSL_CIP
12970 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 HER_get_bits(cip
12980 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b her, &alg_bits);
12990 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
129a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 terp, objPtr, "s
129b0 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 ecret_bits", bit
129c0 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 s);..LAPPEND_INT
129d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
129e0 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 "algorithm_bits
129f0 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f ", alg_bits);../
12a00 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 * alg_bits is ac
12a10 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 tual key secret
12a20 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 bits. If use bit
12a30 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c s and secret (al
12a40 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 gorithm) bits di
12a50 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 ffer,.. the re
12a60 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 st of the bits a
12a70 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 re fixed, i.e. f
12a80 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 or limited expor
12a90 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20 t ciphers (bits
12aa0 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e < 56) */.../* In
12ab0 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53 dicates which SS
12ac0 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 L/TLS protocol v
12ad0 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 ersion first def
12ae0 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20 ined the cipher
12af0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
12b00 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12b10 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 "min_version", S
12b20 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 SL_CIPHER_get_ve
12b30 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d rsion(cipher), -
12b40 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 1);.../* Cipher
12b50 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f NID */..LAPPEND_
12b60 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
12b70 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c tr, "cipherNID",
12b80 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 (char *)OBJ_nid
12b90 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 2ln(SSL_CIPHER_g
12ba0 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69 et_cipher_nid(ci
12bb0 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 pher)), -1);..LA
12bc0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
12bd0 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73 , objPtr, "diges
12be0 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f tNID", (char *)O
12bf0 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 BJ_nid2ln(SSL_CI
12c00 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f PHER_get_digest_
12c10 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
12c20 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
12c30 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
12c40 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22 "keyExchangeNID"
12c50 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 , (char *)OBJ_ni
12c60 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f d2ln(SSL_CIPHER_
12c70 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 get_kx_nid(ciphe
12c80 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 r)), -1);..LAPPE
12c90 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
12ca0 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69 bjPtr, "authenti
12cb0 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 cationNID", (cha
12cc0 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 r *)OBJ_nid2ln(S
12cd0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75 SL_CIPHER_get_au
12ce0 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c th_nid(cipher)),
12cf0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 -1);.../* messa
12d00 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f ge authenticatio
12d10 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20 n code - Cipher
12d20 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43 is AEAD (e.g. GC
12d30 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f M or ChaCha20/Po
12d40 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a ly1305) or not *
12d50 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 /../* Authentica
12d60 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 ted Encryption w
12d70 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64 ith associated d
12d80 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b ata (AEAD) check
12d90 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
12da0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
12db0 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61 , "cipher_is_aea
12dc0 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 d", SSL_CIPHER_i
12dd0 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b s_aead(cipher));
12de0 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 .../* Digest use
12df0 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c d during the SSL
12e00 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 /TLS handshake w
12e10 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 hen using the ci
12e20 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 pher. */..md = S
12e30 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 SL_CIPHER_get_ha
12e40 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 ndshake_digest(c
12e50 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 ipher);..LAPPEND
12e60 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
12e70 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f Ptr, "handshake_
12e80 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a digest", (char *
12e90 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 )EVP_MD_name(md)
12ea0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 , -1);.../* Get
12eb0 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 OpenSSL-specific
12ec0 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 ID, not IANA ID
12ed0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
12ee0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
12ef0 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69 "cipher_id", (i
12f00 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 nt) SSL_CIPHER_g
12f10 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a et_id(cipher));.
12f20 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 ../* Two-byte ID
12f30 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53 used in the TLS
12f40 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 protocol of the
12f50 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f given cipher */
12f60 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e ..LAPPEND_INT(in
12f70 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 terp, objPtr, "p
12f80 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e rotocol_id", (in
12f90 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 t) SSL_CIPHER_ge
12fa0 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 t_protocol_id(ci
12fb0 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 pher));.../* Tex
12fc0 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e tual description
12fd0 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a of the cipher *
12fe0 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 /..if (SSL_CIPHE
12ff0 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 R_description(ci
13000 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f pher, buf, sizeo
13010 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 f(buf)) != NULL)
13020 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f {.. LAPPEND_
13030 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
13040 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e tr, "description
13050 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a ", buf, -1);..}.
13060 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
13070 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 ssion info */.
13080 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f session = SSL_
13090 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 get_session(ssl)
130a0 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f ;. if (sessio
130b0 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f n != NULL) {..co
130c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
130d0 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 r *ticket;..size
130e0 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e _t len2;..unsign
130f0 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f ed int ulen;..co
13100 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
13110 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a r *session_id, *
13120 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 proto;..unsigned
13130 20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c char buffer[SSL
13140 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f _MAX_MASTER_KEY_
13150 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 LENGTH];.../* Re
13160 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 port the selecte
13170 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 d protocol as a
13180 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c result of the AL
13190 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a PN negotiation *
131a0 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 /..SSL_SESSION_g
131b0 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 et0_alpn_selecte
131c0 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 d(session, &prot
131d0 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 o, &len2);..LAPP
131e0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
131f0 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 objPtr, "alpn",
13200 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 (char *) proto,
13210 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 (Tcl_Size) len2)
13220 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 ;.../* Report th
13230 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
13240 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
13250 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 of the NPN negot
13260 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 iation */.#ifdef
13270 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 USE_NPN..SSL_ge
13280 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 t0_next_proto_ne
13290 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 gotiated(ssl, &p
132a0 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c roto, &ulen);..L
132b0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
132c0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 p, objPtr, "npn"
132d0 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f , (char *) proto
132e0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
132f0 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 n);.#endif.../*
13300 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f Resumable sessio
13310 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f n */..LAPPEND_BO
13320 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 OL(interp, objPt
13330 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 r, "resumable",
13340 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 SSL_SESSION_is_r
13350 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e esumable(session
13360 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e ));.../* Session
13370 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 start time (sec
13380 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 onds since epoch
13390 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f ) */..LAPPEND_LO
133a0 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NG(interp, objPt
133b0 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c r, "start_time",
133c0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
133d0 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b _time(session));
133e0 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 .../* Timeout va
133f0 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 lue - SSL_CTX_ge
13400 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 t_timeout (in se
13410 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 conds) */..LAPPE
13420 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
13430 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 objPtr, "timeout
13440 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 ", SSL_SESSION_g
13450 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 et_timeout(sessi
13460 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 on));.../* Sessi
13470 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 on id - TLSv1.2
13480 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a and below only *
13490 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 /..session_id =
134a0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
134b0 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 id(session, &ule
134c0 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 n);..LAPPEND_BAR
134d0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 RAY(interp, objP
134e0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 tr, "session_id"
134f0 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 , session_id, (T
13500 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a cl_Size) ulen);.
13510 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e ../* Session con
13520 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e text */..session
13530 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f _id = SSL_SESSIO
13540 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 N_get0_id_contex
13550 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e t(session, &ulen
13560 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
13570 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
13580 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 r, "session_cont
13590 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 ext", session_id
135a0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 , (Tcl_Size) ule
135b0 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e n);.../* Session
135c0 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 ticket - client
135d0 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 only */..SSL_SE
135e0 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 SSION_get0_ticke
135f0 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b t(session, &tick
13600 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 et, &len2);..LAP
13610 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
13620 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 rp, objPtr, "ses
13630 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 sion_ticket", ti
13640 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 cket, (Tcl_Size)
13650 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 len2);.../* Ses
13660 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 sion ticket life
13670 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 time hint (in se
13680 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 conds) */..LAPPE
13690 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
136a0 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d objPtr, "lifetim
136b0 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f e", SSL_SESSION_
136c0 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 get_ticket_lifet
136d0 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e ime_hint(session
136e0 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 ));.../* Ticket
136f0 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 app data */.#if
13700 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
13710 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
13720 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 000L..SSL_SESSIO
13730 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 N_get0_ticket_ap
13740 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49 pdata((SSL_SESSI
13750 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 ON *) session, &
13760 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a ticket, &len2);.
13770 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
13780 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
13790 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 "ticket_app_data
137a0 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f ", ticket, (Tcl_
137b0 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e Size) len2);.#en
137c0 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 dif.../* Get mas
137d0 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 ter key */..len2
137e0 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
137f0 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 et_master_key(se
13800 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 ssion, buffer, S
13810 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 SL_MAX_MASTER_KE
13820 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 Y_LENGTH);..LAPP
13830 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 END_BARRAY(inter
13840 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 p, objPtr, "mast
13850 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c er_key", buffer,
13860 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
13870 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 );.../* Compress
13880 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 ion id */..unsig
13890 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c ned int id = SSL
138a0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d _SESSION_get_com
138b0 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e press_id(session
138c0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
138d0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
138e0 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 "compression_id"
138f0 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 , id == 1 ? "zli
13900 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 b" : "none", -1)
13910 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
13920 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f Compression info
13930 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 */. if (ssl
13940 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 != NULL) {.#ifde
13950 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 f HAVE_SSL_COMPR
13960 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f ESSION..const CO
13970 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c MP_METHOD *comp,
13980 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 *expn;..comp =
13990 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
139a0 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 compression(ssl)
139b0 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 ;..expn = SSL_ge
139c0 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 t_current_expans
139d0 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 ion(ssl);...LAPP
139e0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
139f0 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 objPtr, "compres
13a00 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 sion", comp ? SS
13a10 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 L_COMP_get_name(
13a20 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 comp) : "none",
13a30 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 -1);..LAPPEND_ST
13a40 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
13a50 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 , "expansion", e
13a60 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 xpn ? SSL_COMP_g
13a70 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 et_name(expn) :
13a80 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c "none", -1);.#el
13a90 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 se..LAPPEND_STR(
13aa0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
13ab0 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 "compression", "
13ac0 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 none", -1);..LAP
13ad0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
13ae0 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 objPtr, "expans
13af0 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 ion", "none", -1
13b00 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
13b10 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 . /* Server i
13b20 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f nfo */. {..lo
13b30 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 ng mode = SSL_CT
13b40 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 X_get_session_ca
13b50 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 che_mode(statePt
13b60 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a r->ctx);..char *
13b70 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 msg;...if (mode
13b80 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 & SSL_SESS_CACHE
13b90 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 _OFF) {.. msg
13ba0 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 = "off";..} els
13bb0 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c e if (mode & SSL
13bc0 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 _SESS_CACHE_CLIE
13bd0 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d NT) {.. msg =
13be0 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c "client";..} el
13bf0 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
13c00 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 L_SESS_CACHE_SER
13c10 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 VER) {.. msg
13c20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 = "server";..} e
13c30 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 lse if (mode & S
13c40 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f SL_SESS_CACHE_BO
13c50 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d TH) {.. msg =
13c60 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 "both";..} else
13c70 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 {.. msg = "u
13c80 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 nknown";..}..LAP
13c90 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
13ca0 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
13cb0 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d n_cache_mode", m
13cc0 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a sg, -1);. }..
13cd0 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a /* CA List *
13ce0 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 /. /* IF not
13cf0 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 a server, same a
13d00 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f s SSL_get0_peer_
13d10 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 CA_list. If serv
13d20 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 er same as SSL_C
13d30 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 TX_get_client_CA
13d40 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 _list */. lis
13d50 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tPtr = Tcl_NewLi
13d60 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
13d70 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 STACK_OF(X50
13d80 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 9_NAME) *ca_list
13d90 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 ;. if ((ca_li
13da0 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 st = SSL_get_cli
13db0 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 ent_CA_list(ssl)
13dc0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 ) != NULL) {..ch
13dd0 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a ar buffer[BUFSIZ
13de0 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d ];..for (int i =
13df0 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 0; i < sk_X509_
13e00 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 NAME_num(ca_list
13e10 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 ); i++) {.. X
13e20 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 509_NAME *name =
13e30 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 sk_X509_NAME_va
13e40 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b lue(ca_list, i);
13e50 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 .. if (name)
13e60 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e {...X509_NAME_on
13e70 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 eline(name, buff
13e80 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 er, BUFSIZ);...T
13e90 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
13ea0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
13eb0 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 listPtr, Tcl_New
13ec0 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 StringObj(buffer
13ed0 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 , -1));.. }..
13ee0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 }. }. LAPP
13ef0 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 END_OBJ(interp,
13f00 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 objPtr, "caList"
13f10 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 , listPtr);.
13f20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 LAPPEND_INT(inte
13f30 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c rp, objPtr, "caL
13f40 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 istCount", sk_X5
13f50 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 09_NAME_num(ca_l
13f60 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ist));.. Tcl_
13f70 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
13f80 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
13f90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
13fa0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
13fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
13ff0 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d . * VersionObjCm
14000 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 d -- return vers
14010 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 ion string from
14020 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 OpenSSL.. *. * R
14030 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
14040 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
14050 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
14060 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
14070 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
14080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
140a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
140b0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
140c0 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 ic int.VersionOb
140d0 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
140e0 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
140f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
14100 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
14110 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
14120 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a {. Tcl_Obj *
14130 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 objPtr;. (voi
14140 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 d) clientData;.
14150 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a (void) objc;.
14160 20 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b (void) objv;
14170 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
14180 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 alled");.. ob
14190 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 jPtr = Tcl_NewSt
141a0 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f ringObj(OPENSSL_
141b0 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 VERSION_TEXT, -1
141c0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 );. Tcl_SetOb
141d0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
141e0 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 objPtr);.. re
141f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
14200 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
14210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14240 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
14250 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 MiscObjCmd -- mi
14260 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 sc commands. *.
14270 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
14280 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
14290 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
142a0 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
142b0 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
142c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
142d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
142e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
142f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
14300 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 tatic int.MiscOb
14310 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
14320 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
14330 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
14340 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
14350 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
14360 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f {. static co
14370 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e nst char *comman
14380 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c ds [] = { "req",
14390 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 "strreq", NULL
143a0 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d };. enum comm
143b0 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 and { C_REQ, C_S
143c0 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d TRREQ, C_DUMMY }
143d0 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 ;. Tcl_Size c
143e0 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 74 md;. int isSt
143f0 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 r;. char buff
14400 65 72 5b 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 er[16384];. (
14410 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
14420 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
14430 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
14440 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 f (objc < 2) {..
14450 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
14460 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
14470 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 , "subcommand ?a
14480 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 rgs?");..return
14490 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
144a0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
144b0 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 IndexFromObj(int
144c0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f erp, objv[1], co
144d0 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 mmands, "command
144e0 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 ", 0, &cmd) != T
144f0 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
14500 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
14510 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 }.. ERR_clear
14520 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 _error();.. i
14530 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 sStr = (cmd == C
14540 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 _STRREQ);. sw
14550 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d itch ((enum comm
14560 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 and) cmd) {..cas
14570 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 e C_REQ:..case C
14580 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 _STRREQ: {..
14590 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e EVP_PKEY *pkey=N
145a0 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a ULL;.. X509 *
145b0 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 cert=NULL;..
145c0 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d X509_NAME *name=
145d0 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f NULL;.. Tcl_O
145e0 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 bj **listv;..
145f0 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b Tcl_Size listc;
14600 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 .. int i;...
14610 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c BIO *out=NULL
14620 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f ;... char *k_
14630 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b C="",*k_ST="",*k
14640 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b _L="",*k_O="",*k
14650 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c _OU="",*k_CN="",
14660 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 *k_Email="";..
14670 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a char *keyout,*
14680 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 pemout,*str;..
14690 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 int keysize,se
146a0 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b rial=0,days=365;
146b0 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ..#if OPENSSL_VE
146c0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
146d0 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 x30000000L..
146e0 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 BIGNUM *bne = NU
146f0 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 LL;.. RSA *rs
14700 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a a = NULL;.#else.
14710 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 . EVP_PKEY_CT
14720 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 X *ctx = NULL;.#
14730 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 endif... if (
14740 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a (objc<5) || (obj
14750 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 c>6)) {...Tcl_Wr
14760 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
14770 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 p, 2, objv, "key
14780 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 size keyfile cer
14790 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a tfile ?info?");.
147a0 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
147b0 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 OR;.. }...
147c0 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 if (Tcl_GetIntF
147d0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
147e0 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 bjv[2], &keysize
147f0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
14800 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
14810 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b R;.. }.. k
14820 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 eyout=Tcl_GetStr
14830 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 ing(objv[3]);..
14840 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 pemout=Tcl_Ge
14850 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 tString(objv[4])
14860 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 ;.. if (isStr
14870 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 ) {...Tcl_SetVar
14880 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 (interp,keyout,"
14890 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 ",0);...Tcl_SetV
148a0 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 ar(interp,pemout
148b0 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a ,"",0);.. }..
148c0 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 . if (objc>=6
148d0 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 ) {...if (Tcl_Li
148e0 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 stObjGetElements
148f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d (interp, objv[5]
14900 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 , &listc, &listv
14910 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
14920 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
14930 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 ERROR;...}....if
14940 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 ((listc%2) != 0
14950 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 ) {... Tcl_Se
14960 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 tResult(interp,"
14970 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 Information list
14980 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 must have even
14990 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 number of argume
149a0 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 nts",NULL);...
149b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
149c0 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 OR;...}...for (i
149d0 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d =0; i<listc; i+=
149e0 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 2) {... str=T
149f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
14a00 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 tv[i]);... if
14a10 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 (strcmp(str,"da
14a20 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 ys")==0) {....if
14a30 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
14a40 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
14a50 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 [i+1],&days)!=TC
14a60 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 L_OK).... ret
14a70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
14a80 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
14a90 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 strcmp(str,"seri
14aa0 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 al")==0) {....if
14ab0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
14ac0 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
14ad0 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d [i+1],&serial)!=
14ae0 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 TCL_OK).... r
14af0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
14b00 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
14b10 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 (strcmp(str,"C"
14b20 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 )==0) {....k_C=T
14b30 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
14b40 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
14b50 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
14b60 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 p(str,"ST")==0)
14b70 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 {....k_ST=Tcl_Ge
14b80 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
14b90 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
14ba0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
14bb0 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"L")==0) {....k
14bc0 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _L=Tcl_GetString
14bd0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
14be0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
14bf0 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d trcmp(str,"O")==
14c00 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 0) {....k_O=Tcl_
14c10 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
14c20 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
14c30 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
14c40 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 tr,"OU")==0) {..
14c50 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 ..k_OU=Tcl_GetSt
14c60 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
14c70 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
14c80 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
14c90 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 N")==0) {....k_C
14ca0 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 N=Tcl_GetString(
14cb0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
14cc0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
14cd0 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 rcmp(str,"Email"
14ce0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 )==0) {....k_Ema
14cf0 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 il=Tcl_GetString
14d00 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
14d10 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 } else {....
14d20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
14d30 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 terp,"Unknown pa
14d40 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a rameter",NULL);.
14d50 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
14d60 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d ROR;... }...}
14d70 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 .. }..#if OPE
14d80 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
14d90 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
14da0 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f L.. bne = BN_
14db0 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 new();.. rsa
14dc0 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 = RSA_new();..
14dd0 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 pkey = EVP_PKE
14de0 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 Y_new();.. if
14df0 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (bne == NULL ||
14e00 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 rsa == NULL ||
14e10 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 pkey == NULL ||
14e20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 !BN_set_word(bne
14e30 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 ,RSA_F4) ||...!R
14e40 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f SA_generate_key_
14e50 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c ex(rsa, keysize,
14e60 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 bne, NULL) || !
14e70 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f EVP_PKEY_assign_
14e80 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 RSA(pkey, rsa))
14e90 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 {...EVP_PKEY_fre
14ea0 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 e(pkey);.../* RS
14eb0 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 A_free(rsa); fre
14ec0 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 ed by EVP_PKEY_f
14ed0 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 ree */...BN_free
14ee0 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 (bne);.#else..
14ef0 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 pkey = EVP_RSA
14f00 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 _gen((unsigned i
14f10 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 nt) keysize);..
14f20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 ctx = EVP_PKE
14f30 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e Y_CTX_new(pkey,N
14f40 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 ULL);.. if (p
14f50 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 key == NULL || c
14f60 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 tx == NULL || !E
14f70 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 VP_PKEY_keygen_i
14f80 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 nit(ctx) ||...!E
14f90 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f VP_PKEY_CTX_set_
14fa0 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 rsa_keygen_bits(
14fb0 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c ctx, keysize) ||
14fc0 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 !EVP_PKEY_keyge
14fd0 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b n(ctx, &pkey)) {
14fe0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 ...EVP_PKEY_free
14ff0 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b (pkey);...EVP_PK
15000 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 EY_CTX_free(ctx)
15010 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 ;.#endif...Tcl_S
15020 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
15030 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
15040 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e g private key",N
15050 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 ULL);...return T
15060 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
15070 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 else {...if (is
15080 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 Str) {... out
15090 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d =BIO_new(BIO_s_m
150a0 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d em());... PEM
150b0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
150c0 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
150d0 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
150e0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 NULL);... i=B
150f0 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 IO_read(out,buff
15100 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 er,sizeof(buffer
15110 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 )-1);... i=(i
15120 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 <0) ? 0 : i;...
15130 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 buffer[i]='\0
15140 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 ';... Tcl_Set
15150 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
15160 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 t,buffer,0);...
15170 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 BIO_flush(out
15180 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
15190 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 e(out);...} else
151a0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f {... out=BIO
151b0 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 _new(BIO_s_file(
151c0 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 ));... BIO_wr
151d0 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 ite_filename(out
151e0 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 ,keyout);...
151f0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 PEM_write_bio_Pr
15200 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 ivateKey(out,pke
15210 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 y,NULL,NULL,0,NU
15220 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 LL,NULL);...
15230 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f /* PEM_write_bio
15240 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f _RSAPrivateKey(o
15250 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e ut, rsa, NULL, N
15260 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 ULL, 0, NULL, NU
15270 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 LL); */... BI
15280 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
15290 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 .. .}....if ((ce
152a0 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d rt=X509_new())==
152b0 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 NULL) {... Tc
152c0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
152d0 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 rp,"Error genera
152e0 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ting certificate
152f0 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b request",NULL);
15300 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f ... EVP_PKEY_
15310 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 free(pkey);.#if
15320 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
15330 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
15340 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 000L... BN_fr
15350 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a ee(bne);.#endif.
15360 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
15370 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 _ERROR;...}....X
15380 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 509_set_version(
15390 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f cert,2);...ASN1_
153a0 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 INTEGER_set(X509
153b0 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 _get_serialNumbe
153c0 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b r(cert),serial);
153d0 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
153e0 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 dj(X509_getm_not
153f0 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b Before(cert),0);
15400 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 ...X509_gmtime_a
15410 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 dj(X509_getm_not
15420 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e After(cert),(lon
15430 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 g)60*60*24*days)
15440 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 ;...X509_set_pub
15450 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a key(cert,pkey);.
15460 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 ...name=X509_get
15470 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 _subject_name(ce
15480 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d rt);....X509_NAM
15490 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
154a0 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 xt(name,"C", MBS
154b0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 TRING_ASC, (cons
154c0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
154d0 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 *) k_C, -1, -1,
154e0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
154f0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
15500 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 (name,"ST", MBST
15510 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 RING_ASC, (const
15520 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
15530 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 ) k_ST, -1, -1,
15540 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
15550 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
15560 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 (name,"L", MBSTR
15570 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
15580 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
15590 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_L, -1, -1, 0)
155a0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
155b0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
155c0 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e ame,"O", MBSTRIN
155d0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
155e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
155f0 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _O, -1, -1, 0);.
15600 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
15610 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
15620 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 e,"OU", MBSTRING
15630 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
15640 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
15650 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a OU, -1, -1, 0);.
15660 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
15670 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
15680 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 e,"CN", MBSTRING
15690 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _ASC, (const uns
156a0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f igned char *) k_
156b0 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a CN, -1, -1, 0);.
156c0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
156d0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
156e0 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 e,"Email", MBSTR
156f0 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
15700 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
15710 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 k_Email, -1, -1
15720 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 , 0);....X509_se
15730 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
15740 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 ert,name);....if
15750 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 (!X509_sign(cer
15760 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 t,pkey,EVP_sha25
15770 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 6())) {... X5
15780 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09_free(cert);..
15790 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 . EVP_PKEY_fr
157a0 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 ee(pkey);.#if OP
157b0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
157c0 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
157d0 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 0L... BN_free
157e0 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 (bne);.#endif...
157f0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
15800 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
15810 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 signing certific
15820 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 ate",NULL);...
15830 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
15840 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 OR;...}....if (i
15850 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 sStr) {... ou
15860 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
15870 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 mem());... PE
15880 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 M_write_bio_X509
15890 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 (out,cert);...
158a0 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 i=BIO_read(out
158b0 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 ,buffer,sizeof(b
158c0 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 uffer)-1);...
158d0 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 i=(i<0) ? 0 : i
158e0 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 ;... buffer[i
158f0 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 ]='\0';... Tc
15900 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c l_SetVar(interp,
15910 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 pemout,buffer,0)
15920 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 ;... BIO_flus
15930 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 h(out);... BI
15940 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d O_free(out);...}
15950 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 else {... ou
15960 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f t=BIO_new(BIO_s_
15970 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 file());... B
15980 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d IO_write_filenam
15990 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 e(out,pemout);..
159a0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
159b0 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
159c0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 );... BIO_fre
159d0 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a e_all(out);...}.
159e0 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 ...X509_free(cer
159f0 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 t);...EVP_PKEY_f
15a00 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f ree(pkey);.#if O
15a10 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
15a20 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 UMBER < 0x300000
15a30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 00L...BN_free(bn
15a40 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 e);.#endif..
15a50 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 }..}..break;.
15a60 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b default:..break
15a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
15a80 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
15a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15aa0 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 ****/./* Init
15ab0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a */./**
15ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15ad0 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
15ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
15b20 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a . * Tls_Free --.
15b30 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
15b40 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 dure cleans up w
15b50 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
15b60 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
15b70 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 *.is closed and
15b80 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f its reference co
15b90 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 unt falls below
15ba0 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 1. *. * Results:
15bb0 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
15bc0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
15bd0 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
15be0 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
15bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
15c30 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 74 .void.Tls_Free(t
15c40 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 62 6c ls_free_type *bl
15c50 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 ockPtr) {. St
15c60 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
15c70 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 (State *)blockPt
15c80 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 r;.. dprintf(
15c90 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
15ca0 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 Tls_Clean(stateP
15cb0 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 tr);. ckfree(
15cc0 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f blockPtr);.}.../
15cd0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
15ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d10 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
15d20 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a s_Clean --. *. *
15d30 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
15d40 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 cleans up when a
15d50 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
15d60 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 d channel. *.is
15d70 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 closed and its r
15d80 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 eference count f
15d90 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 alls below 1. T
15da0 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 his should. *.be
15db0 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e called synchron
15dc0 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f ously by the Clo
15dd0 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 seProc, not in t
15de0 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 he. *.Eventually
15df0 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 Free callback..
15e00 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
15e10 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .none. *. * Side
15e20 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 effects:. *.Fre
15e30 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 es all the state
15e40 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
15e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
15e90 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 id Tls_Clean(Sta
15ea0 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a te *statePtr) {.
15eb0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
15ec0 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 led");.. /*.
15ed0 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 * we're assu
15ee0 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 ming here that w
15ef0 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 e're single-thre
15f00 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 aded. */.
15f10 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 if (statePtr->t
15f20 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d imer != (Tcl_Tim
15f30 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b erToken) NULL) {
15f40 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 ..Tcl_DeleteTime
15f50 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 rHandler(statePt
15f60 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 r->timer);..stat
15f70 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 ePtr->timer = NU
15f80 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f LL;. }.. /
15f90 2a 20 52 65 6d 6f 76 65 20 63 61 6c 6c 62 61 63 * Remove callbac
15fa0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 ks */. if (st
15fb0 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
15fc0 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
15fd0 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
15fe0 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 callback);..stat
15ff0 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d ePtr->callback =
16000 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
16010 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
16020 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f assword) {..Tcl_
16030 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 DecrRefCount(sta
16040 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
16050 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 ;..statePtr->pas
16060 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 sword = NULL;.
16070 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
16080 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 ePtr->vcmd) {..T
16090 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
160a0 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b statePtr->vcmd);
160b0 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 ..statePtr->vcmd
160c0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a = NULL;. }..
160d0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
160e0 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 ->protos) {..ckf
160f0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 ree(statePtr->pr
16100 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 otos);..statePtr
16110 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b ->protos = NULL;
16120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
16130 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b statePtr->bio) {
16140 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 ../* This will c
16150 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e all SSL_shutdown
16160 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f . Bug 1414045 */
16170 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 ..dprintf("BIO_f
16180 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 ree_all(%p)", st
16190 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 atePtr->bio);..B
161a0 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 IO_free_all(stat
161b0 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 ePtr->bio);..sta
161c0 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c tePtr->bio = NUL
161d0 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 L;. }.. if
161e0 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 (statePtr->ssl)
161f0 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c {..dprintf("SSL
16200 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 _free(%p)", stat
16210 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c ePtr->ssl);..SSL
16220 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e _free(statePtr->
16230 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ssl);..statePtr-
16240 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >ssl = NULL;.
16250 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 }.. if (stat
16260 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 ePtr->ctx) {..SS
16270 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 L_CTX_free(state
16280 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 Ptr->ctx);..stat
16290 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c ePtr->ctx = NULL
162a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
162b0 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 intf("Returning"
162c0 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
162d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
162e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
162f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16310 2d 2d 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 --. *. * Build I
16320 6e 66 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 nfo Command --.
16330 2a 0a 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d *. *.Create comm
16340 61 6e 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75 and to return bu
16350 69 6c 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 ild info for pac
16360 6b 61 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 kage.. *. * Resu
16370 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
16380 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a rd Tcl result. *
16390 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
163a0 3a 0a 20 2a 09 43 72 65 61 74 65 64 20 62 75 69 :. *.Created bui
163b0 6c 64 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e ld-info command.
163c0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
163d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
163f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
16410 0a 0a 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 ..#ifndef STRING
16420 49 46 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 IFY.# define ST
16430 52 49 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e RINGIFY(x) STRIN
16440 47 49 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 GIFY1(x).# defi
16450 6e 65 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 ne STRINGIFY1(x)
16460 20 23 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a #x.#endif..int.
16470 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 BuildInfoCommand
16480 28 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 (Tcl_Interp* int
16490 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 erp) {. Tcl_C
164a0 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 mdInfo info;..
164b0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d if (Tcl_GetCom
164c0 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c mandInfo(interp,
164d0 20 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 "::tcl::build-i
164e0 6e 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a nfo", &info)) {.
164f0 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f .Tcl_CreateObjCo
16500 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
16510 3a 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f :tls::build-info
16520 22 2c 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c ", info.objProc,
16530 20 28 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 (void *)(...PAC
16540 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 KAGE_VERSION "+"
16550 20 53 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 STRINGIFY(TLS_V
16560 45 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 ERSION_UUID).#if
16570 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 defined(__clang
16580 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f __) && defined(_
16590 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a _clang_major__).
165a0 09 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 ... ".clang-"
165b0 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 STRINGIFY(__cla
165c0 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 ng_major__).#if
165d0 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 __clang_minor__
165e0 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a < 10.... "0".
165f0 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 #endif.... ST
16600 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f RINGIFY(__clang_
16610 6d 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a minor__).#endif.
16620 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 #if defined(__cp
16630 6c 75 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 lusplus) && !def
16640 69 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 ined(__OBJC__)..
16650 09 09 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 .. ".cplusplu
16660 73 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 s".#endif.#ifnde
16670 66 20 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 f NDEBUG....
16680 22 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a ".debug".#endif.
16690 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 #if !defined(__c
166a0 6c 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 lang__) && !defi
166b0 6e 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 ned(__INTEL_COMP
166c0 49 4c 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 ILER) && defined
166d0 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 (__GNUC__)....
166e0 20 20 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 ".gcc-" STRING
166f0 49 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 IFY(__GNUC__).#i
16700 66 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f f __GNUC_MINOR__
16710 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 < 10.... "0"
16720 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 .#endif.... S
16730 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f TRINGIFY(__GNUC_
16740 4d 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a MINOR__).#endif.
16750 23 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 #ifdef __INTEL_C
16760 4f 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 OMPILER.... "
16770 2e 69 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 .icc-" STRINGIFY
16780 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 (__INTEL_COMPILE
16790 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 R).#endif.#ifdef
167a0 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 TCL_MEM_DEBUG..
167b0 09 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 .. ".memdebug
167c0 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ".#endif.#if def
167d0 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 ined(_MSC_VER)..
167e0 09 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 .. ".msvc-" S
167f0 54 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 TRINGIFY(_MSC_VE
16800 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 R).#endif.#ifdef
16810 20 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 USE_NMAKE....
16820 20 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 ".nmake".#endi
16830 66 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 f.#ifndef TCL_CF
16840 47 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 G_OPTIMIZED....
16850 20 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 ".no-optimize
16860 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ".#endif.#ifdef
16870 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 __OBJC__....
16880 22 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 ".objective-c".#
16890 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c if defined(__cpl
168a0 75 73 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 usplus).... "
168b0 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 plusplus".#endif
168c0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 .#endif.#ifdef T
168d0 43 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a CL_CFG_PROFILED.
168e0 09 09 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 ... ".profile
168f0 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ".#endif.#ifdef
16900 50 55 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e PURIFY.... ".
16910 70 75 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 purify".#endif.#
16920 69 66 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 ifdef STATIC_BUI
16930 4c 44 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 LD.... ".stat
16940 69 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 ic".#endif...),
16950 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL);. }.
16960 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
16970 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
16980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
169a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
169b0 0a 20 2a 0a 20 2a 20 54 6c 73 4c 69 62 53 68 75 . *. * TlsLibShu
169c0 74 64 6f 77 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 53 tdown --. *. *.S
169d0 68 75 74 64 6f 77 6e 20 53 53 4c 20 6c 69 62 72 hutdown SSL libr
169e0 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 ary once per app
169f0 6c 69 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 lication. *. * R
16a00 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
16a10 6e 64 61 72 64 20 54 43 4c 20 72 65 73 75 6c 74 ndard TCL result
16a20 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
16a30 63 74 73 3a 0a 20 2a 09 53 68 75 74 64 6f 77 6e cts:. *.Shutdown
16a40 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a SSL library. *.
16a50 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
16a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a80 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 76 6f --------*. */.vo
16a90 69 64 20 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 id TlsLibShutdow
16aa0 6e 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 n(ClientData cli
16ab0 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20 64 entData) {. d
16ac0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
16ad0 3b 0a 0a 20 20 20 20 42 49 4f 5f 63 6c 65 61 6e ;.. BIO_clean
16ae0 75 70 28 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d up();.}../*. *--
16af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b20 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c ----*. *. *.TlsL
16b30 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 ibInit --. *. *.
16b40 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 Initializes SSL
16b50 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 library once per
16b60 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 0a application. *.
16b70 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
16b80 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
16b90 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 sult. *. * Side
16ba0 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 6e 69 74 effects:. *.Init
16bb0 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 ializes SSL libr
16bc0 61 72 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ary. *. *-------
16bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
16c00 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
16c10 54 6c 73 4c 69 62 49 6e 69 74 28 29 20 7b 0a 20 TlsLibInit() {.
16c20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e static int in
16c30 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a itialized = 0;..
16c40 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
16c50 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
16c60 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a !initialized) {.
16c70 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 ./* Initialize B
16c80 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e OTH libcrypto an
16c90 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 09 69 66 d libssl. */..if
16ca0 20 28 21 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f (!OPENSSL_init_
16cb0 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 ssl(OPENSSL_INIT
16cc0 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 _LOAD_SSL_STRING
16cd0 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 S | OPENSSL_INIT
16ce0 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 _LOAD_CRYPTO_STR
16cf0 49 4e 47 53 0a 09 20 20 20 20 7c 20 4f 50 45 4e INGS.. | OPEN
16d00 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c SSL_INIT_ADD_ALL
16d10 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 _CIPHERS | OPENS
16d20 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f SL_INIT_ADD_ALL_
16d30 44 49 47 45 53 54 53 0a 09 20 20 20 20 7c 20 4f DIGESTS.. | O
16d40 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 PENSSL_INIT_LOAD
16d50 5f 43 4f 4e 46 49 47 20 7c 20 4f 50 45 4e 53 53 _CONFIG | OPENSS
16d60 4c 5f 49 4e 49 54 5f 41 53 59 4e 43 2c 20 4e 55 L_INIT_ASYNC, NU
16d70 4c 4c 29 29 20 7b 0a 09 20 20 20 20 72 65 74 75 LL)) {.. retu
16d80 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
16d90 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 42 49 4f .../* Create BIO
16da0 20 68 61 6e 64 6c 65 72 73 20 2a 2f 0a 09 42 49 handlers */..BI
16db0 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 O_new_tcl(NULL,
16dc0 30 29 3b 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 0);.../* Create
16dd0 65 78 69 74 20 68 61 6e 64 6c 65 72 20 2a 2f 0a exit handler */.
16de0 09 54 63 6c 5f 43 72 65 61 74 65 45 78 69 74 48 .Tcl_CreateExitH
16df0 61 6e 64 6c 65 72 28 54 6c 73 4c 69 62 53 68 75 andler(TlsLibShu
16e00 74 64 6f 77 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 69 tdown, NULL);..i
16e10 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a nitialized = 1;.
16e20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
16e30 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 20 TCL_OK;.}.../*
16e40 49 6e 69 74 20 73 63 72 69 70 74 20 2a 2f 0a 73 Init script */.s
16e50 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
16e60 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 tlsTclInitScrip
16e70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 t[] = {.#include
16e80 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 7d 3b 0a "tls.tcl.h".};.
16e90 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
16ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
16ee0 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 Tls_Init --. *.
16ef0 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b *.This is a pack
16f00 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 age initializati
16f10 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 on procedure, wh
16f20 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a ich is called. *
16f30 09 62 79 20 54 43 4c 20 77 68 65 6e 20 74 68 69 .by TCL when thi
16f40 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 s package is to
16f50 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 be added to an i
16f60 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 nterpreter.. *.
16f70 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 49 6e * Results:. *.In
16f80 69 74 69 61 6c 69 7a 65 73 20 73 74 72 75 63 74 itializes struct
16f90 75 72 65 73 20 61 6e 64 20 63 72 65 61 74 65 73 ures and creates
16fa0 20 63 6f 6d 6d 61 6e 64 73 2e 0a 20 2a 0a 20 2a commands.. *. *
16fb0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
16fc0 2a 09 20 43 72 65 61 74 65 20 74 68 65 20 63 6f *. Create the co
16fd0 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d mmands. *. *----
16fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
17020 20 2a 2f 0a 0a 23 69 66 20 54 43 4c 5f 4d 41 4a */..#if TCL_MAJ
17030 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 OR_VERSION > 8.#
17040 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 define MIN_VERSI
17050 4f 4e 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23 ON "9.0".#else.#
17060 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 define MIN_VERSI
17070 4f 4e 20 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a ON "8.5".#endif.
17080 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 .DLLEXPORT int T
17090 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 ls_Init(Tcl_Inte
170a0 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 0a 20 rp *interp) {..
170b0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
170c0 65 64 22 29 3b 0a 0a 23 69 66 64 65 66 20 55 53 ed");..#ifdef US
170d0 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 E_TCL_STUBS.
170e0 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 if (Tcl_InitStub
170f0 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 45 s(interp, MIN_VE
17100 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c RSION, 0) == NUL
17110 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
17120 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 _ERROR;. }.#e
17130 6c 73 65 0a 20 20 20 20 69 66 20 28 54 63 6c 5f lse. if (Tcl_
17140 50 6b 67 52 65 71 75 69 72 65 45 78 28 69 6e 74 PkgRequireEx(int
17150 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f erp, "Tcl", MIN_
17160 56 45 52 53 49 4f 4e 2c 20 30 2c 20 4e 55 4c 4c VERSION, 0, NULL
17170 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 ) == NULL) {..re
17180 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
17190 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 }.#endif..
171a0 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 if (TlsLibInit
171b0 28 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a () != TCL_OK) {.
171c0 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
171d0 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 t(interp, "could
171e0 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 not initialize
171f0 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63 SSL library", (c
17200 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
17210 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
17220 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
17230 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
17240 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a (interp, "::tls:
17250 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 :ciphers", Ciphe
17260 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e rsObjCmd, (Clien
17270 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 tData) NULL, (Tc
17280 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
17290 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
172a0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
172b0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c nd(interp, "::tl
172c0 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 s::connection",
172d0 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 ConnectionInfoOb
172e0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
172f0 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
17300 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
17310 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
17320 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
17330 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 nterp, "::tls::h
17340 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 andshake", Hands
17350 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 hakeObjCmd, (Cli
17360 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
17370 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
17380 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
17390 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
173a0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a mand(interp, "::
173b0 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d tls::import", Im
173c0 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 portObjCmd, (Cli
173d0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
173e0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
173f0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
17400 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
17410 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a mand(interp, "::
17420 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 tls::unimport",
17430 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 UnimportObjCmd,
17440 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
17450 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
17460 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
17470 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
17480 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
17490 20 22 3a 3a 74 6c 73 3a 3a 75 6e 73 74 61 63 6b "::tls::unstack
174a0 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d ", UnimportObjCm
174b0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
174c0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
174d0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
174e0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
174f0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
17500 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 rp, "::tls::stat
17510 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d us", StatusObjCm
17520 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
17530 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 NULL, (Tcl_CmdDe
17540 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
17550 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
17560 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
17570 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 76 65 72 73 rp, "::tls::vers
17580 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a ion", VersionObj
17590 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
175a0 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
175b0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
175c0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
175d0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
175e0 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 6d 69 terp, "::tls::mi
175f0 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c sc", MiscObjCmd,
17600 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
17610 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
17620 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
17630 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
17640 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
17650 2c 20 22 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f 63 , "::tls::protoc
17660 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f ols", ProtocolsO
17670 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
17680 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
17690 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
176a0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 75 69 6c NULL);.. Buil
176b0 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 dInfoCommand(int
176c0 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 erp);.. if (i
176d0 6e 74 65 72 70 20 26 26 20 54 63 6c 5f 45 76 61 nterp && Tcl_Eva
176e0 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c l(interp, tlsTcl
176f0 49 6e 69 74 53 63 72 69 70 74 29 20 21 3d 20 54 InitScript) != T
17700 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
17710 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
17720 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 }.. return Tc
17730 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 l_PkgProvide(int
17740 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d erp, PACKAGE_NAM
17750 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 E, PACKAGE_VERSI
17760 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d ON);.}../*. *---
17770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
177a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
177b0 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 . *. *.Tls_SafeI
177c0 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 nit --. *. *.Thi
177d0 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 s is a package i
177e0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 nitialization pr
177f0 6f 63 65 64 75 72 65 20 66 6f 72 20 73 61 66 65 ocedure for safe
17800 20 69 6e 74 65 72 70 73 2e 0a 20 2a 0a 20 2a 20 interps.. *. *
17810 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53 61 6d 65 Results:. *.Same
17820 20 61 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 as of 'Tls_Init
17830 27 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 '. *. * Side eff
17840 65 63 74 73 3a 0a 20 2a 09 53 61 6d 65 20 61 73 ects:. *.Same as
17850 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 of 'Tls_Init'.
17860 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
17870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
178a0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 -------. */.DLLE
178b0 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 XPORT int Tls_Sa
178c0 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 feInit(Tcl_Inter
178d0 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 p *interp) {.
178e0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
178f0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 ");. return T
17900 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b ls_Init(interp);
17910 0a 7d 0a .}.