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 32 20 32 30 30 30 2f 30 31 2f 32 ,v 1.2 2000/01/2
0090: 30 20 30 31 3a 35 30 3a 35 35 20 61 62 6f 72 72 0 01:50:55 aborr
00a0: 20 45 78 70 20 24 0a 20 2a 0a 20 2a 20 54 4c 53 Exp $. *. * TLS
00b0: 20 28 61 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e (aka SSL) Chann
00c0: 65 6c 20 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 el - can be laye
00d0: 72 65 64 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 red on any bi-di
00e0: 72 65 63 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c rectional. * Tcl
00f0: 5f 43 68 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 _Channel (Note:
0100: 52 65 71 75 69 72 65 73 20 54 72 66 20 43 6f 72 Requires Trf Cor
0110: 65 20 50 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 e Patch). *. * T
0120: 68 69 73 20 77 61 73 20 62 75 69 6c 74 20 28 61 his was built (a
0130: 6c 6d 6f 73 74 29 20 66 72 6f 6d 20 73 63 72 61 lmost) from scra
0140: 74 63 68 20 62 61 73 65 64 20 75 70 6f 6e 20 6f tch based upon o
0150: 62 73 65 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a bservation of. *
0160: 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a OpenSSL 0.9.2B.
0170: 20 2a 0a 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 *. * Addition c
0180: 72 65 64 69 74 20 69 73 20 64 75 65 20 66 6f 72 redit is due for
0190: 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 65 73 Andreas Kupries
01a0: 20 28 61 2e 6b 75 70 72 69 65 73 40 77 65 73 74 (a.kupries@west
01b0: 65 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a end.com), for. *
01c0: 20 70 72 6f 76 69 64 69 6e 67 20 74 68 65 20 54 providing the T
01d0: 63 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 cl_ReplaceChanne
01e0: 6c 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 l mechanism and
01f0: 77 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 working closely
0200: 77 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e with me. * to en
0210: 68 61 6e 63 65 20 69 74 20 74 6f 20 73 75 70 70 hance it to supp
0220: 6f 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 ort full fileeve
0230: 6e 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a nt semantics.. *
0240: 0a 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f . * Also work do
0250: 6e 65 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 ne by the follow
0260: 20 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 people provided
0270: 20 74 68 65 20 69 6d 70 65 74 75 73 20 74 6f 20 the impetus to
0280: 64 6f 20 74 68 69 73 20 22 72 69 67 68 74 22 3a do this "right":
0290: 0a 20 2a 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 . *.tclSSL (Coli
02a0: 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 n McCormack, Sha
02b0: 72 65 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a red Technology).
02c0: 20 2a 09 53 53 4c 74 63 6c 20 28 50 65 74 65 72 *.SSLtcl (Peter
02d0: 20 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a Antman). *. */.
02e0: 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e .#include "tlsIn
02f0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 t.h".#include "t
0300: 63 6c 4f 70 74 73 2e 68 22 0a 0a 2f 2a 0a 20 2a clOpts.h"../*. *
0310: 20 45 78 74 65 72 6e 61 6c 20 66 75 6e 63 74 69 External functi
0320: 6f 6e 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 ons. */../*. * F
0330: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 orward declarati
0340: 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 ons. */..#define
0350: 20 46 32 4e 28 20 6b 65 79 2c 20 64 73 70 29 20 F2N( key, dsp)
0360: 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e 55 \..(((key) == NU
0370: 4c 4c 29 3f 28 63 68 61 72 2a 29 4e 55 4c 4c 3a LL)?(char*)NULL:
0380: 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c Tcl_TranslateFil
0390: 65 4e 61 6d 65 28 20 69 6e 74 65 72 70 2c 20 28 eName( interp, (
03a0: 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a 23 64 key), (dsp))).#d
03b0: 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29 09 45 efine REASON().E
03c0: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f RR_reason_error_
03d0: 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74 5f 65 string(ERR_get_e
03e0: 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69 63 20 rror())..static
03f0: 69 6e 74 09 43 69 70 68 65 72 73 4f 62 6a 43 6d int.CiphersObjCm
0400: 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 d _ANSI_ARGS_ ((
0410: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
0420: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
0430: 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 p *interp,....
0440: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
0450: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d bj *CONST objv[]
0460: 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 ));..static int.
0470: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 HandshakeObjCmd
0480: 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c _ANSI_ARGS_ ((Cl
0490: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
04a0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
04b0: 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 69 *interp,.... i
04c0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
04d0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 *CONST objv[]))
04e0: 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 49 6d ;..static int.Im
04f0: 70 6f 72 74 4f 62 6a 43 6d 64 20 5f 41 4e 53 49 portObjCmd _ANSI
0500: 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 _ARGS_ ((ClientD
0510: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
0520: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
0530: 72 70 2c 0a 09 09 09 20 20 20 69 6e 74 20 6f 62 rp,.... int ob
0540: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e jc, Tcl_Obj *CON
0550: 53 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 ST objv[]));..st
0560: 61 74 69 63 20 69 6e 74 09 53 74 61 74 75 73 4f atic int.StatusO
0570: 62 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 bjCmd _ANSI_ARGS
0580: 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 _ ((ClientData c
0590: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
05a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 nterp *interp,..
05b0: 09 09 20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 .. int objc, T
05c0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 cl_Obj *CONST ob
05d0: 6a 76 5b 5d 29 29 3b 0a 73 74 61 74 69 63 20 53 jv[]));.static S
05e0: 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69 74 SL_CTX *CTX_Init
05f0: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 _ANSI_ARGS_((Tc
0600: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
0610: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 , int proto, cha
0620: 72 20 2a 6b 65 79 2c 0a 09 09 09 20 20 20 20 63 r *key,.... c
0630: 68 61 72 20 2a 63 65 72 74 2c 20 63 68 61 72 20 har *cert, char
0640: 2a 43 41 64 69 72 2c 20 63 68 61 72 20 2a 43 41 *CAdir, char *CA
0650: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 file, char *ciph
0660: 65 72 73 29 29 3b 0a 0a 23 64 65 66 69 6e 65 20 ers));..#define
0670: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 30 TLS_PROTO_SSL2.0
0680: 78 30 31 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f x01.#define TLS_
0690: 50 52 4f 54 4f 5f 53 53 4c 33 09 30 78 30 32 0a PROTO_SSL3.0x02.
06a0: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 #define TLS_PROT
06b0: 4f 5f 54 4c 53 31 09 30 78 30 34 0a 23 64 65 66 O_TLS1.0x04.#def
06c0: 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67 ine ENABLED(flag
06d0: 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29 , mask).(((flag)
06e0: 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d & (mask)) == (m
06f0: 61 73 6b 29 29 0a 2f 2a 0a 20 2a 20 53 74 61 74 ask))./*. * Stat
0700: 69 63 20 64 61 74 61 20 73 74 72 75 63 74 75 72 ic data structur
0710: 65 73 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 es. */..#ifndef
0720: 4e 4f 5f 44 48 0a 2f 2a 20 66 72 6f 6d 20 6f 70 NO_DH./* from op
0730: 65 6e 73 73 6c 2f 61 70 70 73 2f 73 5f 73 65 72 enssl/apps/s_ser
0740: 76 65 72 2e 63 20 2a 2f 0a 0a 73 74 61 74 69 63 ver.c */..static
0750: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 unsigned char d
0760: 68 35 31 32 5f 70 5b 5d 3d 7b 0a 20 20 20 20 20 h512_p[]={.
0770: 20 20 20 30 78 44 41 2c 30 78 35 38 2c 30 78 33 0xDA,0x58,0x3
0780: 43 2c 30 78 31 36 2c 30 78 44 39 2c 30 78 38 35 C,0x16,0xD9,0x85
0790: 2c 30 78 32 32 2c 30 78 38 39 2c 30 78 44 30 2c ,0x22,0x89,0xD0,
07a0: 30 78 45 34 2c 30 78 41 46 2c 30 78 37 35 2c 0a 0xE4,0xAF,0x75,.
07b0: 20 20 20 20 20 20 20 20 30 78 36 46 2c 30 78 34 0x6F,0x4
07c0: 43 2c 30 78 43 41 2c 30 78 39 32 2c 30 78 44 44 C,0xCA,0x92,0xDD
07d0: 2c 30 78 34 42 2c 30 78 45 35 2c 30 78 33 33 2c ,0x4B,0xE5,0x33,
07e0: 30 78 42 38 2c 30 78 30 34 2c 30 78 46 42 2c 30 0xB8,0x04,0xFB,0
07f0: 78 30 46 2c 0a 20 20 20 20 20 20 20 20 30 78 45 x0F,. 0xE
0800: 44 2c 30 78 39 34 2c 30 78 45 46 2c 30 78 39 43 D,0x94,0xEF,0x9C
0810: 2c 30 78 38 41 2c 30 78 34 34 2c 30 78 30 33 2c ,0x8A,0x44,0x03,
0820: 30 78 45 44 2c 30 78 35 37 2c 30 78 34 36 2c 30 0xED,0x57,0x46,0
0830: 78 35 30 2c 30 78 44 33 2c 0a 20 20 20 20 20 20 x50,0xD3,.
0840: 20 20 30 78 36 39 2c 30 78 39 39 2c 30 78 44 42 0x69,0x99,0xDB
0850: 2c 30 78 32 39 2c 30 78 44 37 2c 30 78 37 36 2c ,0x29,0xD7,0x76,
0860: 30 78 32 37 2c 30 78 36 42 2c 30 78 41 32 2c 30 0x27,0x6B,0xA2,0
0870: 78 44 33 2c 30 78 44 34 2c 30 78 31 32 2c 0a 20 xD3,0xD4,0x12,.
0880: 20 20 20 20 20 20 20 30 78 45 32 2c 30 78 31 38 0xE2,0x18
0890: 2c 30 78 46 34 2c 30 78 44 44 2c 30 78 31 45 2c ,0xF4,0xDD,0x1E,
08a0: 30 78 30 38 2c 30 78 34 43 2c 30 78 46 36 2c 30 0x08,0x4C,0xF6,0
08b0: 78 44 38 2c 30 78 30 30 2c 30 78 33 45 2c 30 78 xD8,0x00,0x3E,0x
08c0: 37 43 2c 0a 20 20 20 20 20 20 20 20 30 78 34 37 7C,. 0x47
08d0: 2c 30 78 37 34 2c 30 78 45 38 2c 30 78 33 33 2c ,0x74,0xE8,0x33,
08e0: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 73 74 61 74 . };.stat
08f0: 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ic unsigned char
0900: 20 64 68 35 31 32 5f 67 5b 5d 3d 7b 0a 09 30 78 dh512_g[]={..0x
0910: 30 32 2c 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 44 02,.};..static D
0920: 48 20 2a 67 65 74 5f 64 68 35 31 32 28 29 0a 7b H *get_dh512().{
0930: 0a 20 20 20 20 44 48 20 2a 64 68 3d 4e 55 4c 4c . DH *dh=NULL
0940: 3b 0a 0a 20 20 20 20 69 66 20 28 28 64 68 3d 44 ;.. if ((dh=D
0950: 48 5f 6e 65 77 28 29 29 20 3d 3d 20 4e 55 4c 4c H_new()) == NULL
0960: 29 20 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ) return(NULL);.
0970: 0a 20 20 20 20 64 68 2d 3e 70 3d 42 4e 5f 62 69 . dh->p=BN_bi
0980: 6e 32 62 6e 28 64 68 35 31 32 5f 70 2c 73 69 7a n2bn(dh512_p,siz
0990: 65 6f 66 28 64 68 35 31 32 5f 70 29 2c 4e 55 4c eof(dh512_p),NUL
09a0: 4c 29 3b 0a 20 20 20 20 64 68 2d 3e 67 3d 42 4e L);. dh->g=BN
09b0: 5f 62 69 6e 32 62 6e 28 64 68 35 31 32 5f 67 2c _bin2bn(dh512_g,
09c0: 73 69 7a 65 6f 66 28 64 68 35 31 32 5f 67 29 2c sizeof(dh512_g),
09d0: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 NULL);.. if (
09e0: 28 64 68 2d 3e 70 20 3d 3d 20 4e 55 4c 4c 29 20 (dh->p == NULL)
09f0: 7c 7c 20 28 64 68 2d 3e 67 20 3d 3d 20 4e 55 4c || (dh->g == NUL
0a00: 4c 29 29 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c L))..return(NULL
0a10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 64 68 );. return(dh
0a20: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a );.}.#endif../*.
0a30: 20 2a 20 50 65 72 20 4f 70 65 6e 53 53 4c 20 30 * Per OpenSSL 0
0a40: 2e 39 2e 34 20 43 6f 6d 70 61 74 0a 20 2a 2f 0a .9.4 Compat. */.
0a50: 23 69 66 6e 64 65 66 20 53 54 41 43 4b 5f 4f 46 #ifndef STACK_OF
0a60: 0a 23 64 65 66 69 6e 65 20 53 54 41 43 4b 5f 4f .#define STACK_O
0a70: 46 28 78 29 09 09 09 53 54 41 43 4b 0a 23 64 65 F(x)...STACK.#de
0a80: 66 69 6e 65 20 73 6b 5f 53 53 4c 5f 43 49 50 48 fine sk_SSL_CIPH
0a90: 45 52 5f 6e 75 6d 28 73 6b 29 09 09 73 6b 5f 6e ER_num(sk)..sk_n
0aa0: 75 6d 28 28 73 6b 29 29 0a 23 64 65 66 69 6e 65 um((sk)).#define
0ab0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 sk_SSL_CIPHER_v
0ac0: 61 6c 75 65 28 20 73 6b 2c 20 69 6e 64 65 78 29 alue( sk, index)
0ad0: 09 28 53 53 4c 5f 43 49 50 48 45 52 2a 29 73 6b .(SSL_CIPHER*)sk
0ae0: 5f 76 61 6c 75 65 28 28 73 6b 29 2c 20 28 69 6e _value((sk), (in
0af0: 64 65 78 29 29 0a 23 65 6e 64 69 66 0a 0c 0a 2f dex)).#endif.../
0b00: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e -------. *. * In
0b50: 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a foCallback --. *
0b60: 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 4c . *.monitors SSL
0b70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 connection proc
0b80: 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ess. *. * Result
0b90: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
0ba0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
0bb0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b *.Calls callback
0bc0: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a (if defined). *
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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c10: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 ---. */.static v
0c20: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b oid.InfoCallback
0c30: 28 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 (SSL *ssl, int w
0c40: 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 0a 7b here, int ret).{
0c50: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
0c60: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 ePtr = (State*)S
0c70: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 SL_get_app_data(
0c80: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 ssl);. Tcl_Ob
0c90: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 j *cmdPtr;. c
0ca0: 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 har *major; char
0cb0: 20 2a 6d 69 6e 6f 72 3b 0a 20 20 20 20 69 6e 74 *minor;. int
0cc0: 20 77 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 w;.. if (sta
0cd0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
0ce0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
0cf0: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 L)..return;..
0d00: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 cmdPtr = Tcl_Du
0d10: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 plicateObj(state
0d20: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
0d30: 0a 23 69 66 20 30 0a 20 20 20 20 69 66 20 28 77 .#if 0. if (w
0d40: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c here & SSL_CB_AL
0d50: 45 52 54 29 20 7b 0a 09 73 65 76 20 3d 20 53 53 ERT) {..sev = SS
0d60: 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 L_alert_type_str
0d70: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 09 ing_long(ret);..
0d80: 69 66 20 28 73 74 72 63 6d 70 28 20 73 65 76 2c if (strcmp( sev,
0d90: 20 22 66 61 74 61 6c 22 29 3d 3d 30 29 20 7b 09 "fatal")==0) {.
0da0: 2f 2a 20 4d 61 70 20 74 6f 20 65 72 72 6f 72 20 /* Map to error
0db0: 2a 2f 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f */.. Tls_Erro
0dc0: 72 28 73 74 61 74 65 50 74 72 2c 20 53 53 4c 5f r(statePtr, SSL_
0dd0: 45 52 52 4f 52 28 73 73 6c 2c 20 30 29 29 3b 0a ERROR(ssl, 0));.
0de0: 09 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 7d 0a . return;..}.
0df0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 }.#endif.
0e00: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
0e10: 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 _CB_HANDSHAKE_ST
0e20: 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 ART) {..major =
0e30: 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 "handshake";..mi
0e40: 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 nor = "start";.
0e50: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 } else if (wh
0e60: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e ere & SSL_CB_HAN
0e70: 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 DSHAKE_DONE) {..
0e80: 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 major = "handsha
0e90: 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 ke";..minor = "d
0ea0: 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 one";. } else
0eb0: 20 7b 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 {..if (where &
0ec0: 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d SSL_CB_ALERT)..m
0ed0: 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a ajor = "alert";.
0ee0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
0ef0: 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 & SSL_ST_CONNECT
0f00: 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 ).major = "conne
0f10: 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 ct";..else if (w
0f20: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 here & SSL_ST_AC
0f30: 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 CEPT)..major = "
0f40: 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 accept";..else..
0f50: 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e ...major = "unkn
0f60: 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 own";...if (wher
0f70: 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 e & SSL_CB_READ)
0f80: 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 ..minor = "read"
0f90: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
0fa0: 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 e & SSL_CB_WRITE
0fb0: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 )..minor = "writ
0fc0: 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 e";..else if (wh
0fd0: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f ere & SSL_CB_LOO
0fe0: 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f P)..minor = "loo
0ff0: 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 p";..else if (wh
1000: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 ere & SSL_CB_EXI
1010: 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 T)..minor = "exi
1020: 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 t";..else.....mi
1030: 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b nor = "unknown";
1040: 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 54 63 6c . }... Tcl
1050: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1060: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d ement( statePtr-
1070: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c >interp, cmdPtr,
1080: 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 .. Tcl_NewSt
1090: 72 69 6e 67 4f 62 6a 28 20 22 69 6e 66 6f 22 2c ringObj( "info",
10a0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1));.. Tcl_
10b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
10c0: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e ment( statePtr->
10d0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
10e0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
10f0: 69 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43 ingObj( Tcl_GetC
1100: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 hannelName(state
1110: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20 Ptr->self), -1)
1120: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
1130: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1140: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ( statePtr->inte
1150: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
1160: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1170: 6a 28 20 6d 61 6a 6f 72 2c 20 2d 31 29 20 29 3b j( major, -1) );
1180: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
1190: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 jAppendElement(
11a0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
11b0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
11c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
11d0: 20 6d 69 6e 6f 72 2c 20 2d 31 29 20 29 3b 0a 0a minor, -1) );..
11e0: 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 if (where &
11f0: 28 53 53 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c (SSL_CB_LOOP|SSL
1200: 5f 43 42 5f 45 58 49 54 29 29 20 7b 0a 09 54 63 _CB_EXIT)) {..Tc
1210: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1220: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 lement( statePtr
1230: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
1240: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
1250: 72 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 73 74 61 ringObj( SSL_sta
1260: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 te_string_long(s
1270: 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20 20 20 sl), -1) );.
1280: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 } else if (where
1290: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 & SSL_CB_ALERT)
12a0: 20 7b 0a 09 63 68 61 72 20 2a 63 70 20 3d 20 53 {..char *cp = S
12b0: 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 SL_alert_desc_st
12c0: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a ring_long(ret);.
12d0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
12e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 endElement( stat
12f0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d ePtr->interp, cm
1300: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
1310: 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 63 70 2c ewStringObj( cp,
1320: 20 2d 31 29 20 29 3b 0a 20 20 20 20 7d 20 65 6c -1) );. } el
1330: 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 se {..Tcl_ListOb
1340: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 jAppendElement(
1350: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1360: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
1370: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1380: 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e SSL_state_strin
1390: 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 g_long(ssl), -1)
13a0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 );. }. Tc
13b0: 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c 69 l_Preserve( (Cli
13c0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
13d0: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 r->interp);.
13e0: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 Tcl_Preserve( (C
13f0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
1400: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 Ptr);.. Tcl_I
1410: 6e 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d 64 ncrRefCount( cmd
1420: 50 74 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 Ptr);. (void)
1430: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 4f Tcl_GlobalEvalO
1440: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 bj(statePtr->int
1450: 65 72 70 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 erp, cmdPtr);.
1460: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
1470: 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a 20 20 nt( cmdPtr);..
1480: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 Tcl_Release( (
1490: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
14a0: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 ePtr);. Tcl_R
14b0: 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74 44 elease( (ClientD
14c0: 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 ata) statePtr->i
14d0: 6e 74 65 72 70 29 3b 0a 0a 7d 0a 0c 0a 2f 2a 0a nterp);..}.../*.
14e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
14f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1520: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 -----. *. * Veri
1530: 66 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a fyCallback --. *
1540: 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 4c . *.monitors SSL
1550: 20 63 65 72 69 66 69 63 61 74 65 20 76 61 6c 69 cerificate vali
1560: 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 dation process.
1570: 2a 09 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 *.This is called
1580: 20 77 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 whenever a cert
1590: 69 66 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 ificate is inspe
15a0: 63 74 65 64 0a 20 2a 09 20 6f 72 20 64 65 63 69 cted. *. or deci
15b0: 64 65 64 20 69 6e 76 61 6c 69 64 0a 20 2a 0a 20 ded invalid. *.
15c0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6f 6b * Results:. *.ok
15d0: 20 2d 20 6c 65 74 20 53 53 4c 20 68 61 6e 64 6c - let SSL handl
15e0: 65 20 69 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 e it. *. * Side
15f0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 effects:. *.The
1600: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 err field of the
1610: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 currently opera
1620: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 tive State is se
1630: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 t. *. to a stri
1640: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 ng describing th
1650: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f e SSL negotiatio
1660: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e n failure reason
1670: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
16c0: 63 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c c int.VerifyCall
16d0: 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 back(int ok, X50
16e0: 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 9_STORE_CTX *ctx
16f0: 29 0a 7b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c ).{. SSL *ssl
1700: 20 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 = (SSL*)X509_ST
1710: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 61 70 70 5f ORE_CTX_get_app_
1720: 64 61 74 61 28 63 74 78 29 3b 0a 20 20 20 20 58 data(ctx);. X
1730: 35 30 39 20 2a 63 65 72 74 20 3d 20 58 35 30 39 509 *cert = X509
1740: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 _STORE_CTX_get_c
1750: 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 urrent_cert(ctx)
1760: 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 ;. State *sta
1770: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 tePtr = (State*)
1780: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 SSL_get_app_data
1790: 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f (ssl);. Tcl_O
17a0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
17b0: 69 6e 74 20 64 65 70 74 68 20 3d 20 58 35 30 39 int depth = X509
17c0: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 _STORE_CTX_get_e
17d0: 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b rror_depth(ctx);
17e0: 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 58 . int err = X
17f0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 509_STORE_CTX_ge
1800: 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 20 20 t_error(ctx);.
1810: 20 20 63 68 61 72 20 2a 65 72 72 53 74 72 3b 0a char *errStr;.
1820: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 . dprintf(std
1830: 65 72 72 2c 20 22 56 65 72 69 66 79 3a 20 25 64 err, "Verify: %d
1840: 5c 6e 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 \n", ok);.. i
1850: 66 20 28 21 6f 6b 29 0a 09 65 72 72 53 74 72 20 f (!ok)..errStr
1860: 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 = (char*)X509_ve
1870: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f rify_cert_error_
1880: 73 74 72 69 6e 67 28 65 72 72 29 3b 0a 20 20 20 string(err);.
1890: 20 65 6c 73 65 0a 09 65 72 72 53 74 72 20 3d 20 else..errStr =
18a0: 28 63 68 61 72 20 2a 29 30 3b 0a 0a 20 20 20 20 (char *)0;..
18b0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 if (statePtr->ca
18c0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f llback == (Tcl_O
18d0: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 bj*)NULL) {..if
18e0: 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 (statePtr->vflag
18f0: 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 s & SSL_VERIFY_F
1900: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 AIL_IF_NO_PEER_C
1910: 45 52 54 29 0a 09 20 20 20 20 72 65 74 75 72 6e ERT).. return
1920: 20 6f 6b 3b 0a 09 65 6c 73 65 0a 09 20 20 20 20 ok;..else..
1930: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a return 1;. }.
1940: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
1950: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
1960: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
1970: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
1980: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1990: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ( statePtr->inte
19a0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 20 rp, cmdPtr, ..
19b0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
19c0: 62 6a 28 20 22 76 65 72 69 66 79 22 2c 20 2d 31 bj( "verify", -1
19d0: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 ));.. Tcl_Lis
19e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
19f0: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 t( statePtr->int
1a00: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 erp, cmdPtr, ..
1a10: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
1a20: 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43 68 61 6e Obj( Tcl_GetChan
1a30: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
1a40: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20 29 3b 0a ->self), -1) );.
1a50: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1a60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 AppendElement( s
1a70: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
1a80: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
1a90: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 20 64 65 70 l_NewIntObj( dep
1aa0: 74 68 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f th) );.. Tcl_
1ab0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1ac0: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e ment( statePtr->
1ad0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
1ae0: 09 20 20 20 20 54 6c 73 5f 4e 65 77 58 35 30 39 . Tls_NewX509
1af0: 4f 62 6a 28 20 73 74 61 74 65 50 74 72 2d 3e 69 Obj( statePtr->i
1b00: 6e 74 65 72 70 2c 20 63 65 72 74 29 20 29 3b 0a nterp, cert) );.
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 6f 6b 29 l_NewIntObj( ok)
1b60: 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 );.. Tcl_Lis
1b70: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1b80: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 t( statePtr->int
1b90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
1ba0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
1bb0: 62 6a 28 20 65 72 72 53 74 72 20 3f 20 65 72 72 bj( errStr ? err
1bc0: 53 74 72 20 3a 20 22 22 2c 20 2d 31 29 20 29 3b Str : "", -1) );
1bd0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 .. Tcl_Preser
1be0: 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 ve( (ClientData)
1bf0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
1c00: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 p);. Tcl_Pres
1c10: 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 erve( (ClientDat
1c20: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 a) statePtr);..
1c30: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
1c40: 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 20 20 unt( cmdPtr);.
1c50: 20 20 69 66 20 28 54 63 6c 5f 47 6c 6f 62 61 6c if (Tcl_Global
1c60: 45 76 61 6c 4f 62 6a 28 73 74 61 74 65 50 74 72 EvalObj(statePtr
1c70: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
1c80: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
1c90: 2f 2a 20 69 74 20 67 6f 74 20 61 6e 20 65 72 72 /* it got an err
1ca0: 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20 or - reject the
1cb0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
1cc0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 Tcl_BackgroundEr
1cd0: 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d 3e 69 ror( statePtr->i
1ce0: 6e 74 65 72 70 29 3b 0a 09 6f 6b 20 3d 20 30 3b nterp);..ok = 0;
1cf0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 . } else {..i
1d00: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
1d10: 6d 4f 62 6a 28 20 73 74 61 74 65 50 74 72 2d 3e mObj( statePtr->
1d20: 69 6e 74 65 72 70 2c 0a 09 09 20 20 20 20 54 63 interp,... Tc
1d30: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 20 l_GetObjResult(
1d40: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1d50: 29 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c 5f 4f ), &ok) != TCL_O
1d60: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 42 61 K) {.. Tcl_Ba
1d70: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 20 73 ckgroundError( s
1d80: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 tatePtr->interp)
1d90: 3b 0a 09 20 20 20 20 6f 6b 20 3d 20 30 3b 0a 09 ;.. ok = 0;..
1da0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f }. }. Tcl_
1db0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d DecrRefCount( cm
1dc0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f dPtr);.. Tcl_
1dd0: 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74 Release( (Client
1de0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
1df0: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 . Tcl_Release
1e00: 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 ( (ClientData) s
1e10: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 tatePtr->interp)
1e20: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b ;.. return(ok
1e30: 29 3b 09 2f 2a 20 6c 65 61 76 65 20 74 68 65 20 );./* leave the
1e40: 64 69 73 70 6f 73 69 74 69 6f 6e 20 61 73 20 53 disposition as S
1e50: 53 4c 20 73 65 74 20 69 74 20 2a 2f 0a 7d 0a 0c SL set it */.}..
1e60: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
1e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
1eb0: 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a Tls_Error --. *.
1ec0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
1ed0: 6b 20 77 69 74 68 20 24 66 64 20 61 6e 64 20 24 k with $fd and $
1ee0: 6d 73 67 20 2d 20 73 6f 20 74 68 65 20 63 61 6c msg - so the cal
1ef0: 6c 62 61 63 6b 20 63 61 6e 20 64 65 63 69 64 65 lback can decide
1f00: 0a 20 2a 09 77 68 61 74 20 74 6f 20 64 6f 20 77 . *.what to do w
1f10: 69 74 68 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 ith errors.. *.
1f20: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6f 6b * Results:. *.ok
1f30: 20 2d 20 6c 65 74 20 53 53 4c 20 68 61 6e 64 6c - let SSL handl
1f40: 65 20 69 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 e it. *. * Side
1f50: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 effects:. *.The
1f60: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 err field of the
1f70: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 currently opera
1f80: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 tive State is se
1f90: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 t. *. to a stri
1fa0: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 ng describing th
1fb0: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f e SSL negotiatio
1fc0: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e n failure reason
1fd0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2010: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a ------. */.void.
2020: 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 Tls_Error(State
2030: 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 *statePtr, char
2040: 2a 6d 73 67 29 0a 7b 0a 20 20 20 20 54 63 6c 5f *msg).{. Tcl_
2050: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 0a 20 20 Obj *cmdPtr;..
2060: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73 if (msg && *ms
2070: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 g) {..Tcl_SetErr
2080: 6f 72 43 6f 64 65 28 20 73 74 61 74 65 50 74 72 orCode( statePtr
2090: 2d 3e 69 6e 74 65 72 70 2c 20 22 53 53 4c 22 2c ->interp, "SSL",
20a0: 20 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e 55 msg, (char *)NU
20b0: 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 LL);. } else
20c0: 7b 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 {..msg = Tcl_Get
20d0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 StringFromObj(Tc
20e0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 73 l_GetObjResult(s
20f0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 tatePtr->interp)
2100: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 , NULL);. }.
2110: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 statePtr->err
2120: 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66 20 = msg;.. if
2130: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
2140: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a ack == (Tcl_Obj*
2150: 29 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 )NULL) {..char b
2160: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70 72 uf[BUFSIZ];..spr
2170: 69 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20 63 intf(buf, "SSL c
2180: 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20 65 hannel \"%s\": e
2190: 72 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20 20 rror: %s",..
21a0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
21b0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
21c0: 66 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f 53 f), msg);..Tcl_S
21d0: 65 74 52 65 73 75 6c 74 28 20 73 74 61 74 65 50 etResult( stateP
21e0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 62 75 66 2c tr->interp, buf,
21f0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a TCL_VOLATILE);.
2200: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
2210: 72 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d 3e rror( statePtr->
2220: 69 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e interp);..return
2230: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 ;. }. cmdP
2240: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
2250: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
2260: 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 callback);..
2270: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2280: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 dElement( stateP
2290: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
22a0: 74 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 tr, .. Tcl_Ne
22b0: 77 53 74 72 69 6e 67 4f 62 6a 28 20 22 65 72 72 wStringObj( "err
22c0: 6f 72 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 or", -1));..
22d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
22e0: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 dElement( stateP
22f0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
2300: 74 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 tr, .. Tcl_Ne
2310: 77 53 74 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f wStringObj( Tcl_
2320: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
2330: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
2340: 2d 31 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1) );.. Tcl_
2350: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2360: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e ment( statePtr->
2370: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
2380: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
2390: 6e 67 4f 62 6a 28 20 6d 73 67 2c 20 2d 31 29 20 ngObj( msg, -1)
23a0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
23b0: 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 erve( (ClientDat
23c0: 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 a) statePtr->int
23d0: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 erp);. Tcl_Pr
23e0: 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 eserve( (ClientD
23f0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
2400: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
2410: 43 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a Count( cmdPtr);.
2420: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 6c 6f 62 if (Tcl_Glob
2430: 61 6c 45 76 61 6c 4f 62 6a 28 73 74 61 74 65 50 alEvalObj(stateP
2440: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
2450: 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b tr) != TCL_OK) {
2460: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 ..Tcl_Background
2470: 45 72 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d Error( statePtr-
2480: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a >interp);. }.
2490: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
24a0: 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a ount( cmdPtr);..
24b0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
24c0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 (ClientData) st
24d0: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c atePtr);. Tcl
24e0: 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e _Release( (Clien
24f0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d tData) statePtr-
2500: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a >interp);.}.../*
2510: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2550: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 ------. *. * Pas
2560: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 20 2d 2d swordCallback --
2570: 20 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 . *. *.Called w
2580: 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 69 hen a password i
2590: 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e 70 61 s needed to unpa
25a0: 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d 20 6b ck RSA and PEM k
25b0: 65 79 73 0a 20 2a 09 45 76 61 6c 73 20 74 68 65 eys. *.Evals the
25c0: 20 74 63 6c 20 70 72 6f 63 3a 20 20 74 6c 73 3a tcl proc: tls:
25d0: 3a 70 61 73 73 77 6f 72 64 20 61 6e 64 20 72 65 :password and re
25e0: 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 turns the result
25f0: 20 61 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77 as. *.the passw
2600: 6f 72 64 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ord. *----------
2610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 ---------. */.#i
2650: 66 64 65 66 20 50 52 45 5f 4f 50 45 4e 53 53 4c fdef PRE_OPENSSL
2660: 5f 30 5f 39 5f 34 0a 2f 2a 0a 20 2a 20 4e 6f 20 _0_9_4./*. * No
2670: 77 61 79 20 74 6f 20 68 61 6e 64 6c 65 20 75 73 way to handle us
2680: 65 72 2d 64 61 74 61 20 74 68 65 72 65 66 6f 72 er-data therefor
2690: 65 20 6e 6f 20 77 61 79 20 77 69 74 68 6f 75 74 e no way without
26a0: 20 61 20 67 6c 6f 62 61 6c 0a 20 2a 20 76 61 72 a global. * var
26b0: 69 61 62 6c 65 20 74 6f 20 61 63 63 65 73 73 20 iable to access
26c0: 74 68 65 20 54 63 6c 20 69 6e 74 65 72 70 72 65 the Tcl interpre
26d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ter..*/.static i
26e0: 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 nt.PasswordCallb
26f0: 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 ack(char *buf, i
2700: 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 72 nt size, int ver
2710: 69 66 79 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 ify).{. retur
2720: 6e 20 2d 31 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74 n -1;.}.#else.st
2730: 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 atic int.Passwor
2740: 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a dCallback(char *
2750: 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 buf, int size, i
2760: 6e 74 20 76 65 72 69 66 79 2c 20 76 6f 69 64 20 nt verify, void
2770: 2a 75 64 61 74 61 29 0a 7b 0a 20 20 20 20 54 63 *udata).{. Tc
2780: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
2790: 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 = (Tcl_Interp*)
27a0: 75 64 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 udata;.. if (
27b0: 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c Tcl_Eval(interp,
27c0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 "tls::password"
27d0: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) == TCL_OK) {..
27e0: 63 68 61 72 20 2a 72 65 74 20 3d 20 54 63 6c 5f char *ret = Tcl_
27f0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 GetStringResult(
2800: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 20 interp);.
2810: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 strncpy(buf, re
2820: 74 2c 20 73 69 7a 65 29 3b 0a 09 72 65 74 75 72 t, size);..retur
2830: 6e 20 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 20 n strlen(ret);.
2840: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 74 } else {..ret
2850: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 7d 0a urn -1;. }.}.
2860: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28b0: 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f -. *. * CiphersO
28c0: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 bjCmd -- list av
28d0: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a ailable ciphers.
28e0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
28f0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
2900: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
2910: 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f tls::ciphers" co
2920: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 mmand. *.to list
2930: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
2940: 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 rs, based upon p
2950: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
2960: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
2970: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
2980: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a cl result list..
2990: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
29a0: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 ts:. *.construct
29b0: 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 s and destroys S
29c0: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 SL context (CTX)
29d0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
29e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
2a20: 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 atic int.Ciphers
2a30: 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 ObjCmd(clientDat
2a40: 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c a, interp, objc,
2a50: 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e objv). Clien
2a60: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
2a70: 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a ;./* Not used. *
2a80: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 /. Tcl_Interp
2a90: 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e *interp;. in
2aa0: 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f t objc;. Tcl_
2ab0: 4f 62 6a 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b Obj.*CONST objv[
2ac0: 5d 3b 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20 ];.{. static
2ad0: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b char *protocols[
2ae0: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 0a 09 ] = {.."ssl2",..
2af0: 22 73 73 6c 33 22 2c 0a 09 22 74 6c 73 31 22 2c "ssl3",.."tls1",
2b00: 0a 09 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20 ..NULL. };.
2b10: 20 20 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 enum protocol
2b20: 7b 0a 09 54 4c 53 5f 53 53 4c 32 2c 0a 09 54 4c {..TLS_SSL2,..TL
2b30: 53 5f 53 53 4c 33 2c 0a 09 54 4c 53 5f 54 4c 53 S_SSL3,..TLS_TLS
2b40: 31 2c 0a 09 54 4c 53 5f 4e 4f 4e 45 0a 20 20 20 1,..TLS_NONE.
2b50: 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 };. Tcl_Obj
2b60: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 53 53 4c *objPtr;. SSL
2b70: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
2b80: 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d ;. SSL *ssl =
2b90: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b NULL;. STACK
2ba0: 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20 _OF(SSL_CIPHER)
2bb0: 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 *sk;. char *c
2bc0: 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a p, buf[BUFSIZ];.
2bd0: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 int index, v
2be0: 65 72 62 6f 73 65 20 3d 20 30 3b 0a 0a 20 20 20 erbose = 0;..
2bf0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c if (objc < 2 ||
2c00: 20 6f 62 6a 63 20 3e 20 33 29 20 7b 0a 09 54 63 objc > 3) {..Tc
2c10: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
2c20: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
2c30: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f "protocol ?verbo
2c40: 73 65 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 72 se?");. r
2c50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
2c60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 . }. if (T
2c70: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f cl_GetIndexFromO
2c80: 62 6a 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 bj( interp, objv
2c90: 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 [1], protocols,
2ca0: 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 0a 09 "protocol", 0,..
2cb0: 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f &index) != TCL_O
2cc0: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
2cd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
2ce0: 20 20 69 66 20 28 6f 62 6a 63 20 3e 20 32 20 26 if (objc > 2 &
2cf0: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e & Tcl_GetBoolean
2d00: 46 72 6f 6d 4f 62 6a 28 20 69 6e 74 65 72 70 2c FromObj( interp,
2d10: 20 6f 62 6a 76 5b 32 5d 2c 0a 09 26 76 65 72 62 objv[2],..&verb
2d20: 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ose) != TCL_OK)
2d30: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
2d40: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 ROR;. }. s
2d50: 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f witch ((enum pro
2d60: 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 20 tocol)index) {.
2d70: 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 case TLS_SSL2
2d80: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
2d90: 5f 53 53 4c 32 29 0a 09 09 54 63 6c 5f 41 70 70 _SSL2)...Tcl_App
2da0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
2db0: 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 , "protocol not
2dc0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
2dd0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
2de0: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 63 ERROR;.#else...c
2df0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
2e00: 28 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29 (SSLv2_method())
2e10: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
2e20: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c case TLS_SSL
2e30: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 3:.#if defined(N
2e40: 4f 5f 53 53 4c 33 29 0a 09 09 54 63 6c 5f 41 70 O_SSL3)...Tcl_Ap
2e50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
2e60: 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 p, "protocol not
2e70: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
2e80: 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c L);...return TCL
2e90: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 _ERROR;.#else...
2ea0: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
2eb0: 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 w(SSLv3_method()
2ec0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ); break;.#endif
2ed0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c . case TLS_TL
2ee0: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 S1:.#if defined(
2ef0: 4e 4f 5f 54 4c 53 31 29 0a 09 09 54 63 6c 5f 41 NO_TLS1)...Tcl_A
2f00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
2f10: 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f rp, "protocol no
2f20: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
2f30: 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 LL);...return TC
2f40: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 L_ERROR;.#else..
2f50: 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e .ctx = SSL_CTX_n
2f60: 65 77 28 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 ew(TLSv1_method(
2f70: 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 )); break;.#endi
2f80: 66 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 f. }. if (
2f90: 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ctx == NULL) {..
2fa0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
2fb0: 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 (interp, REASON(
2fc0: 29 2c 0a 09 20 20 20 20 28 63 68 61 72 20 2a 29 ),.. (char *)
2fd0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
2fe0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
2ff0: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e . ssl = SSL_n
3000: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20 ew(ctx);. if
3010: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ssl == NULL) {.
3020: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
3030: 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e t(interp, REASON
3040: 28 29 2c 0a 09 20 20 20 20 28 63 68 61 72 20 2a (),.. (char *
3050: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
3060: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
3070: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
3080: 20 20 20 20 7d 0a 20 20 20 20 6f 62 6a 50 74 72 }. objPtr
3090: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 = Tcl_NewListOb
30a0: 6a 28 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 j( 0, NULL);..
30b0: 20 20 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 if (!verbose)
30c0: 7b 0a 09 66 6f 72 20 28 69 6e 64 65 78 20 3d 20 {..for (index =
30d0: 30 3b 20 3b 20 69 6e 64 65 78 2b 2b 29 20 7b 0a 0; ; index++) {.
30e0: 09 20 20 20 20 63 70 20 3d 20 28 63 68 61 72 2a . cp = (char*
30f0: 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f )SSL_get_cipher_
3100: 6c 69 73 74 28 20 73 73 6c 2c 20 69 6e 64 65 78 list( ssl, index
3110: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 70 20 3d );.. if (cp =
3120: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 = NULL) break;..
3130: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
3140: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e ppendElement( in
3150: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 terp, objPtr,...
3160: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
3170: 28 20 63 70 2c 20 2d 31 29 20 29 3b 0a 09 7d 0a ( cp, -1) );..}.
3180: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b } else {..sk
3190: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 = SSL_get_ciphe
31a0: 72 73 28 73 73 6c 29 3b 0a 0a 09 66 6f 72 20 28 rs(ssl);...for (
31b0: 69 6e 64 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 index = 0; index
31c0: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 < sk_SSL_CIPHER
31d0: 5f 6e 75 6d 28 73 6b 29 3b 20 69 6e 64 65 78 2b _num(sk); index+
31e0: 2b 29 20 7b 0a 09 20 20 20 20 72 65 67 69 73 74 +) {.. regist
31f0: 65 72 20 69 6e 74 20 69 3b 0a 09 20 20 20 20 53 er int i;.. S
3200: 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 SL_CIPHER_descri
3210: 70 74 69 6f 6e 28 20 73 6b 5f 53 53 4c 5f 43 49 ption( sk_SSL_CI
3220: 50 48 45 52 5f 76 61 6c 75 65 28 20 73 6b 2c 20 PHER_value( sk,
3230: 69 6e 64 65 78 29 2c 0a 09 09 09 09 20 20 20 20 index),.....
3240: 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 buf, sizeof(buf)
3250: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 20 3d );.. for (i =
3260: 20 73 74 72 6c 65 6e 28 62 75 66 29 20 2d 20 31 strlen(buf) - 1
3270: 3b 20 69 20 3b 20 69 2d 2d 29 20 7b 0a 09 09 69 ; i ; i--) {...i
3280: 66 20 28 62 75 66 5b 69 5d 20 3d 3d 20 27 20 27 f (buf[i] == ' '
3290: 20 7c 7c 20 62 75 66 5b 69 5d 20 3d 3d 20 27 5c || buf[i] == '\
32a0: 6e 27 20 7c 7c 0a 09 09 20 20 20 20 62 75 66 5b n' ||... buf[
32b0: 69 5d 20 3d 3d 20 27 5c 72 27 20 7c 7c 20 62 75 i] == '\r' || bu
32c0: 66 5b 69 5d 20 3d 3d 20 27 5c 74 27 29 20 7b 0a f[i] == '\t') {.
32d0: 09 09 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 27 .. buf[i] = '
32e0: 5c 30 27 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a \0';...} else {.
32f0: 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d .. break;...}
3300: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
3310: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3320: 65 6d 65 6e 74 28 20 69 6e 74 65 72 70 2c 20 6f ement( interp, o
3330: 62 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 bjPtr,...Tcl_New
3340: 53 74 72 69 6e 67 4f 62 6a 28 20 62 75 66 2c 20 StringObj( buf,
3350: 2d 31 29 20 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a -1) );..}. }.
3360: 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c SSL_free(ssl
3370: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 );. SSL_CTX_f
3380: 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 ree(ctx);.. T
3390: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
33a0: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 interp, objPtr)
33b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
33c0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3410: 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b -. *. * Handshak
3420: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a eObjCmd --. *. *
3430: 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 .This command is
3440: 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 used to verify
3450: 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 whether the hand
3460: 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 shake is complet
3470: 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a e. *.or not.. *.
3480: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
3490: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
34a0: 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 sult. 1 means ha
34b0: 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 ndshake complete
34c0: 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e , 0 means pendin
34d0: 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 g.. *. * Side ef
34e0: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f fects:. *.May fo
34f0: 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 rce SSL negotiat
3500: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 ion to take plac
3510: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
3560: 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 61 6e 64 .static int.Hand
3570: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 63 6c 69 65 shakeObjCmd(clie
3580: 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 ntData, interp,
3590: 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 objc, objv).
35a0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
35b0: 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 tData;./* Not us
35c0: 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 ed. */. Tcl_I
35d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 nterp *interp;.
35e0: 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 int objc;.
35f0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 Tcl_Obj *CONST
3600: 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63 objv[];.{. Tc
3610: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 l_Channel chan;.
3620: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 ./* The channel
3630: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e to set a mode on
3640: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a . */. State *
3650: 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c statePtr;../* cl
3660: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 ient state for s
3670: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 sl socket */.
3680: 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 0a 20 int ret = 1;..
3690: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 if (objc != 2
36a0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
36b0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
36c0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 objv, "channel"
36d0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 );. retur
36e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
36f0: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
3700: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
3710: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
3720: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
3730: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 1], NULL), NULL)
3740: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
3750: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
3760: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 NULL) {.
3770: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
3780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
3790: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
37a0: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
37b0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
37c0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 . Tcl_App
37d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
37e0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
37f0: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
3800: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 20 20 elName(chan),.
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c "\
3820: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
3830: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 nnel", NULL);.
3840: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c return TCL
3850: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
3860: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 statePtr = (St
3870: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
3880: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
3890: 28 20 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 ( chan);.. if
38a0: 20 28 21 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 (!SSL_is_init_f
38b0: 69 6e 69 73 68 65 64 28 73 74 61 74 65 50 74 72 inished(statePtr
38c0: 2d 3e 73 73 6c 29 29 20 7b 0a 09 69 6e 74 20 65 ->ssl)) {..int e
38d0: 72 72 3b 0a 09 72 65 74 20 3d 20 54 6c 73 5f 57 rr;..ret = Tls_W
38e0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 aitForConnect(st
38f0: 61 74 65 50 74 72 2c 20 26 65 72 72 29 3b 0a 09 atePtr, &err);..
3900: 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 if (ret < 0) {..
3910: 20 20 20 20 63 68 61 72 20 2a 65 72 72 53 74 72 char *errStr
3920: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 = statePtr->err
3930: 3b 0a 09 20 20 20 20 54 63 6c 5f 52 65 73 65 74 ;.. Tcl_Reset
3940: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
3950: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6e . Tcl_SetErrn
3960: 6f 28 65 72 72 29 3b 0a 0a 09 20 20 20 20 69 66 o(err);... if
3970: 20 28 21 65 72 72 53 74 72 20 7c 7c 20 2a 65 72 (!errStr || *er
3980: 72 53 74 72 20 3d 3d 20 30 29 0a 09 20 20 20 20 rStr == 0)..
3990: 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c errStr = Tcl
39a0: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 _PosixError(inte
39b0: 72 70 29 3b 0a 0a 09 20 20 20 20 54 63 6c 5f 41 rp);... Tcl_A
39c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
39d0: 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 rp, "handshake f
39e0: 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 ailed: ", errStr
39f0: 2c 20 28 63 68 61 72 2a 29 4e 55 4c 4c 29 3b 0a , (char*)NULL);.
3a00: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
3a10: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
3a20: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
3a30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
3a40: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 _NewIntObj(ret))
3a50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
3a60: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ab0: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 -. *. * ImportOb
3ac0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
3ad0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
3ae0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
3af0: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d ss the "ssl" com
3b00: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 mand. *. *.The s
3b10: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 sl command pushe
3b20: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 s SSL over a (ne
3b30: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 wly connected) t
3b40: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 cp socket. *. *
3b50: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
3b60: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
3b70: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
3b80: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f fects:. *.May mo
3b90: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f dify the behavio
3ba0: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e r of an IO chann
3bb0: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
3bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3c00: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 ..static int.Imp
3c10: 6f 72 74 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74 ortObjCmd(client
3c20: 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 Data, interp, ob
3c30: 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c jc, objv). Cl
3c40: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
3c50: 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64 ata;./* Not used
3c60: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 . */. Tcl_Int
3c70: 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20 erp *interp;.
3c80: 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54 int objc;. T
3c90: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 cl_Obj *CONST ob
3ca0: 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63 6c 5f jv[];.{. Tcl_
3cb0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
3cc0: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f * The channel to
3cd0: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 set a mode on.
3ce0: 2a 2f 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b */. BIO *bio;
3cf0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
3d00: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 ePtr;../* client
3d10: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
3d20: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c ocket */. SSL
3d30: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
3d40: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 ;. Tcl_Obj *s
3d50: 63 72 69 70 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 cript = NULL;.
3d60: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 69 int idx;. i
3d70: 6e 74 20 66 6c 61 67 73 20 3d 20 54 4c 53 5f 54 nt flags = TLS_T
3d80: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 CL_INIT;. int
3d90: 20 73 65 72 76 65 72 20 3d 20 30 3b 09 09 2f 2a server = 0;../*
3da0: 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 is connection i
3db0: 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f ncoming or outgo
3dc0: 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 ing? */. char
3dd0: 20 2a 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *key = NULL;.
3de0: 20 20 63 68 61 72 20 2a 63 65 72 74 20 3d 20 4e char *cert = N
3df0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 ULL;. char *c
3e00: 69 70 68 65 72 73 20 3d 20 4e 55 4c 4c 3b 0a 20 iphers = NULL;.
3e10: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 20 char *CAfile
3e20: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
3e30: 20 2a 43 41 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a *CAdir = NULL;.
3e40: 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 20 char *model
3e50: 3d 20 4e 55 4c 4c 3b 0a 23 69 66 20 64 65 66 69 = NULL;.#if defi
3e60: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 ned(NO_SSL2).
3e70: 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 3b 0a 23 int ssl2 = 0;.#
3e80: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 73 73 6c else. int ssl
3e90: 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 2 = 1;.#endif.#i
3ea0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c f defined(NO_SSL
3eb0: 33 29 0a 20 20 20 20 69 6e 74 20 73 73 6c 33 20 3). int ssl3
3ec0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 = 0;.#else. i
3ed0: 6e 74 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e nt ssl3 = 1;.#en
3ee0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
3ef0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 NO_SSL2) && defi
3f00: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 ned(NO_SSL3).
3f10: 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 3b 0a 23 int tls1 = 1;.#
3f20: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 74 6c 73 else. int tls
3f30: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 1 = 0;.#endif.
3f40: 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 3b int proto = 0;
3f50: 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 . int verify
3f60: 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 = 0, require = 0
3f70: 2c 20 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a , request = 1;..
3f80: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
3f90: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
3fa0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
3fb0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 objv, "channel
3fc0: 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 20 20 20 ?options?");.
3fd0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f return TCL_
3fe0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
3ff0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
4000: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
4010: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
4020: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 mObj(objv[1], NU
4030: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 LL), NULL);.
4040: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
4050: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
4060: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e {. return
4070: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
4080: 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 }.. for (idx
4090: 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b = 2; idx < objc;
40a0: 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 idx++) {..char
40b0: 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 *opt = Tcl_GetSt
40c0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
40d0: 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 [idx], NULL);...
40e0: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d if (opt[0] != '-
40f0: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a ').. break;..
4100: 09 4f 50 54 53 54 52 28 20 22 2d 63 61 66 69 6c .OPTSTR( "-cafil
4110: 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 e", CAfile);..OP
4120: 54 53 54 52 28 20 22 2d 63 61 64 69 72 22 2c 20 TSTR( "-cadir",
4130: 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 CAdir);..OPTSTR(
4140: 20 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 "-certfile", ce
4150: 72 74 29 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d rt);..OPTSTR( "-
4160: 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 cipher", ciphers
4170: 29 3b 0a 09 4f 50 54 4f 42 4a 28 20 22 2d 63 6f );..OPTOBJ( "-co
4180: 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b mmand", script);
4190: 0a 09 4f 50 54 53 54 52 28 20 22 2d 6b 65 79 66 ..OPTSTR( "-keyf
41a0: 69 6c 65 22 2c 20 6b 65 79 29 3b 0a 09 4f 50 54 ile", key);..OPT
41b0: 53 54 52 28 20 22 2d 6d 6f 64 65 6c 22 2c 20 6d STR( "-model", m
41c0: 6f 64 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 odel);..OPTBOOL(
41d0: 20 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 "-require", req
41e0: 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 uire);..OPTBOOL(
41f0: 20 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 "-request", req
4200: 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 uest);..OPTBOOL(
4210: 20 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 "-server", serv
4220: 65 72 29 3b 0a 0a 09 4f 50 54 42 4f 4f 4c 28 20 er);...OPTBOOL(
4230: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a "-ssl2", ssl2);.
4240: 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 73 73 6c 33 .OPTBOOL( "-ssl3
4250: 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f ", ssl3);..OPTBO
4260: 4f 4c 28 20 22 2d 74 6c 73 31 22 2c 20 74 6c 73 OL( "-tls1", tls
4270: 31 29 3b 0a 0a 09 4f 50 54 42 41 44 28 20 22 6f 1);...OPTBAD( "o
4280: 70 74 69 6f 6e 22 2c 20 22 2d 63 61 66 69 6c 65 ption", "-cafile
4290: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 65 72 74 66 , -cadir, -certf
42a0: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 ile, -cipher, -c
42b0: 6f 6d 6d 61 6e 64 2c 20 2d 6b 65 79 66 69 6c 65 ommand, -keyfile
42c0: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 72 65 71 75 69 , -model, -requi
42d0: 72 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 73 re, -request, -s
42e0: 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 73 65 72 sl2, -ssl3, -ser
42f0: 76 65 72 2c 20 6f 72 20 2d 74 6c 73 31 22 29 3b ver, or -tls1");
4300: 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
4310: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
4320: 66 20 28 72 65 71 75 65 73 74 29 20 76 65 72 69 f (request) veri
4330: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
4340: 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 _CLIENT_ONCE | S
4350: 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a SL_VERIFY_PEER;.
4360: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 if (request
4370: 26 26 20 72 65 71 75 69 72 65 29 20 76 65 72 69 && require) veri
4380: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 fy |= SSL_VERIFY
4390: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 _FAIL_IF_NO_PEER
43a0: 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 76 _CERT;. if (v
43b0: 65 72 69 66 79 20 3d 3d 20 30 29 20 76 65 72 69 erify == 0) veri
43c0: 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f fy = SSL_VERIFY_
43d0: 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f NONE;.. proto
43e0: 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f |= (ssl2 ? TLS_
43f0: 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b PROTO_SSL2 : 0);
4400: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 . proto |= (s
4410: 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f sl3 ? TLS_PROTO_
4420: 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 SSL3 : 0);. p
4430: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 roto |= (tls1 ?
4440: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a TLS_PROTO_TLS1 :
4450: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 0);.. /* res
4460: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c et to NULL if bl
4470: 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 ank string provi
4480: 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 ded */. if (c
4490: 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 20 63 ert && !*cert) c
44a0: 65 72 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ert = NULL;.
44b0: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 if (key && !*key
44c0: 29 20 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ) key = NULL;.
44d0: 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 if (ciphers &&
44e0: 20 21 2a 63 69 70 68 65 72 73 29 20 63 69 70 68 !*ciphers) ciph
44f0: 65 72 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ers = NULL;.
4500: 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a if (CAfile && !*
4510: 43 41 66 69 6c 65 29 20 43 41 66 69 6c 65 20 3d CAfile) CAfile =
4520: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 NULL;. if (C
4530: 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72 29 Adir && !*CAdir)
4540: 20 43 41 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a 0a CAdir = NULL;..
4550: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d if (model !=
4560: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f NULL) {..int mo
4570: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 de;../* Get the
4580: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 "model" context
4590: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 */..chan = Tcl_G
45a0: 65 74 43 68 61 6e 6e 65 6c 28 20 69 6e 74 65 72 etChannel( inter
45b0: 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 p, model, &mode)
45c0: 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 ;..if (chan == (
45d0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 30 29 20 7b Tcl_Channel)0) {
45e0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
45f0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 69 66 20 28 _ERROR;..}..if (
4600: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
4610: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
4620: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
4630: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
4640: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
4650: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
4660: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
4670: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 20 20 20 ame(chan),...
4680: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 "\": not a TLS
4690: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
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 73 74 61 74 _ERROR;..}..stat
46c0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
46d0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
46e0: 73 74 61 6e 63 65 44 61 74 61 28 20 63 68 61 6e stanceData( chan
46f0: 29 3b 0a 09 63 74 78 20 3d 20 73 74 61 74 65 50 );..ctx = stateP
4700: 74 72 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 tr->ctx;. } e
4710: 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 lse {..if ((ctx
4720: 3d 20 43 54 58 5f 49 6e 69 74 28 20 69 6e 74 65 = CTX_Init( inte
4730: 72 70 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 2c 20 rp, proto, key,
4740: 63 65 72 74 2c 20 43 41 64 69 72 2c 20 43 41 66 cert, CAdir, CAf
4750: 69 6c 65 2c 20 63 69 70 68 65 72 73 29 29 0a 09 ile, ciphers))..
4760: 20 20 20 20 3d 3d 20 28 53 53 4c 5f 43 54 58 2a == (SSL_CTX*
4770: 29 30 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 )0) {.. retur
4780: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
4790: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 6e 65 }.. /* ne
47a0: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 w SSL state */.
47b0: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 statePtr = (S
47c0: 74 61 74 65 20 2a 29 20 54 63 6c 5f 41 6c 6c 6f tate *) Tcl_Allo
47d0: 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a c((unsigned) siz
47e0: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 eof(State));.
47f0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 statePtr->self
4800: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 4e = (Tcl_Channel)N
4810: 55 4c 4c 3b 0a 20 20 20 20 73 74 61 74 65 50 74 ULL;. statePt
4820: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f r->timer = (Tcl_
4830: 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c 3b TimerToken)NULL;
4840: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
4850: 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 flags = flags;.
4860: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74 statePtr->wat
4870: 63 68 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 chMask = 0;.
4880: 73 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65 20 3d statePtr->mode =
4890: 20 30 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 0;.. statePt
48a0: 72 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 r->interp = inte
48b0: 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 rp;. statePtr
48c0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 28 54 63 ->callback = (Tc
48d0: 6c 5f 4f 62 6a 20 2a 29 30 3b 0a 0a 20 20 20 20 l_Obj *)0;..
48e0: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 statePtr->vflags
48f0: 20 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 = verify;. s
4900: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 28 tatePtr->ssl = (
4910: 53 53 4c 2a 29 30 3b 0a 20 20 20 20 73 74 61 74 SSL*)0;. stat
4920: 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b ePtr->ctx = ctx;
4930: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 . statePtr->b
4940: 69 6f 20 3d 20 28 42 49 4f 2a 29 30 3b 0a 20 20 io = (BIO*)0;.
4950: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 statePtr->p_bi
4960: 6f 20 3d 20 28 42 49 4f 2a 29 30 3b 0a 0a 20 20 o = (BIO*)0;..
4970: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 statePtr->err
4980: 3d 20 22 22 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 = "";.. Tcl_S
4990: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
49a0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
49b0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 translation", "b
49c0: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c inary");. Tcl
49d0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
49e0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
49f0: 22 2d 62 75 66 66 65 72 69 6e 67 22 2c 20 22 6e "-buffering", "n
4a00: 6f 6e 65 22 29 3b 0a 0a 23 69 66 20 54 43 4c 5f one");..#if TCL_
4a10: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d MAJOR_VERSION ==
4a20: 20 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f 8 && TCL_MINOR_
4a30: 56 45 52 53 49 4f 4e 20 3c 20 32 0a 20 20 20 20 VERSION < 2.
4a40: 73 74 61 74 65 50 74 72 2d 3e 70 61 72 65 6e 74 statePtr->parent
4a50: 20 3d 20 63 68 61 6e 3b 0a 20 20 20 20 73 74 61 = chan;. sta
4a60: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 tePtr->self = Tc
4a70: 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c l_ReplaceChannel
4a80: 28 20 69 6e 74 65 72 70 2c 0a 09 09 09 09 54 6c ( interp,.....Tl
4a90: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c s_ChannelType(),
4aa0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 (ClientData) st
4ab0: 61 74 65 50 74 72 2c 0a 09 09 09 20 20 20 20 20 atePtr,....
4ac0: 20 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 (TCL_READABLE
4ad0: 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c | TCL_WRITABLE),
4ae0: 20 73 74 61 74 65 50 74 72 2d 3e 70 61 72 65 6e statePtr->paren
4af0: 74 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 74 t);.#else. st
4b00: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 63 atePtr->self = c
4b10: 68 61 6e 3b 0a 20 20 20 20 54 63 6c 5f 53 74 61 han;. Tcl_Sta
4b20: 63 6b 43 68 61 6e 6e 65 6c 28 20 69 6e 74 65 72 ckChannel( inter
4b30: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 p, Tls_ChannelTy
4b40: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 pe(), (ClientDat
4b50: 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 09 09 a) statePtr,....
4b60: 20 20 20 20 20 20 20 28 54 43 4c 5f 52 45 41 44 (TCL_READ
4b70: 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 ABLE | TCL_WRITA
4b80: 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 23 65 6e BLE), chan);.#en
4b90: 64 69 66 0a 20 20 20 20 69 66 20 28 73 74 61 74 dif. if (stat
4ba0: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
4bb0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
4bc0: 29 20 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f ) {. Tcl_
4bd0: 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 28 20 EventuallyFree(
4be0: 28 43 6c 69 65 6e 74 44 61 74 61 29 73 74 61 74 (ClientData)stat
4bf0: 65 50 74 72 2c 20 54 6c 73 5f 46 72 65 65 29 3b ePtr, Tls_Free);
4c00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 . return
4c10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
4c20: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 .. /* allocat
4c30: 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 e script */.
4c40: 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 63 if (script) {..c
4c50: 68 61 72 20 2a 20 74 6d 70 20 3d 20 54 63 6c 5f har * tmp = Tcl_
4c60: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
4c70: 28 73 63 72 69 70 74 2c 20 4e 55 4c 4c 29 3b 0a (script, NULL);.
4c80: 09 69 66 20 28 74 6d 70 20 26 26 20 2a 74 6d 70 .if (tmp && *tmp
4c90: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 ) {.. statePt
4ca0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 54 63 r->callback = Tc
4cb0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
4cc0: 63 72 69 70 74 29 3b 0a 09 20 20 20 20 54 63 6c cript);.. Tcl
4cd0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 20 73 _IncrRefCount( s
4ce0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
4cf0: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 k);..}. }.
4d00: 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 /* This is only
4d10: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 needed because
4d20: 6f 66 20 61 20 62 75 67 20 69 6e 20 4f 70 65 6e of a bug in Open
4d30: 53 53 4c 2c 20 77 68 65 72 65 20 74 68 65 0a 20 SSL, where the.
4d40: 20 20 20 20 2a 20 73 73 6c 2d 3e 76 65 72 69 66 * ssl->verif
4d50: 79 5f 63 61 6c 6c 62 61 63 6b 20 69 73 20 6e 6f y_callback is no
4d60: 74 20 72 65 66 65 72 65 6e 63 65 64 21 21 21 20 t referenced!!!
4d70: 28 4d 75 73 74 20 62 65 20 64 6f 6e 65 0a 20 20 (Must be done.
4d80: 20 20 20 2a 20 2a 62 65 66 6f 72 65 2a 20 53 53 * *before* SS
4d90: 4c 5f 6e 65 77 28 29 20 69 73 20 63 61 6c 6c 65 L_new() is calle
4da0: 64 21 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 d!. */. S
4db0: 53 4c 5f 43 54 58 5f 73 65 74 5f 76 65 72 69 66 SL_CTX_set_verif
4dc0: 79 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c y(statePtr->ctx,
4dd0: 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 verify, VerifyC
4de0: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f allback);.. /
4df0: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 *. * SSL Ini
4e00: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 tialization.
4e10: 20 2a 2f 0a 0a 20 20 20 20 73 74 61 74 65 50 74 */.. statePt
4e20: 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 r->ssl = SSL_new
4e30: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b (statePtr->ctx);
4e40: 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 . if (!stateP
4e50: 74 72 2d 3e 73 73 6c 29 20 7b 0a 20 20 20 20 20 tr->ssl) {.
4e60: 20 20 20 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 /* SSL librar
4e70: 79 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 y error */.
4e80: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
4e90: 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 20 ult(interp,.
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4eb0: 20 20 20 20 20 22 63 6f 75 6c 64 6e 27 74 20 63 "couldn't c
4ec0: 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 onstruct ssl ses
4ed0: 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 sion: ", REASON(
4ee0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ),.
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 (cha
4f00: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 r *) NULL);.
4f10: 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c Tcl_Eventual
4f20: 6c 79 46 72 65 65 28 20 28 43 6c 69 65 6e 74 44 lyFree( (ClientD
4f30: 61 74 61 29 73 74 61 74 65 50 74 72 2c 20 54 6c ata)statePtr, Tl
4f40: 73 5f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 s_Free);.
4f50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
4f60: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
4f70: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c . * SSL Call
4f80: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 0a 20 backs. */..
4f90: 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 SSL_set_app_d
4fa0: 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ata(statePtr->ss
4fb0: 6c 2c 20 28 56 4f 49 44 20 2a 29 73 74 61 74 65 l, (VOID *)state
4fc0: 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 Ptr);./* point b
4fd0: 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a 20 20 ack to us */..
4fe0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 /*. * The
4ff0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 62 72 6f following is bro
5000: 6b 65 6e 20 2d 20 77 65 20 6e 65 65 64 20 69 73 ken - we need is
5010: 20 74 6f 20 73 65 74 20 74 68 65 0a 20 20 20 20 to set the.
5020: 20 2a 20 76 65 72 69 66 79 5f 6d 6f 64 65 2c 20 * verify_mode,
5030: 62 75 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 but the library
5040: 69 67 6e 6f 72 65 73 20 74 68 65 20 76 65 72 69 ignores the veri
5050: 66 79 5f 63 61 6c 6c 62 61 63 6b 21 21 21 0a 20 fy_callback!!!.
5060: 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 53 53 4c */. /*SSL
5070: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 _set_verify(stat
5080: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 ePtr->ssl, verif
5090: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 y, VerifyCallbac
50a0: 6b 29 3b 2a 2f 0a 0a 20 20 20 20 53 53 4c 5f 43 k);*/.. SSL_C
50b0: 54 58 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c TX_set_info_call
50c0: 62 61 63 6b 28 20 73 74 61 74 65 50 74 72 2d 3e back( statePtr->
50d0: 63 74 78 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 ctx, InfoCallbac
50e0: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 k);.. /* Crea
50f0: 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 te Tcl_Channel B
5100: 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 IO Handler */.
5110: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 statePtr->p_bi
5120: 6f 20 3d 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 o = bio = BIO_ne
5130: 77 5f 74 63 6c 28 20 73 74 61 74 65 50 74 72 2c w_tcl( statePtr,
5140: 20 42 49 4f 5f 43 4c 4f 53 45 29 3b 0a 20 20 20 BIO_CLOSE);.
5150: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d statePtr->bio =
5160: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 BIO_new(BIO_f_s
5170: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 sl());.. if (
5180: 73 65 72 76 65 72 29 20 7b 0a 09 73 74 61 74 65 server) {..state
5190: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c Ptr->flags |= TL
51a0: 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 S_TCL_SERVER;..S
51b0: 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 SL_set_accept_st
51c0: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ate(statePtr->ss
51d0: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b l);. } else {
51e0: 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 ..SSL_set_connec
51f0: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 t_state(statePtr
5200: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 ->ssl);. }.
5210: 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 SSL_set_bio(st
5220: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 62 69 6f atePtr->ssl, bio
5230: 2c 20 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f , bio);. BIO_
5240: 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72 set_ssl(statePtr
5250: 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d ->bio, statePtr-
5260: 3e 73 73 6c 2c 20 42 49 4f 5f 43 4c 4f 53 45 29 >ssl, BIO_CLOSE)
5270: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
5280: 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 End of SSL Init
5290: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c . */. Tcl
52a0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
52b0: 70 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 p, Tcl_GetChanne
52c0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
52d0: 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 self), TCL_VOLAT
52e0: 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ILE);. return
52f0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
5300: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5340: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f -----. *. * CTX_
5350: 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 Init -- construc
5360: 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 t a SSL_CTX inst
5370: 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ance. *. * Resul
5380: 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 ts:. *.A valid S
5390: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 SL_CTX instance
53a0: 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 or NULL.. *. * S
53b0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
53c0: 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 constructs SSL c
53d0: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a ontext (CTX). *.
53e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5420: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
5430: 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f c SSL_CTX *.CTX_
5440: 49 6e 69 74 28 69 6e 74 65 72 70 2c 20 70 72 6f Init(interp, pro
5450: 74 6f 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 43 to, key, cert, C
5460: 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 Adir, CAfile, ci
5470: 70 68 65 72 73 29 0a 20 20 20 20 54 63 6c 5f 49 phers). Tcl_I
5480: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 nterp *interp;.
5490: 20 20 20 69 6e 74 20 70 72 6f 74 6f 3b 0a 20 20 int proto;.
54a0: 20 20 63 68 61 72 20 2a 6b 65 79 3b 0a 20 20 20 char *key;.
54b0: 20 63 68 61 72 20 2a 63 65 72 74 3b 0a 20 20 20 char *cert;.
54c0: 20 63 68 61 72 20 2a 43 41 64 69 72 3b 0a 20 20 char *CAdir;.
54d0: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 3b 0a char *CAfile;.
54e0: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 char *cipher
54f0: 73 3b 0a 7b 0a 20 20 20 20 53 53 4c 5f 43 54 58 s;.{. SSL_CTX
5500: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ctx = NULL;.
5510: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 Tcl_DString ds
5520: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
5530: 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f g ds1;. int o
5540: 66 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 ff = 0;.. /*
5550: 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 create SSL conte
5560: 78 74 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e xt */.#if !defin
5570: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 ed(NO_SSL2) && !
5580: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
5590: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
55a0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
55b0: 4f 5f 53 53 4c 32 29 20 26 26 0a 09 45 4e 41 42 O_SSL2) &&..ENAB
55c0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
55d0: 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 63 ROTO_SSL3)) {..c
55e0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
55f0: 28 53 53 4c 76 32 33 5f 6d 65 74 68 6f 64 28 29 (SSLv23_method()
5600: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 0a 23 65 );. } else.#e
5610: 6e 64 69 66 0a 20 20 20 20 69 66 20 28 45 4e 41 ndif. if (ENA
5620: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
5630: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 23 PROTO_SSL2)) {.#
5640: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 if defined(NO_SS
5650: 4c 32 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 L2)..Tcl_AppendR
5660: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 esult(interp, "p
5670: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
5680: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
5690: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
56a0: 2a 29 30 3b 0a 23 65 6c 73 65 0a 09 63 74 78 20 *)0;.#else..ctx
56b0: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 = SSL_CTX_new(SS
56c0: 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 23 Lv2_method());.#
56d0: 65 6e 64 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 endif. } else
56e0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
56f0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
5700: 53 31 29 29 20 7b 0a 09 63 74 78 20 3d 20 53 53 S1)) {..ctx = SS
5710: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f L_CTX_new(TLSv1_
5720: 6d 65 74 68 6f 64 28 29 29 3b 0a 20 20 20 20 7d method());. }
5730: 20 65 6c 73 65 20 69 66 20 28 45 4e 41 42 4c 45 else if (ENABLE
5740: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
5750: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 23 69 66 20 TO_SSL3)) {.#if
5760: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
5770: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
5780: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 lt(interp, "prot
5790: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
57a0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
57b0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
57c0: 3b 0a 23 65 6c 73 65 0a 09 63 74 78 20 3d 20 53 ;.#else..ctx = S
57d0: 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 SL_CTX_new(SSLv3
57e0: 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 23 65 6e 64 _method());.#end
57f0: 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a if. } else {.
5800: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
5810: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 t(interp, "no va
5820: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c lid protocol sel
5830: 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 ected", NULL);..
5840: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
5850: 2a 29 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f *)0;. }. o
5860: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
5870: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
5880: 54 4c 53 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f TLS1) ? 0 : SSL_
5890: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 20 20 OP_NO_TLSv1);.
58a0: 20 20 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 off |= (ENABLE
58b0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
58c0: 54 4f 5f 53 53 4c 32 29 20 3f 20 30 20 3a 20 53 TO_SSL2) ? 0 : S
58d0: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b SL_OP_NO_SSLv2);
58e0: 0a 20 20 20 20 6f 66 66 20 7c 3d 20 28 45 4e 41 . off |= (ENA
58f0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
5900: 50 52 4f 54 4f 5f 53 53 4c 33 29 20 3f 20 30 20 PROTO_SSL3) ? 0
5910: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 : SSL_OP_NO_SSLv
5920: 33 29 3b 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 3);.. SSL_CTX
5930: 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 20 63 _set_app_data( c
5940: 74 78 2c 20 28 56 4f 49 44 2a 29 69 6e 74 65 72 tx, (VOID*)inter
5950: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 p);./* remember
5960: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
5970: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
5980: 65 74 5f 6f 70 74 69 6f 6e 73 28 20 63 74 78 2c et_options( ctx,
5990: 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a SSL_OP_ALL);./*
59a0: 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 all SSL bug wor
59b0: 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 karounds */.
59c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
59d0: 6f 6e 73 28 20 63 74 78 2c 20 6f 66 66 29 3b 09 ons( ctx, off);.
59e0: 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 /* all SSL bug w
59f0: 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 orkarounds */.
5a00: 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 SSL_CTX_sess_s
5a10: 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 20 63 et_cache_size( c
5a20: 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 69 tx, 128);.. i
5a30: 66 20 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 f (ciphers != NU
5a40: 4c 4c 29 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 LL)..SSL_CTX_set
5a50: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 _cipher_list(ctx
5a60: 2c 20 63 69 70 68 65 72 73 29 3b 0a 0a 20 20 20 , ciphers);..
5a70: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c /* set some cal
5a80: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 lbacks */. SS
5a90: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
5aa0: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c t_passwd_cb(ctx,
5ab0: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 PasswordCallbac
5ac0: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f k);. SSL_CTX_
5ad0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 set_default_pass
5ae0: 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 wd_cb_userdata(c
5af0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74 65 tx, (void *)inte
5b00: 72 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 4f rp);..#ifndef NO
5b10: 5f 44 48 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 _DH. {..DH* d
5b20: 68 20 3d 20 67 65 74 5f 64 68 35 31 32 28 29 3b h = get_dh512();
5b30: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d ..SSL_CTX_set_tm
5b40: 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 p_dh(ctx, dh);..
5b50: 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 20 20 DH_free(dh);.
5b60: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f }.#endif.. /
5b70: 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 * set our certif
5b80: 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 69 66 20 icate */. if
5b90: 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b (cert != NULL) {
5ba0: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 ..Tcl_DStringIni
5bb0: 74 28 26 64 73 29 3b 0a 0a 20 20 20 20 20 20 20 t(&ds);..
5bc0: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 if (SSL_CTX_use
5bd0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c _certificate_fil
5be0: 65 28 63 74 78 2c 20 46 32 4e 28 20 63 65 72 74 e(ctx, F2N( cert
5bf0: 2c 20 26 64 73 29 2c 0a 09 09 09 09 09 53 53 4c , &ds),......SSL
5c00: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c _FILETYPE_PEM) <
5c10: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
5c20: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
5c30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 ;. Tc
5c40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
5c50: 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 20 20 20 nterp,.
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5c70: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 "unable to s
5c80: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 et certificate f
5c90: 69 6c 65 20 22 2c 20 63 65 72 74 2c 20 22 3a 20 ile ", cert, ":
5ca0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ",.
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5cc0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
5cd0: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 *) NULL);.
5ce0: 20 20 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 SSL_CTX_fr
5cf0: 65 65 28 63 74 78 29 3b 0a 20 20 20 20 20 20 20 ee(ctx);.
5d00: 20 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c return (SSL
5d10: 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 20 20 _CTX *)0;.
5d20: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 }.. /*
5d30: 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 20 get the private
5d40: 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 key associated w
5d50: 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 69 ith this certifi
5d60: 63 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 cate */.
5d70: 69 66 20 28 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 if (key == NULL)
5d80: 20 6b 65 79 3d 63 65 72 74 3b 0a 0a 20 20 20 20 key=cert;..
5d90: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f if (SSL_CTX_
5da0: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 use_PrivateKey_f
5db0: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 20 6b 65 ile(ctx, F2N( ke
5dc0: 79 2c 20 26 64 73 29 2c 0a 09 09 09 09 09 53 53 y, &ds),......SS
5dd0: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 L_FILETYPE_PEM)
5de0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c <= 0) {.. Tcl
5df0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
5e00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 );. T
5e10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
5e20: 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 20 20 interp,.
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5e40: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 "unable to
5e50: 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 set public key f
5e60: 69 6c 65 20 22 2c 20 6b 65 79 2c 20 22 20 22 2c ile ", key, " ",
5e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 45 RE
5e90: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
5ea0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 NULL);.
5eb0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
5ec0: 28 63 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20 (ctx);.
5ed0: 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 return (SSL_C
5ee0: 54 58 20 2a 29 30 3b 0a 20 20 20 20 20 20 20 20 TX *)0;.
5ef0: 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 }..Tcl_DStringFr
5f00: 65 65 28 26 64 73 29 3b 0a 20 20 20 20 20 20 20 ee(&ds);.
5f10: 20 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 /* Now we know
5f20: 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 that a key and c
5f30: 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 ert have been se
5f40: 74 20 61 67 61 69 6e 73 74 0a 20 20 20 20 20 20 t against.
5f50: 20 20 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e * the SSL con
5f60: 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 text */.
5f70: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 if (!SSL_CTX_che
5f80: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 ck_private_key(c
5f90: 74 78 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 tx)) {.
5fa0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
5fb0: 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 20 ult(interp,.
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5fd0: 20 20 20 20 20 20 20 20 20 22 70 72 69 76 61 74 "privat
5fe0: 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d e key does not m
5ff0: 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 atch the certifi
6000: 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 cate public key"
6010: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
6030: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 char *) NULL);.
6040: 20 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43 SSL_C
6050: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 20 20 TX_free(ctx);.
6060: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
6070: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 (SSL_CTX *)0;.
6080: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 }. } e
6090: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 63 65 lse {. ce
60a0: 72 74 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 rt = (char*)X509
60b0: 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 _get_default_cer
60c0: 74 5f 66 69 6c 65 28 29 3b 0a 0a 20 20 20 20 20 t_file();..
60d0: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 if (SSL_CTX_u
60e0: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 se_certificate_f
60f0: 69 6c 65 28 63 74 78 2c 20 63 65 72 74 2c 0a 09 ile(ctx, cert,..
6100: 09 09 09 09 53 53 4c 5f 46 49 4c 45 54 59 50 45 ....SSL_FILETYPE
6110: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 _PEM) <= 0) {.#i
6120: 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 f 0.. Tcl_DSt
6130: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 ringFree(&ds);.
6140: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 Tcl_A
6150: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
6160: 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 rp,.
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6180: 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 "unable to use
6190: 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 default certific
61a0: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 ate file ", cert
61b0: 2c 20 22 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 , ": ",.
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61d0: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 REASON(), (
61e0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 char *) NULL);.
61f0: 20 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43 SSL_C
6200: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 20 20 TX_free(ctx);.
6210: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
6220: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 23 (SSL_CTX *)0;.#
6230: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a endif. }.
6240: 20 20 20 20 7d 0a 09 0a 20 20 20 20 54 63 6c 5f }... Tcl_
6250: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
6260: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
6270: 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 gInit(&ds1);.
6280: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f if (!SSL_CTX_lo
6290: 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 ad_verify_locati
62a0: 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 ons(ctx, F2N(CAf
62b0: 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 ile, &ds), F2N(C
62c0: 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a Adir, &ds1)) ||.
62d0: 20 20 20 20 20 20 20 20 21 53 53 4c 5f 43 54 58 !SSL_CTX
62e0: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 _set_default_ver
62f0: 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 ify_paths(ctx))
6300: 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 {.#if 0..Tcl_DSt
6310: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
6320: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
6330: 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 &ds1);../* Don't
6340: 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 currently care
6350: 69 66 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f if this fails */
6360: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
6370: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 lt(interp, "SSL
6380: 64 65 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 default verify p
6390: 61 74 68 73 3a 20 22 2c 0a 20 20 20 20 20 20 20 aths: ",.
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63b0: 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 REASON(),
63c0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
63d0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
63e0: 78 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c x);..return (SSL
63f0: 5f 43 54 58 20 2a 29 30 3b 0a 23 65 6e 64 69 66 _CTX *)0;.#endif
6400: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 43 . }. SSL_C
6410: 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 TX_set_client_CA
6420: 5f 6c 69 73 74 28 63 74 78 2c 20 53 53 4c 5f 6c _list(ctx, SSL_l
6430: 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 oad_client_CA_fi
6440: 6c 65 28 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 le( F2N(CAfile,
6450: 26 64 73 29 20 29 29 3b 0a 0a 20 20 20 20 54 63 &ds) ));.. Tc
6460: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
6470: 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 s);. Tcl_DStr
6480: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 20 ingFree(&ds1);.
6490: 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d return ctx;.}
64a0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
64f0: 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d * StatusObjCmd -
6500: 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 - return certifi
6510: 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 cate for connect
6520: 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 ed peer.. *. * R
6530: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
6540: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
6550: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
6560: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
6570: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
65c0: 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a ic int.StatusObj
65d0: 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 Cmd(clientData,
65e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 interp, objc, ob
65f0: 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 jv). ClientDa
6600: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f ta clientData;./
6610: 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 * Not used. */.
6620: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
6630: 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f nterp;. int o
6640: 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a bjc;. Tcl_Obj
6650: 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a .*CONST objv[];.
6660: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
6670: 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 tePtr;. X509
6680: 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f *peer;. Tcl_O
6690: 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 bj *objPtr;.
66a0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
66b0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e ;. char *chan
66c0: 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 nelName, *cipher
66d0: 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b s;. int mode;
66e0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
66f0: 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 20 20 54 = 2) {. T
6700: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
6710: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
6720: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 20 20 20 "channel");.
6730: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f return TCL_
6740: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
6750: 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 channelName = T
6760: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
6770: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c Obj(objv[1], NUL
6780: 4c 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 L);.. chan =
6790: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 20 Tcl_GetChannel(
67a0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e interp, channelN
67b0: 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 ame, &mode);.
67c0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
67d0: 6c 5f 43 68 61 6e 6e 65 6c 29 30 29 20 7b 0a 09 l_Channel)0) {..
67e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
67f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
6800: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
6810: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
6820: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
6830: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 . Tcl_App
6840: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
6850: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c , "bad channel \
6860: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e "", Tcl_GetChann
6870: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 20 20 elName(chan),.
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c "\
6890: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
68a0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 nnel", NULL);.
68b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c return TCL
68c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
68d0: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 statePtr = (St
68e0: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 ate *)Tcl_GetCha
68f0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
6900: 28 20 63 68 61 6e 29 3b 0a 20 20 20 20 70 65 65 ( chan);. pee
6910: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 r = SSL_get_peer
6920: 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 _certificate(sta
6930: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
6940: 20 69 66 20 28 70 65 65 72 29 0a 09 6f 62 6a 50 if (peer)..objP
6950: 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 tr = Tls_NewX509
6960: 4f 62 6a 28 20 69 6e 74 65 72 70 2c 20 70 65 65 Obj( interp, pee
6970: 72 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 6f 62 r);. else..ob
6980: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
6990: 73 74 4f 62 6a 28 20 30 2c 20 4e 55 4c 4c 29 3b stObj( 0, NULL);
69a0: 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 .. ciphers =
69b0: 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 (char*)SSL_get_c
69c0: 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e ipher(statePtr->
69d0: 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 ssl);. if (ci
69e0: 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 20 26 26 phers != NULL &&
69f0: 20 73 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c strcmp(ciphers,
6a00: 20 22 28 4e 4f 4e 45 29 22 29 21 3d 30 29 20 7b "(NONE)")!=0) {
6a10: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
6a20: 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e 74 65 endElement( inte
6a30: 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 54 63 rp, objPtr,...Tc
6a40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 l_NewStringObj(
6a50: 22 63 69 70 68 65 72 22 2c 20 2d 31 29 20 29 3b "cipher", -1) );
6a60: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
6a70: 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e 74 65 endElement( inte
6a80: 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 54 63 rp, objPtr,...Tc
6a90: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 l_NewStringObj(
6aa0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 SSL_get_cipher(s
6ab0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d tatePtr->ssl), -
6ac0: 31 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 1) );. }.
6ad0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
6ae0: 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 ( interp, objPtr
6af0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
6b00: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b50: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 --. *. * Tls_Fre
6b60: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 e --. *. *.This
6b70: 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 procedure cleans
6b80: 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 up when a SSL s
6b90: 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e ocket based chan
6ba0: 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 nel. *.is closed
6bb0: 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e and its referen
6bc0: 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 ce count falls b
6bd0: 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 elow 1. *. * Res
6be0: 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
6bf0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
6c00: 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
6c10: 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c60: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 -. */.void.Tls_F
6c70: 72 65 65 28 20 63 68 61 72 20 2a 62 6c 6f 63 6b ree( char *block
6c80: 50 74 72 20 29 0a 7b 0a 20 20 20 20 53 74 61 74 Ptr ).{. Stat
6c90: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
6ca0: 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b tate *)blockPtr;
6cb0: 0a 0a 20 20 20 20 2f 2a 20 77 65 27 72 65 20 61 .. /* we're a
6cc0: 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 ssuming here tha
6cd0: 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 t we're single-t
6ce0: 68 72 65 61 64 65 64 20 2a 2f 0a 20 20 20 20 69 hreaded */. i
6cf0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c f (statePtr->ssl
6d00: 29 20 7b 0a 09 53 53 4c 5f 73 68 75 74 64 6f 77 ) {..SSL_shutdow
6d10: 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 n(statePtr->ssl)
6d20: 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 ;..SSL_free(stat
6d30: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
6d40: 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
6d50: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 0a 09 54 tr->callback)..T
6d60: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
6d70: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
6d80: 63 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 ck);.. if (st
6d90: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d atePtr->timer !=
6da0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e (Tcl_TimerToken
6db0: 29 4e 55 4c 4c 29 0a 09 54 63 6c 5f 44 65 6c 65 )NULL)..Tcl_Dele
6dc0: 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 20 28 teTimerHandler (
6dd0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 statePtr->timer)
6de0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 ;.. Tcl_Free(
6df0: 28 63 68 61 72 20 2a 29 73 74 61 74 65 50 74 72 (char *)statePtr
6e00: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
6e50: 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d *. * Tls_Init -
6e60: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 -. *. *.This is
6e70: 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 a package initia
6e80: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 lization procedu
6e90: 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c re, which is cal
6ea0: 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 led. *.by Tcl wh
6eb0: 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 en this package
6ec0: 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 is to be added t
6ed0: 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 o an interpreter
6ee0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
6ef0: 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 Ssl configured
6f00: 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 and loaded. *.
6f10: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
6f20: 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 *. create the s
6f30: 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 sl command, init
6f40: 69 61 6c 69 73 65 20 73 73 6c 20 63 6f 6e 74 65 ialise ssl conte
6f50: 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d xt. *. *--------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
6fa0: 0a 69 6e 74 0a 54 6c 73 5f 49 6e 69 74 28 54 63 .int.Tls_Init(Tc
6fb0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
6fc0: 29 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 )../* Interprete
6fd0: 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 70 r in which the p
6fe0: 61 63 6b 61 67 65 20 69 73 0a 20 20 20 20 20 20 ackage is.
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7010: 20 20 20 2a 20 74 6f 20 62 65 20 6d 61 64 65 20 * to be made
7020: 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 7b 0a available. */.{.
7030: 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 #if TCL_MAJOR_VE
7040: 52 53 49 4f 4e 20 3e 3d 20 38 20 26 26 20 54 43 RSION >= 8 && TC
7050: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 L_MINOR_VERSION
7060: 3e 3d 20 32 0a 20 20 20 20 69 66 20 28 21 54 63 >= 2. if (!Tc
7070: 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 l_InitStubs(inte
7080: 72 70 2c 20 54 43 4c 5f 56 45 52 53 49 4f 4e 2c rp, TCL_VERSION,
7090: 20 30 29 29 20 7b 0a 20 20 20 20 20 20 20 20 72 0)) {. r
70a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
70b0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 . }.#endif.
70c0: 20 20 53 53 4c 5f 6c 6f 61 64 5f 65 72 72 6f 72 SSL_load_error
70d0: 5f 73 74 72 69 6e 67 73 28 29 3b 0a 20 20 20 20 _strings();.
70e0: 45 52 52 5f 6c 6f 61 64 5f 63 72 79 70 74 6f 5f ERR_load_crypto_
70f0: 73 74 72 69 6e 67 73 28 29 3b 0a 20 20 20 20 53 strings();. S
7100: 53 4c 5f 6c 69 62 72 61 72 79 5f 69 6e 69 74 28 SL_library_init(
7110: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 );.. Tcl_Crea
7120: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
7130: 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 erp, "tls::ciphe
7140: 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 rs", CiphersObjC
7150: 6d 64 20 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 md , (ClientData
7160: 29 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ) 0,.
7170: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f (Tcl_
7180: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
7190: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c NULL);.. Tcl
71a0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
71b0: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
71c0: 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 handshake", Hand
71d0: 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2c 20 28 43 shakeObjCmd , (C
71e0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 0a 20 20 lientData) 0,.
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7200: 20 20 20 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 (Tcl_CmdDele
7210: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
7220: 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 .. Tcl_Create
7230: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
7240: 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 p, "tls::import"
7250: 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2c , ImportObjCmd ,
7260: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
7270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
7280: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 44 (Tcl_CmdD
7290: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
72a0: 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 L);.. Tcl_Cre
72b0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
72c0: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 terp, "tls::stat
72d0: 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d us", StatusObjCm
72e0: 64 20 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 d , (ClientData)
72f0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 0,.
7300: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 (Tcl_C
7310: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
7320: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 72 65 74 75 NULL);.. retu
7330: 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 rn Tcl_PkgProvid
7340: 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 e(interp, PACKAG
7350: 45 2c 20 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a E, VERSION);.}..
7360: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
7370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
73a0: 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 *. *.Tls_SafeIni
73b0: 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d t --. *. *.-----
73c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
73d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
73e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 -----------*. *.
73f0: 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 Standard procedu
7400: 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 27 re required by '
7410: 6c 6f 61 64 27 2e 20 0a 20 2a 09 49 6e 69 74 69 load'. . *.Initi
7420: 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 alizes this exte
7430: 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 nsion for a safe
7440: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a interpreter.. *
7450: 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
7460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7480: 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 65 66 66 -*. *. *.Sideeff
7490: 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 ects:. *..As of
74a0: 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 'Tls_Init'. *. *
74b0: 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 .Result:. *..A s
74c0: 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f tandard Tcl erro
74d0: 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d r code.. *. *---
74e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
74f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7510: 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6c ---*. */..int.Tl
7520: 73 5f 53 61 66 65 49 6e 69 74 20 28 54 63 6c 5f s_SafeInit (Tcl_
7530: 49 6e 74 65 72 70 2a 20 69 6e 74 65 72 70 29 0a Interp* interp).
7540: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73 {. return Tls
7550: 5f 49 6e 69 74 20 28 69 6e 74 65 72 70 29 3b 0a _Init (interp);.
7560: 7d 0a }.