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 33 20 53 right (C) 2003 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a tarfish Systems.
00d0: 20 2a 0a 20 2a 20 24 48 65 61 64 65 72 3a 20 2f *. * $Header: /
00e0: 68 6f 6d 65 2f 72 6b 65 65 6e 65 2f 74 6d 70 2f home/rkeene/tmp/
00f0: 63 76 73 32 66 6f 73 73 69 6c 2f 2e 2e 2f 74 63 cvs2fossil/../tc
0100: 6c 74 6c 73 2f 74 6c 73 2f 74 6c 73 2f 74 6c 73 ltls/tls/tls/tls
0110: 2e 63 2c 76 20 31 2e 31 35 20 32 30 30 33 2f 30 .c,v 1.15 2003/0
0120: 35 2f 31 35 20 32 30 3a 34 34 3a 34 36 20 72 61 5/15 20:44:46 ra
0130: 7a 7a 65 6c 6c 20 45 78 70 20 24 0a 20 2a 0a 20 zzell Exp $. *.
0140: 2a 20 54 4c 53 20 28 61 6b 61 20 53 53 4c 29 20 * TLS (aka SSL)
0150: 43 68 61 6e 6e 65 6c 20 2d 20 63 61 6e 20 62 65 Channel - can be
0160: 20 6c 61 79 65 72 65 64 20 6f 6e 20 61 6e 79 20 layered on any
0170: 62 69 2d 64 69 72 65 63 74 69 6f 6e 61 6c 0a 20 bi-directional.
0180: 2a 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 28 4e * Tcl_Channel (N
0190: 6f 74 65 3a 20 52 65 71 75 69 72 65 73 20 54 72 ote: Requires Tr
01a0: 66 20 43 6f 72 65 20 50 61 74 63 68 29 0a 20 2a f Core Patch). *
01b0: 0a 20 2a 20 54 68 69 73 20 77 61 73 20 62 75 69 . * This was bui
01c0: 6c 74 20 28 61 6c 6d 6f 73 74 29 20 66 72 6f 6d lt (almost) from
01d0: 20 73 63 72 61 74 63 68 20 62 61 73 65 64 20 75 scratch based u
01e0: 70 6f 6e 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 pon observation
01f0: 6f 66 0a 20 2a 20 4f 70 65 6e 53 53 4c 20 30 2e of. * OpenSSL 0.
0200: 39 2e 32 42 0a 20 2a 0a 20 2a 20 41 64 64 69 74 9.2B. *. * Addit
0210: 69 6f 6e 20 63 72 65 64 69 74 20 69 73 20 64 75 ion credit is du
0220: 65 20 66 6f 72 20 41 6e 64 72 65 61 73 20 4b 75 e for Andreas Ku
0230: 70 72 69 65 73 20 28 61 2e 6b 75 70 72 69 65 73 pries (a.kupries
0240: 40 77 65 73 74 65 6e 64 2e 63 6f 6d 29 2c 20 66 @westend.com), f
0250: 6f 72 0a 20 2a 20 70 72 6f 76 69 64 69 6e 67 20 or. * providing
0260: 74 68 65 20 54 63 6c 5f 52 65 70 6c 61 63 65 43 the Tcl_ReplaceC
0270: 68 61 6e 6e 65 6c 20 6d 65 63 68 61 6e 69 73 6d hannel mechanism
0280: 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 63 6c 6f and working clo
0290: 73 65 6c 79 20 77 69 74 68 20 6d 65 0a 20 2a 20 sely with me. *
02a0: 74 6f 20 65 6e 68 61 6e 63 65 20 69 74 20 74 6f to enhance it to
02b0: 20 73 75 70 70 6f 72 74 20 66 75 6c 6c 20 66 69 support full fi
02c0: 6c 65 65 76 65 6e 74 20 73 65 6d 61 6e 74 69 63 leevent semantic
02d0: 73 2e 0a 20 2a 0a 20 2a 20 41 6c 73 6f 20 77 6f s.. *. * Also wo
02e0: 72 6b 20 64 6f 6e 65 20 62 79 20 74 68 65 20 66 rk done by the f
02f0: 6f 6c 6c 6f 77 20 70 65 6f 70 6c 65 20 70 72 6f ollow people pro
0300: 76 69 64 65 64 20 74 68 65 20 69 6d 70 65 74 75 vided the impetu
0310: 73 20 74 6f 20 64 6f 20 74 68 69 73 20 22 72 69 s to do this "ri
0320: 67 68 74 22 3a 0a 20 2a 09 74 63 6c 53 53 4c 20 ght":. *.tclSSL
0330: 28 43 6f 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 6b (Colin McCormack
0340: 2c 20 53 68 61 72 65 64 20 54 65 63 68 6e 6f 6c , Shared Technol
0350: 6f 67 79 29 0a 20 2a 09 53 53 4c 74 63 6c 20 28 ogy). *.SSLtcl (
0360: 50 65 74 65 72 20 41 6e 74 6d 61 6e 29 0a 20 2a Peter Antman). *
0370: 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 . */..#include "
0380: 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 tlsInt.h".#inclu
0390: 64 65 20 22 74 63 6c 4f 70 74 73 2e 68 22 0a 23 de "tclOpts.h".#
03a0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e include <stdlib.
03b0: 68 3e 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72 6e h>../*. * Extern
03c0: 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a 2f al functions. */
03d0: 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 ../*. * Forward
03e0: 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f declarations. */
03f0: 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 20 6b ..#define F2N( k
0400: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b ey, dsp) \..(((k
0410: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 ey) == NULL) ? (
0420: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c char *) NULL : \
0430: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 ...Tcl_Translate
0440: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c FileName(interp,
0450: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a (key), (dsp))).
0460: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29 #define REASON()
0470: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f .ERR_reason_erro
0480: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74 r_string(ERR_get
0490: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69 _error())..stati
04a0: 63 20 69 6e 74 09 43 69 70 68 65 72 73 4f 62 6a c int.CiphersObj
04b0: 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 Cmd _ANSI_ARGS_
04c0: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ((ClientData cli
04d0: 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f entData,....Tcl_
04e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
04f0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
0500: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 j *CONST objv[])
0510: 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 48 );..static int.H
0520: 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 5f andshakeObjCmd _
0530: 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 ANSI_ARGS_ ((Cli
0540: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
0550: 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 ta,....Tcl_Inter
0560: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
0570: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f bjc, Tcl_Obj *CO
0580: 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 NST objv[]));..s
0590: 74 61 74 69 63 20 69 6e 74 09 49 6d 70 6f 72 74 tatic int.Import
05a0: 4f 62 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 ObjCmd _ANSI_ARG
05b0: 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 S_ ((ClientData
05c0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 clientData,....T
05d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
05e0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
05f0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 _Obj *CONST objv
0600: 5b 5d 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e []));..static in
0610: 74 09 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 5f t.StatusObjCmd _
0620: 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 ANSI_ARGS_ ((Cli
0630: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
0640: 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 ta,....Tcl_Inter
0650: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
0660: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f bjc, Tcl_Obj *CO
0670: 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 NST objv[]));..s
0680: 74 61 74 69 63 20 69 6e 74 09 56 65 72 73 69 6f tatic int.Versio
0690: 6e 4f 62 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 nObjCmd _ANSI_AR
06a0: 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 GS_ ((ClientData
06b0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 clientData,....
06c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
06d0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
06e0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a l_Obj *CONST obj
06f0: 76 5b 5d 29 29 3b 0a 0a 73 74 61 74 69 63 20 53 v[]));..static S
0700: 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69 74 SL_CTX *CTX_Init
0710: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 53 74 _ANSI_ARGS_((St
0720: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 ate *statePtr, i
0730: 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a nt proto, char *
0740: 6b 65 79 2c 0a 09 09 09 63 68 61 72 20 2a 63 65 key,....char *ce
0750: 72 74 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c rt, char *CAdir,
0760: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 char *CAfile, c
0770: 68 61 72 20 2a 63 69 70 68 65 72 73 29 29 3b 0a har *ciphers));.
0780: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
0790: 54 4f 5f 53 53 4c 32 09 30 78 30 31 0a 23 64 65 TO_SSL2.0x01.#de
07a0: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 fine TLS_PROTO_S
07b0: 53 4c 33 09 30 78 30 32 0a 23 64 65 66 69 6e 65 SL3.0x02.#define
07c0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 TLS_PROTO_TLS1.
07d0: 30 78 30 34 0a 23 64 65 66 69 6e 65 20 45 4e 41 0x04.#define ENA
07e0: 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 73 6b 29 BLED(flag, mask)
07f0: 09 28 28 28 66 6c 61 67 29 20 26 20 28 6d 61 73 .(((flag) & (mas
0800: 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a k)) == (mask))..
0810: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74 /*. * Static dat
0820: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f a structures. */
0830: 0a 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 44 48 0a ..#ifndef NO_DH.
0840: 2f 2a 20 66 72 6f 6d 20 6f 70 65 6e 73 73 6c 2f /* from openssl/
0850: 61 70 70 73 2f 73 5f 73 65 72 76 65 72 2e 63 20 apps/s_server.c
0860: 2a 2f 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 */..static unsig
0870: 6e 65 64 20 63 68 61 72 20 64 68 35 31 32 5f 70 ned char dh512_p
0880: 5b 5d 3d 7b 0a 20 20 20 20 20 20 20 20 30 78 44 []={. 0xD
0890: 41 2c 30 78 35 38 2c 30 78 33 43 2c 30 78 31 36 A,0x58,0x3C,0x16
08a0: 2c 30 78 44 39 2c 30 78 38 35 2c 30 78 32 32 2c ,0xD9,0x85,0x22,
08b0: 30 78 38 39 2c 30 78 44 30 2c 30 78 45 34 2c 30 0x89,0xD0,0xE4,0
08c0: 78 41 46 2c 30 78 37 35 2c 0a 20 20 20 20 20 20 xAF,0x75,.
08d0: 20 20 30 78 36 46 2c 30 78 34 43 2c 30 78 43 41 0x6F,0x4C,0xCA
08e0: 2c 30 78 39 32 2c 30 78 44 44 2c 30 78 34 42 2c ,0x92,0xDD,0x4B,
08f0: 30 78 45 35 2c 30 78 33 33 2c 30 78 42 38 2c 30 0xE5,0x33,0xB8,0
0900: 78 30 34 2c 30 78 46 42 2c 30 78 30 46 2c 0a 20 x04,0xFB,0x0F,.
0910: 20 20 20 20 20 20 20 30 78 45 44 2c 30 78 39 34 0xED,0x94
0920: 2c 30 78 45 46 2c 30 78 39 43 2c 30 78 38 41 2c ,0xEF,0x9C,0x8A,
0930: 30 78 34 34 2c 30 78 30 33 2c 30 78 45 44 2c 30 0x44,0x03,0xED,0
0940: 78 35 37 2c 30 78 34 36 2c 30 78 35 30 2c 30 78 x57,0x46,0x50,0x
0950: 44 33 2c 0a 20 20 20 20 20 20 20 20 30 78 36 39 D3,. 0x69
0960: 2c 30 78 39 39 2c 30 78 44 42 2c 30 78 32 39 2c ,0x99,0xDB,0x29,
0970: 30 78 44 37 2c 30 78 37 36 2c 30 78 32 37 2c 30 0xD7,0x76,0x27,0
0980: 78 36 42 2c 30 78 41 32 2c 30 78 44 33 2c 30 78 x6B,0xA2,0xD3,0x
0990: 44 34 2c 30 78 31 32 2c 0a 20 20 20 20 20 20 20 D4,0x12,.
09a0: 20 30 78 45 32 2c 30 78 31 38 2c 30 78 46 34 2c 0xE2,0x18,0xF4,
09b0: 30 78 44 44 2c 30 78 31 45 2c 30 78 30 38 2c 30 0xDD,0x1E,0x08,0
09c0: 78 34 43 2c 30 78 46 36 2c 30 78 44 38 2c 30 78 x4C,0xF6,0xD8,0x
09d0: 30 30 2c 30 78 33 45 2c 30 78 37 43 2c 0a 20 20 00,0x3E,0x7C,.
09e0: 20 20 20 20 20 20 30 78 34 37 2c 30 78 37 34 2c 0x47,0x74,
09f0: 30 78 45 38 2c 30 78 33 33 2c 0a 20 20 20 20 20 0xE8,0x33,.
0a00: 20 20 20 7d 3b 0a 73 74 61 74 69 63 20 75 6e 73 };.static uns
0a10: 69 67 6e 65 64 20 63 68 61 72 20 64 68 35 31 32 igned char dh512
0a20: 5f 67 5b 5d 3d 7b 0a 09 30 78 30 32 2c 0a 7d 3b _g[]={..0x02,.};
0a30: 0a 0a 73 74 61 74 69 63 20 44 48 20 2a 67 65 74 ..static DH *get
0a40: 5f 64 68 35 31 32 28 29 0a 7b 0a 20 20 20 20 44 _dh512().{. D
0a50: 48 20 2a 64 68 3d 4e 55 4c 4c 3b 0a 0a 20 20 20 H *dh=NULL;..
0a60: 20 69 66 20 28 28 64 68 3d 44 48 5f 6e 65 77 28 if ((dh=DH_new(
0a70: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 72 65 74 75 )) == NULL) retu
0a80: 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 64 rn(NULL);.. d
0a90: 68 2d 3e 70 3d 42 4e 5f 62 69 6e 32 62 6e 28 64 h->p=BN_bin2bn(d
0aa0: 68 35 31 32 5f 70 2c 73 69 7a 65 6f 66 28 64 68 h512_p,sizeof(dh
0ab0: 35 31 32 5f 70 29 2c 4e 55 4c 4c 29 3b 0a 20 20 512_p),NULL);.
0ac0: 20 20 64 68 2d 3e 67 3d 42 4e 5f 62 69 6e 32 62 dh->g=BN_bin2b
0ad0: 6e 28 64 68 35 31 32 5f 67 2c 73 69 7a 65 6f 66 n(dh512_g,sizeof
0ae0: 28 64 68 35 31 32 5f 67 29 2c 4e 55 4c 4c 29 3b (dh512_g),NULL);
0af0: 0a 0a 20 20 20 20 69 66 20 28 28 64 68 2d 3e 70 .. if ((dh->p
0b00: 20 3d 3d 20 4e 55 4c 4c 29 20 7c 7c 20 28 64 68 == NULL) || (dh
0b10: 2d 3e 67 20 3d 3d 20 4e 55 4c 4c 29 29 0a 09 72 ->g == NULL))..r
0b20: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 eturn(NULL);.
0b30: 20 72 65 74 75 72 6e 28 64 68 29 3b 0a 7d 0a 23 return(dh);.}.#
0b40: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 44 65 66 endif../*. * Def
0b50: 69 6e 65 64 20 69 6e 20 54 6c 73 5f 49 6e 69 74 ined in Tls_Init
0b60: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 to determine wh
0b70: 61 74 20 6b 69 6e 64 20 6f 66 20 63 68 61 6e 6e at kind of chann
0b80: 65 6c 73 20 77 65 20 61 72 65 20 75 73 69 6e 67 els we are using
0b90: 0a 20 2a 20 28 6f 6c 64 2d 73 74 79 6c 65 20 38 . * (old-style 8
0ba0: 2e 32 2e 30 2d 38 2e 33 2e 31 20 6f 72 20 6e 65 .2.0-8.3.1 or ne
0bb0: 77 2d 73 74 79 6c 65 20 38 2e 33 2e 32 2b 29 2e w-style 8.3.2+).
0bc0: 0a 20 2a 2f 0a 69 6e 74 20 63 68 61 6e 6e 65 6c . */.int channel
0bd0: 54 79 70 65 56 65 72 73 69 6f 6e 3b 0a 0a 2f 2a TypeVersion;../*
0be0: 0a 20 2a 20 57 65 20 6c 6f 73 65 20 74 68 65 20 . * We lose the
0bf0: 74 63 6c 20 70 61 73 73 77 6f 72 64 20 63 61 6c tcl password cal
0c00: 6c 62 61 63 6b 20 77 68 65 6e 20 77 65 20 75 73 lback when we us
0c10: 65 20 74 68 65 20 52 53 41 20 42 53 41 46 45 20 e the RSA BSAFE
0c20: 53 53 4c 2d 43 20 31 2e 31 2e 32 0a 20 2a 20 6c SSL-C 1.1.2. * l
0c30: 69 62 72 61 72 69 65 73 20 69 6e 73 74 65 61 64 ibraries instead
0c40: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 of the current
0c50: 4f 70 65 6e 53 53 4c 20 6c 69 62 72 61 72 69 65 OpenSSL librarie
0c60: 73 2e 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 42 s.. */..#ifdef B
0c70: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 50 52 45 SAFE.#define PRE
0c80: 5f 4f 50 45 4e 53 53 4c 5f 30 5f 39 5f 34 20 31 _OPENSSL_0_9_4 1
0c90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 50 .#endif../*. * P
0ca0: 65 72 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 34 er OpenSSL 0.9.4
0cb0: 20 43 6f 6d 70 61 74 0a 20 2a 2f 0a 0a 23 69 66 Compat. */..#if
0cc0: 6e 64 65 66 20 53 54 41 43 4b 5f 4f 46 0a 23 64 ndef STACK_OF.#d
0cd0: 65 66 69 6e 65 20 53 54 41 43 4b 5f 4f 46 28 78 efine STACK_OF(x
0ce0: 29 09 09 09 53 54 41 43 4b 0a 23 64 65 66 69 6e )...STACK.#defin
0cf0: 65 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f e sk_SSL_CIPHER_
0d00: 6e 75 6d 28 73 6b 29 09 09 73 6b 5f 6e 75 6d 28 num(sk)..sk_num(
0d10: 28 73 6b 29 29 0a 23 64 65 66 69 6e 65 20 73 6b (sk)).#define sk
0d20: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 _SSL_CIPHER_valu
0d30: 65 28 20 73 6b 2c 20 69 6e 64 65 78 29 09 28 53 e( sk, index).(S
0d40: 53 4c 5f 43 49 50 48 45 52 2a 29 73 6b 5f 76 61 SL_CIPHER*)sk_va
0d50: 6c 75 65 28 28 73 6b 29 2c 20 28 69 6e 64 65 78 lue((sk), (index
0d60: 29 29 0a 23 65 6e 64 69 66 0a 0a 0c 0a 2f 2a 0a )).#endif..../*.
0d70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0db0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f -----. *. * Info
0dc0: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 Callback --. *.
0dd0: 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 *.monitors SSL c
0de0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 onnection proces
0df0: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
0e00: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
0e10: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
0e20: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
0e30: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 2d 2d if defined). *--
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e80: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 -. */.static voi
0e90: 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 53 d.InfoCallback(S
0ea0: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 SL *ssl, int whe
0eb0: 72 65 2c 20 69 6e 74 20 72 65 74 29 0a 7b 0a 20 re, int ret).{.
0ec0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
0ed0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
0ee0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73 _get_app_data(ss
0ef0: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 l);. Tcl_Obj
0f00: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 *cmdPtr;. cha
0f10: 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 20 2a r *major; char *
0f20: 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 69 66 20 28 minor;.. if (
0f30: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
0f40: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
0f50: 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a NULL)..return;..
0f60: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
0f70: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
0f80: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
0f90: 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 );..#if 0. if
0fa0: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
0fb0: 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65 76 20 3d _ALERT) {..sev =
0fc0: 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f SSL_alert_type_
0fd0: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 string_long(ret)
0fe0: 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 28 20 73 ;..if (strcmp( s
0ff0: 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d 30 29 ev, "fatal")==0)
1000: 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 72 72 {./* Map to err
1010: 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 5f 45 or */.. Tls_E
1020: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 53 rror(statePtr, S
1030: 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 30 29 SL_ERROR(ssl, 0)
1040: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 3b 0a );.. return;.
1050: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a .}. }.#endif.
1060: 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 if (where &
1070: 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 SSL_CB_HANDSHAKE
1080: 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 _START) {..major
1090: 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a = "handshake";.
10a0: 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 .minor = "start"
10b0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
10c0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
10d0: 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 HANDSHAKE_DONE)
10e0: 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 {..major = "hand
10f0: 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d shake";..minor =
1100: 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 "done";. } e
1110: 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65 lse {..if (where
1120: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 & SSL_CB_ALERT)
1130: 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 ..major = "alert
1140: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 ";..else if (whe
1150: 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e re & SSL_ST_CONN
1160: 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f ECT).major = "co
1170: 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 nnect";..else if
1180: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 (where & SSL_ST
1190: 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 _ACCEPT)..major
11a0: 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 = "accept";..els
11b0: 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 e.....major = "u
11c0: 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 nknown";...if (w
11d0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 here & SSL_CB_RE
11e0: 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 AD)..minor = "re
11f0: 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 ad";..else if (w
1200: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 here & SSL_CB_WR
1210: 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 ITE)..minor = "w
1220: 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 rite";..else if
1230: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1240: 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 LOOP)..minor = "
1250: 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 loop";..else if
1260: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1270: 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 EXIT)..minor = "
1280: 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 exit";..else....
1290: 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 .minor = "unknow
12a0: 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 n";. }.. T
12b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
12c0: 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 Element( statePt
12d0: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 r->interp, cmdPt
12e0: 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 r, .. Tcl_New
12f0: 53 74 72 69 6e 67 4f 62 6a 28 20 22 69 6e 66 6f StringObj( "info
1300: 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 ", -1));.. Tc
1310: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1320: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 lement( statePtr
1330: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
1340: 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 , .. Tcl_NewS
1350: 74 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 tringObj( Tcl_Ge
1360: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
1370: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
1380: 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 ) );.. Tcl_Li
1390: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
13a0: 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e nt( statePtr->in
13b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
13c0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
13d0: 4f 62 6a 28 20 6d 61 6a 6f 72 2c 20 2d 31 29 20 Obj( major, -1)
13e0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
13f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1400: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ( statePtr->inte
1410: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
1420: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1430: 6a 28 20 6d 69 6e 6f 72 2c 20 2d 31 29 20 29 3b j( minor, -1) );
1440: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 .. if (where
1450: 26 20 28 53 53 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 & (SSL_CB_LOOP|S
1460: 53 4c 5f 43 42 5f 45 58 49 54 29 29 20 7b 0a 09 SL_CB_EXIT)) {..
1470: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1480: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 dElement( stateP
1490: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
14a0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
14b0: 53 74 72 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 73 StringObj( SSL_s
14c0: 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 tate_string_long
14d0: 28 73 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20 (ssl), -1) );.
14e0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 } else if (whe
14f0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
1500: 54 29 20 7b 0a 09 63 68 61 72 20 2a 63 70 20 3d T) {..char *cp =
1510: 20 28 63 68 61 72 20 2a 29 20 53 53 4c 5f 61 6c (char *) SSL_al
1520: 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f ert_desc_string_
1530: 6c 6f 6e 67 28 72 65 74 29 3b 0a 0a 09 54 63 6c long(ret);...Tcl
1540: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1550: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d ement( statePtr-
1560: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c >interp, cmdPtr,
1570: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
1580: 69 6e 67 4f 62 6a 28 20 63 70 2c 20 2d 31 29 20 ingObj( cp, -1)
1590: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
15a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
15b0: 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 ndElement( state
15c0: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 Ptr->interp, cmd
15d0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
15e0: 77 53 74 72 69 6e 67 4f 62 6a 28 20 53 53 4c 5f wStringObj( SSL_
15f0: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e state_string_lon
1600: 67 28 73 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 g(ssl), -1) );.
1610: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 50 72 65 }. Tcl_Pre
1620: 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 serve( (ClientDa
1630: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e ta) statePtr->in
1640: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
1650: 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 reserve( (Client
1660: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
1670: 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
1680: 66 43 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b fCount( cmdPtr);
1690: 0a 20 20 20 20 28 76 6f 69 64 29 20 54 63 6c 5f . (void) Tcl_
16a0: 47 6c 6f 62 61 6c 45 76 61 6c 4f 62 6a 28 73 74 GlobalEvalObj(st
16b0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
16c0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c cmdPtr);. Tcl
16d0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 20 63 _DecrRefCount( c
16e0: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c mdPtr);.. Tcl
16f0: 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e _Release( (Clien
1700: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
1710: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
1720: 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 e( (ClientData)
1730: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1740: 29 3b 0a 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d );..}.../*. *---
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1790: 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c . *. * VerifyCal
17a0: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 6d lback --. *. *.m
17b0: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 69 onitors SSL ceri
17c0: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f ficate validatio
17d0: 6e 20 70 72 6f 63 65 73 73 0a 20 2a 09 54 68 69 n process. *.Thi
17e0: 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e s is called when
17f0: 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63 61 ever a certifica
1800: 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 0a te is inspected.
1810: 20 2a 09 20 6f 72 20 64 65 63 69 64 65 64 20 69 *. or decided i
1820: 6e 76 61 6c 69 64 0a 20 2a 0a 20 2a 20 52 65 73 nvalid. *. * Res
1830: 75 6c 74 73 3a 0a 20 2a 09 6f 6b 20 2d 20 6c 65 ults:. *.ok - le
1840: 74 20 53 53 4c 20 68 61 6e 64 6c 65 20 69 74 0a t SSL handle it.
1850: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
1860: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 ts:. *.The err f
1870: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 ield of the curr
1880: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 ently operative
1890: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 State is set. *.
18a0: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 to a string de
18b0: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c scribing the SSL
18c0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 negotiation fai
18d0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d lure reason. *--
18e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1920: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
1930: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 .VerifyCallback(
1940: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f int ok, X509_STO
1950: 52 45 5f 43 54 58 20 2a 63 74 78 29 0a 7b 0a 20 RE_CTX *ctx).{.
1960: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
1970: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 65 72 tr;. char *er
1980: 72 53 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 rStr;. SSL
1990: 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 *ssl..= (SSL*)X5
19a0: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
19b0: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 29 3b 0a _app_data(ctx);.
19c0: 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 X509 *cert.
19d0: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 .= X509_STORE_CT
19e0: 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 X_get_current_ce
19f0: 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 rt(ctx);. Sta
1a00: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 te *statePtr.= (
1a10: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 State*)SSL_get_a
1a20: 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 pp_data(ssl);.
1a30: 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 int depth..= X
1a40: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 509_STORE_CTX_ge
1a50: 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 t_error_depth(ct
1a60: 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 x);. int err.
1a70: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 .= X509_STORE_CT
1a80: 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 X_get_error(ctx)
1a90: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 ;.. dprintf(s
1aa0: 74 64 65 72 72 2c 20 22 56 65 72 69 66 79 3a 20 tderr, "Verify:
1ab0: 25 64 5c 6e 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 %d\n", ok);..
1ac0: 20 69 66 20 28 21 6f 6b 29 20 7b 0a 09 65 72 72 if (!ok) {..err
1ad0: 53 74 72 20 3d 20 28 63 68 61 72 2a 29 58 35 30 Str = (char*)X50
1ae0: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 9_verify_cert_er
1af0: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 3b ror_string(err);
1b00: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 65 . } else {..e
1b10: 72 72 53 74 72 20 3d 20 28 63 68 61 72 20 2a 29 rrStr = (char *)
1b20: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 0;. }.. if
1b30: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
1b40: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
1b50: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73 *)NULL) {..if (s
1b60: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 tatePtr->vflags
1b70: 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 & SSL_VERIFY_FAI
1b80: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 L_IF_NO_PEER_CER
1b90: 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e T) {.. return
1ba0: 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 ok;..} else {..
1bb0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d return 1;..}
1bc0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 74 . }. cmdPt
1bd0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
1be0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
1bf0: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 allback);.. T
1c00: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1c10: 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 Element( statePt
1c20: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 r->interp, cmdPt
1c30: 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 r, .. Tcl_New
1c40: 53 74 72 69 6e 67 4f 62 6a 28 20 22 76 65 72 69 StringObj( "veri
1c50: 66 79 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 fy", -1));..
1c60: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1c70: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 dElement( stateP
1c80: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
1c90: 74 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 tr, .. Tcl_Ne
1ca0: 77 53 74 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f wStringObj( Tcl_
1cb0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
1cc0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
1cd0: 2d 31 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1) );.. Tcl_
1ce0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1cf0: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e ment( statePtr->
1d00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
1d10: 09 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f . Tcl_NewIntO
1d20: 62 6a 28 20 64 65 70 74 68 29 20 29 3b 0a 0a 20 bj( depth) );..
1d30: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
1d40: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 pendElement( sta
1d50: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 tePtr->interp, c
1d60: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 6c 73 5f mdPtr,.. Tls_
1d70: 4e 65 77 58 35 30 39 4f 62 6a 28 20 73 74 61 74 NewX509Obj( stat
1d80: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 65 ePtr->interp, ce
1d90: 72 74 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f rt) );.. Tcl_
1da0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1db0: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e ment( statePtr->
1dc0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
1dd0: 09 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f . Tcl_NewIntO
1de0: 62 6a 28 20 6f 6b 29 20 29 3b 0a 0a 20 20 20 20 bj( ok) );..
1df0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1e00: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 dElement( stateP
1e10: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
1e20: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
1e30: 53 74 72 69 6e 67 4f 62 6a 28 20 65 72 72 53 74 StringObj( errSt
1e40: 72 20 3f 20 65 72 72 53 74 72 20 3a 20 22 22 2c r ? errStr : "",
1e50: 20 2d 31 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c -1) );.. Tcl
1e60: 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 _Preserve( (Clie
1e70: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
1e80: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 ->interp);. T
1e90: 63 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c cl_Preserve( (Cl
1ea0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
1eb0: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e tr);.. Tcl_In
1ec0: 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d 64 50 crRefCount( cmdP
1ed0: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c tr);. if (Tcl
1ee0: 5f 47 6c 6f 62 61 6c 45 76 61 6c 4f 62 6a 28 73 _GlobalEvalObj(s
1ef0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
1f00: 20 63 6d 64 50 74 72 29 20 21 3d 20 54 43 4c 5f cmdPtr) != TCL_
1f10: 4f 4b 29 20 7b 0a 09 2f 2a 20 69 74 20 67 6f 74 OK) {../* it got
1f20: 20 61 6e 20 65 72 72 6f 72 20 2d 20 72 65 6a 65 an error - reje
1f30: 63 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61 ct the certifica
1f40: 74 65 20 2a 2f 0a 09 54 63 6c 5f 42 61 63 6b 67 te */..Tcl_Backg
1f50: 72 6f 75 6e 64 45 72 72 6f 72 28 20 73 74 61 74 roundError( stat
1f60: 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 09 ePtr->interp);..
1f70: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c ok = 0;. } el
1f80: 73 65 20 7b 0a 09 69 66 20 28 54 63 6c 5f 47 65 se {..if (Tcl_Ge
1f90: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 20 73 74 61 tIntFromObj( sta
1fa0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 0a 09 tePtr->interp,..
1fb0: 09 20 20 20 20 54 63 6c 5f 47 65 74 4f 62 6a 52 . Tcl_GetObjR
1fc0: 65 73 75 6c 74 28 20 73 74 61 74 65 50 74 72 2d esult( statePtr-
1fd0: 3e 69 6e 74 65 72 70 29 2c 20 26 6f 6b 29 20 21 >interp), &ok) !
1fe0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
1ff0: 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 Tcl_BackgroundE
2000: 72 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d 3e rror( statePtr->
2010: 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 6f 6b interp);.. ok
2020: 20 3d 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 = 0;..}. }.
2030: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
2040: 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a 20 unt( cmdPtr);..
2050: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20 Tcl_Release(
2060: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
2070: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f tePtr);. Tcl_
2080: 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74 Release( (Client
2090: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e Data) statePtr->
20a0: 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 72 65 interp);.. re
20b0: 74 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 6c 65 61 turn(ok);./* lea
20c0: 76 65 20 74 68 65 20 64 69 73 70 6f 73 69 74 69 ve the dispositi
20d0: 6f 6e 20 61 73 20 53 53 4c 20 73 65 74 20 69 74 on as SSL set it
20e0: 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d */.}.../*. *---
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2130: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 . *. * Tls_Error
2140: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 --. *. *.Calls
2150: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 24 66 callback with $f
2160: 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f 20 d and $msg - so
2170: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e the callback can
2180: 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61 74 20 decide. *.what
2190: 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72 6f 72 to do with error
21a0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
21b0: 3a 0a 20 2a 09 6f 6b 20 2d 20 6c 65 74 20 53 53 :. *.ok - let SS
21c0: 4c 20 68 61 6e 64 6c 65 20 69 74 0a 20 2a 0a 20 L handle it. *.
21d0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
21e0: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 *.The err field
21f0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c of the currentl
2200: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 y operative Stat
2210: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f e is set. *. to
2220: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 a string descri
2230: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 bing the SSL neg
2240: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 otiation failure
2250: 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d 2d 2d 2d 2d reason. *------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
22a0: 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 /.void.Tls_Error
22b0: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 (State *statePtr
22c0: 2c 20 63 68 61 72 20 2a 6d 73 67 29 0a 7b 0a 20 , char *msg).{.
22d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
22e0: 74 72 3b 0a 0a 20 20 20 20 69 66 20 28 6d 73 67 tr;.. if (msg
22f0: 20 26 26 20 2a 6d 73 67 29 20 7b 0a 09 54 63 6c && *msg) {..Tcl
2300: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 73 74 _SetErrorCode(st
2310: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
2320: 22 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63 68 61 "SSL", msg, (cha
2330: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d r *)NULL);. }
2340: 20 65 6c 73 65 20 7b 0a 09 6d 73 67 20 3d 20 54 else {..msg = T
2350: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
2360: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 Obj(Tcl_GetObjRe
2370: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 69 sult(statePtr->i
2380: 6e 74 65 72 70 29 2c 20 4e 55 4c 4c 29 3b 0a 20 nterp), NULL);.
2390: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 }. statePt
23a0: 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 r->err = msg;..
23b0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
23c0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 >callback == (Tc
23d0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
23e0: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d char buf[BUFSIZ]
23f0: 3b 0a 09 73 70 72 69 6e 74 66 28 62 75 66 2c 20 ;..sprintf(buf,
2400: 22 53 53 4c 20 63 68 61 6e 6e 65 6c 20 5c 22 25 "SSL channel \"%
2410: 73 5c 22 3a 20 65 72 72 6f 72 3a 20 25 73 22 2c s\": error: %s",
2420: 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 .. Tcl_GetCha
2430: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
2440: 72 2d 3e 73 65 6c 66 29 2c 20 6d 73 67 29 3b 0a r->self), msg);.
2450: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 20 .Tcl_SetResult(
2460: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2470: 2c 20 62 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 , buf, TCL_VOLAT
2480: 49 4c 45 29 3b 0a 09 54 63 6c 5f 42 61 63 6b 67 ILE);..Tcl_Backg
2490: 72 6f 75 6e 64 45 72 72 6f 72 28 20 73 74 61 74 roundError( stat
24a0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 09 ePtr->interp);..
24b0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 return;. }.
24c0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
24d0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
24e0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
24f0: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
2500: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 jAppendElement(s
2510: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
2520: 20 63 6d 64 50 74 72 2c 20 0a 09 20 20 20 20 54 cmdPtr, .. T
2530: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2540: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 0a "error", -1));..
2550: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
2560: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 ppendElement(sta
2570: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 tePtr->interp, c
2580: 6d 64 50 74 72 2c 20 0a 09 20 20 20 20 54 63 6c mdPtr, .. Tcl
2590: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
25a0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
25b0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
25c0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c , -1));.. Tcl
25d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
25e0: 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e ement(statePtr->
25f0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
2600: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
2610: 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b ngObj(msg, -1));
2620: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
2630: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ve((ClientData)
2640: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2650: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 );. Tcl_Prese
2660: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 rve((ClientData)
2670: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 statePtr);..
2680: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
2690: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 t(cmdPtr);. i
26a0: 66 20 28 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 f (Tcl_GlobalEva
26b0: 6c 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 69 lObj(statePtr->i
26c0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 29 20 21 nterp, cmdPtr) !
26d0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c = TCL_OK) {..Tcl
26e0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
26f0: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 (statePtr->inter
2700: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 p);. }. Tc
2710: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
2720: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c mdPtr);.. Tcl
2730: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 _Release((Client
2740: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
2750: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
2760: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
2770: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b atePtr->interp);
2780: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
27d0: 0a 20 2a 20 50 61 73 73 77 6f 72 64 43 61 6c 6c . * PasswordCall
27e0: 62 61 63 6b 20 2d 2d 20 0a 20 2a 0a 20 2a 09 43 back -- . *. *.C
27f0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 alled when a pas
2800: 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 sword is needed
2810: 74 6f 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e to unpack RSA an
2820: 64 20 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 d PEM keys.. *.E
2830: 76 61 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 vals any bound p
2840: 61 73 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 assword script a
2850: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 nd returns the r
2860: 65 73 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 esult as. *.the
2870: 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e password string.
2880: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 ------. */.#ifde
28d0: 66 20 50 52 45 5f 4f 50 45 4e 53 53 4c 5f 30 5f f PRE_OPENSSL_0_
28e0: 39 5f 34 0a 2f 2a 0a 20 2a 20 4e 6f 20 77 61 79 9_4./*. * No way
28f0: 20 74 6f 20 68 61 6e 64 6c 65 20 75 73 65 72 2d to handle user-
2900: 64 61 74 61 20 74 68 65 72 65 66 6f 72 65 20 6e data therefore n
2910: 6f 20 77 61 79 20 77 69 74 68 6f 75 74 20 61 20 o way without a
2920: 67 6c 6f 62 61 6c 0a 20 2a 20 76 61 72 69 61 62 global. * variab
2930: 6c 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 le to access the
2940: 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 Tcl interpreter
2950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a ..*/.static int.
2960: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b PasswordCallback
2970: 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 (char *buf, int
2980: 73 69 7a 65 2c 20 69 6e 74 20 76 65 72 69 66 79 size, int verify
2990: 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d ).{. return -
29a0: 31 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74 61 74 69 1;.}.#else.stati
29b0: 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 c int.PasswordCa
29c0: 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 llback(char *buf
29d0: 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 , int size, int
29e0: 76 65 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 verify, void *ud
29f0: 61 74 61 29 0a 7b 0a 20 20 20 20 53 74 61 74 65 ata).{. State
2a00: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 *statePtr.= (St
2a10: 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 ate *) udata;.
2a20: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
2a30: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
2a40: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
2a50: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
2a60: 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 0a 20 int result;..
2a70: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
2a80: 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c >password == NUL
2a90: 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 L) {..if (Tcl_Ev
2aa0: 61 6c 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a al(interp, "tls:
2ab0: 3a 70 61 73 73 77 6f 72 64 22 29 20 3d 3d 20 54 :password") == T
2ac0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 CL_OK) {.. ch
2ad0: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 ar *ret = (char
2ae0: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 *) Tcl_GetString
2af0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6e strn
2b10: 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 73 69 cpy(buf, ret, si
2b20: 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e ze);.. return
2b30: 20 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d strlen(ret);..}
2b40: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 else {.. ret
2b50: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d urn -1;..}. }
2b60: 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 .. cmdPtr = T
2b70: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
2b80: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
2b90: 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 rd);.. Tcl_Pr
2ba0: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
2bb0: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e ta) statePtr->in
2bc0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
2bd0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
2be0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
2bf0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
2c00: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
2c10: 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f result = Tcl_
2c20: 47 6c 6f 62 61 6c 45 76 61 6c 4f 62 6a 28 69 6e GlobalEvalObj(in
2c30: 74 65 72 70 2c 20 63 6d 64 50 74 72 29 3b 0a 20 terp, cmdPtr);.
2c40: 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d if (result !=
2c50: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f TCL_OK) {..Tcl_
2c60: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 BackgroundError(
2c70: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2c80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c );. }. Tcl
2c90: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
2ca0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f dPtr);.. Tcl_
2cb0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
2cc0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
2cd0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
2ce0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
2cf0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a tePtr->interp);.
2d00: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 . if (result
2d10: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 == TCL_OK) {..ch
2d20: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 ar *ret = (char
2d30: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 *) Tcl_GetString
2d40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
2d50: 20 20 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 strncpy(
2d60: 62 75 66 2c 20 72 65 74 2c 20 73 69 7a 65 29 3b buf, ret, size);
2d70: 0a 09 72 65 74 75 72 6e 20 73 74 72 6c 65 6e 28 ..return strlen(
2d80: 72 65 74 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ret);. } else
2d90: 20 7b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 {..return -1;.
2da0: 20 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a }.}.#endif...
2db0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
2dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
2e00: 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 iphersObjCmd --
2e10: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 list available c
2e20: 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 iphers. *. *.Thi
2e30: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
2e40: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
2e50: 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 s the "tls::ciph
2e60: 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ers" command. *.
2e70: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c to list availabl
2e80: 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 e ciphers, based
2e90: 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 upon protocol s
2ea0: 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 elected.. *. * R
2eb0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
2ec0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
2ed0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 list.. *. * Sid
2ee0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f e effects:. *.co
2ef0: 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 nstructs and des
2f00: 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 troys SSL contex
2f10: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d t (CTX). *. *---
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f60: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
2f70: 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 63 6c CiphersObjCmd(cl
2f80: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 ientData, interp
2f90: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 , objc, objv).
2fa0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ClientData cli
2fb0: 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 entData;./* Not
2fc0: 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c used. */. Tcl
2fd0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b _Interp *interp;
2fe0: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 . int objc;.
2ff0: 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e 53 Tcl_Obj.*CONS
3000: 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 T objv[];.{.
3010: 73 74 61 74 69 63 20 43 4f 4e 53 54 20 63 68 61 static CONST cha
3020: 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d r *protocols[] =
3030: 20 7b 0a 09 22 73 73 6c 32 22 2c 09 22 73 73 6c {.."ssl2",."ssl
3040: 33 22 2c 09 22 74 6c 73 31 22 2c 09 4e 55 4c 4c 3",."tls1",.NULL
3050: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 65 6e 75 6d . };. enum
3060: 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 09 54 4c 53 protocol {..TLS
3070: 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c _SSL2, TLS_SSL3,
3080: 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 4e TLS_TLS1, TLS_N
3090: 4f 4e 45 0a 20 20 20 20 7d 3b 0a 20 20 20 20 54 ONE. };. T
30a0: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a cl_Obj *objPtr;.
30b0: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 SSL_CTX *ctx
30c0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c = NULL;. SSL
30d0: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ssl = NULL;.
30e0: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 STACK_OF(SSL_C
30f0: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 IPHER) *sk;.
3100: 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 char *cp, buf[BU
3110: 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 FSIZ];. int i
3120: 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 ndex, verbose =
3130: 30 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 0;.. if (objc
3140: 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 < 2 || objc > 3
3150: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
3160: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
3170: 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c objv, "protocol
3180: 20 3f 76 65 72 62 6f 73 65 3f 22 29 3b 0a 20 20 ?verbose?");.
3190: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c return TCL
31a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
31b0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 if (Tcl_GetInd
31c0: 65 78 46 72 6f 6d 4f 62 6a 28 20 69 6e 74 65 72 exFromObj( inter
31d0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 p, objv[1], prot
31e0: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c ocols, "protocol
31f0: 22 2c 20 30 2c 0a 09 26 69 6e 64 65 78 29 20 21 ", 0,..&index) !
3200: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
3210: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
3220: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6f 62 6a }. if (obj
3230: 63 20 3e 20 32 20 26 26 20 54 63 6c 5f 47 65 74 c > 2 && Tcl_Get
3240: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 20 BooleanFromObj(
3250: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c interp, objv[2],
3260: 0a 09 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 ..&verbose) != T
3270: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
3280: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
3290: 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 }. switch ((e
32a0: 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 num protocol)ind
32b0: 65 78 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54 ex) {. case T
32c0: 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 64 65 66 LS_SSL2:.#if def
32d0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 09 09 ined(NO_SSL2)...
32e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
32f0: 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 (interp, "protoc
3300: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 ol not supported
3310: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 ", NULL);...retu
3320: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 rn TCL_ERROR;.#e
3330: 6c 73 65 0a 09 09 63 74 78 20 3d 20 53 53 4c 5f lse...ctx = SSL_
3340: 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65 CTX_new(SSLv2_me
3350: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a thod()); break;.
3360: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 #endif. case
3370: 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 TLS_SSL3:.#if de
3380: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 09 fined(NO_SSL3)..
3390: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
33a0: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f t(interp, "proto
33b0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
33c0: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 d", NULL);...ret
33d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 urn TCL_ERROR;.#
33e0: 65 6c 73 65 0a 09 09 63 74 78 20 3d 20 53 53 4c else...ctx = SSL
33f0: 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d _CTX_new(SSLv3_m
3400: 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b ethod()); break;
3410: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 .#endif. case
3420: 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 TLS_TLS1:.#if d
3430: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 0a efined(NO_TLS1).
3440: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
3450: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 lt(interp, "prot
3460: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
3470: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 ed", NULL);...re
3480: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
3490: 23 65 6c 73 65 0a 09 09 63 74 78 20 3d 20 53 53 #else...ctx = SS
34a0: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f L_CTX_new(TLSv1_
34b0: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b method()); break
34c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 ;.#endif. }.
34d0: 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 if (ctx == NU
34e0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
34f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
3500: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
3510: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
3520: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
3530: 20 7d 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c }. ssl = SSL
3540: 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 _new(ctx);. i
3550: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 f (ssl == NULL)
3560: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
3570: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 ult(interp, REAS
3580: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
3590: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 ULL);..SSL_CTX_f
35a0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 ree(ctx);..retur
35b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
35c0: 20 7d 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 }. objPtr =
35d0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 20 Tcl_NewListObj(
35e0: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 0, NULL);.. i
35f0: 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 f (!verbose) {..
3600: 66 6f 72 20 28 69 6e 64 65 78 20 3d 20 30 3b 20 for (index = 0;
3610: 3b 20 69 6e 64 65 78 2b 2b 29 20 7b 0a 09 20 20 ; index++) {..
3620: 20 20 63 70 20 3d 20 28 63 68 61 72 2a 29 53 53 cp = (char*)SS
3630: 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 L_get_cipher_lis
3640: 74 28 20 73 73 6c 2c 20 69 6e 64 65 78 29 3b 0a t( ssl, index);.
3650: 09 20 20 20 20 69 66 20 28 63 70 20 3d 3d 20 4e . if (cp == N
3660: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 20 20 20 ULL) break;..
3670: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
3680: 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e 74 65 72 ndElement( inter
3690: 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 54 63 6c p, objPtr,...Tcl
36a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 63 _NewStringObj( c
36b0: 70 2c 20 2d 31 29 20 29 3b 0a 09 7d 0a 20 20 20 p, -1) );..}.
36c0: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 } else {..sk =
36d0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 SSL_get_ciphers(
36e0: 73 73 6c 29 3b 0a 0a 09 66 6f 72 20 28 69 6e 64 ssl);...for (ind
36f0: 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20 3c 20 ex = 0; index <
3700: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 sk_SSL_CIPHER_nu
3710: 6d 28 73 6b 29 3b 20 69 6e 64 65 78 2b 2b 29 20 m(sk); index++)
3720: 7b 0a 09 20 20 20 20 72 65 67 69 73 74 65 72 20 {.. register
3730: 69 6e 74 20 69 3b 0a 09 20 20 20 20 53 53 4c 5f int i;.. SSL_
3740: 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 CIPHER_descripti
3750: 6f 6e 28 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 on( sk_SSL_CIPHE
3760: 52 5f 76 61 6c 75 65 28 20 73 6b 2c 20 69 6e 64 R_value( sk, ind
3770: 65 78 29 2c 0a 09 09 09 09 20 20 20 20 62 75 66 ex),..... buf
3780: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a , sizeof(buf));.
3790: 09 20 20 20 20 66 6f 72 20 28 69 20 3d 20 73 74 . for (i = st
37a0: 72 6c 65 6e 28 62 75 66 29 20 2d 20 31 3b 20 69 rlen(buf) - 1; i
37b0: 20 3b 20 69 2d 2d 29 20 7b 0a 09 09 69 66 20 28 ; i--) {...if (
37c0: 62 75 66 5b 69 5d 20 3d 3d 20 27 20 27 20 7c 7c buf[i] == ' ' ||
37d0: 20 62 75 66 5b 69 5d 20 3d 3d 20 27 5c 6e 27 20 buf[i] == '\n'
37e0: 7c 7c 0a 09 09 20 20 20 20 62 75 66 5b 69 5d 20 ||... buf[i]
37f0: 3d 3d 20 27 5c 72 27 20 7c 7c 20 62 75 66 5b 69 == '\r' || buf[i
3800: 5d 20 3d 3d 20 27 5c 74 27 29 20 7b 0a 09 09 20 ] == '\t') {...
3810: 20 20 20 62 75 66 5b 69 5d 20 3d 20 27 5c 30 27 buf[i] = '\0'
3820: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 ;...} else {...
3830: 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20 break;...}..
3840: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 4c 69 }.. Tcl_Li
3850: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3860: 6e 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 nt( interp, objP
3870: 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 tr,...Tcl_NewStr
3880: 69 6e 67 4f 62 6a 28 20 62 75 66 2c 20 2d 31 29 ingObj( buf, -1)
3890: 20 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 );..}. }.
38a0: 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a SSL_free(ssl);.
38b0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
38c0: 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f (ctx);.. Tcl_
38d0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 20 69 6e SetObjResult( in
38e0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
38f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
3900: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3950: 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 *. * HandshakeOb
3960: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
3970: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 is command is us
3980: 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 ed to verify whe
3990: 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 ther the handsha
39a0: 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 ke is complete.
39b0: 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 *.or not.. *. *
39c0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
39d0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
39e0: 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 t. 1 means hands
39f0: 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 hake complete, 0
3a00: 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a means pending..
3a10: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
3a20: 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 ts:. *.May force
3a30: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e SSL negotiation
3a40: 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a to take place..
3a50: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
3aa0: 61 74 69 63 20 69 6e 74 0a 48 61 6e 64 73 68 61 atic int.Handsha
3ab0: 6b 65 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74 44 keObjCmd(clientD
3ac0: 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a ata, interp, obj
3ad0: 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c 69 c, objv). Cli
3ae0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
3af0: 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64 2e ta;./* Not used.
3b00: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 */. Tcl_Inte
3b10: 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20 20 rp *interp;.
3b20: 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54 63 int objc;. Tc
3b30: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a l_Obj *CONST obj
3b40: 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 v[];.{. Tcl_C
3b50: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
3b60: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
3b70: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
3b80: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 /. State *sta
3b90: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e tePtr;../* clien
3ba0: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 t state for ssl
3bb0: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 69 6e socket */. in
3bc0: 74 20 72 65 74 20 3d 20 31 3b 0a 0a 20 20 20 20 t ret = 1;..
3bd0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b if (objc != 2) {
3be0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
3bf0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
3c00: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a jv, "channel");.
3c10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 return T
3c20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
3c30: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
3c40: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
3c50: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
3c60: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
3c70: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 NULL), NULL);.
3c80: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
3c90: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
3ca0: 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 L) {. ret
3cb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
3cc0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 68 61 }. if (cha
3cd0: 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 nnelTypeVersion
3ce0: 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 == TLS_CHANNEL_V
3cf0: 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 2f 2a 0a ERSION_2) {../*.
3d00: 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f . * Make sure to
3d10: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
3d20: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a topmost channel.
3d30: 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c . */..chan = Tcl
3d40: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
3d50: 68 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 han);. }.
3d60: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
3d70: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
3d80: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
3d90: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 54 63 6c )) {. Tcl
3da0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
3db0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
3dc0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
3dd0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
3de0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
3df0: 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 "\": not a TLS
3e00: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 channel", NULL)
3e10: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e ;. return
3e20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
3e30: 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d }. statePtr =
3e40: 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 (State *)Tcl_Ge
3e50: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
3e60: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 Data(chan);..
3e70: 20 69 66 20 28 21 53 53 4c 5f 69 73 5f 69 6e 69 if (!SSL_is_ini
3e80: 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61 74 65 t_finished(state
3e90: 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 69 6e Ptr->ssl)) {..in
3ea0: 74 20 65 72 72 3b 0a 09 72 65 74 20 3d 20 54 6c t err;..ret = Tl
3eb0: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
3ec0: 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 29 (statePtr, &err)
3ed0: 3b 0a 09 69 66 20 28 72 65 74 20 3c 20 30 29 20 ;..if (ret < 0)
3ee0: 7b 0a 09 20 20 20 20 43 4f 4e 53 54 20 63 68 61 {.. CONST cha
3ef0: 72 20 2a 65 72 72 53 74 72 20 3d 20 73 74 61 74 r *errStr = stat
3f00: 65 50 74 72 2d 3e 65 72 72 3b 0a 09 20 20 20 20 ePtr->err;..
3f10: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 Tcl_ResetResult(
3f20: 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 54 63 interp);.. Tc
3f30: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b l_SetErrno(err);
3f40: 0a 0a 09 20 20 20 20 69 66 20 28 21 65 72 72 53 ... if (!errS
3f50: 74 72 20 7c 7c 20 2a 65 72 72 53 74 72 20 3d 3d tr || *errStr ==
3f60: 20 30 29 20 7b 0a 09 20 20 20 20 20 20 20 20 65 0) {.. e
3f70: 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 rrStr = Tcl_Posi
3f80: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a xError(interp);.
3f90: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 54 63 6c . }... Tcl
3fa0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
3fb0: 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 terp, "handshake
3fc0: 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 failed: ", errS
3fd0: 74 72 2c 0a 09 09 20 20 20 20 28 63 68 61 72 20 tr,... (char
3fe0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 *) NULL);.. r
3ff0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
4000: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 ..}. }.. T
4010: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
4020: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 interp, Tcl_NewI
4030: 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 ntObj(ret));.
4040: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
4050: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
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 0a 20 2a 0a ------------. *.
40a0: 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 * ImportObjCmd
40b0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
40c0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
40d0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ed to process th
40e0: 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a e "ssl" command.
40f0: 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f *. *.The ssl co
4100: 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c mmand pushes SSL
4110: 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 over a (newly c
4120: 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f onnected) tcp so
4130: 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cket. *. * Resul
4140: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
4150: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
4160: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
4170: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 :. *.May modify
4180: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 the behavior of
4190: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 an IO channel..
41a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
41b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
41f0: 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 tic int.ImportOb
4200: 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c jCmd(clientData,
4210: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f interp, objc, o
4220: 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 bjv). ClientD
4230: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 ata clientData;.
4240: 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a /* Not used. */.
4250: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
4260: 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 interp;. int
4270: 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 objc;. Tcl_Ob
4280: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b j *CONST objv[];
4290: 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e .{. Tcl_Chann
42a0: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 el chan;../* The
42b0: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 channel to set
42c0: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 a mode on. */.
42d0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
42e0: 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 r;../* client st
42f0: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b ate for ssl sock
4300: 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 et */. SSL_CT
4310: 58 20 2a 63 74 78 09 3d 20 4e 55 4c 4c 3b 0a 20 X *ctx.= NULL;.
4320: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 Tcl_Obj *scri
4330: 70 74 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 pt.= NULL;. T
4340: 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 cl_Obj *password
4350: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 .= NULL;. int
4360: 20 69 64 78 3b 0a 20 20 20 20 69 6e 74 20 66 6c idx;. int fl
4370: 61 67 73 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 ags..= TLS_TCL_I
4380: 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 NIT;. int ser
4390: 76 65 72 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 ver..= 0;./* is
43a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d connection incom
43b0: 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f ing or outgoing?
43c0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 */. char *ke
43d0: 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 y..= NULL;. c
43e0: 68 61 72 20 2a 63 65 72 74 09 09 3d 20 4e 55 4c har *cert..= NUL
43f0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 L;. char *cip
4400: 68 65 72 73 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 hers.= NULL;.
4410: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 3d 20 char *CAfile.=
4420: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
4430: 43 41 64 69 72 09 09 3d 20 4e 55 4c 4c 3b 0a 20 CAdir..= NULL;.
4440: 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 char *model..
4450: 3d 20 4e 55 4c 4c 3b 0a 23 69 66 20 64 65 66 69 = NULL;.#if defi
4460: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 ned(NO_SSL2).
4470: 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 3b 0a 23 int ssl2 = 0;.#
4480: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 73 73 6c else. int ssl
4490: 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 2 = 1;.#endif.#i
44a0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c f defined(NO_SSL
44b0: 33 29 0a 20 20 20 20 69 6e 74 20 73 73 6c 33 20 3). int ssl3
44c0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 = 0;.#else. i
44d0: 6e 74 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e nt ssl3 = 1;.#en
44e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
44f0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 NO_SSL2) && defi
4500: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 ned(NO_SSL3).
4510: 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 3b 0a 23 int tls1 = 1;.#
4520: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 74 6c 73 else. int tls
4530: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 1 = 0;.#endif.
4540: 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 3b int proto = 0;
4550: 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 . int verify
4560: 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 = 0, require = 0
4570: 2c 20 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a , request = 1;..
4580: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
4590: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
45a0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
45b0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 objv, "channel
45c0: 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 20 20 20 ?options?");.
45d0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f return TCL_
45e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
45f0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
4600: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
4610: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
4620: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 mObj(objv[1], NU
4630: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 LL), NULL);.
4640: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
4650: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
4660: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e {. return
4670: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
4680: 7d 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65 }. if (channe
4690: 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 lTypeVersion ==
46a0: 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 TLS_CHANNEL_VERS
46b0: 49 4f 4e 5f 32 29 20 7b 0a 09 2f 2a 0a 09 20 2a ION_2) {../*.. *
46c0: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
46d0: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
46e0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a most channel.. *
46f0: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
4700: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
4710: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f );. }.. fo
4720: 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 r (idx = 2; idx
4730: 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b < objc; idx++) {
4740: 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 ..char *opt = Tc
4750: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
4760: 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 bj(objv[idx], NU
4770: 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 LL);...if (opt[0
4780: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 ] != '-').. b
4790: 72 65 61 6b 3b 0a 0a 09 4f 50 54 53 54 52 28 20 reak;...OPTSTR(
47a0: 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29 "-cadir", CAdir)
47b0: 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d 63 61 66 ;..OPTSTR( "-caf
47c0: 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 ile", CAfile);..
47d0: 4f 50 54 53 54 52 28 20 22 2d 63 65 72 74 66 69 OPTSTR( "-certfi
47e0: 6c 65 22 2c 20 63 65 72 74 29 3b 0a 09 4f 50 54 le", cert);..OPT
47f0: 53 54 52 28 20 22 2d 63 69 70 68 65 72 22 2c 20 STR( "-cipher",
4800: 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 4f 42 ciphers);..OPTOB
4810: 4a 28 20 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 J( "-command", s
4820: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 cript);..OPTSTR(
4830: 20 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 "-keyfile", key
4840: 29 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d 6d 6f );..OPTSTR( "-mo
4850: 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f del", model);..O
4860: 50 54 4f 42 4a 28 20 22 2d 70 61 73 73 77 6f 72 PTOBJ( "-passwor
4870: 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 d", password);..
4880: 4f 50 54 42 4f 4f 4c 28 20 22 2d 72 65 71 75 69 OPTBOOL( "-requi
4890: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 re", require);..
48a0: 4f 50 54 42 4f 4f 4c 28 20 22 2d 72 65 71 75 65 OPTBOOL( "-reque
48b0: 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 st", request);..
48c0: 4f 50 54 42 4f 4f 4c 28 20 22 2d 73 65 72 76 65 OPTBOOL( "-serve
48d0: 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 0a 09 4f r", server);...O
48e0: 50 54 42 4f 4f 4c 28 20 22 2d 73 73 6c 32 22 2c PTBOOL( "-ssl2",
48f0: 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c ssl2);..OPTBOOL
4900: 28 20 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 ( "-ssl3", ssl3)
4910: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 74 6c ;..OPTBOOL( "-tl
4920: 73 31 22 2c 20 74 6c 73 31 29 3b 0a 0a 09 4f 50 s1", tls1);...OP
4930: 54 42 41 44 28 20 22 6f 70 74 69 6f 6e 22 2c 20 TBAD( "option",
4940: 22 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 "-cadir, -cafile
4950: 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 , -certfile, -ci
4960: 70 68 65 72 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 pher, -command,
4970: 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c -keyfile, -model
4980: 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 65 , -password, -re
4990: 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 74 2c quire, -request,
49a0: 20 2d 73 65 72 76 65 72 2c 20 2d 73 73 6c 32 2c -server, -ssl2,
49b0: 20 2d 73 73 6c 33 2c 20 6f 72 20 2d 74 6c 73 31 -ssl3, or -tls1
49c0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c ");...return TCL
49d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
49e0: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 20 20 if (request)
49f0: 20 20 20 20 20 20 20 20 20 20 76 65 72 69 66 79 verify
4a00: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 |= SSL_VERIFY_C
4a10: 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c LIENT_ONCE | SSL
4a20: 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 _VERIFY_PEER;.
4a30: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 if (request &&
4a40: 20 72 65 71 75 69 72 65 29 20 76 65 72 69 66 79 require) verify
4a50: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 |= SSL_VERIFY_F
4a60: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 AIL_IF_NO_PEER_C
4a70: 45 52 54 3b 0a 20 20 20 20 69 66 20 28 76 65 72 ERT;. if (ver
4a80: 69 66 79 20 3d 3d 20 30 29 20 20 20 20 20 20 20 ify == 0)
4a90: 20 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 verify = SSL_VE
4aa0: 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 RIFY_NONE;..
4ab0: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f proto |= (ssl2 ?
4ac0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 TLS_PROTO_SSL2
4ad0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
4ae0: 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 |= (ssl3 ? TLS_P
4af0: 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a ROTO_SSL3 : 0);.
4b00: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c proto |= (tl
4b10: 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 s1 ? TLS_PROTO_T
4b20: 4c 53 31 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f LS1 : 0);.. /
4b30: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 * reset to NULL
4b40: 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 if blank string
4b50: 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 provided */.
4b60: 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 if (cert && !*ce
4b70: 72 74 29 09 09 63 65 72 74 09 3d 20 4e 55 4c 4c rt)..cert.= NULL
4b80: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 ;. if (key &&
4b90: 20 21 2a 6b 65 79 29 09 09 6b 65 79 09 3d 20 4e !*key)..key.= N
4ba0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 ULL;. if (cip
4bb0: 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 hers && !*cipher
4bc0: 73 29 09 63 69 70 68 65 72 73 09 3d 20 4e 55 4c s).ciphers.= NUL
4bd0: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c L;. if (CAfil
4be0: 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 43 e && !*CAfile).C
4bf0: 41 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 Afile.= NULL;.
4c00: 20 20 69 66 20 28 43 41 64 69 72 20 26 26 20 21 if (CAdir && !
4c10: 2a 43 41 64 69 72 29 09 43 41 64 69 72 09 3d 20 *CAdir).CAdir.=
4c20: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 NULL;.. /* ne
4c30: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 w SSL state */.
4c40: 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 statePtr..= (
4c50: 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 41 6c 6c State *) Tcl_All
4c60: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 oc((unsigned) si
4c70: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 zeof(State));.
4c80: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 statePtr->self
4c90: 09 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 .= (Tcl_Channel)
4ca0: 4e 55 4c 4c 3b 0a 20 20 20 20 73 74 61 74 65 50 NULL;. stateP
4cb0: 74 72 2d 3e 74 69 6d 65 72 09 3d 20 28 54 63 6c tr->timer.= (Tcl
4cc0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c _TimerToken)NULL
4cd0: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d ;.. statePtr-
4ce0: 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a >flags.= flags;.
4cf0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 statePtr->wa
4d00: 74 63 68 4d 61 73 6b 09 3d 20 30 3b 0a 20 20 20 tchMask.= 0;.
4d10: 20 73 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65 09 statePtr->mode.
4d20: 3d 20 30 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 = 0;.. stateP
4d30: 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 tr->interp.= int
4d40: 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 erp;. statePt
4d50: 72 2d 3e 63 61 6c 6c 62 61 63 6b 09 3d 20 28 54 r->callback.= (T
4d60: 63 6c 5f 4f 62 6a 20 2a 29 30 3b 0a 20 20 20 20 cl_Obj *)0;.
4d70: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
4d80: 72 64 09 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 rd.= (Tcl_Obj *)
4d90: 30 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 0;.. statePtr
4da0: 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 ->vflags.= verif
4db0: 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d y;. statePtr-
4dc0: 3e 73 73 6c 09 3d 20 28 53 53 4c 2a 29 30 3b 0a >ssl.= (SSL*)0;.
4dd0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 statePtr->ct
4de0: 78 09 3d 20 28 53 53 4c 5f 43 54 58 2a 29 30 3b x.= (SSL_CTX*)0;
4df0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 . statePtr->b
4e00: 69 6f 09 3d 20 28 42 49 4f 2a 29 30 3b 0a 20 20 io.= (BIO*)0;.
4e10: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 statePtr->p_bi
4e20: 6f 09 3d 20 28 42 49 4f 2a 29 30 3b 0a 0a 20 20 o.= (BIO*)0;..
4e30: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 statePtr->err.
4e40: 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c = "";.. /* al
4e50: 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f locate script */
4e60: 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29 . if (script)
4e70: 20 7b 0a 09 63 68 61 72 20 2a 74 6d 70 20 3d 20 {..char *tmp =
4e80: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
4e90: 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 4e 55 4c mObj(script, NUL
4ea0: 4c 29 3b 0a 09 69 66 20 28 74 6d 70 20 26 26 20 L);..if (tmp &&
4eb0: 2a 74 6d 70 29 20 7b 0a 09 20 20 20 20 73 74 61 *tmp) {.. sta
4ec0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
4ed0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
4ee0: 62 6a 28 73 63 72 69 70 74 29 3b 0a 09 20 20 20 bj(script);..
4ef0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
4f00: 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c t(statePtr->call
4f10: 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a back);..}. }.
4f20: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 . /* allocate
4f30: 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 password */.
4f40: 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b if (password) {
4f50: 0a 09 63 68 61 72 20 2a 74 6d 70 20 3d 20 54 63 ..char *tmp = Tc
4f60: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
4f70: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 4e 55 4c bj(password, NUL
4f80: 4c 29 3b 0a 09 69 66 20 28 74 6d 70 20 26 26 20 L);..if (tmp &&
4f90: 2a 74 6d 70 29 20 7b 0a 09 20 20 20 20 73 74 61 *tmp) {.. sta
4fa0: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 tePtr->password
4fb0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
4fc0: 62 6a 28 70 61 73 73 77 6f 72 64 29 3b 0a 09 20 bj(password);..
4fd0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
4fe0: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 unt(statePtr->pa
4ff0: 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 ssword);..}.
5000: 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c }.. if (model
5010: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 != NULL) {..int
5020: 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 mode;../* Get t
5030: 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 he "model" conte
5040: 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 xt */..chan = Tc
5050: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
5060: 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 erp, model, &mod
5070: 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d e);..if (chan ==
5080: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
5090: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f ULL) {.. Tls_
50a0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
50b0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
50c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
50d0: 09 7d 0a 09 69 66 20 28 63 68 61 6e 6e 65 6c 54 .}..if (channelT
50e0: 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c ypeVersion == TL
50f0: 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f S_CHANNEL_VERSIO
5100: 4e 5f 32 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 N_2) {.. /*..
5110: 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 * Make sure
5120: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
5130: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
5140: 65 6c 0a 09 20 20 20 20 20 2a 2f 0a 09 20 20 20 el.. */..
5150: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
5160: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
5170: 0a 09 7d 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 ..}..if (Tcl_Get
5180: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
5190: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
51a0: 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 Type()) {.. T
51b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
51c0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
51d0: 6e 6e 65 6c 20 5c 22 22 2c 0a 09 09 20 20 20 20 nnel \"",...
51e0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
51f0: 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e me(chan), "\": n
5200: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
5210: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 ", NULL);.. T
5220: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
5230: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
5240: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
5250: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 R;..}..ctx = ((S
5260: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 tate *)Tcl_GetCh
5270: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
5280: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 a(chan))->ctx;.
5290: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
52a0: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 ((ctx = CTX_Init
52b0: 28 73 74 61 74 65 50 74 72 2c 20 70 72 6f 74 6f (statePtr, proto
52c0: 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 43 41 64 , key, cert, CAd
52d0: 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 ir, CAfile, ciph
52e0: 65 72 73 29 29 0a 09 20 20 20 20 3d 3d 20 28 53 ers)).. == (S
52f0: 53 4c 5f 43 54 58 2a 29 30 29 20 7b 0a 09 20 20 SL_CTX*)0) {..
5300: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
5310: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
5320: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
5330: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
5340: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 statePtr->ct
5350: 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a x = ctx;.. /*
5360: 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 . * We need
5370: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 to make sure tha
5380: 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f t the channel wo
5390: 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 rks in binary (f
53a0: 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e or the. * en
53b0: 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 cryption not to
53c0: 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a get goofed up)..
53d0: 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 * We only w
53e0: 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 ant to adjust th
53f0: 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 e buffering in p
5400: 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 re-v2 channels,
5410: 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 where. * eac
5420: 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 h channel in the
5430: 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 stack maintaine
5440: 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 d its own buffer
5450: 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 s.. */. T
5460: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
5470: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
5480: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
5490: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 , "binary");.
54a0: 20 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 if (channelType
54b0: 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 Version == TLS_C
54c0: 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 31 HANNEL_VERSION_1
54d0: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e ) {..Tcl_SetChan
54e0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
54f0: 2c 20 63 68 61 6e 2c 20 22 2d 62 75 66 66 65 72 , chan, "-buffer
5500: 69 6e 67 22 2c 20 22 6e 6f 6e 65 22 29 3b 0a 20 ing", "none");.
5510: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 63 68 }.. if (ch
5520: 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e annelTypeVersion
5530: 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f == TLS_CHANNEL_
5540: 56 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 73 74 VERSION_2) {..st
5550: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 atePtr->self = T
5560: 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 cl_StackChannel(
5570: 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e interp, Tls_Chan
5580: 6e 65 6c 54 79 70 65 28 29 2c 0a 09 09 28 43 6c nelType(),...(Cl
5590: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
55a0: 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c tr, (TCL_READABL
55b0: 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 E | TCL_WRITABLE
55c0: 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 7d 20 ), chan);. }
55d0: 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 else {..statePtr
55e0: 2d 3e 73 65 6c 66 20 3d 20 63 68 61 6e 3b 0a 09 ->self = chan;..
55f0: 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c Tcl_StackChannel
5600: 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 (interp, Tls_Cha
5610: 6e 6e 65 6c 54 79 70 65 28 29 2c 0a 09 09 28 43 nnelType(),...(C
5620: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
5630: 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 Ptr, (TCL_READAB
5640: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c LE | TCL_WRITABL
5650: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 7d E), chan);. }
5660: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
5670: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f r->self == (Tcl_
5680: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
5690: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 ../*.. * No use
56a0: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c of Tcl_Eventuall
56b0: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f yFree because no
56c0: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 possible Tcl_Pr
56d0: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c eserve... */..Tl
56e0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
56f0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 statePtr);.
5700: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
5710: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
5720: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e /*. * SSL In
5730: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 itialization.
5740: 20 20 2a 2f 0a 0a 20 20 20 20 73 74 61 74 65 50 */.. stateP
5750: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 tr->ssl = SSL_ne
5760: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 w(statePtr->ctx)
5770: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 ;. if (!state
5780: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 20 20 20 20 Ptr->ssl) {.
5790: 20 20 20 20 2f 2a 20 53 53 4c 20 6c 69 62 72 61 /* SSL libra
57a0: 72 79 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 ry error */.
57b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
57c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
57d0: 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 uldn't construct
57e0: 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c ssl session: ",
57f0: 20 52 45 41 53 4f 4e 28 29 2c 0a 09 09 28 63 68 REASON(),...(ch
5800: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c ar *) NULL);..Tl
5810: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
5820: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 statePtr);.
5830: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
5840: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
5850: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 /*. * SSL Ca
5860: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a llbacks. */.
5870: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 . SSL_set_app
5880: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e _data(statePtr->
5890: 73 73 6c 2c 20 28 56 4f 49 44 20 2a 29 73 74 61 ssl, (VOID *)sta
58a0: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 tePtr);./* point
58b0: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a back to us */..
58c0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 SSL_set_veri
58d0: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c fy(statePtr->ssl
58e0: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 , verify, Verify
58f0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 Callback);..
5900: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 69 6e 66 6f SSL_CTX_set_info
5910: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 _callback(stateP
5920: 74 72 2d 3e 63 74 78 2c 20 49 6e 66 6f 43 61 6c tr->ctx, InfoCal
5930: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 lback);.. /*
5940: 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e Create Tcl_Chann
5950: 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a el BIO Handler *
5960: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e /. statePtr->
5970: 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f p_bio.= BIO_new_
5980: 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 tcl(statePtr, BI
5990: 4f 5f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 O_CLOSE);. st
59a0: 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 atePtr->bio.= BI
59b0: 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 O_new(BIO_f_ssl(
59c0: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 ));.. if (ser
59d0: 76 65 72 29 20 7b 0a 09 73 74 61 74 65 50 74 72 ver) {..statePtr
59e0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 ->flags |= TLS_T
59f0: 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f CL_SERVER;..SSL_
5a00: 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 set_accept_state
5a10: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
5a20: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 53 . } else {..S
5a30: 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 SL_set_connect_s
5a40: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 tate(statePtr->s
5a50: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 sl);. }. S
5a60: 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 SL_set_bio(state
5a70: 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 Ptr->ssl, stateP
5a80: 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 tr->p_bio, state
5a90: 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 Ptr->p_bio);.
5aa0: 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 BIO_set_ssl(sta
5ab0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 tePtr->bio, stat
5ac0: 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 43 ePtr->ssl, BIO_C
5ad0: 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 LOSE);.. /*.
5ae0: 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c * End of SSL
5af0: 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 Init. */.
5b00: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
5b10: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 interp, (char *)
5b20: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
5b30: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
5b40: 6c 66 29 2c 0a 09 20 20 20 20 54 43 4c 5f 56 4f lf),.. TCL_VO
5b50: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 LATILE);. ret
5b60: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
5b70: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
5b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
5bc0: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 TX_Init -- const
5bd0: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 ruct a SSL_CTX i
5be0: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 nstance. *. * Re
5bf0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 sults:. *.A vali
5c00: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e d SSL_CTX instan
5c10: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 ce or NULL.. *.
5c20: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5c30: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 *.constructs SS
5c40: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a L context (CTX).
5c50: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
5c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c90: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
5ca0: 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 atic SSL_CTX *.C
5cb0: 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 TX_Init(statePtr
5cc0: 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 2c 20 63 65 , proto, key, ce
5cd0: 72 74 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c rt, CAdir, CAfil
5ce0: 65 2c 20 63 69 70 68 65 72 73 29 0a 20 20 20 20 e, ciphers).
5cf0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
5d00: 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 3b 0a . int proto;.
5d10: 20 20 20 20 63 68 61 72 20 2a 6b 65 79 3b 0a 20 char *key;.
5d20: 20 20 20 63 68 61 72 20 2a 63 65 72 74 3b 0a 20 char *cert;.
5d30: 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 3b 0a char *CAdir;.
5d40: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 char *CAfile
5d50: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
5d60: 65 72 73 3b 0a 7b 0a 20 20 20 20 54 63 6c 5f 49 ers;.{. Tcl_I
5d70: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 nterp *interp =
5d80: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
5d90: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 ;. SSL_CTX *c
5da0: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 tx = NULL;. T
5db0: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 cl_DString ds;.
5dc0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 Tcl_DString d
5dd0: 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 s1;. int off
5de0: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 63 72 65 = 0;.. /* cre
5df0: 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 ate SSL context
5e00: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 */.#if !defined(
5e10: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 NO_SSL2) && !def
5e20: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 ined(NO_SSL3).
5e30: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
5e40: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 oto, TLS_PROTO_S
5e50: 53 4c 32 29 20 26 26 0a 09 45 4e 41 42 4c 45 44 SL2) &&..ENABLED
5e60: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
5e70: 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 63 74 78 20 O_SSL3)) {..ctx
5e80: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 = SSL_CTX_new(SS
5e90: 4c 76 32 33 5f 6d 65 74 68 6f 64 28 29 29 3b 0a Lv23_method());.
5ea0: 20 20 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69 } else.#endi
5eb0: 66 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 f. if (ENABLE
5ec0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
5ed0: 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 23 69 66 20 TO_SSL2)) {.#if
5ee0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
5ef0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
5f00: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 lt(interp, "prot
5f10: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
5f20: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
5f30: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
5f40: 3b 0a 23 65 6c 73 65 0a 09 63 74 78 20 3d 20 53 ;.#else..ctx = S
5f50: 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 SL_CTX_new(SSLv2
5f60: 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 23 65 6e 64 _method());.#end
5f70: 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 if. } else if
5f80: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
5f90: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 TLS_PROTO_TLS1)
5fa0: 29 20 7b 0a 09 63 74 78 20 3d 20 53 53 4c 5f 43 ) {..ctx = SSL_C
5fb0: 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 6d 65 74 TX_new(TLSv1_met
5fc0: 68 6f 64 28 29 29 3b 0a 20 20 20 20 7d 20 65 6c hod());. } el
5fd0: 73 65 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 se if (ENABLED(p
5fe0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
5ff0: 53 53 4c 33 29 29 20 7b 0a 23 69 66 20 64 65 66 SSL3)) {.#if def
6000: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 09 54 ined(NO_SSL3)..T
6010: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
6020: 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f interp, "protoco
6030: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
6040: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
6050: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 23 (SSL_CTX *)0;.#
6060: 65 6c 73 65 0a 09 63 74 78 20 3d 20 53 53 4c 5f else..ctx = SSL_
6070: 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65 CTX_new(SSLv3_me
6080: 74 68 6f 64 28 29 29 3b 0a 23 65 6e 64 69 66 0a thod());.#endif.
6090: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
60a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
60b0: 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 nterp, "no valid
60c0: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 protocol select
60d0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
60e0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
60f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 66 66 20 ;. }. off
6100: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 |= (ENABLED(prot
6110: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
6120: 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 1) ? 0 : SSL_OP_
6130: 4e 4f 5f 54 4c 53 76 31 29 3b 0a 20 20 20 20 6f NO_TLSv1);. o
6140: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
6150: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
6160: 53 53 4c 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f SSL2) ? 0 : SSL_
6170: 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 20 20 OP_NO_SSLv2);.
6180: 20 20 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 off |= (ENABLE
6190: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
61a0: 54 4f 5f 53 53 4c 33 29 20 3f 20 30 20 3a 20 53 TO_SSL3) ? 0 : S
61b0: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b SL_OP_NO_SSLv3);
61c0: 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
61d0: 74 5f 61 70 70 5f 64 61 74 61 28 20 63 74 78 2c t_app_data( ctx,
61e0: 20 28 56 4f 49 44 2a 29 69 6e 74 65 72 70 29 3b (VOID*)interp);
61f0: 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 ./* remember the
6200: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a interpreter */.
6210: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
6220: 6f 70 74 69 6f 6e 73 28 20 63 74 78 2c 20 53 53 options( ctx, SS
6230: 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c L_OP_ALL);./* al
6240: 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 l SSL bug workar
6250: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c ounds */. SSL
6260: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
6270: 28 20 63 74 78 2c 20 6f 66 66 29 3b 09 2f 2a 20 ( ctx, off);./*
6280: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b all SSL bug work
6290: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 arounds */. S
62a0: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f SL_CTX_sess_set_
62b0: 63 61 63 68 65 5f 73 69 7a 65 28 20 63 74 78 2c cache_size( ctx,
62c0: 20 31 32 38 29 3b 0a 0a 20 20 20 20 69 66 20 28 128);.. if (
62d0: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 ciphers != NULL)
62e0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 ..SSL_CTX_set_ci
62f0: 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 pher_list(ctx, c
6300: 69 70 68 65 72 73 29 3b 0a 0a 20 20 20 20 2f 2a iphers);.. /*
6310: 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 set some callba
6320: 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 cks */. SSL_C
6330: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 TX_set_default_p
6340: 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 asswd_cb(ctx, Pa
6350: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b sswordCallback);
6360: 0a 0a 23 69 66 6e 64 65 66 20 42 53 41 46 45 0a ..#ifndef BSAFE.
6370: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
6380: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 default_passwd_c
6390: 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 b_userdata(ctx,
63a0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
63b0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 );.#endif..#ifnd
63c0: 65 66 20 4e 4f 5f 44 48 0a 20 20 20 20 7b 0a 09 ef NO_DH. {..
63d0: 44 48 2a 20 64 68 20 3d 20 67 65 74 5f 64 68 35 DH* dh = get_dh5
63e0: 31 32 28 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 12();..SSL_CTX_s
63f0: 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 et_tmp_dh(ctx, d
6400: 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29 h);..DH_free(dh)
6410: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a ;. }.#endif..
6420: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 /* set our c
6430: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 ertificate */.
6440: 20 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 if (cert != NU
6450: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 53 74 72 69 LL) {..Tcl_DStri
6460: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a 20 20 ngInit(&ds);..
6470: 20 20 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 if (SSL_CT
6480: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
6490: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 e_file(ctx, F2N(
64a0: 20 63 65 72 74 2c 20 26 64 73 29 2c 0a 09 09 09 cert, &ds),....
64b0: 09 09 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 ..SSL_FILETYPE_P
64c0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 EM) <= 0) {..
64d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
64e0: 28 26 64 73 29 3b 0a 20 20 20 20 20 20 20 20 20 (&ds);.
64f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
6500: 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 20 ult(interp,.
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6520: 20 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 "unable
6530: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 to set certific
6540: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 ate file ", cert
6550: 2c 20 22 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 , ": ",.
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6570: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 REASON(), (
6580: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 char *) NULL);.
6590: 20 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43 SSL_C
65a0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 20 20 TX_free(ctx);.
65b0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
65c0: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 (SSL_CTX *)0;.
65d0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 }..
65e0: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 /* get the pri
65f0: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 vate key associa
6600: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 ted with this ce
6610: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 rtificate */.
6620: 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 if (key ==
6630: 4e 55 4c 4c 29 20 6b 65 79 3d 63 65 72 74 3b 0a NULL) key=cert;.
6640: 0a 20 20 20 20 20 20 20 20 69 66 20 28 53 53 4c . if (SSL
6650: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 _CTX_use_Private
6660: 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 Key_file(ctx, F2
6670: 4e 28 20 6b 65 79 2c 20 26 64 73 29 2c 0a 09 09 N( key, &ds),...
6680: 09 09 09 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ...SSL_FILETYPE_
6690: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 PEM) <= 0) {..
66a0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
66b0: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 2f 2a 20 e(&ds);.. /*
66c0: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 flush the passph
66d0: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 rase which might
66e0: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 be left in the
66f0: 72 65 73 75 6c 74 20 2a 2f 0a 09 20 20 20 20 54 result */.. T
6700: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
6710: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 erp, NULL, TCL_S
6720: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 TATIC);.
6730: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
6740: 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 sult(interp,.
6750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6760: 20 20 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c "unabl
6770: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 e to set public
6780: 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 2c key file ", key,
6790: 20 22 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 " ",.
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
67b0: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 REASON(), (ch
67c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 ar *) NULL);.
67d0: 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43 54 58 SSL_CTX
67e0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 20 20 20 20 _free(ctx);.
67f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 return (
6800: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 SSL_CTX *)0;.
6810: 20 20 20 20 20 7d 0a 09 54 63 6c 5f 44 53 74 72 }..Tcl_DStr
6820: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 ingFree(&ds);.
6830: 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 /* Now we
6840: 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 know that a key
6850: 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 and cert have be
6860: 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 20 en set against.
6870: 20 20 20 20 20 20 20 20 2a 20 74 68 65 20 53 53 * the SS
6880: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 L context */.
6890: 20 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 if (!SSL_CT
68a0: 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f X_check_private_
68b0: 6b 65 79 28 63 74 78 29 29 20 7b 0a 20 20 20 20 key(ctx)) {.
68c0: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 Tcl_Appe
68d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
68e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70 "p
6900: 72 69 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 rivate key does
6910: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 not match the ce
6920: 72 74 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 rtificate public
6930: 20 6b 65 79 22 2c 0a 20 20 20 20 20 20 20 20 20 key",.
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6950: 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (char *) NUL
6960: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 L);.
6970: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
6980: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 );. r
6990: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
69a0: 29 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 )0;. }.
69b0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 } else {.
69c0: 20 20 20 63 65 72 74 20 3d 20 28 63 68 61 72 2a cert = (char*
69d0: 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c )X509_get_defaul
69e0: 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a t_cert_file();..
69f0: 20 20 20 20 20 20 20 20 69 66 20 28 53 53 4c 5f if (SSL_
6a00: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
6a10: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 ate_file(ctx, ce
6a20: 72 74 2c 0a 09 09 09 09 09 53 53 4c 5f 46 49 4c rt,......SSL_FIL
6a30: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 ETYPE_PEM) <= 0)
6a40: 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 {.#if 0.. Tc
6a50: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
6a60: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 s);.
6a70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
6a80: 28 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 20 (interp,.
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6aa0: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f "unable to
6ab0: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 use default cer
6ac0: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c tificate file ",
6ad0: 20 63 65 72 74 2c 20 22 3a 20 22 2c 0a 20 20 20 cert, ": ",.
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6af0: 20 20 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e REASON
6b00: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
6b10: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 L);.
6b20: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
6b30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 );. r
6b40: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
6b50: 29 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 )0;.#endif.
6b60: 20 20 20 7d 0a 20 20 20 20 7d 0a 09 0a 20 20 20 }. }...
6b70: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
6b80: 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 (&ds);. Tcl_D
6b90: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 StringInit(&ds1)
6ba0: 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 ;. if (!SSL_C
6bb0: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c TX_load_verify_l
6bc0: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 ocations(ctx, F2
6bd0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 N(CAfile, &ds),
6be0: 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 F2N(CAdir, &ds1)
6bf0: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 21 53 53 ) ||. !SS
6c00: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
6c10: 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 t_verify_paths(c
6c20: 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 tx)) {.#if 0..Tc
6c30: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
6c40: 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 s);..Tcl_DString
6c50: 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 Free(&ds1);../*
6c60: 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 Don't currently
6c70: 63 61 72 65 20 69 66 20 74 68 69 73 20 66 61 69 care if this fai
6c80: 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e ls */..Tcl_Appen
6c90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
6ca0: 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 "SSL default ver
6cb0: 69 66 79 20 70 61 74 68 73 3a 20 22 2c 0a 09 09 ify paths: ",...
6cc0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
6cd0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 *) NULL);..SSL_C
6ce0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 TX_free(ctx);..r
6cf0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
6d00: 29 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d )0;.#endif. }
6d10: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
6d20: 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 _client_CA_list(
6d30: 63 74 78 2c 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c ctx, SSL_load_cl
6d40: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 20 46 32 ient_CA_file( F2
6d50: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 20 29 N(CAfile, &ds) )
6d60: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 );.. Tcl_DStr
6d70: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 ingFree(&ds);.
6d80: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
6d90: 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 e(&ds1);. ret
6da0: 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a urn ctx;.}.../*.
6db0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6df0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 -----. *. * Stat
6e00: 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 usObjCmd -- retu
6e10: 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66 rn certificate f
6e20: 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 or connected pee
6e30: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
6e40: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
6e50: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
6e60: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
6e70: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ec0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
6ed0: 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 63 6c .StatusObjCmd(cl
6ee0: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 ientData, interp
6ef0: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 , objc, objv).
6f00: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ClientData cli
6f10: 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 entData;./* Not
6f20: 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c used. */. Tcl
6f30: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b _Interp *interp;
6f40: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 . int objc;.
6f50: 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e 53 Tcl_Obj.*CONS
6f60: 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 T objv[];.{.
6f70: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
6f80: 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b . X509 *peer;
6f90: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 . Tcl_Obj *ob
6fa0: 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 jPtr;. Tcl_Ch
6fb0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 annel chan;.
6fc0: 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d char *channelNam
6fd0: 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 e, *ciphers;.
6fe0: 20 69 6e 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 int mode;..
6ff0: 73 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a switch (objc) {.
7000: 09 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63 68 .case 2:.. ch
7010: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f annelName = Tcl_
7020: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
7030: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b (objv[1], NULL);
7040: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 .. break;...c
7050: 61 73 65 20 33 3a 0a 09 20 20 20 20 69 66 20 28 ase 3:.. if (
7060: 21 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 74 !strcmp (Tcl_Get
7070: 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 String (objv[1])
7080: 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 , "-local")) {..
7090: 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 .channelName = T
70a0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
70b0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c Obj(objv[2], NUL
70c0: 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 L);...break;..
70d0: 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65 }.. /* else
70e0: 20 66 61 6c 6c 2e 2e 2e 20 2a 2f 0a 09 64 65 66 fall... */..def
70f0: 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57 ault:.. Tcl_W
7100: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
7110: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d rp, 1, objv, "?-
7120: 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 local? channel")
7130: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
7140: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
7150: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
7160: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
7170: 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 , channelName, &
7180: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 mode);. if (c
7190: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
71a0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
71b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
71c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 68 }. if (ch
71d0: 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e annelTypeVersion
71e0: 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f == TLS_CHANNEL_
71f0: 56 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 2f 2a VERSION_2) {../*
7200: 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 .. * Make sure t
7210: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
7220: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
7230: 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 .. */..chan = Tc
7240: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
7250: 63 68 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 chan);. }.
7260: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
7270: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
7280: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
7290: 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 54 63 ()) {. Tc
72a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
72b0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e nterp, "bad chan
72c0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 nel \"", Tcl_Get
72d0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
72e0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ),.
72f0: 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c "\": not a TL
7300: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c S channel", NULL
7310: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 );. retur
7320: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
7330: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 }. statePtr.
7340: 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f = (State *) Tcl_
7350: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
7360: 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 ceData(chan);.
7370: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 if (objc == 2)
7380: 0a 09 70 65 65 72 09 3d 20 53 53 4c 5f 67 65 74 ..peer.= SSL_get
7390: 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 _peer_certificat
73a0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
73b0: 3b 0a 20 20 20 20 65 6c 73 65 0a 09 70 65 65 72 ;. else..peer
73c0: 09 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 .= SSL_get_certi
73d0: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d ficate(statePtr-
73e0: 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 70 >ssl);. if (p
73f0: 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d eer) {..objPtr =
7400: 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 Tls_NewX509Obj(
7410: 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 20 interp, peer);.
7420: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a } else {..obj
7430: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
7440: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 tObj(0, NULL);.
7450: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 }.. Tcl_Li
7460: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
7470: 6e 74 20 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 nt (interp, objP
7480: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
7490: 53 74 72 69 6e 67 4f 62 6a 20 28 22 73 62 69 74 StringObj ("sbit
74a0: 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 s", -1));. Tc
74b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
74c0: 6c 65 6d 65 6e 74 20 28 69 6e 74 65 72 70 2c 20 lement (interp,
74d0: 6f 62 6a 50 74 72 2c 0a 09 20 20 20 20 54 63 6c objPtr,.. Tcl
74e0: 5f 4e 65 77 49 6e 74 4f 62 6a 20 28 53 53 4c 5f _NewIntObj (SSL_
74f0: 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 20 get_cipher_bits
7500: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
7510: 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63 69 NULL)));.. ci
7520: 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 phers = (char*)S
7530: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 SL_get_cipher(st
7540: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
7550: 20 20 69 66 20 28 63 69 70 68 65 72 73 20 21 3d if (ciphers !=
7560: 20 4e 55 4c 4c 20 26 26 20 73 74 72 63 6d 70 28 NULL && strcmp(
7570: 63 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e 45 29 ciphers, "(NONE)
7580: 22 29 21 3d 30 29 20 7b 0a 09 54 63 6c 5f 4c 69 ")!=0) {..Tcl_Li
7590: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
75a0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
75b0: 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 r,...Tcl_NewStri
75c0: 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22 2c 20 ngObj("cipher",
75d0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f -1));..Tcl_ListO
75e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
75f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a interp, objPtr,.
7600: 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f ..Tcl_NewStringO
7610: 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 bj(SSL_get_ciphe
7620: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 r(statePtr->ssl)
7630: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 , -1));. }.
7640: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
7650: 6c 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 lt( interp, objP
7660: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
7670: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
7680: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
7690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76c0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 ----. *. * Versi
76d0: 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 onObjCmd -- retu
76e0: 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e rn version strin
76f0: 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a g from OpenSSL..
7700: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
7710: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
7720: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
7730: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
7740: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
7750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
7790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 */.static int.Ve
77a0: 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 63 6c 69 65 rsionObjCmd(clie
77b0: 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 ntData, interp,
77c0: 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 objc, objv).
77d0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
77e0: 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 tData;./* Not us
77f0: 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 ed. */. Tcl_I
7800: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 nterp *interp;.
7810: 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 int objc;.
7820: 20 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e 53 54 20 Tcl_Obj.*CONST
7830: 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63 objv[];.{. Tc
7840: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a l_Obj *objPtr;..
7850: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
7860: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 _NewStringObj(OP
7870: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 ENSSL_VERSION_TE
7880: 58 54 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 XT, -1);.. Tc
7890: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
78a0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
78b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
78c0: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7910: 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d *. * Tls_Free -
7920: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
7930: 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 cedure cleans up
7940: 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b when a SSL sock
7950: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
7960: 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e . *.is closed an
7970: 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 d its reference
7980: 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f count falls belo
7990: 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 w 1. *. * Result
79a0: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.none. *. *
79b0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
79c0: 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 *.Frees all the
79d0: 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d state. *. *-----
79e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
7a20: 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 */.void.Tls_Free
7a30: 28 20 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 ( char *blockPtr
7a40: 20 29 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a ).{. State *
7a50: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
7a60: 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 e *)blockPtr;..
7a70: 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 Tls_Clean(sta
7a80: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f tePtr);. Tcl_
7a90: 46 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a Free(blockPtr);.
7aa0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
7ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
7af0: 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a * Tls_Clean --.
7b00: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
7b10: 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 dure cleans up w
7b20: 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
7b30: 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
7b40: 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 *.is closed and
7b50: 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f its reference co
7b60: 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 unt falls below
7b70: 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 1. This should.
7b80: 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e *.be called syn
7b90: 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 chronously by th
7ba0: 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 e CloseProc, not
7bb0: 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 in the. *.Event
7bc0: 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 uallyFree callba
7bd0: 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ck.. *. * Result
7be0: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.none. *. *
7bf0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
7c00: 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 *.Frees all the
7c10: 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d state. *. *-----
7c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
7c60: 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 43 6c 65 61 */.void.Tls_Clea
7c70: 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 n(State *statePt
7c80: 72 29 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 r).{. /*.
7c90: 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e * we're assumin
7ca0: 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72 g here that we'r
7cb0: 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 e single-threade
7cc0: 64 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 d. */.. i
7cd0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d f (statePtr->tim
7ce0: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 er != (Tcl_Timer
7cf0: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 Token) NULL) {..
7d00: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 Tcl_DeleteTimerH
7d10: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d andler(statePtr-
7d20: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 >timer);..stateP
7d30: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c tr->timer = NULL
7d40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
7d50: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 (statePtr->ssl)
7d60: 7b 0a 09 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 {..SSL_shutdown(
7d70: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
7d80: 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 .SSL_free(stateP
7d90: 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 tr->ssl);..state
7da0: 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b Ptr->ssl = NULL;
7db0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
7dc0: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a tatePtr->ctx) {.
7dd0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 .SSL_CTX_free(st
7de0: 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 atePtr->ctx);..s
7df0: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e tatePtr->ctx = N
7e00: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
7e10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c f (statePtr->cal
7e20: 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 lback) {..Tcl_De
7e30: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
7e40: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
7e50: 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 .statePtr->callb
7e60: 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ack = NULL;.
7e70: 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
7e80: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a tr->password) {.
7e90: 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
7ea0: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 t(statePtr->pass
7eb0: 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 word);..statePtr
7ec0: 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c ->password = NUL
7ed0: 4c 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a L;. }.}.../*.
7ee0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
7ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f20: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
7f30: 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Init --. *. *.Th
7f40: 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 is is a package
7f50: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 initialization p
7f60: 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 rocedure, which
7f70: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 is called. *.by
7f80: 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 Tcl when this pa
7f90: 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 ckage is to be a
7fa0: 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 dded to an inter
7fb0: 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 preter.. *. * Re
7fc0: 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 sults: Ssl conf
7fd0: 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 igured and loade
7fe0: 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 d. *. * Side eff
7ff0: 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 ects:. *. create
8000: 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 the ssl command
8010: 2c 20 69 6e 69 74 69 61 6c 69 73 65 20 73 73 6c , initialise ssl
8020: 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d context. *. *--
8030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8070: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6c 73 5f 49 -. */..int.Tls_I
8080: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a nit(Tcl_Interp *
8090: 69 6e 74 65 72 70 29 09 09 2f 2a 20 49 6e 74 65 interp)../* Inte
80a0: 72 70 72 65 74 65 72 20 69 6e 20 77 68 69 63 68 rpreter in which
80b0: 20 74 68 65 20 70 61 63 6b 61 67 65 20 69 73 0a the package is.
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
80e0: 20 20 20 20 20 20 20 20 20 2a 20 74 6f 20 62 65 * to be
80f0: 20 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65 2e made available.
8100: 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 6d 61 */.{. int ma
8110: 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 70 61 74 63 jor, minor, patc
8120: 68 6c 65 76 65 6c 2c 20 72 65 6c 65 61 73 65 2c hlevel, release,
8130: 20 69 3b 0a 20 20 20 20 63 68 61 72 20 72 6e 64 i;. char rnd
8140: 5f 73 65 65 64 5b 31 36 5d 20 3d 20 22 47 72 7a _seed[16] = "Grz
8150: 53 6c 70 6c 4b 71 55 64 6e 6e 7a 50 21 22 3b 09 SlplKqUdnnzP!";.
8160: 2f 2a 20 31 36 20 62 79 74 65 73 20 2a 2f 0a 0a /* 16 bytes */..
8170: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 /*. * Th
8180: 65 20 6f 72 69 67 69 6e 61 6c 20 38 2e 32 2e 30 e original 8.2.0
8190: 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c stacked channel
81a0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 implementation
81b0: 28 61 6e 64 20 74 68 65 20 70 61 74 63 68 0a 20 (and the patch.
81c0: 20 20 20 20 2a 20 74 68 61 74 20 70 72 65 63 65 * that prece
81d0: 64 65 64 20 69 74 29 20 68 61 64 20 70 72 6f 62 ded it) had prob
81e0: 6c 65 6d 73 20 77 69 74 68 20 73 63 61 6c 61 62 lems with scalab
81f0: 69 6c 69 74 79 20 61 6e 64 20 72 6f 62 75 73 74 ility and robust
8200: 6e 65 73 73 2e 0a 20 20 20 20 20 2a 20 54 68 65 ness.. * The
8210: 73 65 20 77 65 72 65 20 61 64 64 72 65 73 73 20 se were address
8220: 69 6e 20 38 2e 33 2e 32 20 2f 20 38 2e 34 61 32 in 8.3.2 / 8.4a2
8230: 2c 20 73 6f 20 77 65 20 6e 6f 77 20 72 65 71 75 , so we now requ
8240: 69 72 65 20 74 68 61 74 20 61 73 20 61 0a 20 20 ire that as a.
8250: 20 20 20 2a 20 6d 69 6e 69 6d 75 6d 20 66 6f 72 * minimum for
8260: 20 54 4c 53 20 31 2e 34 2b 2e 20 20 57 65 20 6f TLS 1.4+. We o
8270: 6e 6c 79 20 73 75 70 70 6f 72 74 20 38 2e 32 2b nly support 8.2+
8280: 20 6e 6f 77 20 28 38 2e 33 2e 32 2b 20 70 72 65 now (8.3.2+ pre
8290: 66 65 72 72 65 64 29 2e 0a 20 20 20 20 20 2a 2f ferred).. */
82a0: 0a 20 20 20 20 69 66 20 28 0a 23 69 66 64 65 66 . if (.#ifdef
82b0: 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 09 USE_TCL_STUBS..
82c0: 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e Tcl_InitStubs(in
82d0: 74 65 72 70 2c 20 22 38 2e 32 22 2c 20 30 29 0a terp, "8.2", 0).
82e0: 23 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 67 52 65 #else..Tcl_PkgRe
82f0: 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 quire(interp, "T
8300: 63 6c 22 2c 20 22 38 2e 32 22 2c 20 30 29 0a 23 cl", "8.2", 0).#
8310: 65 6e 64 69 66 0a 09 3d 3d 20 4e 55 4c 4c 29 20 endif..== NULL)
8320: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e {. return
8330: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8340: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
8350: 20 47 65 74 20 74 68 65 20 76 65 72 73 69 6f 6e Get the version
8360: 20 73 6f 20 77 65 20 63 61 6e 20 72 75 6e 74 69 so we can runti
8370: 6d 65 20 73 77 69 74 63 68 20 6f 6e 20 61 76 61 me switch on ava
8380: 69 6c 61 62 6c 65 20 66 75 6e 63 74 69 6f 6e 61 ilable functiona
8390: 6c 69 74 79 2e 0a 20 20 20 20 20 2a 20 54 4c 53 lity.. * TLS
83a0: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 6f should really o
83b0: 6e 6c 79 20 62 65 20 75 73 65 64 20 69 6e 20 38 nly be used in 8
83c0: 2e 33 2e 32 2b 2c 20 62 75 74 20 74 68 65 20 6f .3.2+, but the o
83d0: 74 68 65 72 20 77 6f 72 6b 73 20 66 6f 72 0a 20 ther works for.
83e0: 20 20 20 20 2a 20 73 6f 6d 65 20 6c 69 6d 69 74 * some limit
83f0: 65 64 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 ed functionality
8400: 2c 20 73 6f 20 61 6e 20 61 74 74 65 6d 70 74 20 , so an attempt
8410: 61 74 20 73 75 70 70 6f 72 74 20 69 73 20 6d 61 at support is ma
8420: 64 65 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 de.. */.
8430: 54 63 6c 5f 47 65 74 56 65 72 73 69 6f 6e 28 26 Tcl_GetVersion(&
8440: 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f 72 2c 20 26 major, &minor, &
8450: 70 61 74 63 68 6c 65 76 65 6c 2c 20 26 72 65 6c patchlevel, &rel
8460: 65 61 73 65 29 3b 0a 20 20 20 20 69 66 20 28 28 ease);. if ((
8470: 6d 61 6a 6f 72 20 3e 20 38 29 20 7c 7c 20 28 28 major > 8) || ((
8480: 6d 61 6a 6f 72 20 3d 3d 20 38 29 20 26 26 20 28 major == 8) && (
8490: 28 6d 69 6e 6f 72 20 3e 20 33 29 20 7c 7c 20 28 (minor > 3) || (
84a0: 28 6d 69 6e 6f 72 20 3d 3d 20 33 29 20 26 26 0a (minor == 3) &&.
84b0: 09 20 20 20 20 28 72 65 6c 65 61 73 65 20 3d 3d . (release ==
84c0: 20 54 43 4c 5f 46 49 4e 41 4c 5f 52 45 4c 45 41 TCL_FINAL_RELEA
84d0: 53 45 29 20 26 26 20 28 70 61 74 63 68 6c 65 76 SE) && (patchlev
84e0: 65 6c 20 3e 3d 20 32 29 29 29 29 29 20 7b 0a 09 el >= 2))))) {..
84f0: 2f 2a 20 38 2e 33 2e 32 2b 20 2a 2f 0a 09 63 68 /* 8.3.2+ */..ch
8500: 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e annelTypeVersion
8510: 20 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 = TLS_CHANNEL_V
8520: 45 52 53 49 4f 4e 5f 32 3b 0a 20 20 20 20 7d 20 ERSION_2;. }
8530: 65 6c 73 65 20 7b 0a 09 2f 2a 20 38 2e 32 2e 30 else {../* 8.2.0
8540: 20 2d 20 38 2e 33 2e 31 20 2a 2f 0a 09 63 68 61 - 8.3.1 */..cha
8550: 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 nnelTypeVersion
8560: 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 = TLS_CHANNEL_VE
8570: 52 53 49 4f 4e 5f 31 3b 0a 20 20 20 20 7d 0a 0a RSION_1;. }..
8580: 20 20 20 20 69 66 20 28 53 53 4c 5f 6c 69 62 72 if (SSL_libr
8590: 61 72 79 5f 69 6e 69 74 28 29 20 21 3d 20 31 29 ary_init() != 1)
85a0: 20 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 {. Tcl_A
85b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
85c0: 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 rp, "could not i
85d0: 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 nitialize SSL li
85e0: 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 brary", NULL);..
85f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
8600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f ;. }. SSL_
8610: 6c 6f 61 64 5f 65 72 72 6f 72 5f 73 74 72 69 6e load_error_strin
8620: 67 73 28 29 3b 0a 20 20 20 20 45 52 52 5f 6c 6f gs();. ERR_lo
8630: 61 64 5f 63 72 79 70 74 6f 5f 73 74 72 69 6e 67 ad_crypto_string
8640: 73 28 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 s();.. /*.
8650: 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e * Seed the ran
8660: 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 dom number gener
8670: 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 ator in the SSL
8680: 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 library,. *
8690: 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 using the do/whi
86a0: 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 le construct bec
86b0: 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 ause of the bug
86c0: 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 note in the.
86d0: 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 * OpenSSL FAQ a
86e0: 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 t http://www.ope
86f0: 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 nssl.org/support
8700: 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a /faq.html#USER1.
8710: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 *. * Th
8720: 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 e crux of the pr
8730: 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f oblem is that So
8740: 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 laris 7 does not
8750: 20 68 61 76 65 20 61 20 0a 20 20 20 20 20 2a 20 have a . *
8760: 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f /dev/random or /
8770: 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 dev/urandom devi
8780: 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 ce so it cannot
8790: 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 gather enough.
87a0: 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f * entropy fro
87b0: 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 m the RAND_seed(
87c0: 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 ) when TLS initi
87d0: 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 alizes and refus
87e0: 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 es. * to go
87f0: 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 further. Earlier
8800: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 versions of Ope
8810: 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 nSSL carried on
8820: 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 regardless..
8830: 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 */. srand((u
8840: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d nsigned int) tim
8850: 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c e((time_t *) NUL
8860: 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 L));. do {..f
8870: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 or (i = 0; i < 1
8880: 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6; i++) {.. r
8890: 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b nd_seed[i] = 1 +
88a0: 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a (char) (255.0 *
88b0: 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 rand()/(RAND_MA
88c0: 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e X+1.0));..}..RAN
88d0: 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c D_seed(rnd_seed,
88e0: 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 sizeof(rnd_seed
88f0: 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 ));. } while
8900: 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 (RAND_status() !
8910: 3d 20 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 = 1);.. Tcl_C
8920: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
8930: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 interp, "tls::ci
8940: 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f phers", CiphersO
8950: 62 6a 43 6d 64 2c 0a 09 20 20 20 20 28 43 6c 69 bjCmd,.. (Cli
8960: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
8970: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
8980: 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 ) NULL);.. Tc
8990: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
89a0: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
89b0: 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e :handshake", Han
89c0: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 0a 09 20 dshakeObjCmd,..
89d0: 20 20 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 (ClientData)
89e0: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
89f0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
8a00: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
8a10: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
8a20: 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c , "tls::import",
8a30: 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 0a 09 ImportObjCmd,..
8a40: 20 20 20 20 28 43 6c 69 65 6e 74 44 61 74 61 29 (ClientData)
8a50: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
8a60: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
8a70: 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 .. Tcl_Create
8a80: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
8a90: 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 p, "tls::status"
8aa0: 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 0a , StatusObjCmd,.
8ab0: 09 20 20 20 20 28 43 6c 69 65 6e 74 44 61 74 61 . (ClientData
8ac0: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
8ad0: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
8ae0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 ;.. Tcl_Creat
8af0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
8b00: 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f rp, "tls::versio
8b10: 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d n", VersionObjCm
8b20: 64 2c 0a 09 20 20 20 20 28 43 6c 69 65 6e 74 44 d,.. (ClientD
8b30: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
8b40: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
8b50: 4c 4c 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e LL);.. return
8b60: 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 Tcl_PkgProvide(
8b70: 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 45 2c interp, PACKAGE,
8b80: 20 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0c 0a 2f VERSION);.}.../
8b90: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
8ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
8bd0: 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d *.Tls_SafeInit -
8be0: 2d 0a 20 2a 0a 20 2a 09 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 2a 0a 20 2a 09 53 74 61 --------*. *.Sta
8c20: 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 ndard procedure
8c30: 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 required by 'loa
8c40: 64 27 2e 20 0a 20 2a 09 49 6e 69 74 69 61 6c 69 d'. . *.Initiali
8c50: 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 zes this extensi
8c60: 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e on for a safe in
8c70: 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d terpreter.. *.--
8c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
8cb0: 20 2a 0a 20 2a 09 53 69 64 65 65 66 66 65 63 74 *. *.Sideeffect
8cc0: 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c s:. *..As of 'Tl
8cd0: 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 s_Init'. *. *.Re
8ce0: 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e sult:. *..A stan
8cf0: 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 dard Tcl error c
8d00: 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ode.. *. *------
8d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d40: 2a 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6c 73 5f 53 *. */..int.Tls_S
8d50: 61 66 65 49 6e 69 74 20 28 54 63 6c 5f 49 6e 74 afeInit (Tcl_Int
8d60: 65 72 70 2a 20 69 6e 74 65 72 70 29 0a 7b 0a 20 erp* interp).{.
8d70: 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 49 6e return Tls_In
8d80: 69 74 20 28 69 6e 74 65 72 70 29 3b 0a 7d 0a it (interp);.}.