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: 0a 20 2a 20 24 48 65 61 64 65 72 3a 20 2f 68 6f . * $Header: /ho
0050: 6d 65 2f 72 6b 65 65 6e 65 2f 74 6d 70 2f 63 76 me/rkeene/tmp/cv
0060: 73 32 66 6f 73 73 69 6c 2f 2e 2e 2f 74 63 6c 74 s2fossil/../tclt
0070: 6c 73 2f 74 6c 73 2f 74 6c 73 2f 74 6c 73 2e 63 ls/tls/tls/tls.c
0080: 2c 76 20 31 2e 35 20 32 30 30 30 2f 30 36 2f 30 ,v 1.5 2000/06/0
0090: 36 20 30 31 3a 30 34 3a 33 35 20 73 74 61 6e 74 6 01:04:35 stant
00a0: 6f 6e 20 45 78 70 20 24 0a 20 2a 0a 20 2a 20 54 on Exp $. *. * T
00b0: 4c 53 20 28 61 6b 61 20 53 53 4c 29 20 43 68 61 LS (aka SSL) Cha
00c0: 6e 6e 65 6c 20 2d 20 63 61 6e 20 62 65 20 6c 61 nnel - can be la
00d0: 79 65 72 65 64 20 6f 6e 20 61 6e 79 20 62 69 2d yered on any bi-
00e0: 64 69 72 65 63 74 69 6f 6e 61 6c 0a 20 2a 20 54 directional. * T
00f0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 28 4e 6f 74 65 cl_Channel (Note
0100: 3a 20 52 65 71 75 69 72 65 73 20 54 72 66 20 43 : Requires Trf C
0110: 6f 72 65 20 50 61 74 63 68 29 0a 20 2a 0a 20 2a ore Patch). *. *
0120: 20 54 68 69 73 20 77 61 73 20 62 75 69 6c 74 20 This was built
0130: 28 61 6c 6d 6f 73 74 29 20 66 72 6f 6d 20 73 63 (almost) from sc
0140: 72 61 74 63 68 20 62 61 73 65 64 20 75 70 6f 6e ratch based upon
0150: 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 6f 66 0a observation of.
0160: 20 2a 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 32 * OpenSSL 0.9.2
0170: 42 0a 20 2a 0a 20 2a 20 41 64 64 69 74 69 6f 6e B. *. * Addition
0180: 20 63 72 65 64 69 74 20 69 73 20 64 75 65 20 66 credit is due f
0190: 6f 72 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 or Andreas Kupri
01a0: 65 73 20 28 61 2e 6b 75 70 72 69 65 73 40 77 65 es (a.kupries@we
01b0: 73 74 65 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a stend.com), for.
01c0: 20 2a 20 70 72 6f 76 69 64 69 6e 67 20 74 68 65 * providing the
01d0: 20 54 63 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e Tcl_ReplaceChan
01e0: 6e 65 6c 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e nel mechanism an
01f0: 64 20 77 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c d working closel
0200: 79 20 77 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 y with me. * to
0210: 65 6e 68 61 6e 63 65 20 69 74 20 74 6f 20 73 75 enhance it to su
0220: 70 70 6f 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 pport full filee
0230: 76 65 6e 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a vent semantics..
0240: 20 2a 0a 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 *. * Also work
0250: 64 6f 6e 65 20 62 79 20 74 68 65 20 66 6f 6c 6c done by the foll
0260: 6f 77 20 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 ow people provid
0270: 65 64 20 74 68 65 20 69 6d 70 65 74 75 73 20 74 ed the impetus t
0280: 6f 20 64 6f 20 74 68 69 73 20 22 72 69 67 68 74 o do this "right
0290: 22 3a 0a 20 2a 09 74 63 6c 53 53 4c 20 28 43 6f ":. *.tclSSL (Co
02a0: 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 lin McCormack, S
02b0: 68 61 72 65 64 20 54 65 63 68 6e 6f 6c 6f 67 79 hared Technology
02c0: 29 0a 20 2a 09 53 53 4c 74 63 6c 20 28 50 65 74 ). *.SSLtcl (Pet
02d0: 65 72 20 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a er Antman). *. *
02e0: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 /..#include "tls
02f0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 Int.h".#include
0300: 22 74 63 6c 4f 70 74 73 2e 68 22 0a 0a 2f 2a 0a "tclOpts.h"../*.
0310: 20 2a 20 45 78 74 65 72 6e 61 6c 20 66 75 6e 63 * External func
0320: 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a tions. */../*. *
0330: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 Forward declara
0340: 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69 tions. */..#defi
0350: 6e 65 20 46 32 4e 28 20 6b 65 79 2c 20 64 73 70 ne F2N( key, dsp
0360: 29 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20 ) \..(((key) ==
0370: 4e 55 4c 4c 29 3f 28 63 68 61 72 2a 29 4e 55 4c NULL)?(char*)NUL
0380: 4c 3a 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 L:Tcl_TranslateF
0390: 69 6c 65 4e 61 6d 65 28 20 69 6e 74 65 72 70 2c ileName( interp,
03a0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a (key), (dsp))).
03b0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29 #define REASON()
03c0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f .ERR_reason_erro
03d0: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74 r_string(ERR_get
03e0: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69 _error())..stati
03f0: 63 20 69 6e 74 09 43 69 70 68 65 72 73 4f 62 6a c int.CiphersObj
0400: 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 Cmd _ANSI_ARGS_
0410: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ((ClientData cli
0420: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
0430: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 erp *interp,....
0440: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c int objc, Tcl
0450: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 _Obj *CONST objv
0460: 5b 5d 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e []));..static in
0470: 74 09 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d t.HandshakeObjCm
0480: 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 d _ANSI_ARGS_ ((
0490: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
04a0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
04b0: 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 p *interp,....
04c0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
04d0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d bj *CONST objv[]
04e0: 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 ));..static int.
04f0: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 5f 41 4e ImportObjCmd _AN
0500: 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e SI_ARGS_ ((Clien
0510: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
0520: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
0530: 74 65 72 70 2c 0a 09 09 09 20 20 20 69 6e 74 20 terp,.... int
0540: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 objc, Tcl_Obj *C
0550: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a ONST objv[]));..
0560: 73 74 61 74 69 63 20 69 6e 74 09 53 74 61 74 75 static int.Statu
0570: 73 4f 62 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 sObjCmd _ANSI_AR
0580: 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 GS_ ((ClientData
0590: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
05a0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
05b0: 0a 09 09 09 20 20 20 69 6e 74 20 6f 62 6a 63 2c .... int objc,
05c0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 Tcl_Obj *CONST
05d0: 6f 62 6a 76 5b 5d 29 29 3b 0a 73 74 61 74 69 63 objv[]));.static
05e0: 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e SSL_CTX *CTX_In
05f0: 69 74 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 it _ANSI_ARGS_((
0600: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
0610: 72 70 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 rp, int proto, c
0620: 68 61 72 20 2a 6b 65 79 2c 0a 09 09 09 20 20 20 har *key,....
0630: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 63 68 61 char *cert, cha
0640: 72 20 2a 43 41 64 69 72 2c 20 63 68 61 72 20 2a r *CAdir, char *
0650: 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 CAfile, char *ci
0660: 70 68 65 72 73 29 29 3b 0a 0a 23 64 65 66 69 6e phers));..#defin
0670: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 e TLS_PROTO_SSL2
0680: 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20 54 4c .0x01.#define TL
0690: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 30 78 30 S_PROTO_SSL3.0x0
06a0: 32 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 2.#define TLS_PR
06b0: 4f 54 4f 5f 54 4c 53 31 09 30 78 30 34 0a 23 64 OTO_TLS1.0x04.#d
06c0: 65 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c efine ENABLED(fl
06d0: 61 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 ag, mask).(((fla
06e0: 67 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 g) & (mask)) ==
06f0: 28 6d 61 73 6b 29 29 0a 2f 2a 0a 20 2a 20 53 74 (mask))./*. * St
0700: 61 74 69 63 20 64 61 74 61 20 73 74 72 75 63 74 atic data struct
0710: 75 72 65 73 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 ures. */..#ifnde
0720: 66 20 4e 4f 5f 44 48 0a 2f 2a 20 66 72 6f 6d 20 f NO_DH./* from
0730: 6f 70 65 6e 73 73 6c 2f 61 70 70 73 2f 73 5f 73 openssl/apps/s_s
0740: 65 72 76 65 72 2e 63 20 2a 2f 0a 0a 73 74 61 74 erver.c */..stat
0750: 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ic unsigned char
0760: 20 64 68 35 31 32 5f 70 5b 5d 3d 7b 0a 20 20 20 dh512_p[]={.
0770: 20 20 20 20 20 30 78 44 41 2c 30 78 35 38 2c 30 0xDA,0x58,0
0780: 78 33 43 2c 30 78 31 36 2c 30 78 44 39 2c 30 78 x3C,0x16,0xD9,0x
0790: 38 35 2c 30 78 32 32 2c 30 78 38 39 2c 30 78 44 85,0x22,0x89,0xD
07a0: 30 2c 30 78 45 34 2c 30 78 41 46 2c 30 78 37 35 0,0xE4,0xAF,0x75
07b0: 2c 0a 20 20 20 20 20 20 20 20 30 78 36 46 2c 30 ,. 0x6F,0
07c0: 78 34 43 2c 30 78 43 41 2c 30 78 39 32 2c 30 78 x4C,0xCA,0x92,0x
07d0: 44 44 2c 30 78 34 42 2c 30 78 45 35 2c 30 78 33 DD,0x4B,0xE5,0x3
07e0: 33 2c 30 78 42 38 2c 30 78 30 34 2c 30 78 46 42 3,0xB8,0x04,0xFB
07f0: 2c 30 78 30 46 2c 0a 20 20 20 20 20 20 20 20 30 ,0x0F,. 0
0800: 78 45 44 2c 30 78 39 34 2c 30 78 45 46 2c 30 78 xED,0x94,0xEF,0x
0810: 39 43 2c 30 78 38 41 2c 30 78 34 34 2c 30 78 30 9C,0x8A,0x44,0x0
0820: 33 2c 30 78 45 44 2c 30 78 35 37 2c 30 78 34 36 3,0xED,0x57,0x46
0830: 2c 30 78 35 30 2c 30 78 44 33 2c 0a 20 20 20 20 ,0x50,0xD3,.
0840: 20 20 20 20 30 78 36 39 2c 30 78 39 39 2c 30 78 0x69,0x99,0x
0850: 44 42 2c 30 78 32 39 2c 30 78 44 37 2c 30 78 37 DB,0x29,0xD7,0x7
0860: 36 2c 30 78 32 37 2c 30 78 36 42 2c 30 78 41 32 6,0x27,0x6B,0xA2
0870: 2c 30 78 44 33 2c 30 78 44 34 2c 30 78 31 32 2c ,0xD3,0xD4,0x12,
0880: 0a 20 20 20 20 20 20 20 20 30 78 45 32 2c 30 78 . 0xE2,0x
0890: 31 38 2c 30 78 46 34 2c 30 78 44 44 2c 30 78 31 18,0xF4,0xDD,0x1
08a0: 45 2c 30 78 30 38 2c 30 78 34 43 2c 30 78 46 36 E,0x08,0x4C,0xF6
08b0: 2c 30 78 44 38 2c 30 78 30 30 2c 30 78 33 45 2c ,0xD8,0x00,0x3E,
08c0: 30 78 37 43 2c 0a 20 20 20 20 20 20 20 20 30 78 0x7C,. 0x
08d0: 34 37 2c 30 78 37 34 2c 30 78 45 38 2c 30 78 33 47,0x74,0xE8,0x3
08e0: 33 2c 0a 20 20 20 20 20 20 20 20 7d 3b 0a 73 74 3,. };.st
08f0: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 atic unsigned ch
0900: 61 72 20 64 68 35 31 32 5f 67 5b 5d 3d 7b 0a 09 ar dh512_g[]={..
0910: 30 78 30 32 2c 0a 7d 3b 0a 0a 73 74 61 74 69 63 0x02,.};..static
0920: 20 44 48 20 2a 67 65 74 5f 64 68 35 31 32 28 29 DH *get_dh512()
0930: 0a 7b 0a 20 20 20 20 44 48 20 2a 64 68 3d 4e 55 .{. DH *dh=NU
0940: 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 28 64 68 LL;.. if ((dh
0950: 3d 44 48 5f 6e 65 77 28 29 29 20 3d 3d 20 4e 55 =DH_new()) == NU
0960: 4c 4c 29 20 72 65 74 75 72 6e 28 4e 55 4c 4c 29 LL) return(NULL)
0970: 3b 0a 0a 20 20 20 20 64 68 2d 3e 70 3d 42 4e 5f ;.. dh->p=BN_
0980: 62 69 6e 32 62 6e 28 64 68 35 31 32 5f 70 2c 73 bin2bn(dh512_p,s
0990: 69 7a 65 6f 66 28 64 68 35 31 32 5f 70 29 2c 4e izeof(dh512_p),N
09a0: 55 4c 4c 29 3b 0a 20 20 20 20 64 68 2d 3e 67 3d ULL);. dh->g=
09b0: 42 4e 5f 62 69 6e 32 62 6e 28 64 68 35 31 32 5f BN_bin2bn(dh512_
09c0: 67 2c 73 69 7a 65 6f 66 28 64 68 35 31 32 5f 67 g,sizeof(dh512_g
09d0: 29 2c 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 ),NULL);.. if
09e0: 20 28 28 64 68 2d 3e 70 20 3d 3d 20 4e 55 4c 4c ((dh->p == NULL
09f0: 29 20 7c 7c 20 28 64 68 2d 3e 67 20 3d 3d 20 4e ) || (dh->g == N
0a00: 55 4c 4c 29 29 0a 09 72 65 74 75 72 6e 28 4e 55 ULL))..return(NU
0a10: 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 LL);. return(
0a20: 64 68 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a dh);.}.#endif...
0a30: 2f 2a 0a 20 2a 20 57 65 20 6c 6f 73 65 20 74 68 /*. * We lose th
0a40: 65 20 74 63 6c 20 70 61 73 73 77 6f 72 64 20 63 e tcl password c
0a50: 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 77 65 20 allback when we
0a60: 75 73 65 20 74 68 65 20 52 53 41 20 42 53 41 46 use the RSA BSAF
0a70: 45 20 53 53 4c 2d 43 20 31 2e 31 2e 32 0a 20 2a E SSL-C 1.1.2. *
0a80: 20 6c 69 62 72 61 72 69 65 73 20 69 6e 73 74 65 libraries inste
0a90: 61 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e ad of the curren
0aa0: 74 20 4f 70 65 6e 53 53 4c 20 6c 69 62 72 61 72 t OpenSSL librar
0ab0: 69 65 73 2e 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 ies.. */..#ifdef
0ac0: 20 42 53 41 46 45 0a 23 64 65 66 69 6e 65 20 50 BSAFE.#define P
0ad0: 52 45 5f 4f 50 45 4e 53 53 4c 5f 30 5f 39 5f 34 RE_OPENSSL_0_9_4
0ae0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 1.#endif../*. *
0af0: 20 50 65 72 20 4f 70 65 6e 53 53 4c 20 30 2e 39 Per OpenSSL 0.9
0b00: 2e 34 20 43 6f 6d 70 61 74 0a 20 2a 2f 0a 0a 23 .4 Compat. */..#
0b10: 69 66 6e 64 65 66 20 53 54 41 43 4b 5f 4f 46 0a ifndef STACK_OF.
0b20: 23 64 65 66 69 6e 65 20 53 54 41 43 4b 5f 4f 46 #define STACK_OF
0b30: 28 78 29 09 09 09 53 54 41 43 4b 0a 23 64 65 66 (x)...STACK.#def
0b40: 69 6e 65 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 ine sk_SSL_CIPHE
0b50: 52 5f 6e 75 6d 28 73 6b 29 09 09 73 6b 5f 6e 75 R_num(sk)..sk_nu
0b60: 6d 28 28 73 6b 29 29 0a 23 64 65 66 69 6e 65 20 m((sk)).#define
0b70: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 sk_SSL_CIPHER_va
0b80: 6c 75 65 28 20 73 6b 2c 20 69 6e 64 65 78 29 09 lue( sk, index).
0b90: 28 53 53 4c 5f 43 49 50 48 45 52 2a 29 73 6b 5f (SSL_CIPHER*)sk_
0ba0: 76 61 6c 75 65 28 28 73 6b 29 2c 20 28 69 6e 64 value((sk), (ind
0bb0: 65 78 29 29 0a 23 65 6e 64 69 66 0a 0a 0c 0a 2f ex)).#endif..../
0bc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e -------. *. * In
0c10: 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a foCallback --. *
0c20: 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 4c . *.monitors SSL
0c30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 connection proc
0c40: 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ess. *. * Result
0c50: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
0c60: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
0c70: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
0c80: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cd0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 ---. */.static v
0ce0: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b oid.InfoCallback
0cf0: 28 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 (SSL *ssl, int w
0d00: 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 0a 7b here, int ret).{
0d10: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
0d20: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 ePtr = (State*)S
0d30: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_get_app_data(
0d40: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 ssl);. Tcl_Ob
0d50: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
0d60: 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 har *major; char
0d70: 20 2a 6d 69 6e 6f 72 3b 0a 20 20 20 20 69 6e 74 *minor;. int
0d80: 20 77 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 w;.. if (sta
0d90: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
0da0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
0db0: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 L)..return;..
0dc0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
0dd0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
0de0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
0df0: 0a 23 69 66 20 30 0a 20 20 20 20 69 66 20 28 77 .#if 0. if (w
0e00: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c here & SSL_CB_AL
0e10: 45 52 54 29 20 7b 0a 09 73 65 76 20 3d 20 53 53 ERT) {..sev = SS
0e20: 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 L_alert_type_str
0e30: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 09 ing_long(ret);..
0e40: 69 66 20 28 73 74 72 63 6d 70 28 20 73 65 76 2c if (strcmp( sev,
0e50: 20 22 66 61 74 61 6c 22 29 3d 3d 30 29 20 7b 09 "fatal")==0) {.
0e60: 2f 2a 20 4d 61 70 20 74 6f 20 65 72 72 6f 72 20 /* Map to error
0e70: 2a 2f 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f */.. Tls_Erro
0e80: 72 28 73 74 61 74 65 50 74 72 2c 20 53 53 4c 5f r(statePtr, SSL_
0e90: 45 52 52 4f 52 28 73 73 6c 2c 20 30 29 29 3b 0a ERROR(ssl, 0));.
0ea0: 09 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 7d 0a . return;..}.
0eb0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 }.#endif.
0ec0: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
0ed0: 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 _CB_HANDSHAKE_ST
0ee0: 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 ART) {..major =
0ef0: 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 "handshake";..mi
0f00: 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 nor = "start";.
0f10: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 } else if (wh
0f20: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e ere & SSL_CB_HAN
0f30: 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 DSHAKE_DONE) {..
0f40: 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 major = "handsha
0f50: 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 ke";..minor = "d
0f60: 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 one";. } else
0f70: 20 7b 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 {..if (where &
0f80: 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d SSL_CB_ALERT)..m
0f90: 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a ajor = "alert";.
0fa0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
0fb0: 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 & SSL_ST_CONNECT
0fc0: 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 ).major = "conne
0fd0: 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 ct";..else if (w
0fe0: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 here & SSL_ST_AC
0ff0: 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 CEPT)..major = "
1000: 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 accept";..else..
1010: 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e ...major = "unkn
1020: 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 own";...if (wher
1030: 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 e & SSL_CB_READ)
1040: 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 ..minor = "read"
1050: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1060: 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 e & SSL_CB_WRITE
1070: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 )..minor = "writ
1080: 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 e";..else if (wh
1090: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f ere & SSL_CB_LOO
10a0: 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f P)..minor = "loo
10b0: 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 p";..else if (wh
10c0: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 ere & SSL_CB_EXI
10d0: 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 T)..minor = "exi
10e0: 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 t";..else.....mi
10f0: 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b nor = "unknown";
1100: 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 54 63 6c . }... Tcl
1110: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1120: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d ement( statePtr-
1130: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c >interp, cmdPtr,
1140: 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 .. Tcl_NewSt
1150: 72 69 6e 67 4f 62 6a 28 20 22 69 6e 66 6f 22 2c ringObj( "info",
1160: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1));.. Tcl_
1170: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1180: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e ment( statePtr->
1190: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
11a0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
11b0: 69 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43 ingObj( Tcl_GetC
11c0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
11d0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20 Ptr->self), -1)
11e0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
11f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1200: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ( statePtr->inte
1210: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
1220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1230: 6a 28 20 6d 61 6a 6f 72 2c 20 2d 31 29 20 29 3b j( major, -1) );
1240: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
1250: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 jAppendElement(
1260: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1270: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
1280: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1290: 20 6d 69 6e 6f 72 2c 20 2d 31 29 20 29 3b 0a 0a minor, -1) );..
12a0: 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 if (where &
12b0: 28 53 53 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c (SSL_CB_LOOP|SSL
12c0: 5f 43 42 5f 45 58 49 54 29 29 20 7b 0a 09 54 63 _CB_EXIT)) {..Tc
12d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
12e0: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 lement( statePtr
12f0: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
1300: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
1310: 72 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 73 74 61 ringObj( SSL_sta
1320: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 te_string_long(s
1330: 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20 20 20 sl), -1) );.
1340: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 } else if (where
1350: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 & SSL_CB_ALERT)
1360: 20 7b 0a 09 63 68 61 72 20 2a 63 70 20 3d 20 53 {..char *cp = S
1370: 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 SL_alert_desc_st
1380: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a ring_long(ret);.
1390: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
13a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 endElement( stat
13b0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d ePtr->interp, cm
13c0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
13d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 63 70 2c ewStringObj( cp,
13e0: 20 2d 31 29 20 29 3b 0a 20 20 20 20 7d 20 65 6c -1) );. } el
13f0: 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 se {..Tcl_ListOb
1400: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 jAppendElement(
1410: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1420: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
1430: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1440: 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e SSL_state_strin
1450: 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 g_long(ssl), -1)
1460: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 );. }. Tc
1470: 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c 69 l_Preserve( (Cli
1480: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
1490: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 r->interp);.
14a0: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 Tcl_Preserve( (C
14b0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
14c0: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 Ptr);.. Tcl_I
14d0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d 64 ncrRefCount( cmd
14e0: 50 74 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 Ptr);. (void)
14f0: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 4f Tcl_GlobalEvalO
1500: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 bj(statePtr->int
1510: 65 72 70 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 erp, cmdPtr);.
1520: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
1530: 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a 20 20 nt( cmdPtr);..
1540: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 Tcl_Release( (
1550: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
1560: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 ePtr);. Tcl_R
1570: 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74 44 elease( (ClientD
1580: 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 ata) statePtr->i
1590: 6e 74 65 72 70 29 3b 0a 0a 7d 0a 0c 0a 2f 2a 0a nterp);..}.../*.
15a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 -----. *. * Veri
15f0: 66 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a fyCallback --. *
1600: 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 4c . *.monitors SSL
1610: 20 63 65 72 69 66 69 63 61 74 65 20 76 61 6c 69 cerificate vali
1620: 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 dation process.
1630: 2a 09 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 *.This is called
1640: 20 77 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 whenever a cert
1650: 69 66 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 ificate is inspe
1660: 63 74 65 64 0a 20 2a 09 20 6f 72 20 64 65 63 69 cted. *. or deci
1670: 64 65 64 20 69 6e 76 61 6c 69 64 0a 20 2a 0a 20 ded invalid. *.
1680: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6f 6b * Results:. *.ok
1690: 20 2d 20 6c 65 74 20 53 53 4c 20 68 61 6e 64 6c - let SSL handl
16a0: 65 20 69 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 e it. *. * Side
16b0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 effects:. *.The
16c0: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 err field of the
16d0: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 currently opera
16e0: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 tive State is se
16f0: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 t. *. to a stri
1700: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 ng describing th
1710: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f e SSL negotiatio
1720: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e n failure reason
1730: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
1780: 63 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c c int.VerifyCall
1790: 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 back(int ok, X50
17a0: 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 9_STORE_CTX *ctx
17b0: 29 0a 7b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c ).{. SSL *ssl
17c0: 20 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 = (SSL*)X509_ST
17d0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 61 70 70 5f ORE_CTX_get_app_
17e0: 64 61 74 61 28 63 74 78 29 3b 0a 20 20 20 20 58 data(ctx);. X
17f0: 35 30 39 20 2a 63 65 72 74 20 3d 20 58 35 30 39 509 *cert = X509
1800: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 _STORE_CTX_get_c
1810: 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 urrent_cert(ctx)
1820: 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 ;. State *sta
1830: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
1840: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 SSL_get_app_data
1850: 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f (ssl);. Tcl_O
1860: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
1870: 69 6e 74 20 64 65 70 74 68 20 3d 20 58 35 30 39 int depth = X509
1880: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 _STORE_CTX_get_e
1890: 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b rror_depth(ctx);
18a0: 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 58 . int err = X
18b0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 509_STORE_CTX_ge
18c0: 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 20 20 t_error(ctx);.
18d0: 20 20 63 68 61 72 20 2a 65 72 72 53 74 72 3b 0a char *errStr;.
18e0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 . dprintf(std
18f0: 65 72 72 2c 20 22 56 65 72 69 66 79 3a 20 25 64 err, "Verify: %d
1900: 5c 6e 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 \n", ok);.. i
1910: 66 20 28 21 6f 6b 29 0a 09 65 72 72 53 74 72 20 f (!ok)..errStr
1920: 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 = (char*)X509_ve
1930: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f rify_cert_error_
1940: 73 74 72 69 6e 67 28 65 72 72 29 3b 0a 20 20 20 string(err);.
1950: 20 65 6c 73 65 0a 09 65 72 72 53 74 72 20 3d 20 else..errStr =
1960: 28 63 68 61 72 20 2a 29 30 3b 0a 0a 20 20 20 20 (char *)0;..
1970: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
1980: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f llback == (Tcl_O
1990: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 bj*)NULL) {..if
19a0: 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 (statePtr->vflag
19b0: 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 s & SSL_VERIFY_F
19c0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 AIL_IF_NO_PEER_C
19d0: 45 52 54 29 0a 09 20 20 20 20 72 65 74 75 72 6e ERT).. return
19e0: 20 6f 6b 3b 0a 09 65 6c 73 65 0a 09 20 20 20 20 ok;..else..
19f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a return 1;. }.
1a00: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
1a10: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
1a20: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
1a30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
1a40: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1a50: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ( statePtr->inte
1a60: 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 20 rp, cmdPtr, ..
1a70: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
1a80: 62 6a 28 20 22 76 65 72 69 66 79 22 2c 20 2d 31 bj( "verify", -1
1a90: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 ));.. Tcl_Lis
1aa0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1ab0: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 t( statePtr->int
1ac0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 erp, cmdPtr, ..
1ad0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
1ae0: 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43 68 61 6e Obj( Tcl_GetChan
1af0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
1b00: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20 29 3b 0a ->self), -1) );.
1b10: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1b20: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 AppendElement( s
1b30: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
1b40: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
1b50: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 20 64 65 70 l_NewIntObj( dep
1b60: 74 68 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f th) );.. Tcl_
1b70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1b80: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e ment( statePtr->
1b90: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
1ba0: 09 20 20 20 20 54 6c 73 5f 4e 65 77 58 35 30 39 . Tls_NewX509
1bb0: 4f 62 6a 28 20 73 74 61 74 65 50 74 72 2d 3e 69 Obj( statePtr->i
1bc0: 6e 74 65 72 70 2c 20 63 65 72 74 29 20 29 3b 0a nterp, cert) );.
1bd0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1be0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 AppendElement( s
1bf0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
1c00: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
1c10: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 20 6f 6b 29 l_NewIntObj( ok)
1c20: 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 );.. Tcl_Lis
1c30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1c40: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 t( statePtr->int
1c50: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
1c60: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
1c70: 62 6a 28 20 65 72 72 53 74 72 20 3f 20 65 72 72 bj( errStr ? err
1c80: 53 74 72 20 3a 20 22 22 2c 20 2d 31 29 20 29 3b Str : "", -1) );
1c90: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
1ca0: 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 ve( (ClientData)
1cb0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
1cc0: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 p);. Tcl_Pres
1cd0: 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 erve( (ClientDat
1ce0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
1cf0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
1d00: 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 20 20 unt( cmdPtr);.
1d10: 20 20 69 66 20 28 54 63 6c 5f 47 6c 6f 62 61 6c if (Tcl_Global
1d20: 45 76 61 6c 4f 62 6a 28 73 74 61 74 65 50 74 72 EvalObj(statePtr
1d30: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
1d40: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
1d50: 2f 2a 20 69 74 20 67 6f 74 20 61 6e 20 65 72 72 /* it got an err
1d60: 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20 or - reject the
1d70: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
1d80: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 Tcl_BackgroundEr
1d90: 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d 3e 69 ror( statePtr->i
1da0: 6e 74 65 72 70 29 3b 0a 09 6f 6b 20 3d 20 30 3b nterp);..ok = 0;
1db0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 . } else {..i
1dc0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
1dd0: 6d 4f 62 6a 28 20 73 74 61 74 65 50 74 72 2d 3e mObj( statePtr->
1de0: 69 6e 74 65 72 70 2c 0a 09 09 20 20 20 20 54 63 interp,... Tc
1df0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 20 l_GetObjResult(
1e00: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1e10: 29 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c 5f 4f ), &ok) != TCL_O
1e20: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 42 61 K) {.. Tcl_Ba
1e30: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 20 73 ckgroundError( s
1e40: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 tatePtr->interp)
1e50: 3b 0a 09 20 20 20 20 6f 6b 20 3d 20 30 3b 0a 09 ;.. ok = 0;..
1e60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f }. }. Tcl_
1e70: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d DecrRefCount( cm
1e80: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f dPtr);.. Tcl_
1e90: 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74 Release( (Client
1ea0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
1eb0: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
1ec0: 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 ( (ClientData) s
1ed0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 tatePtr->interp)
1ee0: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b ;.. return(ok
1ef0: 29 3b 09 2f 2a 20 6c 65 61 76 65 20 74 68 65 20 );./* leave the
1f00: 64 69 73 70 6f 73 69 74 69 6f 6e 20 61 73 20 53 disposition as S
1f10: 53 4c 20 73 65 74 20 69 74 20 2a 2f 0a 7d 0a 0c SL set it */.}..
1f20: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
1f70: 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a Tls_Error --. *.
1f80: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
1f90: 6b 20 77 69 74 68 20 24 66 64 20 61 6e 64 20 24 k with $fd and $
1fa0: 6d 73 67 20 2d 20 73 6f 20 74 68 65 20 63 61 6c msg - so the cal
1fb0: 6c 62 61 63 6b 20 63 61 6e 20 64 65 63 69 64 65 lback can decide
1fc0: 0a 20 2a 09 77 68 61 74 20 74 6f 20 64 6f 20 77 . *.what to do w
1fd0: 69 74 68 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 ith errors.. *.
1fe0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6f 6b * Results:. *.ok
1ff0: 20 2d 20 6c 65 74 20 53 53 4c 20 68 61 6e 64 6c - let SSL handl
2000: 65 20 69 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 e it. *. * Side
2010: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 effects:. *.The
2020: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 err field of the
2030: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 currently opera
2040: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 tive State is se
2050: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 t. *. to a stri
2060: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 ng describing th
2070: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f e SSL negotiatio
2080: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e n failure reason
2090: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a ------. */.void.
20e0: 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 Tls_Error(State
20f0: 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 *statePtr, char
2100: 2a 6d 73 67 29 0a 7b 0a 20 20 20 20 54 63 6c 5f *msg).{. Tcl_
2110: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 0a 20 20 Obj *cmdPtr;..
2120: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73 if (msg && *ms
2130: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 g) {..Tcl_SetErr
2140: 6f 72 43 6f 64 65 28 20 73 74 61 74 65 50 74 72 orCode( statePtr
2150: 2d 3e 69 6e 74 65 72 70 2c 20 22 53 53 4c 22 2c ->interp, "SSL",
2160: 20 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e 55 msg, (char *)NU
2170: 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 LL);. } else
2180: 7b 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 {..msg = Tcl_Get
2190: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
21a0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 73 l_GetObjResult(s
21b0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 tatePtr->interp)
21c0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 , NULL);. }.
21d0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 statePtr->err
21e0: 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66 20 = msg;.. if
21f0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
2200: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
2210: 29 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 )NULL) {..char b
2220: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70 72 uf[BUFSIZ];..spr
2230: 69 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20 63 intf(buf, "SSL c
2240: 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20 65 hannel \"%s\": e
2250: 72 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20 20 rror: %s",..
2260: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
2270: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
2280: 66 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f 53 f), msg);..Tcl_S
2290: 65 74 52 65 73 75 6c 74 28 20 73 74 61 74 65 50 etResult( stateP
22a0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 62 75 66 2c tr->interp, buf,
22b0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a TCL_VOLATILE);.
22c0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
22d0: 72 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d 3e rror( statePtr->
22e0: 69 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e interp);..return
22f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 ;. }. cmdP
2300: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
2310: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
2320: 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 callback);..
2330: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2340: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 dElement( stateP
2350: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
2360: 74 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 tr, .. Tcl_Ne
2370: 77 53 74 72 69 6e 67 4f 62 6a 28 20 22 65 72 72 wStringObj( "err
2380: 6f 72 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 or", -1));..
2390: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
23a0: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 dElement( stateP
23b0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
23c0: 74 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 tr, .. Tcl_Ne
23d0: 77 53 74 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f wStringObj( Tcl_
23e0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
23f0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
2400: 2d 31 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1) );.. Tcl_
2410: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2420: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e ment( statePtr->
2430: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
2440: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
2450: 6e 67 4f 62 6a 28 20 6d 73 67 2c 20 2d 31 29 20 ngObj( msg, -1)
2460: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
2470: 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 erve( (ClientDat
2480: 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 a) statePtr->int
2490: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 erp);. Tcl_Pr
24a0: 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 eserve( (ClientD
24b0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
24c0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
24d0: 43 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a Count( cmdPtr);.
24e0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 6c 6f 62 if (Tcl_Glob
24f0: 61 6c 45 76 61 6c 4f 62 6a 28 73 74 61 74 65 50 alEvalObj(stateP
2500: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
2510: 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b tr) != TCL_OK) {
2520: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
2530: 45 72 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d Error( statePtr-
2540: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a >interp);. }.
2550: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2560: 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a ount( cmdPtr);..
2570: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
2580: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 (ClientData) st
2590: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c atePtr);. Tcl
25a0: 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e _Release( (Clien
25b0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d tData) statePtr-
25c0: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a >interp);.}.../*
25d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
25e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
25f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2610: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 ------. *. * Pas
2620: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 20 2d 2d swordCallback --
2630: 20 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 . *. *.Called w
2640: 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 69 hen a password i
2650: 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e 70 61 s needed to unpa
2660: 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d 20 6b ck RSA and PEM k
2670: 65 79 73 0a 20 2a 09 45 76 61 6c 73 20 74 68 65 eys. *.Evals the
2680: 20 74 63 6c 20 70 72 6f 63 3a 20 20 74 6c 73 3a tcl proc: tls:
2690: 3a 70 61 73 73 77 6f 72 64 20 61 6e 64 20 72 65 :password and re
26a0: 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 turns the result
26b0: 20 61 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77 as. *.the passw
26c0: 6f 72 64 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ord. *----------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 ---------. */.#i
2710: 66 64 65 66 20 50 52 45 5f 4f 50 45 4e 53 53 4c fdef PRE_OPENSSL
2720: 5f 30 5f 39 5f 34 0a 2f 2a 0a 20 2a 20 4e 6f 20 _0_9_4./*. * No
2730: 77 61 79 20 74 6f 20 68 61 6e 64 6c 65 20 75 73 way to handle us
2740: 65 72 2d 64 61 74 61 20 74 68 65 72 65 66 6f 72 er-data therefor
2750: 65 20 6e 6f 20 77 61 79 20 77 69 74 68 6f 75 74 e no way without
2760: 20 61 20 67 6c 6f 62 61 6c 0a 20 2a 20 76 61 72 a global. * var
2770: 69 61 62 6c 65 20 74 6f 20 61 63 63 65 73 73 20 iable to access
2780: 74 68 65 20 54 63 6c 20 69 6e 74 65 72 70 72 65 the Tcl interpre
2790: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ter..*/.static i
27a0: 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 nt.PasswordCallb
27b0: 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 ack(char *buf, i
27c0: 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 72 nt size, int ver
27d0: 69 66 79 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 ify).{. retur
27e0: 6e 20 2d 31 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74 n -1;.}.#else.st
27f0: 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 atic int.Passwor
2800: 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a dCallback(char *
2810: 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 buf, int size, i
2820: 6e 74 20 76 65 72 69 66 79 2c 20 76 6f 69 64 20 nt verify, void
2830: 2a 75 64 61 74 61 29 0a 7b 0a 20 20 20 20 54 63 *udata).{. Tc
2840: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
2850: 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 = (Tcl_Interp*)
2860: 75 64 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 udata;.. if (
2870: 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c Tcl_Eval(interp,
2880: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 "tls::password"
2890: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) == TCL_OK) {..
28a0: 63 68 61 72 20 2a 72 65 74 20 3d 20 54 63 6c 5f char *ret = Tcl_
28b0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 GetStringResult(
28c0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 20 interp);.
28d0: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 strncpy(buf, re
28e0: 74 2c 20 73 69 7a 65 29 3b 0a 09 72 65 74 75 72 t, size);..retur
28f0: 6e 20 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 20 n strlen(ret);.
2900: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 74 } else {..ret
2910: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 7d 0a urn -1;. }.}.
2920: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2970: 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f -. *. * CiphersO
2980: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 bjCmd -- list av
2990: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a ailable ciphers.
29a0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
29b0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
29c0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
29d0: 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f tls::ciphers" co
29e0: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 mmand. *.to list
29f0: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
2a00: 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 rs, based upon p
2a10: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
2a20: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
2a30: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
2a40: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a cl result list..
2a50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
2a60: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 ts:. *.construct
2a70: 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 s and destroys S
2a80: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 SL context (CTX)
2a90: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
2ae0: 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 atic int.Ciphers
2af0: 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 ObjCmd(clientDat
2b00: 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c a, interp, objc,
2b10: 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e objv). Clien
2b20: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
2b30: 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a ;./* Not used. *
2b40: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 /. Tcl_Interp
2b50: 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e *interp;. in
2b60: 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f t objc;. Tcl_
2b70: 4f 62 6a 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b Obj.*CONST objv[
2b80: 5d 3b 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20 ];.{. static
2b90: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b char *protocols[
2ba0: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 0a 09 ] = {.."ssl2",..
2bb0: 22 73 73 6c 33 22 2c 0a 09 22 74 6c 73 31 22 2c "ssl3",.."tls1",
2bc0: 0a 09 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20 ..NULL. };.
2bd0: 20 20 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 enum protocol
2be0: 7b 0a 09 54 4c 53 5f 53 53 4c 32 2c 0a 09 54 4c {..TLS_SSL2,..TL
2bf0: 53 5f 53 53 4c 33 2c 0a 09 54 4c 53 5f 54 4c 53 S_SSL3,..TLS_TLS
2c00: 31 2c 0a 09 54 4c 53 5f 4e 4f 4e 45 0a 20 20 20 1,..TLS_NONE.
2c10: 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 };. Tcl_Obj
2c20: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 53 53 4c *objPtr;. SSL
2c30: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
2c40: 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d ;. SSL *ssl =
2c50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b NULL;. STACK
2c60: 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20 _OF(SSL_CIPHER)
2c70: 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 *sk;. char *c
2c80: 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a p, buf[BUFSIZ];.
2c90: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 int index, v
2ca0: 65 72 62 6f 73 65 20 3d 20 30 3b 0a 0a 20 20 20 erbose = 0;..
2cb0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c if (objc < 2 ||
2cc0: 20 6f 62 6a 63 20 3e 20 33 29 20 7b 0a 09 54 63 objc > 3) {..Tc
2cd0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
2ce0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
2cf0: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f "protocol ?verbo
2d00: 73 65 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 72 se?");. r
2d10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
2d20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 . }. if (T
2d30: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f cl_GetIndexFromO
2d40: 62 6a 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 bj( interp, objv
2d50: 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 [1], protocols,
2d60: 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 0a 09 "protocol", 0,..
2d70: 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f &index) != TCL_O
2d80: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
2d90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
2da0: 20 20 69 66 20 28 6f 62 6a 63 20 3e 20 32 20 26 if (objc > 2 &
2db0: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e & Tcl_GetBoolean
2dc0: 46 72 6f 6d 4f 62 6a 28 20 69 6e 74 65 72 70 2c FromObj( interp,
2dd0: 20 6f 62 6a 76 5b 32 5d 2c 0a 09 26 76 65 72 62 objv[2],..&verb
2de0: 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ose) != TCL_OK)
2df0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
2e00: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 ROR;. }. s
2e10: 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f witch ((enum pro
2e20: 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 20 tocol)index) {.
2e30: 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 case TLS_SSL2
2e40: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
2e50: 5f 53 53 4c 32 29 0a 09 09 54 63 6c 5f 41 70 70 _SSL2)...Tcl_App
2e60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
2e70: 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 , "protocol not
2e80: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
2e90: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
2ea0: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 63 ERROR;.#else...c
2eb0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
2ec0: 28 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29 (SSLv2_method())
2ed0: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
2ee0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c case TLS_SSL
2ef0: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 3:.#if defined(N
2f00: 4f 5f 53 53 4c 33 29 0a 09 09 54 63 6c 5f 41 70 O_SSL3)...Tcl_Ap
2f10: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
2f20: 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 p, "protocol not
2f30: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
2f40: 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c L);...return TCL
2f50: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 _ERROR;.#else...
2f60: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
2f70: 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 w(SSLv3_method()
2f80: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
2f90: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c . case TLS_TL
2fa0: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 S1:.#if defined(
2fb0: 4e 4f 5f 54 4c 53 31 29 0a 09 09 54 63 6c 5f 41 NO_TLS1)...Tcl_A
2fc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
2fd0: 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f rp, "protocol no
2fe0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
2ff0: 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 LL);...return TC
3000: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
3010: 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e .ctx = SSL_CTX_n
3020: 65 77 28 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 ew(TLSv1_method(
3030: 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 )); break;.#endi
3040: 66 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 f. }. if (
3050: 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ctx == NULL) {..
3060: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
3070: 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 (interp, REASON(
3080: 29 2c 0a 09 20 20 20 20 28 63 68 61 72 20 2a 29 ),.. (char *)
3090: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
30a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
30b0: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e . ssl = SSL_n
30c0: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20 ew(ctx);. if
30d0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
30e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
30f0: 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e t(interp, REASON
3100: 28 29 2c 0a 09 20 20 20 20 28 63 68 61 72 20 2a (),.. (char *
3110: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
3120: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
3130: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
3140: 20 20 20 20 7d 0a 20 20 20 20 6f 62 6a 50 74 72 }. objPtr
3150: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
3160: 6a 28 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 j( 0, NULL);..
3170: 20 20 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 if (!verbose)
3180: 7b 0a 09 66 6f 72 20 28 69 6e 64 65 78 20 3d 20 {..for (index =
3190: 30 3b 20 3b 20 69 6e 64 65 78 2b 2b 29 20 7b 0a 0; ; index++) {.
31a0: 09 20 20 20 20 63 70 20 3d 20 28 63 68 61 72 2a . cp = (char*
31b0: 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f )SSL_get_cipher_
31c0: 6c 69 73 74 28 20 73 73 6c 2c 20 69 6e 64 65 78 list( ssl, index
31d0: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 70 20 3d );.. if (cp =
31e0: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 = NULL) break;..
31f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3200: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e ppendElement( in
3210: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 terp, objPtr,...
3220: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
3230: 28 20 63 70 2c 20 2d 31 29 20 29 3b 0a 09 7d 0a ( cp, -1) );..}.
3240: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b } else {..sk
3250: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 = SSL_get_ciphe
3260: 72 73 28 73 73 6c 29 3b 0a 0a 09 66 6f 72 20 28 rs(ssl);...for (
3270: 69 6e 64 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 index = 0; index
3280: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 < sk_SSL_CIPHER
3290: 5f 6e 75 6d 28 73 6b 29 3b 20 69 6e 64 65 78 2b _num(sk); index+
32a0: 2b 29 20 7b 0a 09 20 20 20 20 72 65 67 69 73 74 +) {.. regist
32b0: 65 72 20 69 6e 74 20 69 3b 0a 09 20 20 20 20 53 er int i;.. S
32c0: 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 SL_CIPHER_descri
32d0: 70 74 69 6f 6e 28 20 73 6b 5f 53 53 4c 5f 43 49 ption( sk_SSL_CI
32e0: 50 48 45 52 5f 76 61 6c 75 65 28 20 73 6b 2c 20 PHER_value( sk,
32f0: 69 6e 64 65 78 29 2c 0a 09 09 09 09 20 20 20 20 index),.....
3300: 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 buf, sizeof(buf)
3310: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 20 3d );.. for (i =
3320: 20 73 74 72 6c 65 6e 28 62 75 66 29 20 2d 20 31 strlen(buf) - 1
3330: 3b 20 69 20 3b 20 69 2d 2d 29 20 7b 0a 09 09 69 ; i ; i--) {...i
3340: 66 20 28 62 75 66 5b 69 5d 20 3d 3d 20 27 20 27 f (buf[i] == ' '
3350: 20 7c 7c 20 62 75 66 5b 69 5d 20 3d 3d 20 27 5c || buf[i] == '\
3360: 6e 27 20 7c 7c 0a 09 09 20 20 20 20 62 75 66 5b n' ||... buf[
3370: 69 5d 20 3d 3d 20 27 5c 72 27 20 7c 7c 20 62 75 i] == '\r' || bu
3380: 66 5b 69 5d 20 3d 3d 20 27 5c 74 27 29 20 7b 0a f[i] == '\t') {.
3390: 09 09 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 27 .. buf[i] = '
33a0: 5c 30 27 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a \0';...} else {.
33b0: 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d .. break;...}
33c0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
33d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
33e0: 65 6d 65 6e 74 28 20 69 6e 74 65 72 70 2c 20 6f ement( interp, o
33f0: 62 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 bjPtr,...Tcl_New
3400: 53 74 72 69 6e 67 4f 62 6a 28 20 62 75 66 2c 20 StringObj( buf,
3410: 2d 31 29 20 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a -1) );..}. }.
3420: 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c SSL_free(ssl
3430: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 );. SSL_CTX_f
3440: 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 ree(ctx);.. T
3450: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
3460: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 interp, objPtr)
3470: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
3480: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34d0: 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b -. *. * Handshak
34e0: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a eObjCmd --. *. *
34f0: 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 .This command is
3500: 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 used to verify
3510: 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 whether the hand
3520: 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 shake is complet
3530: 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a e. *.or not.. *.
3540: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
3550: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
3560: 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 sult. 1 means ha
3570: 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 ndshake complete
3580: 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e , 0 means pendin
3590: 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 g.. *. * Side ef
35a0: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f fects:. *.May fo
35b0: 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 rce SSL negotiat
35c0: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 ion to take plac
35d0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
3620: 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 61 6e 64 .static int.Hand
3630: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 63 6c 69 65 shakeObjCmd(clie
3640: 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 ntData, interp,
3650: 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 objc, objv).
3660: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
3670: 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 tData;./* Not us
3680: 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 ed. */. Tcl_I
3690: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 nterp *interp;.
36a0: 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 int objc;.
36b0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 Tcl_Obj *CONST
36c0: 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63 objv[];.{. Tc
36d0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 l_Channel chan;.
36e0: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 ./* The channel
36f0: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e to set a mode on
3700: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a . */. State *
3710: 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c statePtr;../* cl
3720: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 ient state for s
3730: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 sl socket */.
3740: 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 0a 20 int ret = 1;..
3750: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 if (objc != 2
3760: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
3770: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
3780: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 objv, "channel"
3790: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 );. retur
37a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
37b0: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
37c0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
37d0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
37e0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
37f0: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 1], NULL), NULL)
3800: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
3810: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
3820: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 NULL) {.
3830: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
3840: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
3850: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
3860: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
3870: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
3880: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 . Tcl_App
3890: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
38a0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
38b0: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
38c0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 20 20 elName(chan),.
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c "\
38e0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
38f0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 nnel", NULL);.
3900: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c return TCL
3910: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
3920: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 statePtr = (St
3930: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
3940: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
3950: 28 20 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 ( chan);.. if
3960: 20 28 21 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 (!SSL_is_init_f
3970: 69 6e 69 73 68 65 64 28 73 74 61 74 65 50 74 72 inished(statePtr
3980: 2d 3e 73 73 6c 29 29 20 7b 0a 09 69 6e 74 20 65 ->ssl)) {..int e
3990: 72 72 3b 0a 09 72 65 74 20 3d 20 54 6c 73 5f 57 rr;..ret = Tls_W
39a0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 aitForConnect(st
39b0: 61 74 65 50 74 72 2c 20 26 65 72 72 29 3b 0a 09 atePtr, &err);..
39c0: 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 if (ret < 0) {..
39d0: 20 20 20 20 63 68 61 72 20 2a 65 72 72 53 74 72 char *errStr
39e0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 = statePtr->err
39f0: 3b 0a 09 20 20 20 20 54 63 6c 5f 52 65 73 65 74 ;.. Tcl_Reset
3a00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
3a10: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6e . Tcl_SetErrn
3a20: 6f 28 65 72 72 29 3b 0a 0a 09 20 20 20 20 69 66 o(err);... if
3a30: 20 28 21 65 72 72 53 74 72 20 7c 7c 20 2a 65 72 (!errStr || *er
3a40: 72 53 74 72 20 3d 3d 20 30 29 0a 09 20 20 20 20 rStr == 0)..
3a50: 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c errStr = Tcl
3a60: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 _PosixError(inte
3a70: 72 70 29 3b 0a 0a 09 20 20 20 20 54 63 6c 5f 41 rp);... Tcl_A
3a80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
3a90: 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 rp, "handshake f
3aa0: 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 ailed: ", errStr
3ab0: 2c 20 28 63 68 61 72 2a 29 4e 55 4c 4c 29 3b 0a , (char*)NULL);.
3ac0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
3ad0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
3ae0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
3af0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
3b00: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 _NewIntObj(ret))
3b10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
3b20: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b70: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 -. *. * ImportOb
3b80: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
3b90: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
3ba0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
3bb0: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d ss the "ssl" com
3bc0: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 mand. *. *.The s
3bd0: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 sl command pushe
3be0: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 s SSL over a (ne
3bf0: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 wly connected) t
3c00: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 cp socket. *. *
3c10: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
3c20: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
3c30: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
3c40: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f fects:. *.May mo
3c50: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f dify the behavio
3c60: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e r of an IO chann
3c70: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3cc0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 ..static int.Imp
3cd0: 6f 72 74 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74 ortObjCmd(client
3ce0: 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 Data, interp, ob
3cf0: 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c jc, objv). Cl
3d00: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
3d10: 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64 ata;./* Not used
3d20: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 . */. Tcl_Int
3d30: 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20 erp *interp;.
3d40: 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54 int objc;. T
3d50: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 cl_Obj *CONST ob
3d60: 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63 6c 5f jv[];.{. Tcl_
3d70: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
3d80: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
3d90: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 set a mode on.
3da0: 2a 2f 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b */. BIO *bio;
3db0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
3dc0: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 ePtr;../* client
3dd0: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
3de0: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c ocket */. SSL
3df0: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
3e00: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 ;. Tcl_Obj *s
3e10: 63 72 69 70 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 cript = NULL;.
3e20: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 69 int idx;. i
3e30: 6e 74 20 66 6c 61 67 73 20 3d 20 54 4c 53 5f 54 nt flags = TLS_T
3e40: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 CL_INIT;. int
3e50: 20 73 65 72 76 65 72 20 3d 20 30 3b 09 09 2f 2a server = 0;../*
3e60: 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 is connection i
3e70: 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f ncoming or outgo
3e80: 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 ing? */. char
3e90: 20 2a 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *key = NULL;.
3ea0: 20 20 63 68 61 72 20 2a 63 65 72 74 20 3d 20 4e char *cert = N
3eb0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 ULL;. char *c
3ec0: 69 70 68 65 72 73 20 3d 20 4e 55 4c 4c 3b 0a 20 iphers = NULL;.
3ed0: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 20 char *CAfile
3ee0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
3ef0: 20 2a 43 41 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a *CAdir = NULL;.
3f00: 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 20 char *model
3f10: 3d 20 4e 55 4c 4c 3b 0a 23 69 66 20 64 65 66 69 = NULL;.#if defi
3f20: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 ned(NO_SSL2).
3f30: 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 3b 0a 23 int ssl2 = 0;.#
3f40: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 73 73 6c else. int ssl
3f50: 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 2 = 1;.#endif.#i
3f60: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c f defined(NO_SSL
3f70: 33 29 0a 20 20 20 20 69 6e 74 20 73 73 6c 33 20 3). int ssl3
3f80: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 = 0;.#else. i
3f90: 6e 74 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e nt ssl3 = 1;.#en
3fa0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
3fb0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 NO_SSL2) && defi
3fc0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 ned(NO_SSL3).
3fd0: 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 3b 0a 23 int tls1 = 1;.#
3fe0: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 74 6c 73 else. int tls
3ff0: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 1 = 0;.#endif.
4000: 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 3b int proto = 0;
4010: 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 . int verify
4020: 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 = 0, require = 0
4030: 2c 20 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a , request = 1;..
4040: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
4050: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
4060: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
4070: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 objv, "channel
4080: 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 20 20 20 ?options?");.
4090: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f return TCL_
40a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
40b0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
40c0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
40d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
40e0: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 mObj(objv[1], NU
40f0: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 LL), NULL);.
4100: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
4110: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
4120: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e {. return
4130: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
4140: 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 }.. for (idx
4150: 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b = 2; idx < objc;
4160: 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 idx++) {..char
4170: 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 *opt = Tcl_GetSt
4180: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
4190: 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 [idx], NULL);...
41a0: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d if (opt[0] != '-
41b0: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a ').. break;..
41c0: 09 4f 50 54 53 54 52 28 20 22 2d 63 61 66 69 6c .OPTSTR( "-cafil
41d0: 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 e", CAfile);..OP
41e0: 54 53 54 52 28 20 22 2d 63 61 64 69 72 22 2c 20 TSTR( "-cadir",
41f0: 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 CAdir);..OPTSTR(
4200: 20 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 "-certfile", ce
4210: 72 74 29 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d rt);..OPTSTR( "-
4220: 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 cipher", ciphers
4230: 29 3b 0a 09 4f 50 54 4f 42 4a 28 20 22 2d 63 6f );..OPTOBJ( "-co
4240: 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b mmand", script);
4250: 0a 09 4f 50 54 53 54 52 28 20 22 2d 6b 65 79 66 ..OPTSTR( "-keyf
4260: 69 6c 65 22 2c 20 6b 65 79 29 3b 0a 09 4f 50 54 ile", key);..OPT
4270: 53 54 52 28 20 22 2d 6d 6f 64 65 6c 22 2c 20 6d STR( "-model", m
4280: 6f 64 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 odel);..OPTBOOL(
4290: 20 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 "-require", req
42a0: 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 uire);..OPTBOOL(
42b0: 20 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 "-request", req
42c0: 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 uest);..OPTBOOL(
42d0: 20 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 "-server", serv
42e0: 65 72 29 3b 0a 0a 09 4f 50 54 42 4f 4f 4c 28 20 er);...OPTBOOL(
42f0: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a "-ssl2", ssl2);.
4300: 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 73 73 6c 33 .OPTBOOL( "-ssl3
4310: 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f ", ssl3);..OPTBO
4320: 4f 4c 28 20 22 2d 74 6c 73 31 22 2c 20 74 6c 73 OL( "-tls1", tls
4330: 31 29 3b 0a 0a 09 4f 50 54 42 41 44 28 20 22 6f 1);...OPTBAD( "o
4340: 70 74 69 6f 6e 22 2c 20 22 2d 63 61 66 69 6c 65 ption", "-cafile
4350: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 65 72 74 66 , -cadir, -certf
4360: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 ile, -cipher, -c
4370: 6f 6d 6d 61 6e 64 2c 20 2d 6b 65 79 66 69 6c 65 ommand, -keyfile
4380: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 72 65 71 75 69 , -model, -requi
4390: 72 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 73 re, -request, -s
43a0: 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 73 65 72 sl2, -ssl3, -ser
43b0: 76 65 72 2c 20 6f 72 20 2d 74 6c 73 31 22 29 3b ver, or -tls1");
43c0: 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
43d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
43e0: 66 20 28 72 65 71 75 65 73 74 29 20 76 65 72 69 f (request) veri
43f0: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
4400: 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 _CLIENT_ONCE | S
4410: 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a SL_VERIFY_PEER;.
4420: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 if (request
4430: 26 26 20 72 65 71 75 69 72 65 29 20 76 65 72 69 && require) veri
4440: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
4450: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 _FAIL_IF_NO_PEER
4460: 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 76 _CERT;. if (v
4470: 65 72 69 66 79 20 3d 3d 20 30 29 20 76 65 72 69 erify == 0) veri
4480: 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f fy = SSL_VERIFY_
4490: 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f NONE;.. proto
44a0: 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f |= (ssl2 ? TLS_
44b0: 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b PROTO_SSL2 : 0);
44c0: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 . proto |= (s
44d0: 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f sl3 ? TLS_PROTO_
44e0: 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 SSL3 : 0);. p
44f0: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 roto |= (tls1 ?
4500: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a TLS_PROTO_TLS1 :
4510: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 0);.. /* res
4520: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c et to NULL if bl
4530: 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 ank string provi
4540: 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 ded */. if (c
4550: 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 20 63 ert && !*cert) c
4560: 65 72 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ert = NULL;.
4570: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 if (key && !*key
4580: 29 20 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ) key = NULL;.
4590: 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 if (ciphers &&
45a0: 20 21 2a 63 69 70 68 65 72 73 29 20 63 69 70 68 !*ciphers) ciph
45b0: 65 72 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ers = NULL;.
45c0: 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a if (CAfile && !*
45d0: 43 41 66 69 6c 65 29 20 43 41 66 69 6c 65 20 3d CAfile) CAfile =
45e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 NULL;. if (C
45f0: 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72 29 Adir && !*CAdir)
4600: 20 43 41 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a 0a CAdir = NULL;..
4610: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d if (model !=
4620: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f NULL) {..int mo
4630: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 de;../* Get the
4640: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 "model" context
4650: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 */..chan = Tcl_G
4660: 65 74 43 68 61 6e 6e 65 6c 28 20 69 6e 74 65 72 etChannel( inter
4670: 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 p, model, &mode)
4680: 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 ;..if (chan == (
4690: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 30 29 20 7b Tcl_Channel)0) {
46a0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
46b0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 69 66 20 28 _ERROR;..}..if (
46c0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
46d0: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
46e0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
46f0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
4700: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
4710: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
4720: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
4730: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 20 20 20 ame(chan),...
4740: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 "\": not a TLS
4750: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
4760: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
4770: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 73 74 61 74 _ERROR;..}..stat
4780: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
4790: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
47a0: 73 74 61 6e 63 65 44 61 74 61 28 20 63 68 61 6e stanceData( chan
47b0: 29 3b 0a 09 63 74 78 20 3d 20 73 74 61 74 65 50 );..ctx = stateP
47c0: 74 72 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 tr->ctx;. } e
47d0: 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 lse {..if ((ctx
47e0: 3d 20 43 54 58 5f 49 6e 69 74 28 20 69 6e 74 65 = CTX_Init( inte
47f0: 72 70 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 2c 20 rp, proto, key,
4800: 63 65 72 74 2c 20 43 41 64 69 72 2c 20 43 41 66 cert, CAdir, CAf
4810: 69 6c 65 2c 20 63 69 70 68 65 72 73 29 29 0a 09 ile, ciphers))..
4820: 20 20 20 20 3d 3d 20 28 53 53 4c 5f 43 54 58 2a == (SSL_CTX*
4830: 29 30 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 )0) {.. retur
4840: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
4850: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 6e 65 }.. /* ne
4860: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 w SSL state */.
4870: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
4880: 74 61 74 65 20 2a 29 20 54 63 6c 5f 41 6c 6c 6f tate *) Tcl_Allo
4890: 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a c((unsigned) siz
48a0: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 eof(State));.
48b0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 statePtr->self
48c0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 4e = (Tcl_Channel)N
48d0: 55 4c 4c 3b 0a 20 20 20 20 73 74 61 74 65 50 74 ULL;. statePt
48e0: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f r->timer = (Tcl_
48f0: 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c 3b TimerToken)NULL;
4900: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
4910: 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 flags = flags;.
4920: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74 statePtr->wat
4930: 63 68 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 chMask = 0;.
4940: 73 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65 20 3d statePtr->mode =
4950: 20 30 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 0;.. statePt
4960: 72 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 r->interp = inte
4970: 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 rp;. statePtr
4980: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 28 54 63 ->callback = (Tc
4990: 6c 5f 4f 62 6a 20 2a 29 30 3b 0a 0a 20 20 20 20 l_Obj *)0;..
49a0: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 statePtr->vflags
49b0: 20 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 = verify;. s
49c0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 28 tatePtr->ssl = (
49d0: 53 53 4c 2a 29 30 3b 0a 20 20 20 20 73 74 61 74 SSL*)0;. stat
49e0: 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b ePtr->ctx = ctx;
49f0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 . statePtr->b
4a00: 69 6f 20 3d 20 28 42 49 4f 2a 29 30 3b 0a 20 20 io = (BIO*)0;.
4a10: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 statePtr->p_bi
4a20: 6f 20 3d 20 28 42 49 4f 2a 29 30 3b 0a 0a 20 20 o = (BIO*)0;..
4a30: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 statePtr->err
4a40: 3d 20 22 22 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 = "";.. Tcl_S
4a50: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
4a60: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
4a70: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 translation", "b
4a80: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c inary");. Tcl
4a90: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
4aa0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
4ab0: 22 2d 62 75 66 66 65 72 69 6e 67 22 2c 20 22 6e "-buffering", "n
4ac0: 6f 6e 65 22 29 3b 0a 0a 23 69 66 20 54 43 4c 5f one");..#if TCL_
4ad0: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d MAJOR_VERSION ==
4ae0: 20 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f 8 && TCL_MINOR_
4af0: 56 45 52 53 49 4f 4e 20 3c 20 32 0a 20 20 20 20 VERSION < 2.
4b00: 73 74 61 74 65 50 74 72 2d 3e 70 61 72 65 6e 74 statePtr->parent
4b10: 20 3d 20 63 68 61 6e 3b 0a 20 20 20 20 73 74 61 = chan;. sta
4b20: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 tePtr->self = Tc
4b30: 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c l_ReplaceChannel
4b40: 28 20 69 6e 74 65 72 70 2c 0a 09 09 09 09 54 6c ( interp,.....Tl
4b50: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c s_ChannelType(),
4b60: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 (ClientData) st
4b70: 61 74 65 50 74 72 2c 0a 09 09 09 20 20 20 20 20 atePtr,....
4b80: 20 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 (TCL_READABLE
4b90: 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c | TCL_WRITABLE),
4ba0: 20 73 74 61 74 65 50 74 72 2d 3e 70 61 72 65 6e statePtr->paren
4bb0: 74 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 74 t);.#else. st
4bc0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 63 atePtr->self = c
4bd0: 68 61 6e 3b 0a 20 20 20 20 54 63 6c 5f 53 74 61 han;. Tcl_Sta
4be0: 63 6b 43 68 61 6e 6e 65 6c 28 20 69 6e 74 65 72 ckChannel( inter
4bf0: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 p, Tls_ChannelTy
4c00: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 pe(), (ClientDat
4c10: 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 09 09 a) statePtr,....
4c20: 20 20 20 20 20 20 20 28 54 43 4c 5f 52 45 41 44 (TCL_READ
4c30: 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 ABLE | TCL_WRITA
4c40: 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 23 65 6e BLE), chan);.#en
4c50: 64 69 66 0a 20 20 20 20 69 66 20 28 73 74 61 74 dif. if (stat
4c60: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
4c70: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
4c80: 29 20 7b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 ) {..Tls_Free((c
4c90: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
4ca0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e ;. return
4cb0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
4cc0: 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 }.. /* alloca
4cd0: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 te script */.
4ce0: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 if (script) {..
4cf0: 63 68 61 72 20 2a 20 74 6d 70 20 3d 20 54 63 6c char * tmp = Tcl
4d00: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
4d10: 6a 28 73 63 72 69 70 74 2c 20 4e 55 4c 4c 29 3b j(script, NULL);
4d20: 0a 09 69 66 20 28 74 6d 70 20 26 26 20 2a 74 6d ..if (tmp && *tm
4d30: 70 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 p) {.. stateP
4d40: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 54 tr->callback = T
4d50: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
4d60: 73 63 72 69 70 74 29 3b 0a 09 20 20 20 20 54 63 script);.. Tc
4d70: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 20 l_IncrRefCount(
4d80: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
4d90: 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 ck);..}. }.
4da0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 6c /* This is onl
4db0: 79 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 y needed because
4dc0: 20 6f 66 20 61 20 62 75 67 20 69 6e 20 4f 70 65 of a bug in Ope
4dd0: 6e 53 53 4c 2c 20 77 68 65 72 65 20 74 68 65 0a nSSL, where the.
4de0: 20 20 20 20 20 2a 20 73 73 6c 2d 3e 76 65 72 69 * ssl->veri
4df0: 66 79 5f 63 61 6c 6c 62 61 63 6b 20 69 73 20 6e fy_callback is n
4e00: 6f 74 20 72 65 66 65 72 65 6e 63 65 64 21 21 21 ot referenced!!!
4e10: 20 28 4d 75 73 74 20 62 65 20 64 6f 6e 65 0a 20 (Must be done.
4e20: 20 20 20 20 2a 20 2a 62 65 66 6f 72 65 2a 20 53 * *before* S
4e30: 53 4c 5f 6e 65 77 28 29 20 69 73 20 63 61 6c 6c SL_new() is call
4e40: 65 64 21 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ed!. */.
4e50: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 76 65 72 69 SSL_CTX_set_veri
4e60: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 fy(statePtr->ctx
4e70: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 , verify, Verify
4e80: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 Callback);..
4e90: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e /*. * SSL In
4ea0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 itialization.
4eb0: 20 20 2a 2f 0a 0a 20 20 20 20 73 74 61 74 65 50 */.. stateP
4ec0: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 tr->ssl = SSL_ne
4ed0: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 w(statePtr->ctx)
4ee0: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 ;. if (!state
4ef0: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 20 20 20 20 Ptr->ssl) {.
4f00: 20 20 20 20 2f 2a 20 53 53 4c 20 6c 69 62 72 61 /* SSL libra
4f10: 72 79 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 ry error */.
4f20: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
4f30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 sult(interp,.
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4f50: 20 20 20 20 20 20 22 63 6f 75 6c 64 6e 27 74 20 "couldn't
4f60: 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 construct ssl se
4f70: 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e ssion: ", REASON
4f80: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 (),.
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 (ch
4fa0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c ar *) NULL);..Tl
4fb0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
4fc0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20 statePtr);.
4fd0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
4fe0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
4ff0: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 /*. * SSL Ca
5000: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a llbacks. */.
5010: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 . SSL_set_app
5020: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e _data(statePtr->
5030: 73 73 6c 2c 20 28 56 4f 49 44 20 2a 29 73 74 61 ssl, (VOID *)sta
5040: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 tePtr);./* point
5050: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a back to us */..
5060: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 /*. * Th
5070: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 62 e following is b
5080: 72 6f 6b 65 6e 20 2d 20 77 65 20 6e 65 65 64 20 roken - we need
5090: 69 73 20 74 6f 20 73 65 74 20 74 68 65 0a 20 20 is to set the.
50a0: 20 20 20 2a 20 76 65 72 69 66 79 5f 6d 6f 64 65 * verify_mode
50b0: 2c 20 62 75 74 20 74 68 65 20 6c 69 62 72 61 72 , but the librar
50c0: 79 20 69 67 6e 6f 72 65 73 20 74 68 65 20 76 65 y ignores the ve
50d0: 72 69 66 79 5f 63 61 6c 6c 62 61 63 6b 21 21 21 rify_callback!!!
50e0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 53 . */. /*S
50f0: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 SL_set_verify(st
5100: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 atePtr->ssl, ver
5110: 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 ify, VerifyCallb
5120: 61 63 6b 29 3b 2a 2f 0a 0a 20 20 20 20 53 53 4c ack);*/.. SSL
5130: 5f 43 54 58 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 _CTX_set_info_ca
5140: 6c 6c 62 61 63 6b 28 20 73 74 61 74 65 50 74 72 llback( statePtr
5150: 2d 3e 63 74 78 2c 20 49 6e 66 6f 43 61 6c 6c 62 ->ctx, InfoCallb
5160: 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 ack);.. /* Cr
5170: 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c eate Tcl_Channel
5180: 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a BIO Handler */.
5190: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f statePtr->p_
51a0: 62 69 6f 20 3d 20 62 69 6f 20 3d 20 42 49 4f 5f bio = bio = BIO_
51b0: 6e 65 77 5f 74 63 6c 28 20 73 74 61 74 65 50 74 new_tcl( statePt
51c0: 72 2c 20 42 49 4f 5f 43 4c 4f 53 45 29 3b 0a 20 r, BIO_CLOSE);.
51d0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f statePtr->bio
51e0: 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 = BIO_new(BIO_f
51f0: 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 _ssl());.. if
5200: 20 28 73 65 72 76 65 72 29 20 7b 0a 09 73 74 61 (server) {..sta
5210: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 tePtr->flags |=
5220: 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a TLS_TCL_SERVER;.
5230: 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f .SSL_set_accept_
5240: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e state(statePtr->
5250: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ssl);. } else
5260: 20 7b 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e {..SSL_set_conn
5270: 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 ect_state(stateP
5280: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a tr->ssl);. }.
5290: 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 SSL_set_bio(
52a0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 62 statePtr->ssl, b
52b0: 69 6f 2c 20 62 69 6f 29 3b 0a 20 20 20 20 42 49 io, bio);. BI
52c0: 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 O_set_ssl(stateP
52d0: 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 tr->bio, statePt
52e0: 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 43 4c 4f 53 r->ssl, BIO_CLOS
52f0: 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 E);.. /*.
5300: 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e * End of SSL In
5310: 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 it. */. T
5320: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
5330: 65 72 70 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e erp, Tcl_GetChan
5340: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
5350: 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c ->self), TCL_VOL
5360: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 ATILE);. retu
5370: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
5380: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53c0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 -------. *. * CT
53d0: 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 X_Init -- constr
53e0: 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e uct a SSL_CTX in
53f0: 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 stance. *. * Res
5400: 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 ults:. *.A valid
5410: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 SSL_CTX instanc
5420: 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a e or NULL.. *. *
5430: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
5440: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c *.constructs SSL
5450: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 context (CTX).
5460: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
54b0: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 tic SSL_CTX *.CT
54c0: 58 5f 49 6e 69 74 28 69 6e 74 65 72 70 2c 20 70 X_Init(interp, p
54d0: 72 6f 74 6f 2c 20 6b 65 79 2c 20 63 65 72 74 2c roto, key, cert,
54e0: 20 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 CAdir, CAfile,
54f0: 63 69 70 68 65 72 73 29 0a 20 20 20 20 54 63 6c ciphers). Tcl
5500: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b _Interp *interp;
5510: 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 3b 0a . int proto;.
5520: 20 20 20 20 63 68 61 72 20 2a 6b 65 79 3b 0a 20 char *key;.
5530: 20 20 20 63 68 61 72 20 2a 63 65 72 74 3b 0a 20 char *cert;.
5540: 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 3b 0a char *CAdir;.
5550: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 char *CAfile
5560: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
5570: 65 72 73 3b 0a 7b 0a 20 20 20 20 53 53 4c 5f 43 ers;.{. SSL_C
5580: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a TX *ctx = NULL;.
5590: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
55a0: 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 ds;. Tcl_DStr
55b0: 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 ing ds1;. int
55c0: 20 6f 66 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f off = 0;.. /
55d0: 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e * create SSL con
55e0: 74 65 78 74 20 2a 2f 0a 23 69 66 20 21 64 65 66 text */.#if !def
55f0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
5600: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
5610: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 3). if (ENABL
5620: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
5630: 4f 54 4f 5f 53 53 4c 32 29 20 26 26 0a 09 45 4e OTO_SSL2) &&..EN
5640: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
5650: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a _PROTO_SSL3)) {.
5660: 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e .ctx = SSL_CTX_n
5670: 65 77 28 53 53 4c 76 32 33 5f 6d 65 74 68 6f 64 ew(SSLv23_method
5680: 28 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 0a ());. } else.
5690: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 45 #endif. if (E
56a0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
56b0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b S_PROTO_SSL2)) {
56c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
56d0: 53 53 4c 32 29 0a 09 54 63 6c 5f 41 70 70 65 6e SSL2)..Tcl_Appen
56e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
56f0: 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 "protocol not su
5700: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
5710: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
5720: 58 20 2a 29 30 3b 0a 23 65 6c 73 65 0a 09 63 74 X *)0;.#else..ct
5730: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
5740: 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b SSLv2_method());
5750: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 20 65 6c .#endif. } el
5760: 73 65 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 se if (ENABLED(p
5770: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
5780: 54 4c 53 31 29 29 20 7b 0a 09 63 74 78 20 3d 20 TLS1)) {..ctx =
5790: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 SSL_CTX_new(TLSv
57a0: 31 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 20 20 20 1_method());.
57b0: 20 7d 20 65 6c 73 65 20 69 66 20 28 45 4e 41 42 } else if (ENAB
57c0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
57d0: 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 23 69 ROTO_SSL3)) {.#i
57e0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c f defined(NO_SSL
57f0: 33 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 3)..Tcl_AppendRe
5800: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 sult(interp, "pr
5810: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
5820: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 rted", NULL);..r
5830: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
5840: 29 30 3b 0a 23 65 6c 73 65 0a 09 63 74 78 20 3d )0;.#else..ctx =
5850: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c SSL_CTX_new(SSL
5860: 76 33 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 23 65 v3_method());.#e
5870: 6e 64 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 ndif. } else
5880: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
5890: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 ult(interp, "no
58a0: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 valid protocol s
58b0: 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b elected", NULL);
58c0: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
58d0: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 20 20 20 X *)0;. }.
58e0: 20 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 off |= (ENABLED
58f0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
5900: 4f 5f 54 4c 53 31 29 20 3f 20 30 20 3a 20 53 53 O_TLS1) ? 0 : SS
5910: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a L_OP_NO_TLSv1);.
5920: 20 20 20 20 6f 66 66 20 7c 3d 20 28 45 4e 41 42 off |= (ENAB
5930: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
5940: 52 4f 54 4f 5f 53 53 4c 32 29 20 3f 20 30 20 3a ROTO_SSL2) ? 0 :
5950: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 SSL_OP_NO_SSLv2
5960: 29 3b 0a 20 20 20 20 6f 66 66 20 7c 3d 20 28 45 );. off |= (E
5970: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
5980: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 3f 20 S_PROTO_SSL3) ?
5990: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 0 : SSL_OP_NO_SS
59a0: 4c 76 33 29 3b 0a 0a 20 20 20 20 53 53 4c 5f 43 Lv3);.. SSL_C
59b0: 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 TX_set_app_data(
59c0: 20 63 74 78 2c 20 28 56 4f 49 44 2a 29 69 6e 74 ctx, (VOID*)int
59d0: 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 erp);./* remembe
59e0: 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 r the interprete
59f0: 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 r */. SSL_CTX
5a00: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 20 63 74 _set_options( ct
5a10: 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 x, SSL_OP_ALL);.
5a20: 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 /* all SSL bug w
5a30: 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 orkarounds */.
5a40: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
5a50: 74 69 6f 6e 73 28 20 63 74 78 2c 20 6f 66 66 29 tions( ctx, off)
5a60: 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 ;./* all SSL bug
5a70: 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a workarounds */.
5a80: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 SSL_CTX_sess
5a90: 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 _set_cache_size(
5aa0: 20 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 ctx, 128);..
5ab0: 20 69 66 20 28 63 69 70 68 65 72 73 20 21 3d 20 if (ciphers !=
5ac0: 4e 55 4c 4c 29 0a 09 53 53 4c 5f 43 54 58 5f 73 NULL)..SSL_CTX_s
5ad0: 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 et_cipher_list(c
5ae0: 74 78 2c 20 63 69 70 68 65 72 73 29 3b 0a 0a 20 tx, ciphers);..
5af0: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 /* set some c
5b00: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 allbacks */.
5b10: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
5b20: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 ult_passwd_cb(ct
5b30: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 x, PasswordCallb
5b40: 61 63 6b 29 3b 0a 0a 23 69 66 6e 64 65 66 20 42 ack);..#ifndef B
5b50: 53 41 46 45 0a 20 20 20 20 53 53 4c 5f 43 54 58 SAFE. SSL_CTX
5b60: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 _set_default_pas
5b70: 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 swd_cb_userdata(
5b80: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74 ctx, (void *)int
5b90: 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 erp);.#endif..#i
5ba0: 66 6e 64 65 66 20 4e 4f 5f 44 48 0a 20 20 20 20 fndef NO_DH.
5bb0: 7b 0a 09 44 48 2a 20 64 68 20 3d 20 67 65 74 5f {..DH* dh = get_
5bc0: 64 68 35 31 32 28 29 3b 0a 09 53 53 4c 5f 43 54 dh512();..SSL_CT
5bd0: 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 X_set_tmp_dh(ctx
5be0: 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 , dh);..DH_free(
5bf0: 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 dh);. }.#endi
5c00: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 f.. /* set ou
5c10: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f r certificate */
5c20: 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 21 3d . if (cert !=
5c30: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 53 NULL) {..Tcl_DS
5c40: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a tringInit(&ds);.
5c50: 0a 20 20 20 20 20 20 20 20 69 66 20 28 53 53 4c . if (SSL
5c60: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 _CTX_use_certifi
5c70: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 cate_file(ctx, F
5c80: 32 4e 28 20 63 65 72 74 2c 20 26 64 73 29 2c 0a 2N( cert, &ds),.
5c90: 09 09 09 09 09 53 53 4c 5f 46 49 4c 45 54 59 50 .....SSL_FILETYP
5ca0: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 E_PEM) <= 0) {..
5cb0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
5cc0: 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 20 20 ree(&ds);.
5cd0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 Tcl_Append
5ce0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 Result(interp,.
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e 61 "una
5d10: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 ble to set certi
5d20: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 ficate file ", c
5d30: 65 72 74 2c 20 22 3a 20 22 2c 0a 20 20 20 20 20 ert, ": ",.
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5d50: 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 REASON()
5d60: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
5d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 53 ;. SS
5d80: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
5d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 . ret
5da0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
5db0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 ;. }..
5dc0: 20 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 /* get the
5dd0: 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f private key asso
5de0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 ciated with this
5df0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
5e00: 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 if (key
5e10: 3d 3d 20 4e 55 4c 4c 29 20 6b 65 79 3d 63 65 72 == NULL) key=cer
5e20: 74 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 t;.. if (
5e30: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 SSL_CTX_use_Priv
5e40: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c ateKey_file(ctx,
5e50: 20 46 32 4e 28 20 6b 65 79 2c 20 26 64 73 29 2c F2N( key, &ds),
5e60: 0a 09 09 09 09 09 53 53 4c 5f 46 49 4c 45 54 59 ......SSL_FILETY
5e70: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a PE_PEM) <= 0) {.
5e80: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
5e90: 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 20 Free(&ds);.
5ea0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e Tcl_Appen
5eb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a dResult(interp,.
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e "un
5ee0: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c able to set publ
5ef0: 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b ic key file ", k
5f00: 65 79 2c 20 22 20 22 2c 0a 20 20 20 20 20 20 20 ey, " ",.
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5f20: 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 REASON(),
5f30: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f SSL_
5f50: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 20 CTX_free(ctx);.
5f60: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 retur
5f70: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
5f80: 20 20 20 20 20 20 20 20 7d 0a 09 54 63 6c 5f 44 }..Tcl_D
5f90: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
5fa0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 . /* Now
5fb0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b we know that a k
5fc0: 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 65 ey and cert have
5fd0: 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e 73 been set agains
5fe0: 74 0a 20 20 20 20 20 20 20 20 20 2a 20 74 68 65 t. * the
5ff0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a SSL context */.
6000: 20 20 20 20 20 20 20 20 69 66 20 28 21 53 53 4c if (!SSL
6010: 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 _CTX_check_priva
6020: 74 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 20 te_key(ctx)) {.
6030: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 Tcl_A
6040: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
6050: 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 rp,.
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6070: 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f "private key do
6080: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 es not match the
6090: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62 certificate pub
60a0: 6c 69 63 20 6b 65 79 22 2c 0a 20 20 20 20 20 20 lic key",.
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
60c0: 20 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 (char *)
60d0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 NULL);.
60e0: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
60f0: 63 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 ctx);.
6100: 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 return (SSL_CT
6110: 58 20 2a 29 30 3b 0a 20 20 20 20 20 20 20 20 7d X *)0;. }
6120: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 . } else {.
6130: 20 20 20 20 20 20 63 65 72 74 20 3d 20 28 63 68 cert = (ch
6140: 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 ar*)X509_get_def
6150: 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 ault_cert_file()
6160: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 53 ;.. if (S
6170: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 SL_CTX_use_certi
6180: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c ficate_file(ctx,
6190: 20 63 65 72 74 2c 0a 09 09 09 09 09 53 53 4c 5f cert,......SSL_
61a0: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d FILETYPE_PEM) <=
61b0: 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 0) {.#if 0..
61c0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
61d0: 28 26 64 73 29 3b 0a 20 20 20 20 20 20 20 20 20 (&ds);.
61e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
61f0: 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 20 ult(interp,.
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6210: 20 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 "unable
6220: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 to use default
6230: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 certificate file
6240: 20 22 2c 20 63 65 72 74 2c 20 22 3a 20 22 2c 0a ", cert, ": ",.
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 52 45 41 REA
6270: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
6280: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 NULL);.
6290: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
62a0: 63 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 ctx);.
62b0: 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 return (SSL_CT
62c0: 58 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 20 20 X *)0;.#endif.
62d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 09 0a }. }...
62e0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
62f0: 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 nit(&ds);. Tc
6300: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 l_DStringInit(&d
6310: 73 31 29 3b 0a 20 20 20 20 69 66 20 28 21 53 53 s1);. if (!SS
6320: 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 L_CTX_load_verif
6330: 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c y_locations(ctx,
6340: 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 F2N(CAfile, &ds
6350: 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 26 64 ), F2N(CAdir, &d
6360: 73 31 29 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 s1)) ||.
6370: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 !SSL_CTX_set_def
6380: 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 ault_verify_path
6390: 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a s(ctx)) {.#if 0.
63a0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
63b0: 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 (&ds);..Tcl_DStr
63c0: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 ingFree(&ds1);..
63d0: 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 /* Don't current
63e0: 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20 ly care if this
63f0: 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 fails */..Tcl_Ap
6400: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
6410: 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 p, "SSL default
6420: 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c verify paths: ",
6430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 45 RE
6450: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
6460: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
6470: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
6480: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
6490: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 ;.#endif. }.
64a0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 SSL_CTX_set_c
64b0: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 lient_CA_list(ct
64c0: 78 2c 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 x, SSL_load_clie
64d0: 6e 74 5f 43 41 5f 66 69 6c 65 28 20 46 32 4e 28 nt_CA_file( F2N(
64e0: 43 41 66 69 6c 65 2c 20 26 64 73 29 20 29 29 3b CAfile, &ds) ));
64f0: 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
6500: 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 gFree(&ds);.
6510: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
6520: 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 &ds1);. retur
6530: 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a n ctx;.}.../*. *
6540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6580: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 ---. *. * Status
6590: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e ObjCmd -- return
65a0: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 certificate for
65b0: 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e connected peer.
65c0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
65d0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
65e0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
65f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
6600: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
6610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
6650: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
6660: 74 61 74 75 73 4f 62 6a 43 6d 64 28 63 6c 69 65 tatusObjCmd(clie
6670: 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 ntData, interp,
6680: 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 objc, objv).
6690: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
66a0: 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 tData;./* Not us
66b0: 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 ed. */. Tcl_I
66c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 nterp *interp;.
66d0: 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 int objc;.
66e0: 20 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e 53 54 20 Tcl_Obj.*CONST
66f0: 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 53 74 objv[];.{. St
6700: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 ate *statePtr;.
6710: 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 X509 *peer;.
6720: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
6730: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e tr;. Tcl_Chan
6740: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 nel chan;. ch
6750: 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c ar *channelName,
6760: 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 *ciphers;. i
6770: 6e 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66 nt mode;.. if
6780: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 20 (objc != 2) {.
6790: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 Tcl_Wrong
67a0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
67b0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
67c0: 6c 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 l");. ret
67d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
67e0: 20 20 20 7d 0a 20 20 20 20 63 68 61 6e 6e 65 6c }. channel
67f0: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 Name = Tcl_GetSt
6800: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
6810: 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 [1], NULL);..
6820: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
6830: 68 61 6e 6e 65 6c 28 20 69 6e 74 65 72 70 2c 20 hannel( interp,
6840: 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f channelName, &mo
6850: 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 de);. if (cha
6860: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
6870: 6c 29 30 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 l)0) {..return T
6880: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
6890: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
68a0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
68b0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
68c0: 79 70 65 28 29 29 20 7b 0a 20 20 20 20 20 20 20 ype()) {.
68d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
68e0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
68f0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
6900: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
6910: 68 61 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 han),.
6920: 20 20 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 "\": not a
6930: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
6940: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 65 ULL);. re
6950: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6960: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
6970: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
6980: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
6990: 61 6e 63 65 44 61 74 61 28 20 63 68 61 6e 29 3b anceData( chan);
69a0: 0a 20 20 20 20 70 65 65 72 20 3d 20 53 53 4c 5f . peer = SSL_
69b0: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 get_peer_certifi
69c0: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 cate(statePtr->s
69d0: 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 70 65 65 sl);. if (pee
69e0: 72 29 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 r)..objPtr = Tls
69f0: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 20 69 6e 74 _NewX509Obj( int
6a00: 65 72 70 2c 20 70 65 65 72 29 3b 0a 20 20 20 20 erp, peer);.
6a10: 65 6c 73 65 0a 09 6f 62 6a 50 74 72 20 3d 20 54 else..objPtr = T
6a20: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 20 30 cl_NewListObj( 0
6a30: 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 63 69 , NULL);.. ci
6a40: 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 phers = (char*)S
6a50: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 SL_get_cipher(st
6a60: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 atePtr->ssl);.
6a70: 20 20 69 66 20 28 63 69 70 68 65 72 73 20 21 3d if (ciphers !=
6a80: 20 4e 55 4c 4c 20 26 26 20 73 74 72 63 6d 70 28 NULL && strcmp(
6a90: 63 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e 45 29 ciphers, "(NONE)
6aa0: 22 29 21 3d 30 29 20 7b 0a 09 54 63 6c 5f 4c 69 ")!=0) {..Tcl_Li
6ab0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6ac0: 6e 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 nt( interp, objP
6ad0: 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 tr,...Tcl_NewStr
6ae0: 69 6e 67 4f 62 6a 28 20 22 63 69 70 68 65 72 22 ingObj( "cipher"
6af0: 2c 20 2d 31 29 20 29 3b 0a 09 54 63 6c 5f 4c 69 , -1) );..Tcl_Li
6b00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6b10: 6e 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 nt( interp, objP
6b20: 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 tr,...Tcl_NewStr
6b30: 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 67 65 74 5f ingObj( SSL_get_
6b40: 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d cipher(statePtr-
6b50: 3e 73 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20 >ssl), -1) );.
6b60: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f }. Tcl_SetO
6b70: 62 6a 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 bjResult( interp
6b80: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 , objPtr);. r
6b90: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
6ba0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
6bf0: 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a Tls_Free --. *.
6c00: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
6c10: 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e e cleans up when
6c20: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
6c30: 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 sed channel. *.i
6c40: 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 s closed and its
6c50: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
6c60: 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 falls below 1.
6c70: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
6c80: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .none. *. * Side
6c90: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 effects:. *.Fre
6ca0: 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 es all the state
6cb0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
6cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
6d00: 69 64 0a 54 6c 73 5f 46 72 65 65 28 20 63 68 61 id.Tls_Free( cha
6d10: 72 20 2a 62 6c 6f 63 6b 50 74 72 20 29 0a 7b 0a r *blockPtr ).{.
6d20: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
6d30: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 Ptr = (State *)b
6d40: 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 54 6c lockPtr;.. Tl
6d50: 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 s_Clean(statePtr
6d60: 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 );. Tcl_Free(
6d70: 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f blockPtr);.}.../
6d80: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6dc0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
6dd0: 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a s_Clean --. *. *
6de0: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
6df0: 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 cleans up when a
6e00: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
6e10: 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 d channel. *.is
6e20: 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 closed and its r
6e30: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 eference count f
6e40: 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 alls below 1. T
6e50: 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 his should. *.be
6e60: 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e called synchron
6e70: 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f ously by the Clo
6e80: 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 seProc, not in t
6e90: 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 he. *.Eventually
6ea0: 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 Free callback..
6eb0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
6ec0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .none. *. * Side
6ed0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 effects:. *.Fre
6ee0: 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 es all the state
6ef0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
6f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
6f40: 69 64 0a 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 id.Tls_Clean(Sta
6f50: 74 65 20 2a 73 74 61 74 65 50 74 72 29 0a 7b 0a te *statePtr).{.
6f60: 20 20 20 20 2f 2a 20 77 65 27 72 65 20 61 73 73 /* we're ass
6f70: 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 uming here that
6f80: 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 we're single-thr
6f90: 65 61 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 eaded */. if
6fa0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 (statePtr->ssl)
6fb0: 7b 0a 09 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 {..SSL_shutdown(
6fc0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
6fd0: 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 .SSL_free(stateP
6fe0: 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 tr->ssl);..state
6ff0: 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b Ptr->ssl = NULL;
7000: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
7010: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
7020: 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 k) {..Tcl_DecrRe
7030: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
7040: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 >callback);..sta
7050: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
7060: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 = NULL;. }..
7070: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
7080: 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 >timer != (Tcl_T
7090: 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c 29 20 imerToken)NULL)
70a0: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d {..Tcl_DeleteTim
70b0: 65 72 48 61 6e 64 6c 65 72 20 28 73 74 61 74 65 erHandler (state
70c0: 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 Ptr->timer);..st
70d0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
70e0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a NULL;. }.}...
70f0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
7100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7130: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
7140: 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a ls_Init --. *. *
7150: 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 .This is a packa
7160: 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f ge initializatio
7170: 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 n procedure, whi
7180: 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 ch is called. *.
7190: 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 by Tcl when this
71a0: 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 package is to b
71b0: 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e e added to an in
71c0: 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a terpreter.. *. *
71d0: 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 Results: Ssl c
71e0: 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f onfigured and lo
71f0: 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 aded. *. * Side
7200: 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 effects:. *. cre
7210: 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d ate the ssl comm
7220: 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 73 65 20 and, initialise
7230: 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 ssl context. *.
7240: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
7250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7280: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6c ----. */..int.Tl
7290: 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 s_Init(Tcl_Inter
72a0: 70 20 2a 69 6e 74 65 72 70 29 09 09 2f 2a 20 49 p *interp)../* I
72b0: 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 77 68 nterpreter in wh
72c0: 69 63 68 20 74 68 65 20 70 61 63 6b 61 67 65 20 ich the package
72d0: 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 is.
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 74 6f * to
7300: 20 62 65 20 6d 61 64 65 20 61 76 61 69 6c 61 62 be made availab
7310: 6c 65 2e 20 2a 2f 0a 7b 0a 23 69 66 20 54 43 4c le. */.{.#if TCL
7320: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e _MAJOR_VERSION >
7330: 3d 20 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 = 8 && TCL_MINOR
7340: 5f 56 45 52 53 49 4f 4e 20 3e 3d 20 32 0a 20 20 _VERSION >= 2.
7350: 20 20 69 66 20 28 21 54 63 6c 5f 49 6e 69 74 53 if (!Tcl_InitS
7360: 74 75 62 73 28 69 6e 74 65 72 70 2c 20 54 43 4c tubs(interp, TCL
7370: 5f 56 45 52 53 49 4f 4e 2c 20 30 29 29 20 7b 0a _VERSION, 0)) {.
7380: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 return T
7390: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
73a0: 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 6c #endif. SSL_l
73b0: 6f 61 64 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 oad_error_string
73c0: 73 28 29 3b 0a 20 20 20 20 45 52 52 5f 6c 6f 61 s();. ERR_loa
73d0: 64 5f 63 72 79 70 74 6f 5f 73 74 72 69 6e 67 73 d_crypto_strings
73e0: 28 29 3b 0a 20 20 20 20 53 53 4c 5f 6c 69 62 72 ();. SSL_libr
73f0: 61 72 79 5f 69 6e 69 74 28 29 3b 0a 0a 20 20 20 ary_init();..
7400: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
7410: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
7420: 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 ls::ciphers", Ci
7430: 70 68 65 72 73 4f 62 6a 43 6d 64 20 2c 20 28 43 phersObjCmd , (C
7440: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 0a 20 20 lientData) 0,.
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7460: 20 20 20 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 (Tcl_CmdDele
7470: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
7480: 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 .. Tcl_Create
7490: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
74a0: 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 p, "tls::handsha
74b0: 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 ke", HandshakeOb
74c0: 6a 43 6d 64 20 2c 20 28 43 6c 69 65 6e 74 44 61 jCmd , (ClientDa
74d0: 74 61 29 20 30 2c 0a 20 20 20 20 20 20 20 20 20 ta) 0,.
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 (Tc
74f0: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
7500: 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 *) NULL);.. T
7510: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
7520: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
7530: 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 ::import", Impor
7540: 74 4f 62 6a 43 6d 64 20 2c 20 28 43 6c 69 65 6e tObjCmd , (Clien
7550: 74 44 61 74 61 29 20 30 2c 0a 20 20 20 20 20 20 tData) 0,.
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7570: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
7580: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 oc *) NULL);..
7590: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
75a0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
75b0: 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 tls::status", St
75c0: 61 74 75 73 4f 62 6a 43 6d 64 20 2c 20 28 43 6c atusObjCmd , (Cl
75d0: 69 65 6e 74 44 61 74 61 29 20 30 2c 0a 20 20 20 ientData) 0,.
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
75f0: 20 20 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 (Tcl_CmdDelet
7600: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
7610: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f . return Tcl_
7620: 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 PkgProvide(inter
7630: 70 2c 20 50 41 43 4b 41 47 45 2c 20 56 45 52 53 p, PACKAGE, VERS
7640: 49 4f 4e 29 3b 0a 7d 0a 0a 0c 0a 2f 2a 0a 20 2a ION);.}..../*. *
7650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7680: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c ------*. *. *.Tl
7690: 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a s_SafeInit --. *
76a0: 0a 20 2a 09 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76d0: 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 ----*. *.Standar
76e0: 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 d procedure requ
76f0: 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 20 ired by 'load'.
7700: 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 . *.Initializes
7710: 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 this extension f
7720: 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 or a safe interp
7730: 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d reter.. *.------
7740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 2a 0a 20 2a 0a 20 ----------*. *.
7770: 2a 09 53 69 64 65 65 66 66 65 63 74 73 3a 0a 20 *.Sideeffects:.
7780: 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e *..As of 'Tls_In
7790: 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 it'. *. *.Result
77a0: 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 :. *..A standard
77b0: 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e Tcl error code.
77c0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
77d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
77e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
77f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
7800: 2f 0a 0a 69 6e 74 0a 54 6c 73 5f 53 61 66 65 49 /..int.Tls_SafeI
7810: 6e 69 74 20 28 54 63 6c 5f 49 6e 74 65 72 70 2a nit (Tcl_Interp*
7820: 20 69 6e 74 65 72 70 29 0a 7b 0a 20 20 20 20 72 interp).{. r
7830: 65 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74 20 28 eturn Tls_Init (
7840: 69 6e 74 65 72 70 29 3b 0a 7d 0a interp);.}.