0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 20 tarfish Systems
00d0: 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 6b 61 20 . *. * TLS (aka
00e0: 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 2d 20 63 SSL) Channel - c
00f0: 61 6e 20 62 65 20 6c 61 79 65 72 65 64 20 6f 6e an be layered on
0100: 20 61 6e 79 20 62 69 2d 64 69 72 65 63 74 69 6f any bi-directio
0110: 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 61 6e 6e nal. * Tcl_Chann
0120: 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 75 69 72 el (Note: Requir
0130: 65 73 20 54 72 66 20 43 6f 72 65 20 50 61 74 63 es Trf Core Patc
0140: 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 20 77 61 h). *. * This wa
0150: 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f 73 74 29 s built (almost)
0160: 20 66 72 6f 6d 20 73 63 72 61 74 63 68 20 62 61 from scratch ba
0170: 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 72 76 61 sed upon observa
0180: 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 65 6e 53 tion of. * OpenS
0190: 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a 20 2a 20 SL 0.9.2B. *. *
01a0: 41 64 64 69 74 69 6f 6e 20 63 72 65 64 69 74 20 Addition credit
01b0: 69 73 20 64 75 65 20 66 6f 72 20 41 6e 64 72 65 is due for Andre
01c0: 61 73 20 4b 75 70 72 69 65 73 20 28 61 2e 6b 75 as Kupries (a.ku
01d0: 70 72 69 65 73 40 77 65 73 74 65 6e 64 2e 63 6f pries@westend.co
01e0: 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 6f 76 69 m), for. * provi
01f0: 64 69 6e 67 20 74 68 65 20 54 63 6c 5f 52 65 70 ding the Tcl_Rep
0200: 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d 65 63 68 laceChannel mech
0210: 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 6b 69 6e anism and workin
0220: 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 68 20 6d g closely with m
0230: 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e 63 65 20 e. * to enhance
0240: 69 74 20 74 6f 20 73 75 70 70 6f 72 74 20 66 75 it to support fu
0250: 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 73 65 6d ll fileevent sem
0260: 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a 20 41 6c antics.. *. * Al
0270: 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 62 79 20 so work done by
0280: 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 6f 70 6c the follow peopl
0290: 65 20 70 72 6f 76 69 64 65 64 20 74 68 65 20 69 e provided the i
02a0: 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 74 68 69 mpetus to do thi
02b0: 73 20 22 72 69 67 68 74 22 3a 0a 20 2a 09 74 63 s "right":. *.tc
02c0: 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d 63 43 6f lSSL (Colin McCo
02d0: 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 20 54 65 rmack, Shared Te
02e0: 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 53 53 4c chnology). *.SSL
02f0: 74 63 6c 20 28 50 65 74 65 72 20 41 6e 74 6d 61 tcl (Peter Antma
0300: 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c n). *. */..#incl
0310: 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 ude "tlsInt.h".#
0320: 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f 70 74 73 include "tclOpts
0330: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 .h".#include <st
0340: 64 6c 69 62 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 45 dlib.h>../*. * E
0350: 78 74 65 72 6e 61 6c 20 66 75 6e 63 74 69 6f 6e xternal function
0360: 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 s. */../*. * For
0370: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e ward declaration
0380: 73 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 s. */..#define F
0390: 32 4e 28 20 6b 65 79 2c 20 64 73 70 29 20 5c 0a 2N( key, dsp) \.
03a0: 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c .(((key) == NULL
03b0: 29 20 3f 20 28 63 68 61 72 20 2a 29 20 4e 55 4c ) ? (char *) NUL
03c0: 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f 54 72 61 6e L : \...Tcl_Tran
03d0: 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e slateFileName(in
03e0: 74 65 72 70 2c 20 28 6b 65 79 29 2c 20 28 64 73 terp, (key), (ds
03f0: 70 29 29 29 0a 23 64 65 66 69 6e 65 20 52 45 41 p))).#define REA
0400: 53 4f 4e 28 29 09 45 52 52 5f 72 65 61 73 6f 6e SON().ERR_reason
0410: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 _error_string(ER
0420: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 0a 0a R_get_error())..
0430: 73 74 61 74 69 63 20 76 6f 69 64 09 49 6e 66 6f static void.Info
0440: 43 61 6c 6c 62 61 63 6b 20 5f 41 4e 53 49 5f 41 Callback _ANSI_A
0450: 52 47 53 5f 20 28 28 43 4f 4e 53 54 20 53 53 4c RGS_ ((CONST SSL
0460: 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 *ssl, int where
0470: 2c 20 69 6e 74 20 72 65 74 29 29 3b 0a 0a 73 74 , int ret));..st
0480: 61 74 69 63 20 69 6e 74 09 43 69 70 68 65 72 73 atic int.Ciphers
0490: 4f 62 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 ObjCmd _ANSI_ARG
04a0: 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 S_ ((ClientData
04b0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 clientData,....T
04c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
04d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
04e0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 _Obj *CONST objv
04f0: 5b 5d 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e []));..static in
0500: 74 09 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d t.HandshakeObjCm
0510: 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 d _ANSI_ARGS_ ((
0520: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
0530: 74 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e tData,....Tcl_In
0540: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
0550: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
0560: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b *CONST objv[]));
0570: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 49 6d 70 ..static int.Imp
0580: 6f 72 74 4f 62 6a 43 6d 64 20 5f 41 4e 53 49 5f ortObjCmd _ANSI_
0590: 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 ARGS_ ((ClientDa
05a0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 ta clientData,..
05b0: 09 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e ..Tcl_Interp *in
05c0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
05d0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f Tcl_Obj *CONST o
05e0: 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 61 74 69 63 bjv[]));..static
05f0: 20 69 6e 74 09 53 74 61 74 75 73 4f 62 6a 43 6d int.StatusObjCm
0600: 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 d _ANSI_ARGS_ ((
0610: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
0620: 74 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e tData,....Tcl_In
0630: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
0640: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
0650: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b *CONST objv[]));
0660: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 56 65 72 ..static int.Ver
0670: 73 69 6f 6e 4f 62 6a 43 6d 64 20 5f 41 4e 53 49 sionObjCmd _ANSI
0680: 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 _ARGS_ ((ClientD
0690: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a ata clientData,.
06a0: 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 ...Tcl_Interp *i
06b0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
06c0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 Tcl_Obj *CONST
06d0: 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 61 74 69 objv[]));..stati
06e0: 63 20 69 6e 74 09 4d 69 73 63 4f 62 6a 43 6d 64 c int.MiscObjCmd
06f0: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 _ANSI_ARGS_ ((C
0700: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
0710: 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 Data,....Tcl_Int
0720: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
0730: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
0740: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a CONST objv[]));.
0750: 0a 73 74 61 74 69 63 20 69 6e 74 09 55 6e 69 6d .static int.Unim
0760: 70 6f 72 74 4f 62 6a 43 6d 64 20 5f 41 4e 53 49 portObjCmd _ANSI
0770: 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 _ARGS_ ((ClientD
0780: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a ata clientData,.
0790: 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 ...Tcl_Interp *i
07a0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
07b0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 Tcl_Obj *CONST
07c0: 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 61 74 69 objv[]));..stati
07d0: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 c SSL_CTX *CTX_I
07e0: 6e 69 74 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 nit _ANSI_ARGS_(
07f0: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 (State *statePtr
0800: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 , int proto, cha
0810: 72 20 2a 6b 65 79 2c 0a 09 09 09 63 68 61 72 20 r *key,....char
0820: 2a 63 65 72 74 2c 20 63 68 61 72 20 2a 43 41 64 *cert, char *CAd
0830: 69 72 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 ir, char *CAfile
0840: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c , char *ciphers,
0850: 0a 09 09 09 63 68 61 72 20 2a 44 48 70 61 72 61 ....char *DHpara
0860: 6d 73 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e ms));..static in
0870: 74 09 54 6c 73 4c 69 62 49 6e 69 74 20 5f 41 4e t.TlsLibInit _AN
0880: 53 49 5f 41 52 47 53 5f 20 28 28 76 6f 69 64 29 SI_ARGS_ ((void)
0890: 29 20 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53 ) ;..#define TLS
08a0: 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30 78 30 _PROTO_SSL2..0x0
08b0: 31 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 1.#define TLS_PR
08c0: 4f 54 4f 5f 53 53 4c 33 09 09 30 78 30 32 0a 23 OTO_SSL3..0x02.#
08d0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f define TLS_PROTO
08e0: 5f 54 4c 53 31 09 09 30 78 30 34 0a 23 64 65 66 _TLS1..0x04.#def
08f0: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ine TLS_PROTO_TL
0900: 53 31 5f 31 09 30 78 30 38 0a 23 64 65 66 69 6e S1_1.0x08.#defin
0910: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
0920: 5f 32 09 30 78 31 30 0a 23 64 65 66 69 6e 65 20 _2.0x10.#define
0930: 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 ENABLED(flag, ma
0940: 73 6b 29 09 28 28 28 66 6c 61 67 29 20 26 20 28 sk).(((flag) & (
0950: 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 mask)) == (mask)
0960: 29 0a 0a 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 )../*. * Static
0970: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 0a data structures.
0980: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 */..#ifndef OPE
0990: 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c NSSL_NO_DH.#incl
09a0: 75 64 65 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 ude "dh_params.h
09b0: 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 ".#endif../*. *
09c0: 44 65 66 69 6e 65 64 20 69 6e 20 54 6c 73 5f 49 Defined in Tls_I
09d0: 6e 69 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 nit to determine
09e0: 20 77 68 61 74 20 6b 69 6e 64 20 6f 66 20 63 68 what kind of ch
09f0: 61 6e 6e 65 6c 73 20 77 65 20 61 72 65 20 75 73 annels we are us
0a00: 69 6e 67 0a 20 2a 20 28 6f 6c 64 2d 73 74 79 6c ing. * (old-styl
0a10: 65 20 38 2e 32 2e 30 2d 38 2e 33 2e 31 20 6f 72 e 8.2.0-8.3.1 or
0a20: 20 6e 65 77 2d 73 74 79 6c 65 20 38 2e 33 2e 32 new-style 8.3.2
0a30: 2b 29 2e 0a 20 2a 2f 0a 69 6e 74 20 63 68 61 6e +).. */.int chan
0a40: 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d nelTypeVersion =
0a50: 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 TLS_CHANNEL_VER
0a60: 53 49 4f 4e 5f 32 3b 0a 0a 2f 2a 0a 20 2a 20 57 SION_2;../*. * W
0a70: 65 20 6c 6f 73 65 20 74 68 65 20 74 63 6c 20 70 e lose the tcl p
0a80: 61 73 73 77 6f 72 64 20 63 61 6c 6c 62 61 63 6b assword callback
0a90: 20 77 68 65 6e 20 77 65 20 75 73 65 20 74 68 65 when we use the
0aa0: 20 52 53 41 20 42 53 41 46 45 20 53 53 4c 2d 43 RSA BSAFE SSL-C
0ab0: 20 31 2e 31 2e 32 0a 20 2a 20 6c 69 62 72 61 72 1.1.2. * librar
0ac0: 69 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 ies instead of t
0ad0: 68 65 20 63 75 72 72 65 6e 74 20 4f 70 65 6e 53 he current OpenS
0ae0: 53 4c 20 6c 69 62 72 61 72 69 65 73 2e 0a 20 2a SL libraries.. *
0af0: 2f 0a 0a 23 69 66 64 65 66 20 42 53 41 46 45 0a /..#ifdef BSAFE.
0b00: 23 64 65 66 69 6e 65 20 50 52 45 5f 4f 50 45 4e #define PRE_OPEN
0b10: 53 53 4c 5f 30 5f 39 5f 34 20 31 0a 23 65 6e 64 SSL_0_9_4 1.#end
0b20: 69 66 0a 0a 2f 2a 0a 20 2a 20 50 72 65 20 4f 70 if../*. * Pre Op
0b30: 65 6e 53 53 4c 20 30 2e 39 2e 34 20 43 6f 6d 70 enSSL 0.9.4 Comp
0b40: 61 74 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 at. */..#ifndef
0b50: 53 54 41 43 4b 5f 4f 46 0a 23 64 65 66 69 6e 65 STACK_OF.#define
0b60: 20 53 54 41 43 4b 5f 4f 46 28 78 29 09 09 09 53 STACK_OF(x)...S
0b70: 54 41 43 4b 0a 23 64 65 66 69 6e 65 20 73 6b 5f TACK.#define sk_
0b80: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 SSL_CIPHER_num(s
0b90: 6b 29 09 09 73 6b 5f 6e 75 6d 28 28 73 6b 29 29 k)..sk_num((sk))
0ba0: 0a 23 64 65 66 69 6e 65 20 73 6b 5f 53 53 4c 5f .#define sk_SSL_
0bb0: 43 49 50 48 45 52 5f 76 61 6c 75 65 28 20 73 6b CIPHER_value( sk
0bc0: 2c 20 69 6e 64 65 78 29 09 28 53 53 4c 5f 43 49 , index).(SSL_CI
0bd0: 50 48 45 52 2a 29 73 6b 5f 76 61 6c 75 65 28 28 PHER*)sk_value((
0be0: 73 6b 29 2c 20 28 69 6e 64 65 78 29 29 0a 23 65 sk), (index)).#e
0bf0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 ndif../*. * Thre
0c00: 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 65 ad-Safe TLS Code
0c10: 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c . */..#ifdef TCL
0c20: 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e 65 _THREADS.#define
0c30: 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 5f OPENSSL_THREAD_
0c40: 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 65 DEFINES.#include
0c50: 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 <openssl/openss
0c60: 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 66 lconf.h>..#ifdef
0c70: 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 OPENSSL_THREADS
0c80: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 .#include <opens
0c90: 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 0a 2f 2a sl/crypto.h>../*
0ca0: 0a 20 2a 20 54 68 72 65 61 64 65 64 20 6f 70 65 . * Threaded ope
0cb0: 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 ration requires
0cc0: 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c 62 61 63 6b locking callback
0cd0: 73 0a 20 2a 20 42 61 73 65 64 20 66 72 6f 6d 20 s. * Based from
0ce0: 2f 63 72 79 70 74 6f 2f 63 72 79 70 74 6c 69 62 /crypto/cryptlib
0cf0: 2e 63 20 6f 66 20 4f 70 65 6e 53 53 4c 20 61 6e .c of OpenSSL an
0d00: 64 20 4e 53 4f 70 65 6e 53 53 4c 2e 0a 20 2a 2f d NSOpenSSL.. */
0d10: 0a 0a 23 69 66 6e 64 65 66 20 43 52 59 50 54 4f ..#ifndef CRYPTO
0d20: 5f 4e 55 4d 5f 4c 4f 43 4b 53 0a 23 64 65 66 69 _NUM_LOCKS.#defi
0d30: 6e 65 20 43 52 59 50 54 4f 5f 4e 55 4d 5f 4c 4f ne CRYPTO_NUM_LO
0d40: 43 4b 53 20 31 32 38 0a 23 65 6e 64 69 66 0a 73 CKS 128.#endif.s
0d50: 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 tatic Tcl_Mutex
0d60: 6c 6f 63 6b 73 5b 43 52 59 50 54 4f 5f 4e 55 4d locks[CRYPTO_NUM
0d70: 5f 4c 4f 43 4b 53 5d 3b 0a 73 74 61 74 69 63 20 _LOCKS];.static
0d80: 54 63 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d Tcl_Mutex init_m
0d90: 78 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 x;..static void
0da0: 20 20 20 20 20 20 20 20 20 43 72 79 70 74 6f 54 CryptoT
0db0: 68 72 65 61 64 4c 6f 63 6b 43 61 6c 6c 62 61 63 hreadLockCallbac
0dc0: 6b 20 28 69 6e 74 20 6d 6f 64 65 2c 20 69 6e 74 k (int mode, int
0dd0: 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a n, const char *
0de0: 66 69 6c 65 2c 20 69 6e 74 20 6c 69 6e 65 29 3b file, int line);
0df0: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 .static unsigned
0e00: 20 6c 6f 6e 67 20 43 72 79 70 74 6f 54 68 72 65 long CryptoThre
0e10: 61 64 49 64 43 61 6c 6c 62 61 63 6b 20 20 20 28 adIdCallback (
0e20: 76 6f 69 64 29 3b 0a 0a 73 74 61 74 69 63 20 76 void);..static v
0e30: 6f 69 64 0a 43 72 79 70 74 6f 54 68 72 65 61 64 oid.CryptoThread
0e40: 4c 6f 63 6b 43 61 6c 6c 62 61 63 6b 28 69 6e 74 LockCallback(int
0e50: 20 6d 6f 64 65 2c 20 69 6e 74 20 6e 2c 20 63 6f mode, int n, co
0e60: 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 2c 20 nst char *file,
0e70: 69 6e 74 20 6c 69 6e 65 29 0a 7b 0a 20 20 20 20 int line).{.
0e80: 69 66 20 28 6d 6f 64 65 20 26 20 43 52 59 50 54 if (mode & CRYPT
0e90: 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 O_LOCK) {.
0ea0: 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 Tcl_MutexLock(&
0eb0: 6c 6f 63 6b 73 5b 6e 5d 29 3b 0a 20 20 20 20 7d locks[n]);. }
0ec0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 54 else {. T
0ed0: 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 cl_MutexUnlock(&
0ee0: 6c 6f 63 6b 73 5b 6e 5d 29 3b 0a 20 20 20 20 7d locks[n]);. }
0ef0: 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 .}..static unsig
0f00: 6e 65 64 20 6c 6f 6e 67 0a 43 72 79 70 74 6f 54 ned long.CryptoT
0f10: 68 72 65 61 64 49 64 43 61 6c 6c 62 61 63 6b 28 hreadIdCallback(
0f20: 76 6f 69 64 29 0a 7b 0a 20 20 20 20 72 65 74 75 void).{. retu
0f30: 72 6e 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e rn (unsigned lon
0f40: 67 29 20 54 63 6c 5f 47 65 74 43 75 72 72 65 6e g) Tcl_GetCurren
0f50: 74 54 68 72 65 61 64 28 29 3b 0a 7d 0a 23 65 6e tThread();.}.#en
0f60: 64 69 66 20 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 dif /* OPENSSL_T
0f70: 48 52 45 41 44 53 20 2a 2f 0a 23 65 6e 64 69 66 HREADS */.#endif
0f80: 20 2f 2a 20 54 43 4c 5f 54 48 52 45 41 44 53 20 /* TCL_THREADS
0f90: 2a 2f 0a 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d */..../*. *-----
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0fe0: 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 *. * InfoCallbac
0ff0: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 6d 6f 6e 69 74 k --. *. *.monit
1000: 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 ors SSL connecti
1010: 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a on process. *. *
1020: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
1030: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
1040: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 ects:. *.Calls c
1050: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 allback (if defi
1060: 6e 65 64 29 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ned). *---------
1070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
10b0: 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43 tatic void.InfoC
10c0: 61 6c 6c 62 61 63 6b 28 43 4f 4e 53 54 20 53 53 allback(CONST SS
10d0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 L *ssl, int wher
10e0: 65 2c 20 69 6e 74 20 72 65 74 29 0a 7b 0a 20 20 e, int ret).{.
10f0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
1100: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f r = (State*)SSL_
1110: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 get_app_data((SS
1120: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 L *)ssl);. Tc
1130: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
1140: 20 20 20 63 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 char *major;
1150: 63 68 61 72 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 char *minor;..
1160: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
1170: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c callback == (Tcl
1180: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 _Obj*)NULL)..ret
1190: 75 72 6e 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 urn;.. cmdPtr
11a0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
11b0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
11c0: 6c 6c 62 61 63 6b 29 3b 0a 0a 23 69 66 20 30 0a llback);..#if 0.
11d0: 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 if (where &
11e0: 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a SSL_CB_ALERT) {.
11f0: 09 73 65 76 20 3d 20 53 53 4c 5f 61 6c 65 72 74 .sev = SSL_alert
1200: 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e _type_string_lon
1210: 67 28 72 65 74 29 3b 0a 09 69 66 20 28 73 74 72 g(ret);..if (str
1220: 63 6d 70 28 20 73 65 76 2c 20 22 66 61 74 61 6c cmp( sev, "fatal
1230: 22 29 3d 3d 30 29 20 7b 09 2f 2a 20 4d 61 70 20 ")==0) {./* Map
1240: 74 6f 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20 20 to error */..
1250: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 Tls_Error(state
1260: 50 74 72 2c 20 53 53 4c 5f 45 52 52 4f 52 28 73 Ptr, SSL_ERROR(s
1270: 73 6c 2c 20 30 29 29 3b 0a 09 20 20 20 20 72 65 sl, 0));.. re
1280: 74 75 72 6e 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 turn;..}. }.#
1290: 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 77 68 endif. if (wh
12a0: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e ere & SSL_CB_HAN
12b0: 44 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a DSHAKE_START) {.
12c0: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 .major = "handsh
12d0: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 ake";..minor = "
12e0: 73 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c start";. } el
12f0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
1300: 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f SL_CB_HANDSHAKE_
1310: 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d DONE) {..major =
1320: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d "handshake";..m
1330: 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 inor = "done";.
1340: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
1350: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1360: 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 ALERT)..major =
1370: 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 "alert";..else i
1380: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 f (where & SSL_S
1390: 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 T_CONNECT).major
13a0: 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 = "connect";..e
13b0: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
13c0: 53 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09 SSL_ST_ACCEPT)..
13d0: 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22 major = "accept"
13e0: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f ;..else.....majo
13f0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a r = "unknown";..
1400: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c .if (where & SSL
1410: 5f 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 _CB_READ)..minor
1420: 20 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 = "read";..else
1430: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
1440: 5f 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f _CB_WRITE)..mino
1450: 72 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c r = "write";..el
1460: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
1470: 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e SL_CB_LOOP)..min
1480: 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c or = "loop";..el
1490: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
14a0: 53 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e SL_CB_EXIT)..min
14b0: 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c or = "exit";..el
14c0: 73 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 se.....minor = "
14d0: 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a unknown";. }.
14e0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
14f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 AppendElement( s
1500: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
1510: 20 63 6d 64 50 74 72 2c 20 0a 09 20 20 20 20 54 cmdPtr, .. T
1520: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1530: 20 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 0a "info", -1));..
1540: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1550: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 ppendElement( st
1560: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
1570: 63 6d 64 50 74 72 2c 20 0a 09 20 20 20 20 54 63 cmdPtr, .. Tc
1580: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 l_NewStringObj(
1590: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
15a0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
15b0: 66 29 2c 20 2d 31 29 20 29 3b 0a 0a 20 20 20 20 f), -1) );..
15c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
15d0: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 dElement( stateP
15e0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
15f0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
1600: 53 74 72 69 6e 67 4f 62 6a 28 20 6d 61 6a 6f 72 StringObj( major
1610: 2c 20 2d 31 29 20 29 3b 0a 0a 20 20 20 20 54 63 , -1) );.. Tc
1620: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1630: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 lement( statePtr
1640: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
1650: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
1660: 72 69 6e 67 4f 62 6a 28 20 6d 69 6e 6f 72 2c 20 ringObj( minor,
1670: 2d 31 29 20 29 3b 0a 0a 20 20 20 20 69 66 20 28 -1) );.. if (
1680: 77 68 65 72 65 20 26 20 28 53 53 4c 5f 43 42 5f where & (SSL_CB_
1690: 4c 4f 4f 50 7c 53 53 4c 5f 43 42 5f 45 58 49 54 LOOP|SSL_CB_EXIT
16a0: 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 )) {..Tcl_ListOb
16b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 jAppendElement(
16c0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
16d0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
16e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
16f0: 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e SSL_state_strin
1700: 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 g_long(ssl), -1)
1710: 20 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 );. } else i
1720: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
1730: 42 5f 41 4c 45 52 54 29 20 7b 0a 09 43 4f 4e 53 B_ALERT) {..CONS
1740: 54 20 63 68 61 72 20 2a 63 70 20 3d 20 28 63 68 T char *cp = (ch
1750: 61 72 20 2a 29 20 53 53 4c 5f 61 6c 65 72 74 5f ar *) SSL_alert_
1760: 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 desc_string_long
1770: 28 72 65 74 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 (ret);...Tcl_Lis
1780: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1790: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 t( statePtr->int
17a0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
17b0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
17c0: 62 6a 28 20 63 70 2c 20 2d 31 29 20 29 3b 0a 20 bj( cp, -1) );.
17d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c } else {..Tcl
17e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
17f0: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d ement( statePtr-
1800: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c >interp, cmdPtr,
1810: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
1820: 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 73 74 61 74 ingObj( SSL_stat
1830: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 e_string_long(ss
1840: 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20 20 20 7d l), -1) );. }
1850: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
1860: 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 e( (ClientData)
1870: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1880: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 );. Tcl_Prese
1890: 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 rve( (ClientData
18a0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 ) statePtr);..
18b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
18c0: 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 nt( cmdPtr);.
18d0: 20 28 76 6f 69 64 29 20 54 63 6c 5f 45 76 61 6c (void) Tcl_Eval
18e0: 4f 62 6a 45 78 28 73 74 61 74 65 50 74 72 2d 3e ObjEx(statePtr->
18f0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1900: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
1910: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 ;. Tcl_DecrRe
1920: 66 43 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b fCount( cmdPtr);
1930: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 .. Tcl_Releas
1940: 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 e( (ClientData)
1950: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
1960: 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69 cl_Release( (Cli
1970: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
1980: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 0a 7d 0a 0c r->interp);..}..
1990: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
19e0: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d VerifyCallback -
19f0: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 -. *. *.Monitors
1a00: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65 SSL certificate
1a10: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63 validation proc
1a20: 65 73 73 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 ess.. *.This is
1a30: 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 called whenever
1a40: 61 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 a certificate is
1a50: 20 69 6e 73 70 65 63 74 65 64 0a 20 2a 09 6f 72 inspected. *.or
1a60: 20 64 65 63 69 64 65 64 20 69 6e 76 61 6c 69 64 decided invalid
1a70: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
1a80: 0a 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 . *.A callback b
1a90: 6f 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 6b ound to the sock
1aa0: 65 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e et may return on
1ab0: 65 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 e of:. *. 0..
1ac0: 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 .- the certifica
1ad0: 74 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e 76 te is deemed inv
1ae0: 61 6c 69 64 0a 20 2a 09 20 20 20 20 31 09 09 09 alid. *. 1...
1af0: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 - the certificat
1b00: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 e is deemed vali
1b10: 64 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 d. *. empty s
1b20: 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 tring.- no chang
1b30: 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 e to certificate
1b40: 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 validation. *.
1b50: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
1b60: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 *.The err field
1b70: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c of the currentl
1b80: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 y operative Stat
1b90: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f e is set. *. to
1ba0: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 a string descri
1bb0: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 bing the SSL neg
1bc0: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 otiation failure
1bd0: 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d 2d 2d 2d 2d reason. *------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1c20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 /.static int.Ver
1c30: 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 ifyCallback(int
1c40: 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 ok, X509_STORE_C
1c50: 54 58 20 2a 63 74 78 29 0a 7b 0a 20 20 20 20 54 TX *ctx).{. T
1c60: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 cl_Obj *cmdPtr,
1c70: 2a 72 65 73 75 6c 74 3b 0a 20 20 20 20 63 68 61 *result;. cha
1c80: 72 20 2a 65 72 72 53 74 72 2c 20 2a 73 74 72 69 r *errStr, *stri
1c90: 6e 67 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 67 ng;. int leng
1ca0: 74 68 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 th;. SSL *s
1cb0: 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 sl..= (SSL*)X509
1cc0: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 _STORE_CTX_get_e
1cd0: 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c 5f x_data(ctx, SSL_
1ce0: 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 get_ex_data_X509
1cf0: 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 _STORE_CTX_idx()
1d00: 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65 );. X509 *ce
1d10: 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 rt..= X509_STORE
1d20: 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 _CTX_get_current
1d30: 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20 _cert(ctx);.
1d40: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 State *statePtr.
1d50: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 = (State*)SSL_ge
1d60: 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b t_app_data(ssl);
1d70: 0a 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 . int depth..
1d80: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 = X509_STORE_CTX
1d90: 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 _get_error_depth
1da0: 28 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 (ctx);. int e
1db0: 72 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 rr..= X509_STORE
1dc0: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 _CTX_get_error(c
1dd0: 74 78 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 tx);.. dprint
1de0: 66 28 22 56 65 72 69 66 79 3a 20 25 64 22 2c 20 f("Verify: %d",
1df0: 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 6f ok);.. if (!o
1e00: 6b 29 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 k) {..errStr = (
1e10: 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 char*)X509_verif
1e20: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 y_cert_error_str
1e30: 69 6e 67 28 65 72 72 29 3b 0a 20 20 20 20 7d 20 ing(err);. }
1e40: 65 6c 73 65 20 7b 0a 09 65 72 72 53 74 72 20 3d else {..errStr =
1e50: 20 28 63 68 61 72 20 2a 29 30 3b 0a 20 20 20 20 (char *)0;.
1e60: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
1e70: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d Ptr->callback ==
1e80: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
1e90: 20 7b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 {..if (statePtr
1ea0: 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 ->vflags & SSL_V
1eb0: 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f ERIFY_FAIL_IF_NO
1ec0: 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 _PEER_CERT) {..
1ed0: 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d return ok;..}
1ee0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 else {.. ret
1ef0: 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a urn 1;..}. }.
1f00: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
1f10: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
1f20: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
1f30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
1f40: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1f50: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ( statePtr->inte
1f60: 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 20 rp, cmdPtr, ..
1f70: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
1f80: 62 6a 28 20 22 76 65 72 69 66 79 22 2c 20 2d 31 bj( "verify", -1
1f90: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 ));.. Tcl_Lis
1fa0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1fb0: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 t( statePtr->int
1fc0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 erp, cmdPtr, ..
1fd0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
1fe0: 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43 68 61 6e Obj( Tcl_GetChan
1ff0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
2000: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20 29 3b 0a ->self), -1) );.
2010: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
2020: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 AppendElement( s
2030: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
2040: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
2050: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 20 64 65 70 l_NewIntObj( dep
2060: 74 68 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f th) );.. Tcl_
2070: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2080: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e ment( statePtr->
2090: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
20a0: 09 20 20 20 20 54 6c 73 5f 4e 65 77 58 35 30 39 . Tls_NewX509
20b0: 4f 62 6a 28 20 73 74 61 74 65 50 74 72 2d 3e 69 Obj( statePtr->i
20c0: 6e 74 65 72 70 2c 20 63 65 72 74 29 20 29 3b 0a nterp, cert) );.
20d0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
20e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 AppendElement( s
20f0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
2100: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
2110: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 20 6f 6b 29 l_NewIntObj( ok)
2120: 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 );.. Tcl_Lis
2130: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2140: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 t( statePtr->int
2150: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
2160: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
2170: 62 6a 28 20 65 72 72 53 74 72 20 3f 20 65 72 72 bj( errStr ? err
2180: 53 74 72 20 3a 20 22 22 2c 20 2d 31 29 20 29 3b Str : "", -1) );
2190: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
21a0: 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 ve( (ClientData)
21b0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
21c0: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 p);. Tcl_Pres
21d0: 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 erve( (ClientDat
21e0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
21f0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 statePtr->fla
2200: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 gs |= TLS_TCL_CA
2210: 4c 4c 42 41 43 4b 3b 0a 0a 20 20 20 20 54 63 6c LLBACK;.. Tcl
2220: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 20 63 _IncrRefCount( c
2230: 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 mdPtr);. if (
2240: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 73 74 Tcl_EvalObjEx(st
2250: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
2260: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c cmdPtr, TCL_EVAL
2270: 5f 47 4c 4f 42 41 4c 29 20 21 3d 20 54 43 4c 5f _GLOBAL) != TCL_
2280: 4f 4b 29 20 7b 0a 09 2f 2a 20 49 74 20 67 6f 74 OK) {../* It got
2290: 20 61 6e 20 65 72 72 6f 72 20 2d 20 72 65 6a 65 an error - reje
22a0: 63 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61 ct the certifica
22b0: 74 65 2e 09 09 2a 2f 0a 09 54 63 6c 5f 42 61 63 te...*/..Tcl_Bac
22c0: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 20 73 74 kgroundError( st
22d0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b atePtr->interp);
22e0: 0a 09 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 20 ..ok = 0;. }
22f0: 65 6c 73 65 20 7b 0a 09 72 65 73 75 6c 74 20 3d else {..result =
2300: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c Tcl_GetObjResul
2310: 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 t(statePtr->inte
2320: 72 70 29 3b 0a 09 73 74 72 69 6e 67 20 3d 20 54 rp);..string = T
2330: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
2340: 4f 62 6a 28 72 65 73 75 6c 74 2c 20 26 6c 65 6e Obj(result, &len
2350: 67 74 68 29 3b 0a 09 2f 2a 20 41 6e 20 65 6d 70 gth);../* An emp
2360: 74 79 20 72 65 73 75 6c 74 20 6c 65 61 76 65 73 ty result leaves
2370: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e verification un
2380: 63 68 61 6e 67 65 64 2e 09 2a 2f 0a 09 69 66 20 changed..*/..if
2390: 28 73 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 20 (string != NULL
23a0: 26 26 20 6c 65 6e 67 74 68 20 3e 20 30 29 20 7b && length > 0) {
23b0: 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 .. if (Tcl_Ge
23c0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 73 74 61 74 tIntFromObj(stat
23d0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 72 65 ePtr->interp, re
23e0: 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 43 sult, &ok) != TC
23f0: 4c 5f 4f 4b 29 20 7b 0a 09 09 54 63 6c 5f 42 61 L_OK) {...Tcl_Ba
2400: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 73 74 ckgroundError(st
2410: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b atePtr->interp);
2420: 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 20 20 20 ...ok = 0;..
2430: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 }..}. }. T
2440: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
2450: 20 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 73 cmdPtr);.. s
2460: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
2470: 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c = ~(TLS_TCL_CALL
2480: 42 41 43 4b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f BACK);.. Tcl_
2490: 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74 Release( (Client
24a0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
24b0: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
24c0: 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 ( (ClientData) s
24d0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 tatePtr->interp)
24e0: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b ;.. return(ok
24f0: 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 );./* By default
2500: 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 , leave verifica
2510: 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 tion unchanged..
2520: 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d */.}.../*. *----
2530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2570: 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 *. * Tls_Error
2580: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 --. *. *.Calls c
2590: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 24 66 64 allback with $fd
25a0: 20 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f 20 74 and $msg - so t
25b0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 he callback can
25c0: 64 65 63 69 64 65 0a 20 2a 09 77 68 61 74 20 74 decide. *.what t
25d0: 6f 20 64 6f 20 77 69 74 68 20 65 72 72 6f 72 73 o do with errors
25e0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
25f0: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 ects:. *.The err
2600: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 field of the cu
2610: 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 rrently operativ
2620: 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 e State is set.
2630: 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 *. to a string
2640: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 describing the S
2650: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 SL negotiation f
2660: 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a ailure reason. *
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26b0: 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 ---. */.void.Tls
26c0: 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 _Error(State *st
26d0: 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 atePtr, char *ms
26e0: 67 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a g).{. Tcl_Obj
26f0: 20 2a 63 6d 64 50 74 72 3b 0a 0a 20 20 20 20 69 *cmdPtr;.. i
2700: 66 20 28 6d 73 67 20 26 26 20 2a 6d 73 67 29 20 f (msg && *msg)
2710: 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 {..Tcl_SetErrorC
2720: 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 69 6e ode(statePtr->in
2730: 74 65 72 70 2c 20 22 53 53 4c 22 2c 20 6d 73 67 terp, "SSL", msg
2740: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b , (char *)NULL);
2750: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6d . } else {..m
2760: 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 sg = Tcl_GetStri
2770: 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 ngFromObj(Tcl_Ge
2780: 74 4f 62 6a 52 65 73 75 6c 74 28 73 74 61 74 65 tObjResult(state
2790: 50 74 72 2d 3e 69 6e 74 65 72 70 29 2c 20 4e 55 Ptr->interp), NU
27a0: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 LL);. }. s
27b0: 74 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d tatePtr->err = m
27c0: 73 67 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 sg;.. if (sta
27d0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
27e0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
27f0: 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 L) {..char buf[B
2800: 55 46 53 49 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 UFSIZ];..sprintf
2810: 28 62 75 66 2c 20 22 53 53 4c 20 63 68 61 6e 6e (buf, "SSL chann
2820: 65 6c 20 5c 22 25 73 5c 22 3a 20 65 72 72 6f 72 el \"%s\": error
2830: 3a 20 25 73 22 2c 0a 09 20 20 20 20 54 63 6c 5f : %s",.. Tcl_
2840: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
2850: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
2860: 6d 73 67 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65 msg);..Tcl_SetRe
2870: 73 75 6c 74 28 20 73 74 61 74 65 50 74 72 2d 3e sult( statePtr->
2880: 69 6e 74 65 72 70 2c 20 62 75 66 2c 20 54 43 4c interp, buf, TCL
2890: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 09 54 63 6c _VOLATILE);..Tcl
28a0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
28b0: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ( statePtr->inte
28c0: 72 70 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 rp);..return;.
28d0: 20 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d }. cmdPtr =
28e0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
28f0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c j(statePtr->call
2900: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f back);.. Tcl_
2910: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2920: 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 ment(statePtr->i
2930: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a nterp, cmdPtr, .
2940: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
2950: 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d ngObj("error", -
2960: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 1));.. Tcl_Li
2970: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2980: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 nt(statePtr->int
2990: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 erp, cmdPtr, ..
29a0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
29b0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
29c0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
29d0: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 >self), -1));..
29e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
29f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 pendElement(stat
2a00: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d ePtr->interp, cm
2a10: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
2a20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c ewStringObj(msg,
2a30: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1));.. Tcl_
2a40: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 Preserve((Client
2a50: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e Data) statePtr->
2a60: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
2a70: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
2a80: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
2a90: 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
2aa0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
2ab0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 45 76 61 . if (Tcl_Eva
2ac0: 6c 4f 62 6a 45 78 28 73 74 61 74 65 50 74 72 2d lObjEx(statePtr-
2ad0: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c >interp, cmdPtr,
2ae0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
2af0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
2b00: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 Tcl_BackgroundEr
2b10: 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 69 6e ror(statePtr->in
2b20: 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 terp);. }.
2b30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
2b40: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 t(cmdPtr);..
2b50: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
2b60: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
2b70: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 r);. Tcl_Rele
2b80: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
2b90: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
2ba0: 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d p);.}.../*. *---
2bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bf0: 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 43 . *. * PasswordC
2c00: 61 6c 6c 62 61 63 6b 20 2d 2d 20 0a 20 2a 0a 20 allback -- . *.
2c10: 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 *.Called when a
2c20: 70 61 73 73 77 6f 72 64 20 69 73 20 6e 65 65 64 password is need
2c30: 65 64 20 74 6f 20 75 6e 70 61 63 6b 20 52 53 41 ed to unpack RSA
2c40: 20 61 6e 64 20 50 45 4d 20 6b 65 79 73 2e 0a 20 and PEM keys..
2c50: 2a 09 45 76 61 6c 73 20 61 6e 79 20 62 6f 75 6e *.Evals any boun
2c60: 64 20 70 61 73 73 77 6f 72 64 20 73 63 72 69 70 d password scrip
2c70: 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 t and returns th
2c80: 65 20 72 65 73 75 6c 74 20 61 73 0a 20 2a 09 74 e result as. *.t
2c90: 68 65 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 he password stri
2ca0: 6e 67 2e 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ng.. *----------
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 ---------. */.#i
2cf0: 66 64 65 66 20 50 52 45 5f 4f 50 45 4e 53 53 4c fdef PRE_OPENSSL
2d00: 5f 30 5f 39 5f 34 0a 2f 2a 0a 20 2a 20 4e 6f 20 _0_9_4./*. * No
2d10: 77 61 79 20 74 6f 20 68 61 6e 64 6c 65 20 75 73 way to handle us
2d20: 65 72 2d 64 61 74 61 20 74 68 65 72 65 66 6f 72 er-data therefor
2d30: 65 20 6e 6f 20 77 61 79 20 77 69 74 68 6f 75 74 e no way without
2d40: 20 61 20 67 6c 6f 62 61 6c 0a 20 2a 20 76 61 72 a global. * var
2d50: 69 61 62 6c 65 20 74 6f 20 61 63 63 65 73 73 20 iable to access
2d60: 74 68 65 20 54 63 6c 20 69 6e 74 65 72 70 72 65 the Tcl interpre
2d70: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ter..*/.static i
2d80: 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 nt.PasswordCallb
2d90: 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 ack(char *buf, i
2da0: 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 72 nt size, int ver
2db0: 69 66 79 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 ify).{. retur
2dc0: 6e 20 2d 31 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74 n -1;.}.#else.st
2dd0: 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 atic int.Passwor
2de0: 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a dCallback(char *
2df0: 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 buf, int size, i
2e00: 6e 74 20 76 65 72 69 66 79 2c 20 76 6f 69 64 20 nt verify, void
2e10: 2a 75 64 61 74 61 29 0a 7b 0a 20 20 20 20 53 74 *udata).{. St
2e20: 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 ate *statePtr.=
2e30: 28 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b (State *) udata;
2e40: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
2e50: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 *interp.= stateP
2e60: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 tr->interp;.
2e70: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b Tcl_Obj *cmdPtr;
2e80: 0a 20 20 20 20 69 6e 74 20 72 65 73 75 6c 74 3b . int result;
2e90: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
2ea0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 tr->password ==
2eb0: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c NULL) {..if (Tcl
2ec0: 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 _EvalEx(interp,
2ed0: 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c "tls::password",
2ee0: 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c -1, TCL_EVAL_GL
2ef0: 4f 42 41 4c 29 0a 09 09 3d 3d 20 54 43 4c 5f 4f OBAL)...== TCL_O
2f00: 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a K) {.. char *
2f10: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 ret = (char *) T
2f20: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 cl_GetStringResu
2f30: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 lt(interp);..
2f40: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 strncpy(buf, re
2f50: 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 t, (size_t) size
2f60: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 );.. return (
2f70: 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b int)strlen(ret);
2f80: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
2f90: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 return -1;..}.
2fa0: 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 }.. cmdPtr
2fb0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
2fc0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 bj(statePtr->pas
2fd0: 73 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c sword);.. Tcl
2fe0: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
2ff0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d tData) statePtr-
3000: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 >interp);. Tc
3010: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 l_Preserve((Clie
3020: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
3030: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 );.. Tcl_Incr
3040: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
3050: 3b 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 ;. result = T
3060: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 cl_EvalObjEx(int
3070: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c erp, cmdPtr, TCL
3080: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 _EVAL_GLOBAL);.
3090: 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d if (result !=
30a0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f TCL_OK) {..Tcl_
30b0: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 BackgroundError(
30c0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
30d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c );. }. Tcl
30e0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
30f0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f dPtr);.. Tcl_
3100: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
3110: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
3120: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
3130: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
3140: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a tePtr->interp);.
3150: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 . if (result
3160: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 == TCL_OK) {..ch
3170: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 ar *ret = (char
3180: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 *) Tcl_GetString
3190: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
31a0: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 .strncpy(buf, re
31b0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 t, (size_t) size
31c0: 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e 74 29 );..return (int)
31d0: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 20 20 20 strlen(ret);.
31e0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 74 75 72 } else {..retur
31f0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 7d 0a 23 65 n -1;. }.}.#e
3200: 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ndif.../*. *----
3210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3250: 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a *. * CiphersObj
3260: 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 Cmd -- list avai
3270: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a lable ciphers. *
3280: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
3290: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f re is invoked to
32a0: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c process the "tl
32b0: 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d s::ciphers" comm
32c0: 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 and. *.to list a
32d0: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 vailable ciphers
32e0: 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f , based upon pro
32f0: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a tocol selected..
3300: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
3310: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
3320: 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a result list.. *
3330: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
3340: 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 :. *.constructs
3350: 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c and destroys SSL
3360: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 context (CTX).
3370: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
33c0: 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 ic int.CiphersOb
33d0: 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c jCmd(clientData,
33e0: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f interp, objc, o
33f0: 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 bjv). ClientD
3400: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 ata clientData;.
3410: 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a /* Not used. */.
3420: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
3430: 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 interp;. int
3440: 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 objc;. Tcl_Ob
3450: 6a 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b j.*CONST objv[];
3460: 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20 43 4f .{. static CO
3470: 4e 53 54 38 34 20 63 68 61 72 20 2a 70 72 6f 74 NST84 char *prot
3480: 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 ocols[] = {.."ss
3490: 6c 32 22 2c 09 22 73 73 6c 33 22 2c 09 22 74 6c l2",."ssl3",."tl
34a0: 73 31 22 2c 09 22 74 6c 73 31 2e 31 22 2c 20 22 s1",."tls1.1", "
34b0: 74 6c 73 31 2e 32 22 2c 20 4e 55 4c 4c 0a 20 20 tls1.2", NULL.
34c0: 20 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 70 72 };. enum pr
34d0: 6f 74 6f 63 6f 6c 20 7b 0a 09 54 4c 53 5f 53 53 otocol {..TLS_SS
34e0: 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c L2, TLS_SSL3, TL
34f0: 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 S_TLS1, TLS_TLS1
3500: 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 _1, TLS_TLS1_2,
3510: 54 4c 53 5f 4e 4f 4e 45 0a 20 20 20 20 7d 3b 0a TLS_NONE. };.
3520: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
3530: 50 74 72 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 Ptr;. SSL_CTX
3540: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ctx = NULL;.
3550: 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c SSL *ssl = NUL
3560: 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 L;. STACK_OF(
3570: 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b SSL_CIPHER) *sk;
3580: 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 . char *cp, b
3590: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 uf[BUFSIZ];.
35a0: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f int index, verbo
35b0: 73 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 se = 0;.. if
35c0: 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a (objc < 2 || obj
35d0: 63 20 3e 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 c > 3) {..Tcl_Wr
35e0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
35f0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f p, 1, objv, "pro
3600: 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 22 tocol ?verbose?"
3610: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
3620: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
3630: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
3640: 46 72 6f 6d 4f 62 6a 28 20 69 6e 74 65 72 70 2c FromObj( interp,
3650: 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 objv[1], protoc
3660: 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c ols, "protocol",
3670: 20 30 2c 0a 09 26 69 6e 64 65 78 29 20 21 3d 20 0,..&index) !=
3680: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
3690: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
36a0: 20 7d 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 }. if (objc
36b0: 3e 20 32 20 26 26 20 54 63 6c 5f 47 65 74 42 6f > 2 && Tcl_GetBo
36c0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 20 69 6e oleanFromObj( in
36d0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 0a 09 terp, objv[2],..
36e0: 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c &verbose) != TCL
36f0: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
3700: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
3710: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 switch ((enu
3720: 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 m protocol)index
3730: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 ) {. case TLS
3740: 5f 53 53 4c 32 3a 0a 23 69 66 20 64 65 66 69 6e _SSL2:.#if defin
3750: 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 09 09 54 63 ed(NO_SSL2)...Tc
3760: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
3770: 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c nterp, "protocol
3780: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c not supported",
3790: 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e NULL);...return
37a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
37b0: 65 0a 09 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 e...ctx = SSL_CT
37c0: 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65 74 68 X_new(SSLv2_meth
37d0: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 od()); break;.#e
37e0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c ndif. case TL
37f0: 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 S_SSL3:.#if defi
3800: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 09 09 54 ned(NO_SSL3)...T
3810: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
3820: 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f interp, "protoco
3830: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
3840: 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 , NULL);...retur
3850: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c n TCL_ERROR;.#el
3860: 73 65 0a 09 09 63 74 78 20 3d 20 53 53 4c 5f 43 se...ctx = SSL_C
3870: 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74 TX_new(SSLv3_met
3880: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 hod()); break;.#
3890: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 endif. case T
38a0: 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 LS_TLS1:.#if def
38b0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 0a 09 09 ined(NO_TLS1)...
38c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
38d0: 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 (interp, "protoc
38e0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
38f0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 ", NULL);...retu
3900: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
3910: 6c 73 65 0a 09 09 63 74 78 20 3d 20 53 53 4c 5f lse...ctx = SSL_
3920: 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 6d 65 CTX_new(TLSv1_me
3930: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a thod()); break;.
3940: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 #endif. case
3950: 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 TLS_TLS1_1:.#if
3960: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
3970: 31 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 1)...Tcl_AppendR
3980: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 esult(interp, "p
3990: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
39a0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
39b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
39c0: 52 3b 0a 23 65 6c 73 65 0a 09 09 63 74 78 20 3d R;.#else...ctx =
39d0: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 SSL_CTX_new(TLS
39e0: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 v1_1_method());
39f0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 break;.#endif.
3a00: 20 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f case TLS_TLS1_
3a10: 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 2:.#if defined(N
3a20: 4f 5f 54 4c 53 31 5f 32 29 0a 09 09 54 63 6c 5f O_TLS1_2)...Tcl_
3a30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
3a40: 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e erp, "protocol n
3a50: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
3a60: 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 ULL);...return T
3a70: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
3a80: 09 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ..ctx = SSL_CTX_
3a90: 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 new(TLSv1_2_meth
3aa0: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 od()); break;.#e
3ab0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 ndif. default
3ac0: 3a 0a 09 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d :...break;. }
3ad0: 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 . if (ctx ==
3ae0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
3af0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
3b00: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 , REASON(), (cha
3b10: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
3b20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
3b30: 20 20 20 7d 0a 20 20 20 20 73 73 6c 20 3d 20 53 }. ssl = S
3b40: 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 SL_new(ctx);.
3b50: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c if (ssl == NULL
3b60: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
3b70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 esult(interp, RE
3b80: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
3b90: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
3ba0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
3bb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
3bc0: 20 20 20 7d 0a 20 20 20 20 6f 62 6a 50 74 72 20 }. objPtr
3bd0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
3be0: 28 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 ( 0, NULL);..
3bf0: 20 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b if (!verbose) {
3c00: 0a 09 66 6f 72 20 28 69 6e 64 65 78 20 3d 20 30 ..for (index = 0
3c10: 3b 20 3b 20 69 6e 64 65 78 2b 2b 29 20 7b 0a 09 ; ; index++) {..
3c20: 20 20 20 20 63 70 20 3d 20 28 63 68 61 72 2a 29 cp = (char*)
3c30: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 6c SSL_get_cipher_l
3c40: 69 73 74 28 20 73 73 6c 2c 20 69 6e 64 65 78 29 ist( ssl, index)
3c50: 3b 0a 09 20 20 20 20 69 66 20 28 63 70 20 3d 3d ;.. if (cp ==
3c60: 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 20 NULL) break;..
3c70: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
3c80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e 74 pendElement( int
3c90: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 54 erp, objPtr,...T
3ca0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
3cb0: 20 63 70 2c 20 2d 31 29 20 29 3b 0a 09 7d 0a 20 cp, -1) );..}.
3cc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 } else {..sk
3cd0: 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 = SSL_get_cipher
3ce0: 73 28 73 73 6c 29 3b 0a 0a 09 66 6f 72 20 28 69 s(ssl);...for (i
3cf0: 6e 64 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20 ndex = 0; index
3d00: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f < sk_SSL_CIPHER_
3d10: 6e 75 6d 28 73 6b 29 3b 20 69 6e 64 65 78 2b 2b num(sk); index++
3d20: 29 20 7b 0a 09 20 20 20 20 72 65 67 69 73 74 65 ) {.. registe
3d30: 72 20 73 69 7a 65 5f 74 20 69 3b 0a 09 20 20 20 r size_t i;..
3d40: 20 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 SSL_CIPHER_desc
3d50: 72 69 70 74 69 6f 6e 28 20 73 6b 5f 53 53 4c 5f ription( sk_SSL_
3d60: 43 49 50 48 45 52 5f 76 61 6c 75 65 28 20 73 6b CIPHER_value( sk
3d70: 2c 20 69 6e 64 65 78 29 2c 0a 09 09 09 09 20 20 , index),.....
3d80: 20 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 buf, sizeof(bu
3d90: 66 29 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 f));.. for (i
3da0: 20 3d 20 73 74 72 6c 65 6e 28 62 75 66 29 20 2d = strlen(buf) -
3db0: 20 31 3b 20 69 20 3b 20 69 2d 2d 29 20 7b 0a 09 1; i ; i--) {..
3dc0: 09 69 66 20 28 62 75 66 5b 69 5d 20 3d 3d 20 27 .if (buf[i] == '
3dd0: 20 27 20 7c 7c 20 62 75 66 5b 69 5d 20 3d 3d 20 ' || buf[i] ==
3de0: 27 5c 6e 27 20 7c 7c 0a 09 09 20 20 20 20 62 75 '\n' ||... bu
3df0: 66 5b 69 5d 20 3d 3d 20 27 5c 72 27 20 7c 7c 20 f[i] == '\r' ||
3e00: 62 75 66 5b 69 5d 20 3d 3d 20 27 5c 74 27 29 20 buf[i] == '\t')
3e10: 7b 0a 09 09 20 20 20 20 62 75 66 5b 69 5d 20 3d {... buf[i] =
3e20: 20 27 5c 30 27 3b 0a 09 09 7d 20 65 6c 73 65 20 '\0';...} else
3e30: 7b 0a 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 {... break;..
3e40: 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 .}.. }.. T
3e50: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
3e60: 45 6c 65 6d 65 6e 74 28 20 69 6e 74 65 72 70 2c Element( interp,
3e70: 20 6f 62 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e objPtr,...Tcl_N
3e80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 62 75 66 ewStringObj( buf
3e90: 2c 20 2d 31 29 20 29 3b 0a 09 7d 0a 20 20 20 20 , -1) );..}.
3ea0: 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 }. SSL_free(s
3eb0: 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 sl);. SSL_CTX
3ec0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 _free(ctx);..
3ed0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
3ee0: 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 t( interp, objPt
3ef0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
3f00: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
3f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f50: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 ---. *. * Handsh
3f60: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a akeObjCmd --. *.
3f70: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 *.This command
3f80: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 is used to verif
3f90: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 y whether the ha
3fa0: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c ndshake is compl
3fb0: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 ete. *.or not..
3fc0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
3fd0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
3fe0: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 result. 1 means
3ff0: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 handshake comple
4000: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 te, 0 means pend
4010: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ing.. *. * Side
4020: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
4030: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 force SSL negoti
4040: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c ation to take pl
4050: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ace.. *. *------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
40a0: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 61 /..static int.Ha
40b0: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 63 6c ndshakeObjCmd(cl
40c0: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 ientData, interp
40d0: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 , objc, objv).
40e0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ClientData cli
40f0: 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 entData;./* Not
4100: 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c used. */. Tcl
4110: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b _Interp *interp;
4120: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 . int objc;.
4130: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 Tcl_Obj *CONS
4140: 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 T objv[];.{.
4150: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
4160: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
4170: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
4180: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on. */. State
4190: 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 *statePtr;../*
41a0: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
41b0: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
41c0: 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a int ret = 1;.
41d0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
41e0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
41f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
4200: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
4210: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
4220: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
4230: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
4240: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
4250: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
4260: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e omObj(objv[1], N
4270: 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 ULL), NULL);.
4280: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
4290: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
42a0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
42b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
42c0: 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 if (channelTypeV
42d0: 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 ersion == TLS_CH
42e0: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 ANNEL_VERSION_2)
42f0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 {../*.. * Make
4300: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 sure to operate
4310: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 on the topmost c
4320: 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 hannel.. */..cha
4330: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
4340: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 annel(chan);.
4350: 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 }. if (Tcl_G
4360: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
4370: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
4380: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
4390: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
43a0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
43b0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
43c0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
43d0: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
43e0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
43f0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
4400: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
4410: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
4420: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
4430: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
4440: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 chan);.. if (
4450: 21 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e !SSL_is_init_fin
4460: 69 73 68 65 64 28 73 74 61 74 65 50 74 72 2d 3e ished(statePtr->
4470: 73 73 6c 29 29 20 7b 0a 09 69 6e 74 20 65 72 72 ssl)) {..int err
4480: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 64 70 = 0;. dp
4490: 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 rintf("Calling T
44a0: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 ls_WaitForConnec
44b0: 74 22 29 3b 0a 09 72 65 74 20 3d 20 54 6c 73 5f t");..ret = Tls_
44c0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 WaitForConnect(s
44d0: 74 61 74 65 50 74 72 2c 20 26 65 72 72 29 3b 0a tatePtr, &err);.
44e0: 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 66 28 dprintf(
44f0: 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e "Tls_WaitForConn
4500: 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 ect returned: %i
4510: 22 2c 20 72 65 74 29 3b 0a 0a 09 69 66 20 28 28 ", ret);...if ((
4520: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
4530: 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 & TLS_TCL_ASYNC)
4540: 20 26 26 20 65 72 72 20 3d 3d 20 45 41 47 41 49 && err == EAGAI
4550: 4e 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 N) {.
4560: 20 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 dprintf("Async
4570: 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 set and err = EA
4580: 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 72 65 74 GAIN");.. ret
4590: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 = 0;..}...if (r
45a0: 65 74 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 43 et < 0) {.. C
45b0: 4f 4e 53 54 20 63 68 61 72 20 2a 65 72 72 53 74 ONST char *errSt
45c0: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 r = statePtr->er
45d0: 72 3b 0a 09 20 20 20 20 54 63 6c 5f 52 65 73 65 r;.. Tcl_Rese
45e0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b tResult(interp);
45f0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
4600: 6e 6f 28 65 72 72 29 3b 0a 0a 09 20 20 20 20 69 no(err);... i
4610: 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 2a 65 f (!errStr || *e
4620: 72 72 53 74 72 20 3d 3d 20 30 29 20 7b 0a 09 09 rrStr == 0) {...
4630: 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 errStr = Tcl_Pos
4640: 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ixError(interp);
4650: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 54 63 .. }... Tc
4660: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
4670: 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b nterp, "handshak
4680: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 e failed: ", err
4690: 53 74 72 2c 0a 09 09 20 20 20 20 28 63 68 61 72 Str,... (char
46a0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
46b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
46c0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
46d0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
46e0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
46f0: 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 IntObj(ret));.
4700: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
4710: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4760: 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 . * ImportObjCmd
4770: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
4780: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
4790: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
47a0: 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 he "ssl" command
47b0: 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 . *. *.The ssl c
47c0: 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 ommand pushes SS
47d0: 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 L over a (newly
47e0: 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 connected) tcp s
47f0: 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 ocket. *. * Resu
4800: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
4810: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
4820: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
4830: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 s:. *.May modify
4840: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 the behavior of
4850: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a an IO channel..
4860: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
48b0: 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f atic int.ImportO
48c0: 62 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 bjCmd(clientData
48d0: 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 , interp, objc,
48e0: 6f 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 objv). Client
48f0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b Data clientData;
4900: 09 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f ./* Not used. */
4910: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
4920: 2a 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 *interp;. int
4930: 20 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f objc;. Tcl_O
4940: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d bj *CONST objv[]
4950: 3b 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ;.{. Tcl_Chan
4960: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 nel chan;../* Th
4970: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 e channel to set
4980: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 a mode on. */.
4990: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
49a0: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 tr;../* client s
49b0: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 tate for ssl soc
49c0: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 ket */. SSL_C
49d0: 54 58 20 2a 63 74 78 09 3d 20 4e 55 4c 4c 3b 0a TX *ctx.= NULL;.
49e0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 Tcl_Obj *scr
49f0: 69 70 74 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ipt.= NULL;.
4a00: 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 Tcl_Obj *passwor
4a10: 64 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e d.= NULL;. in
4a20: 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 t idx, len;.
4a30: 69 6e 74 20 66 6c 61 67 73 09 09 3d 20 54 4c 53 int flags..= TLS
4a40: 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 _TCL_INIT;. i
4a50: 6e 74 20 73 65 72 76 65 72 09 09 3d 20 30 3b 09 nt server..= 0;.
4a60: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e /* is connection
4a70: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 incoming or out
4a80: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 going? */. ch
4a90: 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b ar *key..= NULL;
4aa0: 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 09 . char *cert.
4ab0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 .= NULL;. cha
4ac0: 72 20 2a 63 69 70 68 65 72 73 09 3d 20 4e 55 4c r *ciphers.= NUL
4ad0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 L;. char *CAf
4ae0: 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ile.= NULL;.
4af0: 63 68 61 72 20 2a 43 41 64 69 72 09 09 3d 20 4e char *CAdir..= N
4b00: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 ULL;. char *D
4b10: 48 70 61 72 61 6d 73 09 3d 20 4e 55 4c 4c 3b 0a Hparams.= NULL;.
4b20: 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 char *model.
4b30: 09 3d 20 4e 55 4c 4c 3b 0a 23 69 66 6e 64 65 66 .= NULL;.#ifndef
4b40: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 OPENSSL_NO_TLSE
4b50: 58 54 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 XT. char *ser
4b60: 76 65 72 6e 61 6d 65 09 3d 20 4e 55 4c 4c 3b 09 vername.= NULL;.
4b70: 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 /* hostname for
4b80: 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 Server Name Indi
4b90: 63 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 cation */.#endif
4ba0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
4bb0: 53 53 4c 32 29 0a 20 20 20 20 69 6e 74 20 73 73 SSL2). int ss
4bc0: 6c 32 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 l2 = 0;.#else.
4bd0: 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 31 3b 0a int ssl2 = 1;.
4be0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
4bf0: 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 ed(NO_SSL3).
4c00: 69 6e 74 20 73 73 6c 33 20 3d 20 30 3b 0a 23 65 int ssl3 = 0;.#e
4c10: 6c 73 65 0a 20 20 20 20 69 6e 74 20 73 73 6c 33 lse. int ssl3
4c20: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 1;.#endif.#if
4c30: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
4c40: 29 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d ). int tls1 =
4c50: 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e 0;.#else. in
4c60: 74 20 74 6c 73 31 20 3d 20 31 3b 0a 23 65 6e 64 t tls1 = 1;.#end
4c70: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
4c80: 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 6e O_TLS1_1). in
4c90: 74 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 t tls1_1 = 0;.#e
4ca0: 6c 73 65 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 lse. int tls1
4cb0: 5f 31 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 _1 = 1;.#endif.#
4cc0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c if defined(NO_TL
4cd0: 53 31 5f 32 29 0a 20 20 20 20 69 6e 74 20 74 6c S1_2). int tl
4ce0: 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6c 73 65 0a s1_2 = 0;.#else.
4cf0: 20 20 20 20 69 6e 74 20 74 6c 73 31 5f 32 20 3d int tls1_2 =
4d00: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 1;.#endif. i
4d10: 6e 74 20 70 72 6f 74 6f 20 3d 20 30 3b 0a 20 20 nt proto = 0;.
4d20: 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 int verify = 0
4d30: 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 , require = 0, r
4d40: 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a 20 20 20 equest = 1;..
4d50: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b if (objc < 2) {
4d60: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
4d70: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
4d80: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 jv, "channel ?op
4d90: 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 tions?");..retur
4da0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
4db0: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
4dc0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
4dd0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
4de0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
4df0: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 1], NULL), NULL)
4e00: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
4e10: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
4e20: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
4e30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
4e40: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65 6c . if (channel
4e50: 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 TypeVersion == T
4e60: 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 LS_CHANNEL_VERSI
4e70: 4f 4e 5f 32 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 ON_2) {../*.. *
4e80: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
4e90: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
4ea0: 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f ost channel.. */
4eb0: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 ..chan = Tcl_Get
4ec0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
4ed0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 ;. }.. for
4ee0: 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c (idx = 2; idx <
4ef0: 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a objc; idx++) {.
4f00: 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c .char *opt = Tcl
4f10: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
4f20: 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c j(objv[idx], NUL
4f30: 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d L);...if (opt[0]
4f40: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 != '-').. br
4f50: 65 61 6b 3b 0a 0a 09 4f 50 54 53 54 52 28 20 22 eak;...OPTSTR( "
4f60: 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29 3b -cadir", CAdir);
4f70: 0a 09 4f 50 54 53 54 52 28 20 22 2d 63 61 66 69 ..OPTSTR( "-cafi
4f80: 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f le", CAfile);..O
4f90: 50 54 53 54 52 28 20 22 2d 63 65 72 74 66 69 6c PTSTR( "-certfil
4fa0: 65 22 2c 20 63 65 72 74 29 3b 0a 09 4f 50 54 53 e", cert);..OPTS
4fb0: 54 52 28 20 22 2d 63 69 70 68 65 72 22 2c 20 63 TR( "-cipher", c
4fc0: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 4f 42 4a iphers);..OPTOBJ
4fd0: 28 20 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 ( "-command", sc
4fe0: 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 20 ript);..OPTSTR(
4ff0: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 "-dhparams", DHp
5000: 61 72 61 6d 73 29 3b 0a 09 4f 50 54 53 54 52 28 arams);..OPTSTR(
5010: 20 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 "-keyfile", key
5020: 29 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d 6d 6f );..OPTSTR( "-mo
5030: 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f del", model);..O
5040: 50 54 4f 42 4a 28 20 22 2d 70 61 73 73 77 6f 72 PTOBJ( "-passwor
5050: 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 d", password);..
5060: 4f 50 54 42 4f 4f 4c 28 20 22 2d 72 65 71 75 69 OPTBOOL( "-requi
5070: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 re", require);..
5080: 4f 50 54 42 4f 4f 4c 28 20 22 2d 72 65 71 75 65 OPTBOOL( "-reque
5090: 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 st", request);..
50a0: 4f 50 54 42 4f 4f 4c 28 20 22 2d 73 65 72 76 65 OPTBOOL( "-serve
50b0: 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 23 69 66 r", server);.#if
50c0: 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ndef OPENSSL_NO_
50d0: 54 4c 53 45 58 54 0a 20 20 20 20 20 20 20 20 4f TLSEXT. O
50e0: 50 54 53 54 52 28 20 22 2d 73 65 72 76 65 72 6e PTSTR( "-servern
50f0: 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 ame", servername
5100: 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 4f 50 54 42 );.#endif...OPTB
5110: 4f 4f 4c 28 20 22 2d 73 73 6c 32 22 2c 20 73 73 OOL( "-ssl2", ss
5120: 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 l2);..OPTBOOL( "
5130: 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 -ssl3", ssl3);..
5140: 4f 50 54 42 4f 4f 4c 28 20 22 2d 74 6c 73 31 22 OPTBOOL( "-tls1"
5150: 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f , tls1);..OPTBOO
5160: 4c 28 20 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c L( "-tls1.1", tl
5170: 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 s1_1);..OPTBOOL(
5180: 20 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 "-tls1.2", tls1
5190: 5f 32 29 3b 0a 0a 09 4f 50 54 42 41 44 28 20 22 _2);...OPTBAD( "
51a0: 6f 70 74 69 6f 6e 22 2c 20 22 2d 63 61 64 69 72 option", "-cadir
51b0: 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 , -cafile, -cert
51c0: 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d file, -cipher, -
51d0: 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 command, -dhpara
51e0: 6d 73 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d ms, -keyfile, -m
51f0: 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c odel, -password,
5200: 20 2d 72 65 71 75 69 72 65 2c 20 2d 72 65 71 75 -require, -requ
5210: 65 73 74 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 est, -server, -s
5220: 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 73 6c 32 ervername, -ssl2
5230: 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 , -ssl3, -tls1,
5240: 2d 74 6c 73 31 2e 31 20 6f 72 20 2d 74 6c 73 31 -tls1.1 or -tls1
5250: 2e 32 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 .2");...return T
5260: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
5270: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 29 if (request)
5280: 09 20 20 20 20 76 65 72 69 66 79 20 7c 3d 20 53 . verify |= S
5290: 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 SL_VERIFY_CLIENT
52a0: 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 _ONCE | SSL_VERI
52b0: 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 FY_PEER;. if
52c0: 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 (request && requ
52d0: 69 72 65 29 20 76 65 72 69 66 79 20 7c 3d 20 53 ire) verify |= S
52e0: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 SL_VERIFY_FAIL_I
52f0: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a F_NO_PEER_CERT;.
5300: 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d if (verify =
5310: 3d 20 30 29 09 76 65 72 69 66 79 20 3d 20 53 53 = 0).verify = SS
5320: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a L_VERIFY_NONE;..
5330: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 proto |= (ss
5340: 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 l2 ? TLS_PROTO_S
5350: 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 SL2 : 0);. pr
5360: 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 oto |= (ssl3 ? T
5370: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 LS_PROTO_SSL3 :
5380: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
5390: 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f (tls1 ? TLS_PRO
53a0: 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 TO_TLS1 : 0);.
53b0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
53c0: 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 _1 ? TLS_PROTO_T
53d0: 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 LS1_1 : 0);.
53e0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 proto |= (tls1_2
53f0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
5400: 31 5f 32 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 1_2 : 0);.. /
5410: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 * reset to NULL
5420: 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 if blank string
5430: 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 provided */.
5440: 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 if (cert && !*ce
5450: 72 74 29 09 09 63 65 72 74 09 20 3d 20 4e 55 4c rt)..cert. = NUL
5460: 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 L;. if (key &
5470: 26 20 21 2a 6b 65 79 29 09 09 6b 65 79 09 20 3d & !*key)..key. =
5480: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
5490: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 iphers && !*ciph
54a0: 65 72 73 29 09 63 69 70 68 65 72 73 09 20 3d 20 ers).ciphers. =
54b0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 NULL;. if (CA
54c0: 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 file && !*CAfile
54d0: 29 09 43 41 66 69 6c 65 09 20 3d 20 4e 55 4c 4c ).CAfile. = NULL
54e0: 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69 72 20 ;. if (CAdir
54f0: 26 26 20 21 2a 43 41 64 69 72 29 09 43 41 64 69 && !*CAdir).CAdi
5500: 72 09 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 r. = NULL;. i
5510: 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 f (DHparams && !
5520: 2a 44 48 70 61 72 61 6d 73 29 09 44 48 70 61 72 *DHparams).DHpar
5530: 61 6d 73 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 ams = NULL;..
5540: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 /* new SSL stat
5550: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 e */. statePt
5560: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 r..= (State *) c
5570: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 kalloc((unsigned
5580: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 ) sizeof(State))
5590: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 ;. memset(sta
55a0: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 tePtr, 0, sizeof
55b0: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 (State));.. s
55c0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d tatePtr->flags.=
55d0: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 flags;. stat
55e0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 ePtr->interp.= i
55f0: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 nterp;. state
5600: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 Ptr->vflags.= ve
5610: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 rify;. stateP
5620: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 tr->err.= "";..
5630: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 /* allocate s
5640: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 cript */. if
5650: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 (script) {..(voi
5660: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 d) Tcl_GetString
5670: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 FromObj(script,
5680: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 &len);..if (len)
5690: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 {.. statePtr
56a0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 ->callback = scr
56b0: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e ipt;.. Tcl_In
56c0: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
56d0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
56e0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
56f0: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f allocate passwo
5700: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 rd */. if (pa
5710: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 ssword) {..(void
5720: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
5730: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c romObj(password,
5740: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e &len);..if (len
5750: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 ) {.. statePt
5760: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 r->password = pa
5770: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c ssword;.. Tcl
5780: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
5790: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
57a0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
57b0: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 if (model != NU
57c0: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b LL) {..int mode;
57d0: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f ../* Get the "mo
57e0: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a del" context */.
57f0: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 .chan = Tcl_GetC
5800: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d hannel(interp, m
5810: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 odel, &mode);..i
5820: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
5830: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
5840: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
5850: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
5860: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
5870: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 69 66 CL_ERROR;..}..if
5880: 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 (channelTypeVer
5890: 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e sion == TLS_CHAN
58a0: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 20 7b NEL_VERSION_2) {
58b0: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
58c0: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
58d0: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
58e0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 20 most channel..
58f0: 20 20 20 2a 2f 0a 09 20 20 20 20 63 68 61 6e 20 */.. chan
5900: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
5910: 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 7d 0a 09 69 nel(chan);..}..i
5920: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
5930: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
5940: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
5950: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
5960: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
5970: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
5980: 22 22 2c 0a 09 09 20 20 20 20 54 63 6c 5f 47 65 "",... Tcl_Ge
5990: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
59a0: 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 n), "\": not a T
59b0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
59c0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
59d0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
59e0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
59f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
5a00: 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a .ctx = ((State *
5a10: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 )Tcl_GetChannelI
5a20: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e nstanceData(chan
5a30: 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 ))->ctx;. } e
5a40: 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 lse {..if ((ctx
5a50: 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 = CTX_Init(state
5a60: 50 74 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 2c Ptr, proto, key,
5a70: 20 63 65 72 74 2c 20 43 41 64 69 72 2c 20 43 41 cert, CAdir, CA
5a80: 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 0a 09 file, ciphers,..
5a90: 09 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 28 .DHparams)) == (
5aa0: 53 53 4c 5f 43 54 58 2a 29 30 29 20 7b 0a 09 20 SSL_CTX*)0) {..
5ab0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 Tls_Free((cha
5ac0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a r *) statePtr);.
5ad0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
5ae0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
5af0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 . statePtr->c
5b00: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f tx = ctx;.. /
5b10: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 *. * We need
5b20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 to make sure th
5b30: 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 at the channel w
5b40: 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 orks in binary (
5b50: 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 for the. * e
5b60: 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f ncryption not to
5b70: 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e get goofed up).
5b80: 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 . * We only
5b90: 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 want to adjust t
5ba0: 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 he buffering in
5bb0: 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c pre-v2 channels,
5bc0: 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 where. * ea
5bd0: 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 ch channel in th
5be0: 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e e stack maintain
5bf0: 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 ed its own buffe
5c00: 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 rs.. */.
5c10: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
5c20: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
5c30: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
5c40: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 ", "binary");.
5c50: 20 20 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 if (channelTyp
5c60: 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f eVersion == TLS_
5c70: 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f CHANNEL_VERSION_
5c80: 31 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 1) {..Tcl_SetCha
5c90: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
5ca0: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 75 66 66 65 p, chan, "-buffe
5cb0: 72 69 6e 67 22 2c 20 22 6e 6f 6e 65 22 29 3b 0a ring", "none");.
5cc0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 63 }.. if (c
5cd0: 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f hannelTypeVersio
5ce0: 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c n == TLS_CHANNEL
5cf0: 5f 56 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 73 _VERSION_2) {..s
5d00: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 tatePtr->self =
5d10: 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c Tcl_StackChannel
5d20: 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 (interp, Tls_Cha
5d30: 6e 6e 65 6c 54 79 70 65 28 29 2c 0a 09 09 28 43 nnelType(),...(C
5d40: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
5d50: 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 Ptr, (TCL_READAB
5d60: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c LE | TCL_WRITABL
5d70: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 7d E), chan);. }
5d80: 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 else {..statePt
5d90: 72 2d 3e 73 65 6c 66 20 3d 20 63 68 61 6e 3b 0a r->self = chan;.
5da0: 09 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 .Tcl_StackChanne
5db0: 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 l(interp, Tls_Ch
5dc0: 61 6e 6e 65 6c 54 79 70 65 28 29 2c 0a 09 09 28 annelType(),...(
5dd0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
5de0: 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 ePtr, (TCL_READA
5df0: 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 BLE | TCL_WRITAB
5e00: 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 LE), chan);.
5e10: 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
5e20: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c tr->self == (Tcl
5e30: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
5e40: 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 {../*.. * No use
5e50: 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c of Tcl_Eventual
5e60: 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e lyFree because n
5e70: 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 o possible Tcl_P
5e80: 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 reserve... */..T
5e90: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
5ea0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 statePtr);..ret
5eb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
5ec0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
5ed0: 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 * SSL Initiali
5ee0: 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 0a zation. */..
5ef0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 statePtr->ss
5f00: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 l = SSL_new(stat
5f10: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 ePtr->ctx);.
5f20: 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 if (!statePtr->s
5f30: 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 sl) {../* SSL li
5f40: 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 brary error */..
5f50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
5f60: 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e (interp, "couldn
5f70: 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 't construct ssl
5f80: 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 session: ", REA
5f90: 53 4f 4e 28 29 2c 0a 09 09 28 63 68 61 72 20 2a SON(),...(char *
5fa0: 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 ) NULL);..Tls_Fr
5fb0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
5fc0: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 ePtr);..return T
5fd0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
5fe0: 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c .#ifndef OPENSSL
5ff0: 5f 4e 4f 5f 54 4c 53 45 58 54 0a 20 20 20 20 69 _NO_TLSEXT. i
6000: 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b f (servername) {
6010: 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 53 53 . if (!SS
6020: 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 L_set_tlsext_hos
6030: 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d t_name(statePtr-
6040: 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 >ssl, servername
6050: 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a ) && require) {.
6060: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f Tcl_
6070: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
6080: 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c erp, "setting TL
6090: 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 S host name exte
60a0: 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 0a 20 nsion failed",.
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
60c0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 char *) NULL);.
60d0: 20 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 Tls_F
60e0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
60f0: 74 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 tePtr);.
6100: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
6110: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a RROR;. }.
6120: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 }.#endif..
6130: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 /*. * SSL
6140: 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a Callbacks. *
6150: 2f 0a 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 /.. SSL_set_a
6160: 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 pp_data(statePtr
6170: 2d 3e 73 73 6c 2c 20 28 56 4f 49 44 20 2a 29 73 ->ssl, (VOID *)s
6180: 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 tatePtr);./* poi
6190: 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f nt back to us */
61a0: 0a 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 .. SSL_set_ve
61b0: 72 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 rify(statePtr->s
61c0: 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 sl, verify, Veri
61d0: 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 fyCallback);..
61e0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 69 6e SSL_CTX_set_in
61f0: 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 fo_callback(stat
6200: 65 50 74 72 2d 3e 63 74 78 2c 20 49 6e 66 6f 43 ePtr->ctx, InfoC
6210: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f allback);.. /
6220: 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 * Create Tcl_Cha
6230: 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 nnel BIO Handler
6240: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
6250: 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 ->p_bio.= BIO_ne
6260: 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 w_tcl(statePtr,
6270: 42 49 4f 5f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 BIO_CLOSE);.
6280: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 statePtr->bio.=
6290: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 BIO_new(BIO_f_ss
62a0: 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 l());.. if (s
62b0: 65 72 76 65 72 29 20 7b 0a 09 73 74 61 74 65 50 erver) {..stateP
62c0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 tr->flags |= TLS
62d0: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 _TCL_SERVER;..SS
62e0: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 L_set_accept_sta
62f0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
6300: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
6310: 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 .SSL_set_connect
6320: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d _state(statePtr-
6330: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 >ssl);. }.
6340: 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 SSL_set_bio(sta
6350: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 tePtr->ssl, stat
6360: 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 ePtr->p_bio, sta
6370: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 tePtr->p_bio);.
6380: 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 BIO_set_ssl(s
6390: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 tatePtr->bio, st
63a0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f atePtr->ssl, BIO
63b0: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 _NOCLOSE);..
63c0: 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 /*. * End of
63d0: 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a SSL Init. *
63e0: 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 /. Tcl_SetRes
63f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 ult(interp, (cha
6400: 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e r *) Tcl_GetChan
6410: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
6420: 2d 3e 73 65 6c 66 29 2c 0a 09 20 20 20 20 54 43 ->self),.. TC
6430: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 L_VOLATILE);.
6440: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
6450: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
64a0: 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d * UnimportObjCm
64b0: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
64c0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
64d0: 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 oked to remove t
64e0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
64f0: 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a el filter.. *. *
6500: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
6510: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
6520: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
6530: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d ffects:. *.May m
6540: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 odify the behavi
6550: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e or of an IO chan
6560: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nel.. *. *------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
65b0: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e /..static int.Un
65c0: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 63 6c 69 importObjCmd(cli
65d0: 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c entData, interp,
65e0: 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 objc, objv).
65f0: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 ClientData clie
6600: 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 ntData;./* Not u
6610: 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f sed. */. Tcl_
6620: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a Interp *interp;.
6630: 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 int objc;.
6640: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 Tcl_Obj *CONST
6650: 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 objv[];.{. T
6660: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
6670: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c ../* The channel
6680: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
6690: 6e 2e 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6f n. */.. if (o
66a0: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
66b0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
66c0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
66d0: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
66e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
66f0: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
6700: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
6710: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
6720: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e ring(objv[1]), N
6730: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ULL);. if (ch
6740: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
6750: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
6760: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
6770: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 63 68 }.. if (ch
6780: 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e annelTypeVersion
6790: 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f == TLS_CHANNEL_
67a0: 56 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 2f 2a VERSION_2) {../*
67b0: 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 .. * Make sure t
67c0: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
67d0: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
67e0: 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 .. */..chan = Tc
67f0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
6800: 63 68 61 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 chan);. }..
6810: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
6820: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
6830: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
6840: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 e()) {..Tcl_Appe
6850: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
6860: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
6870: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
6880: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 lName(chan),..."
6890: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
68a0: 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 annel", NULL);..
68b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
68c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
68d0: 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e (Tcl_UnstackChan
68e0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e nel(interp, chan
68f0: 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 ) == TCL_ERROR)
6900: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
6910: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
6920: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
6930: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
6940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
6980: 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f * CTX_Init -- co
6990: 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 nstruct a SSL_CT
69a0: 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a X instance. *. *
69b0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 Results:. *.A v
69c0: 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 alid SSL_CTX ins
69d0: 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 tance or NULL..
69e0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
69f0: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 s:. *.constructs
6a00: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 SSL context (CT
6a10: 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d X). *. *--------
6a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
6a60: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 .static SSL_CTX
6a70: 2a 0a 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 *.CTX_Init(state
6a80: 50 74 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 2c Ptr, proto, key,
6a90: 20 63 65 72 74 2c 20 43 41 64 69 72 2c 20 43 41 cert, CAdir, CA
6aa0: 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 44 file, ciphers, D
6ab0: 48 70 61 72 61 6d 73 29 0a 20 20 20 20 53 74 61 Hparams). Sta
6ac0: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 te *statePtr;.
6ad0: 20 20 69 6e 74 20 70 72 6f 74 6f 3b 0a 20 20 20 int proto;.
6ae0: 20 63 68 61 72 20 2a 6b 65 79 3b 0a 20 20 20 20 char *key;.
6af0: 63 68 61 72 20 2a 63 65 72 74 3b 0a 20 20 20 20 char *cert;.
6b00: 63 68 61 72 20 2a 43 41 64 69 72 3b 0a 20 20 20 char *CAdir;.
6b10: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 3b 0a 20 char *CAfile;.
6b20: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 char *ciphers
6b30: 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 ;. char *DHpa
6b40: 72 61 6d 73 3b 0a 7b 0a 20 20 20 20 54 63 6c 5f rams;.{. Tcl_
6b50: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d Interp *interp =
6b60: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
6b70: 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a p;. SSL_CTX *
6b80: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
6b90: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a Tcl_DString ds;.
6ba0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
6bb0: 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 ds1;. int off
6bc0: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 = 0;. const
6bd0: 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 SSL_METHOD *meth
6be0: 6f 64 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 od;.. if (!pr
6bf0: 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 oto) {..Tcl_Appe
6c00: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
6c10: 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f "no valid proto
6c20: 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 4e col selected", N
6c30: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 ULL);..return (S
6c40: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 SL_CTX *)0;.
6c50: 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 }.. /* create
6c60: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
6c70: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 #if defined(NO_S
6c80: 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 SL2). if (ENA
6c90: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
6ca0: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 PROTO_SSL2)) {..
6cb0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
6cc0: 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 (interp, "protoc
6cd0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
6ce0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
6cf0: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
6d00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
6d10: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 defined(NO_SSL3
6d20: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
6d30: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
6d40: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c TO_SSL3)) {..Tcl
6d50: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
6d60: 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 terp, "protocol
6d70: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 not supported",
6d80: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 NULL);..return (
6d90: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 SSL_CTX *)0;.
6da0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
6db0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 0a 20 fined(NO_TLS1).
6dc0: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
6dd0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
6de0: 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 TLS1)) {..Tcl_Ap
6df0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
6e00: 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 p, "protocol not
6e10: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
6e20: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c L);..return (SSL
6e30: 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a _CTX *)0;. }.
6e40: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
6e50: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 ed(NO_TLS1_1).
6e60: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
6e70: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
6e80: 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 LS1_1)) {..Tcl_A
6e90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
6ea0: 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f rp, "protocol no
6eb0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
6ec0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 LL);..return (SS
6ed0: 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d L_CTX *)0;. }
6ee0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
6ef0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 ned(NO_TLS1_2).
6f00: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
6f10: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
6f20: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f TLS1_2)) {..Tcl_
6f30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
6f40: 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e erp, "protocol n
6f50: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
6f60: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 ULL);..return (S
6f70: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 SL_CTX *)0;.
6f80: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 }.#endif.. sw
6f90: 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 itch (proto) {.#
6fa0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 if !defined(NO_S
6fb0: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c SL2). case TL
6fc0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d S_PROTO_SSL2:..m
6fd0: 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 ethod = SSLv2_me
6fe0: 74 68 6f 64 20 28 29 3b 0a 09 62 72 65 61 6b 3b thod ();..break;
6ff0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
7000: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 ined(NO_SSL3).
7010: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f case TLS_PROTO
7020: 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d _SSL3:..method =
7030: 20 53 53 4c 76 33 5f 6d 65 74 68 6f 64 20 28 29 SSLv3_method ()
7040: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ;..break;.#endif
7050: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
7060: 5f 54 4c 53 31 29 0a 20 20 20 20 63 61 73 65 20 _TLS1). case
7070: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a TLS_PROTO_TLS1:.
7080: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f .method = TLSv1_
7090: 6d 65 74 68 6f 64 20 28 29 3b 0a 09 62 72 65 61 method ();..brea
70a0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
70b0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
70c0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 ). case TLS_P
70d0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 ROTO_TLS1_1:..me
70e0: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d thod = TLSv1_1_m
70f0: 65 74 68 6f 64 20 28 29 3b 0a 09 62 72 65 61 6b ethod ();..break
7100: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
7110: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
7120: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
7130: 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 OTO_TLS1_2:..met
7140: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 hod = TLSv1_2_me
7150: 74 68 6f 64 20 28 29 3b 0a 09 62 72 65 61 6b 3b thod ();..break;
7160: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 .#endif. defa
7170: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 6d 65 74 ult:. met
7180: 68 6f 64 20 3d 20 53 53 4c 76 32 33 5f 6d 65 74 hod = SSLv23_met
7190: 68 6f 64 20 28 29 3b 0a 23 69 66 20 21 64 65 66 hod ();.#if !def
71a0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 09 6f ined(NO_SSL2)..o
71b0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
71c0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
71d0: 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53 SSL2) ? 0 : SS
71e0: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a L_OP_NO_SSLv2);.
71f0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
7200: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 ned(NO_SSL3)..of
7210: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
7220: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 oto, TLS_PROTO_S
7230: 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c SL3) ? 0 : SSL
7240: 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 _OP_NO_SSLv3);.#
7250: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
7260: 65 64 28 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 ed(NO_TLS1)..off
7270: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
7280: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
7290: 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f S1) ? 0 : SSL_
72a0: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 OP_NO_TLSv1);.#e
72b0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
72c0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 d(NO_TLS1_1)..of
72d0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
72e0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
72f0: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c LS1_1) ? 0 : SSL
7300: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b _OP_NO_TLSv1_1);
7310: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
7320: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 0a ined(NO_TLS1_2).
7330: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 .off |= (ENABLED
7340: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
7350: 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 O_TLS1_2) ? 0 :
7360: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f SSL_OP_NO_TLSv1_
7370: 32 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 2);.#endif..brea
7380: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 k;. }. .
7390: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ctx = SSL_CTX_
73a0: 6e 65 77 20 28 6d 65 74 68 6f 64 29 3b 0a 20 20 new (method);.
73b0: 20 20 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 . SSL_CTX_s
73c0: 65 74 5f 61 70 70 5f 64 61 74 61 28 20 63 74 78 et_app_data( ctx
73d0: 2c 20 28 56 4f 49 44 2a 29 69 6e 74 65 72 70 29 , (VOID*)interp)
73e0: 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 ;./* remember th
73f0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f e interpreter */
7400: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
7410: 5f 6f 70 74 69 6f 6e 73 28 20 63 74 78 2c 20 53 _options( ctx, S
7420: 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 SL_OP_ALL);./* a
7430: 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 ll SSL bug worka
7440: 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 rounds */. SS
7450: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e L_CTX_set_option
7460: 73 28 20 63 74 78 2c 20 6f 66 66 29 3b 09 2f 2a s( ctx, off);./*
7470: 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 all SSL bug wor
7480: 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 karounds */.
7490: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 SSL_CTX_sess_set
74a0: 5f 63 61 63 68 65 5f 73 69 7a 65 28 20 63 74 78 _cache_size( ctx
74b0: 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 69 66 20 , 128);.. if
74c0: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c (ciphers != NULL
74d0: 29 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 )..SSL_CTX_set_c
74e0: 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 ipher_list(ctx,
74f0: 63 69 70 68 65 72 73 29 3b 0a 0a 20 20 20 20 2f ciphers);.. /
7500: 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 * set some callb
7510: 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f acks */. SSL_
7520: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
7530: 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 passwd_cb(ctx, P
7540: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 asswordCallback)
7550: 3b 0a 0a 23 69 66 6e 64 65 66 20 42 53 41 46 45 ;..#ifndef BSAFE
7560: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
7570: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f _default_passwd_
7580: 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c cb_userdata(ctx,
7590: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
75a0: 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 r);.#endif..
75b0: 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65 /* read a Diffie
75c0: 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 -Hellman paramet
75d0: 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 ers file, or use
75e0: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e the built-in on
75f0: 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e e */.#ifdef OPEN
7600: 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 SSL_NO_DH. if
7610: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
7620: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
7630: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a dResult(interp,.
7640: 09 20 20 20 20 22 44 48 20 70 61 72 61 6d 65 74 . "DH paramet
7650: 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 er support not a
7660: 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 vailable", (char
7670: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f *) NULL);..SSL_
7680: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
7690: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
76a0: 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 *)0;. }.#else
76b0: 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a . {..DH* dh;.
76c0: 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d .if (DHparams !=
76d0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 NULL) {.. BI
76e0: 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c O *bio;.. Tcl
76f0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
7700: 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 );.. bio = BI
7710: 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 O_new_file(F2N(D
7720: 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 Hparams, &ds), "
7730: 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 r");.. if (!b
7740: 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 io) {...Tcl_DStr
7750: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 ingFree(&ds);...
7760: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7770: 28 69 6e 74 65 72 70 2c 0a 09 09 20 20 20 20 22 (interp,... "
7780: 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 Could not find D
7790: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c H parameters fil
77a0: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c e", (char *) NUL
77b0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 L);...SSL_CTX_fr
77c0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 ee(ctx);...retur
77d0: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
77e0: 09 20 20 20 20 7d 0a 09 20 20 20 20 0a 09 20 20 . }.. ..
77f0: 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f dh = PEM_read_
7800: 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f bio_DHparams(bio
7810: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 , NULL, NULL, NU
7820: 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 LL);.. BIO_fr
7830: 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 ee(bio);.. Tc
7840: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
7850: 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 s);.. if (!dh
7860: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 ) {...Tcl_Append
7870: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09 Result(interp,..
7880: 09 20 20 20 20 22 43 6f 75 6c 64 20 6e 6f 74 20 . "Could not
7890: 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 read DH paramete
78a0: 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 rs from file", (
78b0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
78c0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
78d0: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 53 53 x);...return (SS
78e0: 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 L_CTX *)0;..
78f0: 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 }..} else {..
7900: 20 64 68 20 3d 20 67 65 74 5f 64 68 32 30 34 38 dh = get_dh2048
7910: 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f ();..}..SSL_CTX_
7920: 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 set_tmp_dh(ctx,
7930: 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 dh);..DH_free(dh
7940: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a );. }.#endif.
7950: 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 . /* set our
7960: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 certificate */.
7970: 20 20 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e if (cert != N
7980: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 53 74 72 ULL) {..Tcl_DStr
7990: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 ingInit(&ds);...
79a0: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f if (SSL_CTX_use_
79b0: 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 certificate_file
79c0: 28 63 74 78 2c 20 46 32 4e 28 20 63 65 72 74 2c (ctx, F2N( cert,
79d0: 20 26 64 73 29 2c 0a 09 09 09 09 09 53 53 4c 5f &ds),......SSL_
79e0: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d FILETYPE_PEM) <=
79f0: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 0) {.. Tcl_D
7a00: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
7a10: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
7a20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09 Result(interp,..
7a30: 09 09 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 .. "unable t
7a40: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 o set certificat
7a50: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 2c 20 e file ", cert,
7a60: 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 ": ",.... RE
7a70: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
7a80: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
7a90: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
7aa0: 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c . return (SSL
7ab0: 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 0a 09 2f _CTX *)0;..}.../
7ac0: 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 * get the privat
7ad0: 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 e key associated
7ae0: 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 with this certi
7af0: 66 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 6b ficate */..if (k
7b00: 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 6b 65 79 3d ey == NULL) key=
7b10: 63 65 72 74 3b 0a 0a 09 69 66 20 28 53 53 4c 5f cert;...if (SSL_
7b20: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b CTX_use_PrivateK
7b30: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e ey_file(ctx, F2N
7b40: 28 20 6b 65 79 2c 20 26 64 73 29 2c 0a 09 09 09 ( key, &ds),....
7b50: 09 09 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 ..SSL_FILETYPE_P
7b60: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 EM) <= 0) {..
7b70: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
7b80: 28 26 64 73 29 3b 0a 09 20 20 20 20 2f 2a 20 66 (&ds);.. /* f
7b90: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 lush the passphr
7ba0: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 ase which might
7bb0: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 be left in the r
7bc0: 65 73 75 6c 74 20 2a 2f 0a 09 20 20 20 20 54 63 esult */.. Tc
7bd0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
7be0: 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 rp, NULL, TCL_ST
7bf0: 41 54 49 43 29 3b 0a 09 20 20 20 20 54 63 6c 5f ATIC);.. Tcl_
7c00: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7c10: 65 72 70 2c 0a 09 09 09 20 20 20 20 20 22 75 6e erp,.... "un
7c20: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c able to set publ
7c30: 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b ic key file ", k
7c40: 65 79 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 ey, " ",....
7c50: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
7c60: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
7c70: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
7c80: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 );.. return (
7c90: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a SSL_CTX *)0;..}.
7ca0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
7cb0: 28 26 64 73 29 3b 0a 09 2f 2a 20 4e 6f 77 20 77 (&ds);../* Now w
7cc0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 e know that a ke
7cd0: 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 y and cert have
7ce0: 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 been set against
7cf0: 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e .. * the SSL con
7d00: 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 text */..if (!SS
7d10: 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 L_CTX_check_priv
7d20: 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a ate_key(ctx)) {.
7d30: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
7d40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09 09 esult(interp,...
7d50: 09 20 20 20 20 20 22 70 72 69 76 61 74 65 20 6b . "private k
7d60: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 ey does not matc
7d70: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 h the certificat
7d80: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 e public key",..
7d90: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 .. (char *)
7da0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f NULL);.. SSL_
7db0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
7dc0: 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f return (SSL_
7dd0: 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 CTX *)0;..}.
7de0: 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 20 3d } else {..cert =
7df0: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 (char*)X509_get
7e00: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 _default_cert_fi
7e10: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f le();...if (SSL_
7e20: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
7e30: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 ate_file(ctx, ce
7e40: 72 74 2c 0a 09 09 09 09 09 53 53 4c 5f 46 49 4c rt,......SSL_FIL
7e50: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 ETYPE_PEM) <= 0)
7e60: 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 {.#if 0.. Tc
7e70: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
7e80: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 s);.. Tcl_App
7e90: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7ea0: 2c 0a 09 09 09 20 20 20 20 20 22 75 6e 61 62 6c ,.... "unabl
7eb0: 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 e to use default
7ec0: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c certificate fil
7ed0: 65 20 22 2c 20 63 65 72 74 2c 20 22 3a 20 22 2c e ", cert, ": ",
7ee0: 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 .... REASON(
7ef0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
7f00: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
7f10: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 free(ctx);..
7f20: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
7f30: 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 *)0;.#endif..}.
7f40: 20 20 20 7d 0a 09 0a 20 20 20 20 54 63 6c 5f 44 }... Tcl_D
7f50: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b StringInit(&ds);
7f60: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
7f70: 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 Init(&ds1);.
7f80: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 if (!SSL_CTX_loa
7f90: 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f d_verify_locatio
7fa0: 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 ns(ctx, F2N(CAfi
7fb0: 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 le, &ds), F2N(CA
7fc0: 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 dir, &ds1)) ||..
7fd0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 !SSL_CTX_set_def
7fe0: 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 ault_verify_path
7ff0: 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a s(ctx)) {.#if 0.
8000: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
8010: 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 (&ds);..Tcl_DStr
8020: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 ingFree(&ds1);..
8030: 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 /* Don't current
8040: 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20 ly care if this
8050: 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 fails */..Tcl_Ap
8060: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8070: 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 p, "SSL default
8080: 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c verify paths: ",
8090: 0a 09 09 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 ...REASON(), (ch
80a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 ar *) NULL);..SS
80b0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
80c0: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
80d0: 58 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 20 20 X *)0;.#endif.
80e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 }.. /* http
80f0: 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e s://sourceforge.
8100: 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 net/p/tls/bugs/5
8110: 37 2f 20 2a 2f 0a 20 20 20 20 69 66 20 28 20 43 7/ */. if ( C
8120: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 20 29 20 Afile != NULL )
8130: 7b 0a 20 20 20 20 20 20 20 20 53 54 41 43 4b 5f {. STACK_
8140: 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 OF(X509_NAME) *c
8150: 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c ertNames = SSL_l
8160: 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 oad_client_CA_fi
8170: 6c 65 28 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 le( F2N(CAfile,
8180: 26 64 73 29 20 29 3b 0a 09 69 66 20 28 20 63 65 &ds) );..if ( ce
8190: 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 20 rtNames != NULL
81a0: 29 20 7b 20 0a 09 20 20 20 20 53 53 4c 5f 43 54 ) { .. SSL_CT
81b0: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f X_set_client_CA_
81c0: 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 list(ctx, certNa
81d0: 6d 65 73 20 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a mes );..}. }.
81e0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
81f0: 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 54 Free(&ds);. T
8200: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
8210: 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ds1);. return
8220: 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d ctx;.}.../*. *-
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8270: 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f --. *. * StatusO
8280: 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 bjCmd -- return
8290: 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 certificate for
82a0: 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a connected peer..
82b0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
82c0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
82d0: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
82e0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
82f0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
8300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8340: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 */.static int.St
8350: 61 74 75 73 4f 62 6a 43 6d 64 28 63 6c 69 65 6e atusObjCmd(clien
8360: 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f tData, interp, o
8370: 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43 bjc, objv). C
8380: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
8390: 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 Data;./* Not use
83a0: 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e d. */. Tcl_In
83b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 terp *interp;.
83c0: 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20 int objc;.
83d0: 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e 53 54 20 6f Tcl_Obj.*CONST o
83e0: 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 53 74 61 bjv[];.{. Sta
83f0: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 te *statePtr;.
8400: 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 X509 *peer;.
8410: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
8420: 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e r;. Tcl_Chann
8430: 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 el chan;. cha
8440: 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 r *channelName,
8450: 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e *ciphers;. in
8460: 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 73 77 69 t mode;.. swi
8470: 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 tch (objc) {..ca
8480: 73 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e se 2:.. chann
8490: 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 elName = Tcl_Get
84a0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 StringFromObj(ob
84b0: 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 jv[1], NULL);..
84c0: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 break;...case
84d0: 20 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 3:.. if (!st
84e0: 72 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 rcmp (Tcl_GetStr
84f0: 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 ing (objv[1]), "
8500: 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 -local")) {...ch
8510: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f annelName = Tcl_
8520: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
8530: 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b (objv[2], NULL);
8540: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d ...break;.. }
8550: 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 .. /* else fa
8560: 6c 6c 2e 2e 2e 20 2a 2f 0a 09 64 65 66 61 75 6c ll... */..defaul
8570: 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e t:.. Tcl_Wron
8580: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
8590: 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 1, objv, "?-loc
85a0: 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 al? channel");..
85b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
85c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
85d0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
85e0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 hannel(interp, c
85f0: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 hannelName, &mod
8600: 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e e);. if (chan
8610: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
8620: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
8630: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
8640: 20 7d 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e }. if (chann
8650: 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d elTypeVersion ==
8660: 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 TLS_CHANNEL_VER
8670: 53 49 4f 4e 5f 32 29 20 7b 0a 09 2f 2a 0a 09 20 SION_2) {../*..
8680: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
8690: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
86a0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 pmost channel..
86b0: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 */..chan = Tcl_G
86c0: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 etTopChannel(cha
86d0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 n);. }. if
86e0: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
86f0: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c Type(chan) != Tl
8700: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 s_ChannelType())
8710: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
8720: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 sult(interp, "ba
8730: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 d channel \"", T
8740: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
8750: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 e(chan),..."\":
8760: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 not a TLS channe
8770: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 l", NULL);..retu
8780: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
8790: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 }. statePtr
87a0: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c = (State *) Tcl
87b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
87c0: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 nceData(chan);.
87d0: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
87e0: 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f ) {..peer = SSL_
87f0: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 get_peer_certifi
8800: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 cate(statePtr->s
8810: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 sl);. } else
8820: 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 {..peer = SSL_ge
8830: 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 t_certificate(st
8840: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
8850: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 65 65 72 }. if (peer
8860: 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c ) {..objPtr = Tl
8870: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 s_NewX509Obj(int
8880: 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 erp, peer);..if
8890: 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 20 58 35 (objc == 2) { X5
88a0: 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 20 7d 09_free(peer); }
88b0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f . } else {..o
88c0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
88d0: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
88e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
88f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
8900: 6d 65 6e 74 20 28 69 6e 74 65 72 70 2c 20 6f 62 ment (interp, ob
8910: 6a 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e jPtr,.. Tcl_N
8920: 65 77 53 74 72 69 6e 67 4f 62 6a 20 28 22 73 62 ewStringObj ("sb
8930: 69 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 its", -1));.
8940: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
8950: 64 45 6c 65 6d 65 6e 74 20 28 69 6e 74 65 72 70 dElement (interp
8960: 2c 20 6f 62 6a 50 74 72 2c 0a 09 20 20 20 20 54 , objPtr,.. T
8970: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 20 28 53 53 cl_NewIntObj (SS
8980: 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 L_get_cipher_bit
8990: 73 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c s (statePtr->ssl
89a0: 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 , NULL)));..
89b0: 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a ciphers = (char*
89c0: 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 )SSL_get_cipher(
89d0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
89e0: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 if (ciphers
89f0: 21 3d 20 4e 55 4c 4c 20 26 26 20 73 74 72 63 6d != NULL && strcm
8a00: 70 28 63 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e p(ciphers, "(NON
8a10: 45 29 22 29 21 3d 30 29 20 7b 0a 09 54 63 6c 5f E)")!=0) {..Tcl_
8a20: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
8a30: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
8a40: 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 Ptr,...Tcl_NewSt
8a50: 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22 ringObj("cipher"
8a60: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
8a70: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
8a80: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
8a90: 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e ,...Tcl_NewStrin
8aa0: 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 gObj(SSL_get_cip
8ab0: 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 her(statePtr->ss
8ac0: 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a l), -1));. }.
8ad0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
8ae0: 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 sult( interp, ob
8af0: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 jPtr);. retur
8b00: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
8b10: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
8b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b50: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 ------. *. * Ver
8b60: 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 sionObjCmd -- re
8b70: 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 turn version str
8b80: 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c ing from OpenSSL
8b90: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
8ba0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
8bb0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
8bc0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
8bd0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
8be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c20: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
8c30: 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 63 6c VersionObjCmd(cl
8c40: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 ientData, interp
8c50: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 , objc, objv).
8c60: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ClientData cli
8c70: 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 entData;./* Not
8c80: 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c used. */. Tcl
8c90: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b _Interp *interp;
8ca0: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 . int objc;.
8cb0: 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e 53 Tcl_Obj.*CONS
8cc0: 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 T objv[];.{.
8cd0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
8ce0: 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
8cf0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8d00: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
8d10: 54 45 58 54 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 TEXT, -1);..
8d20: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
8d30: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 (interp, objPtr)
8d40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
8d50: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
8d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8da0: 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 -. *. * MiscObjC
8db0: 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 md -- misc comma
8dc0: 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 nds. *. * Result
8dd0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
8de0: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
8df0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
8e00: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e50: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
8e60: 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 63 6c 69 t.MiscObjCmd(cli
8e70: 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c entData, interp,
8e80: 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 objc, objv).
8e90: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 ClientData clie
8ea0: 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 ntData;./* Not u
8eb0: 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f sed. */. Tcl_
8ec0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a Interp *interp;.
8ed0: 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 int objc;.
8ee0: 20 20 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e 53 54 Tcl_Obj.*CONST
8ef0: 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 73 objv[];.{. s
8f00: 74 61 74 69 63 20 43 4f 4e 53 54 38 34 20 63 68 tatic CONST84 ch
8f10: 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 ar *commands []
8f20: 3d 20 7b 20 22 72 65 71 22 2c 20 4e 55 4c 4c 20 = { "req", NULL
8f30: 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d };. enum comm
8f40: 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 44 and { C_REQ, C_D
8f50: 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 UMMY };. int
8f60: 63 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 cmd;.. if (ob
8f70: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc < 2) {..Tcl_W
8f80: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
8f90: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 rp, 1, objv, "su
8fa0: 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 bcommand ?args?"
8fb0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
8fc0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
8fd0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
8fe0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
8ff0: 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 objv[1], command
9000: 73 2c 0a 09 20 20 20 20 22 63 6f 6d 6d 61 6e 64 s,.. "command
9010: 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 ", 0,&cmd) != TC
9020: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
9030: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
9040: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 .. switch ((e
9050: 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 num command) cmd
9060: 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a ) {..case C_REQ:
9070: 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 {.. EVP_PKEY
9080: 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 *pkey=NULL;..
9090: 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c X509 *cert=NUL
90a0: 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d L;.. X509_NAM
90b0: 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 E *name=NULL;..
90c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 Tcl_Obj **lis
90d0: 74 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 tv;.. int lis
90e0: 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 tc,i;... BIO
90f0: 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 *out=NULL;...
9100: 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b char *k_C="",*k
9110: 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a _ST="",*k_L="",*
9120: 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c k_O="",*k_OU="",
9130: 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 *k_CN="",*k_Emai
9140: 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 l="";.. char
9150: 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c *keyout,*pemout,
9160: 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b *str;.. int k
9170: 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c eysize,serial=0,
9180: 64 61 79 73 3d 33 36 35 3b 0a 09 20 20 20 20 0a days=365;.. .
9190: 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 . if ((objc<5
91a0: 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b ) || (objc>6)) {
91b0: 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 ...Tcl_WrongNumA
91c0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f rgs(interp, 2, o
91d0: 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 bjv, "keysize ke
91e0: 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f yfile certfile ?
91f0: 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 info?");...retur
9200: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
9210: 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 }... if (Tc
9220: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
9230: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c interp, objv[2],
9240: 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 &keysize) != TC
9250: 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e L_OK) {...return
9260: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
9270: 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 }.. keyout=T
9280: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
9290: 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f v[3]);.. pemo
92a0: 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ut=Tcl_GetString
92b0: 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 09 20 20 20 (objv[4]);...
92c0: 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a if (objc>=6) {.
92d0: 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 ..if (Tcl_ListOb
92e0: 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 jGetElements(int
92f0: 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 erp, objv[5],...
9300: 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 .&listc, &listv)
9310: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 != TCL_OK) {...
9320: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
9330: 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 RROR;...}....if
9340: 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 ((listc%2) != 0)
9350: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 {... Tcl_Set
9360: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 Result(interp,"I
9370: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 nformation list
9380: 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e must have even n
9390: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e umber of argumen
93a0: 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 ts",NULL);...
93b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
93c0: 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d R;...}...for (i=
93d0: 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 0; i<listc; i+=2
93e0: 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 ) {... str=Tc
93f0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
9400: 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 v[i]);... if
9410: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 (strcmp(str,"day
9420: 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 s")==0) {....if
9430: 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
9440: 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b bj(interp,listv[
9450: 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c i+1],&days)!=TCL
9460: 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 _OK).... retu
9470: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
9480: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
9490: 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 trcmp(str,"seria
94a0: 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 l")==0) {....if
94b0: 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f (Tcl_GetIntFromO
94c0: 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b bj(interp,listv[
94d0: 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 i+1],&serial)!=T
94e0: 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 CL_OK).... re
94f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9500: 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
9510: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 (strcmp(str,"ser
9520: 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 ial")==0) {....i
9530: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
9540: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 mObj(interp,list
9550: 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 v[i+1],&serial)!
9560: 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 =TCL_OK)....
9570: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9580: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
9590: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
95a0: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d ")==0) {....k_C=
95b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
95c0: 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
95d0: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
95e0: 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 mp(str,"ST")==0)
95f0: 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 {....k_ST=Tcl_G
9600: 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
9610: 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c +1]);... } el
9620: 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
9630: 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 r,"L")==0) {....
9640: 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e k_L=Tcl_GetStrin
9650: 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
9660: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
9670: 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d strcmp(str,"O")=
9680: 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c =0) {....k_O=Tcl
9690: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
96a0: 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
96b0: 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
96c0: 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a str,"OU")==0) {.
96d0: 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 ...k_OU=Tcl_GetS
96e0: 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
96f0: 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
9700: 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
9710: 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f CN")==0) {....k_
9720: 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 CN=Tcl_GetString
9730: 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
9740: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
9750: 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c trcmp(str,"Email
9760: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d ")==0) {....k_Em
9770: 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e ail=Tcl_GetStrin
9780: 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
9790: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
97a0: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
97b0: 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 nterp,"Unknown p
97c0: 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b arameter",NULL);
97d0: 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ....return TCL_E
97e0: 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 RROR;... }...
97f0: 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 }.. }.. if
9800: 20 28 28 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b ((pkey = EVP_PK
9810: 45 59 5f 6e 65 77 28 29 29 20 21 3d 20 4e 55 4c EY_new()) != NUL
9820: 4c 29 20 7b 0a 09 09 69 66 20 28 21 45 56 50 5f L) {...if (!EVP_
9830: 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 PKEY_assign_RSA(
9840: 70 6b 65 79 2c 0a 09 09 09 52 53 41 5f 67 65 6e pkey,....RSA_gen
9850: 65 72 61 74 65 5f 6b 65 79 28 6b 65 79 73 69 7a erate_key(keysiz
9860: 65 2c 20 30 78 31 30 30 30 31 2c 20 4e 55 4c 4c e, 0x10001, NULL
9870: 2c 20 4e 55 4c 4c 29 29 29 20 7b 0a 09 09 20 20 , NULL))) {...
9880: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
9890: 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 interp,"Error ge
98a0: 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 nerating private
98b0: 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 key",NULL);...
98c0: 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 EVP_PKEY_free
98d0: 28 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 72 65 (pkey);... re
98e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
98f0: 09 09 7d 0a 09 09 6f 75 74 3d 42 49 4f 5f 6e 65 ..}...out=BIO_ne
9900: 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b w(BIO_s_file());
9910: 0a 09 09 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c ...BIO_write_fil
9920: 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 ename(out,keyout
9930: 29 3b 0a 09 09 50 45 4d 5f 77 72 69 74 65 5f 62 );...PEM_write_b
9940: 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 io_PrivateKey(ou
9950: 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c t,pkey,NULL,NULL
9960: 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 ,0,NULL,NULL);..
9970: 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 .BIO_free_all(ou
9980: 74 29 3b 0a 0a 09 09 69 66 20 28 28 63 65 72 74 t);....if ((cert
9990: 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 =X509_new())==NU
99a0: 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f LL) {... Tcl_
99b0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
99c0: 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 ,"Error generati
99d0: 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 ng certificate r
99e0: 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 equest",NULL);..
99f0: 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 . EVP_PKEY_fr
9a00: 65 65 28 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 ee(pkey);...
9a10: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 return(TCL_ERROR
9a20: 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 );...}....X509_s
9a30: 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c et_version(cert,
9a40: 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 2);...ASN1_INTEG
9a50: 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f ER_set(X509_get_
9a60: 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 serialNumber(cer
9a70: 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 t),serial);...X5
9a80: 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 09_gmtime_adj(X5
9a90: 30 39 5f 67 65 74 5f 6e 6f 74 42 65 66 6f 72 65 09_get_notBefore
9aa0: 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 (cert),0);...X50
9ab0: 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 9_gmtime_adj(X50
9ac0: 39 5f 67 65 74 5f 6e 6f 74 41 66 74 65 72 28 63 9_get_notAfter(c
9ad0: 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 ert),(long)60*60
9ae0: 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 *24*days);...X50
9af0: 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 9_set_pubkey(cer
9b00: 74 2c 70 6b 65 79 29 3b 0a 09 09 0a 09 09 6e 61 t,pkey);......na
9b10: 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a me=X509_get_subj
9b20: 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a ect_name(cert);.
9b30: 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
9b40: 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
9b50: 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 me,"C", MBSTRING
9b60: 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 _ASC, (unsigned
9b70: 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c char *) k_C, -1,
9b80: 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
9b90: 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
9ba0: 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c y_txt(name,"ST",
9bb0: 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
9bc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
9bd0: 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 k_ST, -1, -1, 0
9be0: 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
9bf0: 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
9c00: 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 name,"L", MBSTRI
9c10: 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 NG_ASC, (unsigne
9c20: 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d d char *) k_L, -
9c30: 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
9c40: 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
9c50: 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 _by_txt(name,"O"
9c60: 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
9c70: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
9c80: 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 ) k_O, -1, -1, 0
9c90: 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
9ca0: 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
9cb0: 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 name,"OU", MBSTR
9cc0: 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e ING_ASC, (unsign
9cd0: 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c ed char *) k_OU,
9ce0: 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
9cf0: 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
9d00: 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
9d10: 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 CN", MBSTRING_AS
9d20: 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 C, (unsigned cha
9d30: 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d r *) k_CN, -1, -
9d40: 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
9d50: 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
9d60: 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 txt(name,"Email"
9d70: 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
9d80: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
9d90: 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d ) k_Email, -1, -
9da0: 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 1, 0);....X509_s
9db0: 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 et_subject_name(
9dc0: 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 cert,name);....i
9dd0: 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 f (!X509_sign(ce
9de0: 72 74 2c 70 6b 65 79 2c 45 56 50 5f 6d 64 35 28 rt,pkey,EVP_md5(
9df0: 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 ))) {... X509
9e00: 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 _free(cert);...
9e10: 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 EVP_PKEY_free
9e20: 28 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 54 63 (pkey);... Tc
9e30: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
9e40: 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e rp,"Error signin
9e50: 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e g certificate",N
9e60: 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 ULL);... retu
9e70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
9e80: 7d 0a 0a 09 09 6f 75 74 3d 42 49 4f 5f 6e 65 77 }....out=BIO_new
9e90: 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
9ea0: 09 09 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 ..BIO_write_file
9eb0: 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 name(out,pemout)
9ec0: 3b 0a 0a 09 09 50 45 4d 5f 77 72 69 74 65 5f 62 ;....PEM_write_b
9ed0: 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
9ee0: 29 3b 0a 09 09 42 49 4f 5f 66 72 65 65 5f 61 6c );...BIO_free_al
9ef0: 6c 28 6f 75 74 29 3b 0a 0a 09 09 58 35 30 39 5f l(out);....X509_
9f00: 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 free(cert);...EV
9f10: 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
9f20: 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b );.. } else {
9f30: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
9f40: 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 (interp,"Error g
9f50: 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 enerating privat
9f60: 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 e key",NULL);...
9f70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9f80: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 ;.. }..}..bre
9f90: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
9fa0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 ..break;. }.
9fb0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
9fc0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
9fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
a010: 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d *. * Tls_Free --
a020: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
a030: 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
a040: 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
a050: 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
a060: 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
a070: 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
a080: 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
a090: 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 1. *. * Results
a0a0: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.none. *. *
a0b0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
a0c0: 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 .Frees all the s
a0d0: 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d tate. *. *------
a0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
a120: 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 /.void.Tls_Free(
a130: 20 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 20 char *blockPtr
a140: 29 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ).{. State *s
a150: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
a160: 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 *)blockPtr;..
a170: 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 Tls_Clean(stat
a180: 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 ePtr);. ckfre
a190: 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c e(blockPtr);.}..
a1a0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
a1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
a1f0: 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a Tls_Clean --. *.
a200: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
a210: 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
a220: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
a230: 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
a240: 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
a250: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
a260: 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 falls below 1.
a270: 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 This should. *.
a280: 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 be called synchr
a290: 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 onously by the C
a2a0: 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e loseProc, not in
a2b0: 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c the. *.Eventual
a2c0: 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e lyFree callback.
a2d0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
a2e0: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
a2f0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
a300: 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
a310: 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
a320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
a360: 76 6f 69 64 0a 54 6c 73 5f 43 6c 65 61 6e 28 53 void.Tls_Clean(S
a370: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 0a tate *statePtr).
a380: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 {. /*. *
a390: 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 we're assuming h
a3a0: 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73 ere that we're s
a3b0: 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 ingle-threaded.
a3c0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 */.. if (
a3d0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
a3e0: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b != (Tcl_TimerTok
a3f0: 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c en) NULL) {..Tcl
a400: 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 _DeleteTimerHand
a410: 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 ler(statePtr->ti
a420: 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d mer);..statePtr-
a430: 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 >timer = NULL;.
a440: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 }.. if (st
a450: 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 atePtr->bio) {..
a460: 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c /* This will cal
a470: 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 l SSL_shutdown.
a480: 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 Bug 1414045 */..
a490: 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 dprintf("BIO_fre
a4a0: 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 e_all(%p)", stat
a4b0: 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f ePtr->bio);..BIO
a4c0: 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 _free_all(stateP
a4d0: 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 tr->bio);..state
a4e0: 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b Ptr->bio = NULL;
a4f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
a500: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a tatePtr->ssl) {.
a510: 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 .dprintf("SSL_fr
a520: 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 ee(%p)", statePt
a530: 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 r->ssl);..SSL_fr
a540: 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ee(statePtr->ssl
a550: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 );..statePtr->ss
a560: 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a l = NULL;. }.
a570: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
a580: 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 ->ctx) {..SSL_CT
a590: 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d X_free(statePtr-
a5a0: 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 >ctx);..statePtr
a5b0: 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->ctx = NULL;.
a5c0: 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
a5d0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 ePtr->callback)
a5e0: 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f {..Tcl_DecrRefCo
a5f0: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 unt(statePtr->ca
a600: 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 llback);..stateP
a610: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e tr->callback = N
a620: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
a630: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 f (statePtr->pas
a640: 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 sword) {..Tcl_De
a650: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
a660: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a Ptr->password);.
a670: 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 .statePtr->passw
a680: 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ord = NULL;.
a690: 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d }.}.../*. *-----
a6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
a6e0: 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d *. * Tls_Init --
a6f0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 . *. *.This is a
a700: 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c package initial
a710: 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 ization procedur
a720: 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c e, which is call
a730: 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 ed. *.by Tcl whe
a740: 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 n this package i
a750: 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f s to be added to
a760: 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e an interpreter.
a770: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 . *. * Results:
a780: 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 Ssl configured
a790: 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a and loaded. *. *
a7a0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
a7b0: 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 *. create the ss
a7c0: 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 l command, initi
a7d0: 61 6c 69 73 65 20 73 73 6c 20 63 6f 6e 74 65 78 alise ssl contex
a7e0: 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d t. *. *---------
a7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
a830: 69 6e 74 0a 54 6c 73 5f 49 6e 69 74 28 54 63 6c int.Tls_Init(Tcl
a840: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 _Interp *interp)
a850: 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 ../* Interpreter
a860: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 70 61 in which the pa
a870: 63 6b 61 67 65 20 69 73 0a 09 09 09 09 09 20 2a ckage is...... *
a880: 20 74 6f 20 62 65 20 6d 61 64 65 20 61 76 61 69 to be made avai
a890: 6c 61 62 6c 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 lable. */.{.
a8a0: 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 const char tlsTc
a8b0: 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 lInitScript[] =
a8c0: 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e {.#include "tls.
a8d0: 74 63 6c 2e 68 22 0a 20 20 20 20 7d 3b 0a 0a 20 tcl.h". };..
a8e0: 20 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20 6d 69 int major, mi
a8f0: 6e 6f 72 2c 20 70 61 74 63 68 6c 65 76 65 6c 2c nor, patchlevel,
a900: 20 72 65 6c 65 61 73 65 3b 0a 0a 20 20 20 20 2f release;.. /
a910: 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 6f 72 69 *. * The ori
a920: 67 69 6e 61 6c 20 38 2e 32 2e 30 20 73 74 61 63 ginal 8.2.0 stac
a930: 6b 65 64 20 63 68 61 6e 6e 65 6c 20 69 6d 70 6c ked channel impl
a940: 65 6d 65 6e 74 61 74 69 6f 6e 20 28 61 6e 64 20 ementation (and
a950: 74 68 65 20 70 61 74 63 68 0a 20 20 20 20 20 2a the patch. *
a960: 20 74 68 61 74 20 70 72 65 63 65 64 65 64 20 69 that preceded i
a970: 74 29 20 68 61 64 20 70 72 6f 62 6c 65 6d 73 20 t) had problems
a980: 77 69 74 68 20 73 63 61 6c 61 62 69 6c 69 74 79 with scalability
a990: 20 61 6e 64 20 72 6f 62 75 73 74 6e 65 73 73 2e and robustness.
a9a0: 0a 20 20 20 20 20 2a 20 54 68 65 73 65 20 77 65 . * These we
a9b0: 72 65 20 61 64 64 72 65 73 73 20 69 6e 20 38 2e re address in 8.
a9c0: 33 2e 32 20 2f 20 38 2e 34 61 32 2c 20 73 6f 20 3.2 / 8.4a2, so
a9d0: 77 65 20 6e 6f 77 20 72 65 71 75 69 72 65 20 74 we now require t
a9e0: 68 61 74 20 61 73 20 61 0a 20 20 20 20 20 2a 20 hat as a. *
a9f0: 6d 69 6e 69 6d 75 6d 20 66 6f 72 20 54 4c 53 20 minimum for TLS
aa00: 31 2e 34 2b 2e 20 20 57 65 20 6f 6e 6c 79 20 73 1.4+. We only s
aa10: 75 70 70 6f 72 74 20 38 2e 32 2b 20 6e 6f 77 20 upport 8.2+ now
aa20: 28 38 2e 33 2e 32 2b 20 70 72 65 66 65 72 72 65 (8.3.2+ preferre
aa30: 64 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 d).. */.
aa40: 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f if (.#ifdef USE_
aa50: 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f 49 TCL_STUBS..Tcl_I
aa60: 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c nitStubs(interp,
aa70: 20 22 38 2e 32 22 2c 20 30 29 0a 23 65 6c 73 65 "8.2", 0).#else
aa80: 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 ..Tcl_PkgRequire
aa90: 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 (interp, "Tcl",
aaa0: 22 38 2e 32 22 2c 20 30 29 0a 23 65 6e 64 69 66 "8.2", 0).#endif
aab0: 0a 09 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 ..== NULL) {..re
aac0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
aad0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
aae0: 20 20 20 2a 20 47 65 74 20 74 68 65 20 76 65 72 * Get the ver
aaf0: 73 69 6f 6e 20 73 6f 20 77 65 20 63 61 6e 20 72 sion so we can r
ab00: 75 6e 74 69 6d 65 20 73 77 69 74 63 68 20 6f 6e untime switch on
ab10: 20 61 76 61 69 6c 61 62 6c 65 20 66 75 6e 63 74 available funct
ab20: 69 6f 6e 61 6c 69 74 79 2e 0a 20 20 20 20 20 2a ionality.. *
ab30: 20 54 4c 53 20 73 68 6f 75 6c 64 20 72 65 61 6c TLS should real
ab40: 6c 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 ly only be used
ab50: 69 6e 20 38 2e 33 2e 32 2b 2c 20 62 75 74 20 74 in 8.3.2+, but t
ab60: 68 65 20 6f 74 68 65 72 20 77 6f 72 6b 73 20 66 he other works f
ab70: 6f 72 0a 20 20 20 20 20 2a 20 73 6f 6d 65 20 6c or. * some l
ab80: 69 6d 69 74 65 64 20 66 75 6e 63 74 69 6f 6e 61 imited functiona
ab90: 6c 69 74 79 2c 20 73 6f 20 61 6e 20 61 74 74 65 lity, so an atte
aba0: 6d 70 74 20 61 74 20 73 75 70 70 6f 72 74 20 69 mpt at support i
abb0: 73 20 6d 61 64 65 2e 0a 20 20 20 20 20 2a 2f 0a s made.. */.
abc0: 20 20 20 20 54 63 6c 5f 47 65 74 56 65 72 73 69 Tcl_GetVersi
abd0: 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f on(&major, &mino
abe0: 72 2c 20 26 70 61 74 63 68 6c 65 76 65 6c 2c 20 r, &patchlevel,
abf0: 26 72 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 69 &release);. i
ac00: 66 20 28 28 6d 61 6a 6f 72 20 3e 20 38 29 20 7c f ((major > 8) |
ac10: 7c 20 28 28 6d 61 6a 6f 72 20 3d 3d 20 38 29 20 | ((major == 8)
ac20: 26 26 20 28 28 6d 69 6e 6f 72 20 3e 20 33 29 20 && ((minor > 3)
ac30: 7c 7c 20 28 28 6d 69 6e 6f 72 20 3d 3d 20 33 29 || ((minor == 3)
ac40: 20 26 26 0a 09 20 20 20 20 28 72 65 6c 65 61 73 &&.. (releas
ac50: 65 20 3d 3d 20 54 43 4c 5f 46 49 4e 41 4c 5f 52 e == TCL_FINAL_R
ac60: 45 4c 45 41 53 45 29 20 26 26 20 28 70 61 74 63 ELEASE) && (patc
ac70: 68 6c 65 76 65 6c 20 3e 3d 20 32 29 29 29 29 29 hlevel >= 2)))))
ac80: 20 7b 0a 09 2f 2a 20 38 2e 33 2e 32 2b 20 2a 2f {../* 8.3.2+ */
ac90: 0a 09 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 ..channelTypeVer
aca0: 73 69 6f 6e 20 3d 20 54 4c 53 5f 43 48 41 4e 4e sion = TLS_CHANN
acb0: 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 3b 0a 20 20 EL_VERSION_2;.
acc0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 38 } else {../* 8
acd0: 2e 32 2e 30 20 2d 20 38 2e 33 2e 31 20 2a 2f 0a .2.0 - 8.3.1 */.
ace0: 09 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 .channelTypeVers
acf0: 69 6f 6e 20 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 ion = TLS_CHANNE
ad00: 4c 5f 56 45 52 53 49 4f 4e 5f 31 3b 0a 20 20 20 L_VERSION_1;.
ad10: 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c }.. if (TlsL
ad20: 69 62 49 6e 69 74 28 29 20 21 3d 20 54 43 4c 5f ibInit() != TCL_
ad30: 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e OK) {..Tcl_Appen
ad40: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
ad50: 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 "could not initi
ad60: 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 alize SSL librar
ad70: 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 y", NULL);..retu
ad80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
ad90: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 }.. Tcl_Cre
ada0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
adb0: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 terp, "tls::ciph
adc0: 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a ers", CiphersObj
add0: 43 6d 64 2c 0a 09 20 20 20 20 28 43 6c 69 65 6e Cmd,.. (Clien
ade0: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
adf0: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
ae00: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
ae10: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
ae20: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 (interp, "tls::h
ae30: 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 andshake", Hands
ae40: 68 61 6b 65 4f 62 6a 43 6d 64 2c 0a 09 20 20 20 hakeObjCmd,..
ae50: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
ae60: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
ae70: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 roc *) NULL);..
ae80: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
ae90: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
aea0: 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 "tls::import", I
aeb0: 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 0a 09 20 20 mportObjCmd,..
aec0: 20 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 (ClientData) 0
aed0: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
aee0: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a Proc *) NULL);..
aef0: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
af00: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
af10: 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 "tls::unimport"
af20: 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 , UnimportObjCmd
af30: 2c 0a 09 20 20 20 20 28 43 6c 69 65 6e 74 44 61 ,.. (ClientDa
af40: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
af50: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
af60: 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 L);.. Tcl_Cre
af70: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
af80: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 terp, "tls::stat
af90: 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d us", StatusObjCm
afa0: 64 2c 0a 09 20 20 20 20 28 43 6c 69 65 6e 74 44 d,.. (ClientD
afb0: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
afc0: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
afd0: 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 LL);.. Tcl_Cr
afe0: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
aff0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 nterp, "tls::ver
b000: 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 sion", VersionOb
b010: 6a 43 6d 64 2c 0a 09 20 20 20 20 28 43 6c 69 65 jCmd,.. (Clie
b020: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
b030: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
b040: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c NULL);.. Tcl
b050: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
b060: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
b070: 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d misc", MiscObjCm
b080: 64 2c 0a 09 20 20 20 20 28 43 6c 69 65 6e 74 44 d,.. (ClientD
b090: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
b0a0: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
b0b0: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e LL);.. if (in
b0c0: 74 65 72 70 29 20 7b 0a 20 20 20 20 20 20 20 20 terp) {.
b0d0: 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c Tcl_Eval(interp,
b0e0: 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 tlsTclInitScrip
b0f0: 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 t);. }.. r
b100: 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f eturn Tcl_PkgPro
b110: 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c vide(interp, "tl
b120: 73 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 s", PACKAGE_VERS
b130: 49 4f 4e 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d ION);.}.../*. *-
b140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b170: 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 -----*. *. *.Tls
b180: 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a _SafeInit --. *.
b190: 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.-------------
b1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b1c0: 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 ---*. *.Standard
b1d0: 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 procedure requi
b1e0: 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 20 0a red by 'load'. .
b1f0: 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 *.Initializes t
b200: 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f his extension fo
b210: 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 r a safe interpr
b220: 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d eter.. *.-------
b230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a ---------*. *. *
b260: 09 53 69 64 65 65 66 66 65 63 74 73 3a 0a 20 2a .Sideeffects:. *
b270: 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 ..As of 'Tls_Ini
b280: 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a t'. *. *.Result:
b290: 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 . *..A standard
b2a0: 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a Tcl error code..
b2b0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
b2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f -----------*. */
b2f0: 0a 0a 69 6e 74 0a 54 6c 73 5f 53 61 66 65 49 6e ..int.Tls_SafeIn
b300: 69 74 20 28 54 63 6c 5f 49 6e 74 65 72 70 2a 20 it (Tcl_Interp*
b310: 69 6e 74 65 72 70 29 0a 7b 0a 20 20 20 20 72 65 interp).{. re
b320: 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74 20 28 69 turn Tls_Init (i
b330: 6e 74 65 72 70 29 3b 0a 7d 0a 0a 0c 0a 2f 2a 0a nterp);.}..../*.
b340: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
b350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b370: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
b380: 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a TlsLibInit --. *
b390: 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *.------------
b3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b3c0: 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c ----*. *.Initial
b3d0: 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 izes SSL library
b3e0: 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 once per applic
b3f0: 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d ation. *.-------
b400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a ---------*. *. *
b430: 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 .Side effects:.
b440: 2a 09 09 69 6e 69 74 69 6c 69 7a 65 73 20 53 53 *..initilizes SS
b450: 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 L library. *. *.
b460: 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 Result:. *..none
b470: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
b480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
b4b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 /.static int Tls
b4c0: 4c 69 62 49 6e 69 74 20 28 76 6f 69 64 29 20 7b LibInit (void) {
b4d0: 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 . static int
b4e0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b initialized = 0;
b4f0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 . int i;.
b500: 63 68 61 72 20 72 6e 64 5f 73 65 65 64 5b 31 36 char rnd_seed[16
b510: 5d 20 3d 20 22 47 72 7a 53 6c 70 6c 4b 71 55 64 ] = "GrzSlplKqUd
b520: 6e 6e 7a 50 21 22 3b 09 2f 2a 20 31 36 20 62 79 nnzP!";./* 16 by
b530: 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 tes */. int s
b540: 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a tatus = TCL_OK;.
b550: 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c . if (initial
b560: 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 ized) {.
b570: 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a return(status);.
b580: 20 20 20 20 7d 0a 20 20 20 20 69 6e 69 74 69 61 }. initia
b590: 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 lized = 1;..#if
b5a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
b5b0: 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
b5c0: 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
b5d0: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f . size_t num_
b5e0: 6c 6f 63 6b 73 3b 0a 0a 20 20 20 20 54 63 6c 5f locks;.. Tcl_
b5f0: 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f MutexLock(&init_
b600: 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 mx);.#endif..#if
b610: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
b620: 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
b630: 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
b640: 29 0a 20 20 20 20 2f 2a 20 73 68 6f 75 6c 64 20 ). /* should
b650: 77 65 20 63 6f 6e 73 69 64 65 72 20 61 6c 6c 6f we consider allo
b660: 63 61 74 69 6e 67 20 6d 75 74 65 78 65 73 3f 20 cating mutexes?
b670: 2a 2f 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 */. num_locks
b680: 20 3d 20 43 52 59 50 54 4f 5f 6e 75 6d 5f 6c 6f = CRYPTO_num_lo
b690: 63 6b 73 28 29 3b 0a 20 20 20 20 69 66 20 28 6e cks();. if (n
b6a0: 75 6d 5f 6c 6f 63 6b 73 20 3e 20 43 52 59 50 54 um_locks > CRYPT
b6b0: 4f 5f 4e 55 4d 5f 4c 4f 43 4b 53 29 20 7b 0a 09 O_NUM_LOCKS) {..
b6c0: 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 45 52 52 status = TCL_ERR
b6d0: 4f 52 3b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a OR;..goto done;.
b6e0: 20 20 20 20 7d 0a 0a 20 20 20 20 43 52 59 50 54 }.. CRYPT
b6f0: 4f 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f 63 61 O_set_locking_ca
b700: 6c 6c 62 61 63 6b 28 43 72 79 70 74 6f 54 68 72 llback(CryptoThr
b710: 65 61 64 4c 6f 63 6b 43 61 6c 6c 62 61 63 6b 29 eadLockCallback)
b720: 3b 0a 20 20 20 20 43 52 59 50 54 4f 5f 73 65 74 ;. CRYPTO_set
b730: 5f 69 64 5f 63 61 6c 6c 62 61 63 6b 28 43 72 79 _id_callback(Cry
b740: 70 74 6f 54 68 72 65 61 64 49 64 43 61 6c 6c 62 ptoThreadIdCallb
b750: 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 ack);.#endif..
b760: 20 20 69 66 20 28 53 53 4c 5f 6c 69 62 72 61 72 if (SSL_librar
b770: 79 5f 69 6e 69 74 28 29 20 21 3d 20 31 29 20 7b y_init() != 1) {
b780: 0a 20 20 20 20 09 73 74 61 74 75 73 20 3d 20 54 . .status = T
b790: 43 4c 5f 45 52 52 4f 52 3b 0a 09 67 6f 74 6f 20 CL_ERROR;..goto
b7a0: 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 done;. }.
b7b0: 53 53 4c 5f 6c 6f 61 64 5f 65 72 72 6f 72 5f 73 SSL_load_error_s
b7c0: 74 72 69 6e 67 73 28 29 3b 0a 20 20 20 20 45 52 trings();. ER
b7d0: 52 5f 6c 6f 61 64 5f 63 72 79 70 74 6f 5f 73 74 R_load_crypto_st
b7e0: 72 69 6e 67 73 28 29 3b 0a 0a 20 20 20 20 2f 2a rings();.. /*
b7f0: 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 . * Seed the
b800: 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 random number g
b810: 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 enerator in the
b820: 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 SSL library,.
b830: 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f * using the do
b840: 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 /while construct
b850: 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 because of the
b860: 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a bug note in the.
b870: 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 * OpenSSL F
b880: 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 AQ at http://www
b890: 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 .openssl.org/sup
b8a0: 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 port/faq.html#US
b8b0: 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 ER1. *.
b8c0: 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 * The crux of th
b8d0: 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 e problem is tha
b8e0: 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 t Solaris 7 does
b8f0: 20 6e 6f 74 20 68 61 76 65 20 61 20 0a 20 20 20 not have a .
b900: 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 * /dev/random
b910: 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 or /dev/urandom
b920: 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e device so it can
b930: 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 not gather enoug
b940: 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 h. * entropy
b950: 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 from the RAND_s
b960: 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 eed() when TLS i
b970: 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 nitializes and r
b980: 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f efuses. * to
b990: 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 go further. Ear
b9a0: 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 lier versions of
b9b0: 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 OpenSSL carried
b9c0: 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a on regardless..
b9d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e */. sran
b9e0: 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 d((unsigned int)
b9f0: 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 time((time_t *)
ba00: 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 NULL));. do
ba10: 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 {..for (i = 0; i
ba20: 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 < 16; i++) {..
ba30: 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d rnd_seed[i] =
ba40: 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 1 + (char) (255
ba50: 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e .0 * rand()/(RAN
ba60: 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a D_MAX+1.0));..}.
ba70: 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 .RAND_seed(rnd_s
ba80: 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f eed, sizeof(rnd_
ba90: 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 seed));. } wh
baa0: 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 ile (RAND_status
bab0: 28 29 20 21 3d 20 31 29 3b 0a 64 6f 6e 65 3a 0a () != 1);.done:.
bac0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
bad0: 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
bae0: 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
baf0: 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 EADS). Tcl_Mu
bb00: 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f texUnlock(&init_
bb10: 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 mx);.#endif..
bb20: 20 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a return status;.
bb30: 7d 0a }.