0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61 (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69 some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68 ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32 pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72 ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79 poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53 right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 20 tarfish Systems
00d0: 0a 20 2a 0a 20 2a 20 24 48 65 61 64 65 72 3a 20 . *. * $Header:
00e0: 2f 68 6f 6d 65 2f 72 6b 65 65 6e 65 2f 74 6d 70 /home/rkeene/tmp
00f0: 2f 63 76 73 32 66 6f 73 73 69 6c 2f 2e 2e 2f 74 /cvs2fossil/../t
0100: 63 6c 74 6c 73 2f 74 6c 73 2f 74 6c 73 2f 74 6c cltls/tls/tls/tl
0110: 73 2e 63 2c 76 20 31 2e 33 34 20 32 30 31 34 2f s.c,v 1.34 2014/
0120: 30 34 2f 31 36 20 31 38 3a 33 33 3a 30 33 20 61 04/16 18:33:03 a
0130: 6e 64 72 65 61 73 5f 6b 75 70 72 69 65 73 20 45 ndreas_kupries E
0140: 78 70 20 24 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 xp $. *. * TLS (
0150: 61 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c aka SSL) Channel
0160: 20 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 - can be layere
0170: 64 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 d on any bi-dire
0180: 63 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 ctional. * Tcl_C
0190: 68 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 hannel (Note: Re
01a0: 71 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 quires Trf Core
01b0: 50 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 Patch). *. * Thi
01c0: 73 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d s was built (alm
01d0: 6f 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 ost) from scratc
01e0: 68 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 h based upon obs
01f0: 65 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f ervation of. * O
0200: 70 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a penSSL 0.9.2B. *
0210: 0a 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 . * Addition cre
0220: 64 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 dit is due for A
0230: 6e 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 ndreas Kupries (
0240: 61 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e a.kupries@westen
0250: 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 d.com), for. * p
0260: 72 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c roviding the Tcl
0270: 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 _ReplaceChannel
0280: 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f mechanism and wo
0290: 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 rking closely wi
02a0: 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 th me. * to enha
02b0: 6e 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 nce it to suppor
02c0: 74 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 t full fileevent
02d0: 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 semantics.. *.
02e0: 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 * Also work done
02f0: 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 by the follow p
0300: 65 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 eople provided t
0310: 68 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f he impetus to do
0320: 20 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 this "right":.
0330: 2a 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 *.tclSSL (Colin
0340: 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 McCormack, Share
0350: 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a d Technology). *
0360: 09 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 .SSLtcl (Peter A
0370: 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 ntman). *. */..#
0380: 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e include "tlsInt.
0390: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c h".#include "tcl
03a0: 4f 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 Opts.h".#include
03b0: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 0a 2f 2a 0a <stdlib.h>../*.
03c0: 20 2a 20 45 78 74 65 72 6e 61 6c 20 66 75 6e 63 * External func
03d0: 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a tions. */../*. *
03e0: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 Forward declara
03f0: 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69 tions. */..#defi
0400: 6e 65 20 46 32 4e 28 20 6b 65 79 2c 20 64 73 70 ne F2N( key, dsp
0410: 29 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20 ) \..(((key) ==
0420: 4e 55 4c 4c 29 20 3f 20 28 63 68 61 72 20 2a 29 NULL) ? (char *)
0430: 20 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f NULL : \...Tcl_
0440: 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d TranslateFileNam
0450: 65 28 69 6e 74 65 72 70 2c 20 28 6b 65 79 29 2c e(interp, (key),
0460: 20 28 64 73 70 29 29 29 0a 23 64 65 66 69 6e 65 (dsp))).#define
0470: 20 52 45 41 53 4f 4e 28 29 09 45 52 52 5f 72 65 REASON().ERR_re
0480: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e ason_error_strin
0490: 67 28 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 g(ERR_get_error(
04a0: 29 29 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 09 ))..static void.
04b0: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 5f 41 4e InfoCallback _AN
04c0: 53 49 5f 41 52 47 53 5f 20 28 28 43 4f 4e 53 54 SI_ARGS_ ((CONST
04d0: 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 SSL *ssl, int w
04e0: 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 29 3b here, int ret));
04f0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 43 69 70 ..static int.Cip
0500: 68 65 72 73 4f 62 6a 43 6d 64 20 5f 41 4e 53 49 hersObjCmd _ANSI
0510: 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 _ARGS_ ((ClientD
0520: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a ata clientData,.
0530: 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 ...Tcl_Interp *i
0540: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
0550: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 Tcl_Obj *CONST
0560: 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 61 74 69 objv[]));..stati
0570: 63 20 69 6e 74 09 48 61 6e 64 73 68 61 6b 65 4f c int.HandshakeO
0580: 62 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 bjCmd _ANSI_ARGS
0590: 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 _ ((ClientData c
05a0: 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 63 lientData,....Tc
05b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
05c0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
05d0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b Obj *CONST objv[
05e0: 5d 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 ]));..static int
05f0: 09 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 5f 41 .ImportObjCmd _A
0600: 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 NSI_ARGS_ ((Clie
0610: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
0620: 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 a,....Tcl_Interp
0630: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
0640: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e jc, Tcl_Obj *CON
0650: 53 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 ST objv[]));..st
0660: 61 74 69 63 20 69 6e 74 09 53 74 61 74 75 73 4f atic int.StatusO
0670: 62 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 bjCmd _ANSI_ARGS
0680: 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 _ ((ClientData c
0690: 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 63 lientData,....Tc
06a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
06b0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
06c0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b Obj *CONST objv[
06d0: 5d 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 ]));..static int
06e0: 09 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 5f .VersionObjCmd _
06f0: 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 ANSI_ARGS_ ((Cli
0700: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
0710: 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 ta,....Tcl_Inter
0720: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
0730: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f bjc, Tcl_Obj *CO
0740: 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 NST objv[]));..s
0750: 74 61 74 69 63 20 69 6e 74 09 4d 69 73 63 4f 62 tatic int.MiscOb
0760: 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f jCmd _ANSI_ARGS_
0770: 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c ((ClientData cl
0780: 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 63 6c ientData,....Tcl
0790: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
07a0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
07b0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d bj *CONST objv[]
07c0: 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 ));..static int.
07d0: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 5f UnimportObjCmd _
07e0: 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 ANSI_ARGS_ ((Cli
07f0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
0800: 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 ta,....Tcl_Inter
0810: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
0820: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f bjc, Tcl_Obj *CO
0830: 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 NST objv[]));..s
0840: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 43 tatic SSL_CTX *C
0850: 54 58 5f 49 6e 69 74 20 5f 41 4e 53 49 5f 41 52 TX_Init _ANSI_AR
0860: 47 53 5f 28 28 53 74 61 74 65 20 2a 73 74 61 74 GS_((State *stat
0870: 65 50 74 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c ePtr, int proto,
0880: 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09 09 63 char *key,....c
0890: 68 61 72 20 2a 63 65 72 74 2c 20 63 68 61 72 20 har *cert, char
08a0: 2a 43 41 64 69 72 2c 20 63 68 61 72 20 2a 43 41 *CAdir, char *CA
08b0: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 file, char *ciph
08c0: 65 72 73 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 ers));..static i
08d0: 6e 74 09 54 6c 73 4c 69 62 49 6e 69 74 20 5f 41 nt.TlsLibInit _A
08e0: 4e 53 49 5f 41 52 47 53 5f 20 28 28 29 29 20 3b NSI_ARGS_ (()) ;
08f0: 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 ..#define TLS_PR
0900: 4f 54 4f 5f 53 53 4c 32 09 30 78 30 31 0a 23 64 OTO_SSL2.0x01.#d
0910: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f efine TLS_PROTO_
0920: 53 53 4c 33 09 30 78 30 32 0a 23 64 65 66 69 6e SSL3.0x02.#defin
0930: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
0940: 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20 45 4e .0x04.#define EN
0950: 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 73 6b ABLED(flag, mask
0960: 29 09 28 28 28 66 6c 61 67 29 20 26 20 28 6d 61 ).(((flag) & (ma
0970: 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 29 0a sk)) == (mask)).
0980: 0a 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 ./*. * Static da
0990: 74 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a ta structures. *
09a0: 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 44 48 /..#ifndef NO_DH
09b0: 0a 2f 2a 20 66 72 6f 6d 20 6f 70 65 6e 73 73 6c ./* from openssl
09c0: 2f 61 70 70 73 2f 73 5f 73 65 72 76 65 72 2e 63 /apps/s_server.c
09d0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 */..static unsi
09e0: 67 6e 65 64 20 63 68 61 72 20 64 68 35 31 32 5f gned char dh512_
09f0: 70 5b 5d 3d 7b 0a 09 30 78 44 41 2c 30 78 35 38 p[]={..0xDA,0x58
0a00: 2c 30 78 33 43 2c 30 78 31 36 2c 30 78 44 39 2c ,0x3C,0x16,0xD9,
0a10: 30 78 38 35 2c 30 78 32 32 2c 30 78 38 39 2c 30 0x85,0x22,0x89,0
0a20: 78 44 30 2c 30 78 45 34 2c 30 78 41 46 2c 30 78 xD0,0xE4,0xAF,0x
0a30: 37 35 2c 0a 09 30 78 36 46 2c 30 78 34 43 2c 30 75,..0x6F,0x4C,0
0a40: 78 43 41 2c 30 78 39 32 2c 30 78 44 44 2c 30 78 xCA,0x92,0xDD,0x
0a50: 34 42 2c 30 78 45 35 2c 30 78 33 33 2c 30 78 42 4B,0xE5,0x33,0xB
0a60: 38 2c 30 78 30 34 2c 30 78 46 42 2c 30 78 30 46 8,0x04,0xFB,0x0F
0a70: 2c 0a 09 30 78 45 44 2c 30 78 39 34 2c 30 78 45 ,..0xED,0x94,0xE
0a80: 46 2c 30 78 39 43 2c 30 78 38 41 2c 30 78 34 34 F,0x9C,0x8A,0x44
0a90: 2c 30 78 30 33 2c 30 78 45 44 2c 30 78 35 37 2c ,0x03,0xED,0x57,
0aa0: 30 78 34 36 2c 30 78 35 30 2c 30 78 44 33 2c 0a 0x46,0x50,0xD3,.
0ab0: 09 30 78 36 39 2c 30 78 39 39 2c 30 78 44 42 2c .0x69,0x99,0xDB,
0ac0: 30 78 32 39 2c 30 78 44 37 2c 30 78 37 36 2c 30 0x29,0xD7,0x76,0
0ad0: 78 32 37 2c 30 78 36 42 2c 30 78 41 32 2c 30 78 x27,0x6B,0xA2,0x
0ae0: 44 33 2c 30 78 44 34 2c 30 78 31 32 2c 0a 09 30 D3,0xD4,0x12,..0
0af0: 78 45 32 2c 30 78 31 38 2c 30 78 46 34 2c 30 78 xE2,0x18,0xF4,0x
0b00: 44 44 2c 30 78 31 45 2c 30 78 30 38 2c 30 78 34 DD,0x1E,0x08,0x4
0b10: 43 2c 30 78 46 36 2c 30 78 44 38 2c 30 78 30 30 C,0xF6,0xD8,0x00
0b20: 2c 30 78 33 45 2c 30 78 37 43 2c 0a 09 30 78 34 ,0x3E,0x7C,..0x4
0b30: 37 2c 30 78 37 34 2c 30 78 45 38 2c 30 78 33 33 7,0x74,0xE8,0x33
0b40: 2c 0a 09 7d 3b 0a 73 74 61 74 69 63 20 75 6e 73 ,..};.static uns
0b50: 69 67 6e 65 64 20 63 68 61 72 20 64 68 35 31 32 igned char dh512
0b60: 5f 67 5b 5d 3d 7b 0a 09 30 78 30 32 2c 0a 7d 3b _g[]={..0x02,.};
0b70: 0a 0a 73 74 61 74 69 63 20 44 48 20 2a 67 65 74 ..static DH *get
0b80: 5f 64 68 35 31 32 28 29 0a 7b 0a 20 20 20 20 44 _dh512().{. D
0b90: 48 20 2a 64 68 3d 4e 55 4c 4c 3b 0a 0a 20 20 20 H *dh=NULL;..
0ba0: 20 69 66 20 28 28 64 68 3d 44 48 5f 6e 65 77 28 if ((dh=DH_new(
0bb0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 72 65 74 75 )) == NULL) retu
0bc0: 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 64 rn(NULL);.. d
0bd0: 68 2d 3e 70 3d 42 4e 5f 62 69 6e 32 62 6e 28 64 h->p=BN_bin2bn(d
0be0: 68 35 31 32 5f 70 2c 73 69 7a 65 6f 66 28 64 68 h512_p,sizeof(dh
0bf0: 35 31 32 5f 70 29 2c 4e 55 4c 4c 29 3b 0a 20 20 512_p),NULL);.
0c00: 20 20 64 68 2d 3e 67 3d 42 4e 5f 62 69 6e 32 62 dh->g=BN_bin2b
0c10: 6e 28 64 68 35 31 32 5f 67 2c 73 69 7a 65 6f 66 n(dh512_g,sizeof
0c20: 28 64 68 35 31 32 5f 67 29 2c 4e 55 4c 4c 29 3b (dh512_g),NULL);
0c30: 0a 0a 20 20 20 20 69 66 20 28 28 64 68 2d 3e 70 .. if ((dh->p
0c40: 20 3d 3d 20 4e 55 4c 4c 29 20 7c 7c 20 28 64 68 == NULL) || (dh
0c50: 2d 3e 67 20 3d 3d 20 4e 55 4c 4c 29 29 0a 09 72 ->g == NULL))..r
0c60: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 eturn(NULL);.
0c70: 20 72 65 74 75 72 6e 28 64 68 29 3b 0a 7d 0a 23 return(dh);.}.#
0c80: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 44 65 66 endif../*. * Def
0c90: 69 6e 65 64 20 69 6e 20 54 6c 73 5f 49 6e 69 74 ined in Tls_Init
0ca0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 to determine wh
0cb0: 61 74 20 6b 69 6e 64 20 6f 66 20 63 68 61 6e 6e at kind of chann
0cc0: 65 6c 73 20 77 65 20 61 72 65 20 75 73 69 6e 67 els we are using
0cd0: 0a 20 2a 20 28 6f 6c 64 2d 73 74 79 6c 65 20 38 . * (old-style 8
0ce0: 2e 32 2e 30 2d 38 2e 33 2e 31 20 6f 72 20 6e 65 .2.0-8.3.1 or ne
0cf0: 77 2d 73 74 79 6c 65 20 38 2e 33 2e 32 2b 29 2e w-style 8.3.2+).
0d00: 0a 20 2a 2f 0a 69 6e 74 20 63 68 61 6e 6e 65 6c . */.int channel
0d10: 54 79 70 65 56 65 72 73 69 6f 6e 3b 0a 0a 2f 2a TypeVersion;../*
0d20: 0a 20 2a 20 57 65 20 6c 6f 73 65 20 74 68 65 20 . * We lose the
0d30: 74 63 6c 20 70 61 73 73 77 6f 72 64 20 63 61 6c tcl password cal
0d40: 6c 62 61 63 6b 20 77 68 65 6e 20 77 65 20 75 73 lback when we us
0d50: 65 20 74 68 65 20 52 53 41 20 42 53 41 46 45 20 e the RSA BSAFE
0d60: 53 53 4c 2d 43 20 31 2e 31 2e 32 0a 20 2a 20 6c SSL-C 1.1.2. * l
0d70: 69 62 72 61 72 69 65 73 20 69 6e 73 74 65 61 64 ibraries instead
0d80: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 of the current
0d90: 4f 70 65 6e 53 53 4c 20 6c 69 62 72 61 72 69 65 OpenSSL librarie
0da0: 73 2e 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 42 s.. */..#ifdef B
0db0: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 50 52 45 SAFE.#define PRE
0dc0: 5f 4f 50 45 4e 53 53 4c 5f 30 5f 39 5f 34 20 31 _OPENSSL_0_9_4 1
0dd0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 50 .#endif../*. * P
0de0: 72 65 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 34 re OpenSSL 0.9.4
0df0: 20 43 6f 6d 70 61 74 0a 20 2a 2f 0a 0a 23 69 66 Compat. */..#if
0e00: 6e 64 65 66 20 53 54 41 43 4b 5f 4f 46 0a 23 64 ndef STACK_OF.#d
0e10: 65 66 69 6e 65 20 53 54 41 43 4b 5f 4f 46 28 78 efine STACK_OF(x
0e20: 29 09 09 09 53 54 41 43 4b 0a 23 64 65 66 69 6e )...STACK.#defin
0e30: 65 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f e sk_SSL_CIPHER_
0e40: 6e 75 6d 28 73 6b 29 09 09 73 6b 5f 6e 75 6d 28 num(sk)..sk_num(
0e50: 28 73 6b 29 29 0a 23 64 65 66 69 6e 65 20 73 6b (sk)).#define sk
0e60: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 _SSL_CIPHER_valu
0e70: 65 28 20 73 6b 2c 20 69 6e 64 65 78 29 09 28 53 e( sk, index).(S
0e80: 53 4c 5f 43 49 50 48 45 52 2a 29 73 6b 5f 76 61 SL_CIPHER*)sk_va
0e90: 6c 75 65 28 28 73 6b 29 2c 20 28 69 6e 64 65 78 lue((sk), (index
0ea0: 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a )).#endif../*. *
0eb0: 20 54 68 72 65 61 64 2d 53 61 66 65 20 54 4c 53 Thread-Safe TLS
0ec0: 20 43 6f 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 Code. */..#ifde
0ed0: 66 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 23 64 f TCL_THREADS.#d
0ee0: 65 66 69 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48 efine OPENSSL_TH
0ef0: 52 45 41 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e READ_DEFINES.#in
0f00: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f clude <openssl/o
0f10: 70 65 6e 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 pensslconf.h>..#
0f20: 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48 ifdef OPENSSL_TH
0f30: 52 45 41 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c READS.#include <
0f40: 6f 70 65 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 openssl/crypto.h
0f50: 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65 >../*. * Threade
0f60: 64 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75 d operation requ
0f70: 69 72 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c ires locking cal
0f80: 6c 62 61 63 6b 73 0a 20 2a 20 42 61 73 65 64 20 lbacks. * Based
0f90: 66 72 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79 from /crypto/cry
0fa0: 70 74 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53 ptlib.c of OpenS
0fb0: 53 4c 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c SL and NSOpenSSL
0fc0: 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 .. */..static Tc
0fd0: 6c 5f 4d 75 74 65 78 20 6c 6f 63 6b 73 5b 43 52 l_Mutex locks[CR
0fe0: 59 50 54 4f 5f 4e 55 4d 5f 4c 4f 43 4b 53 5d 3b YPTO_NUM_LOCKS];
0ff0: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 .static Tcl_Mute
1000: 78 20 69 6e 69 74 5f 6d 78 3b 0a 73 74 61 74 69 x init_mx;.stati
1010: 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 c int initialize
1020: 64 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 d;..static void
1030: 20 20 20 20 20 20 20 20 20 43 72 79 70 74 6f 54 CryptoT
1040: 68 72 65 61 64 4c 6f 63 6b 43 61 6c 6c 62 61 63 hreadLockCallbac
1050: 6b 20 28 69 6e 74 20 6d 6f 64 65 2c 20 69 6e 74 k (int mode, int
1060: 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a n, const char *
1070: 66 69 6c 65 2c 20 69 6e 74 20 6c 69 6e 65 29 3b file, int line);
1080: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 .static unsigned
1090: 20 6c 6f 6e 67 20 43 72 79 70 74 6f 54 68 72 65 long CryptoThre
10a0: 61 64 49 64 43 61 6c 6c 62 61 63 6b 20 20 20 28 adIdCallback (
10b0: 76 6f 69 64 29 3b 0a 0a 73 74 61 74 69 63 20 76 void);..static v
10c0: 6f 69 64 0a 43 72 79 70 74 6f 54 68 72 65 61 64 oid.CryptoThread
10d0: 4c 6f 63 6b 43 61 6c 6c 62 61 63 6b 28 69 6e 74 LockCallback(int
10e0: 20 6d 6f 64 65 2c 20 69 6e 74 20 6e 2c 20 63 6f mode, int n, co
10f0: 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 2c 20 nst char *file,
1100: 69 6e 74 20 6c 69 6e 65 29 0a 7b 0a 20 20 20 20 int line).{.
1110: 69 66 20 28 6d 6f 64 65 20 26 20 43 52 59 50 54 if (mode & CRYPT
1120: 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 O_LOCK) {.
1130: 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 Tcl_MutexLock(&
1140: 6c 6f 63 6b 73 5b 6e 5d 29 3b 0a 20 20 20 20 7d locks[n]);. }
1150: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 54 else {. T
1160: 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 cl_MutexUnlock(&
1170: 6c 6f 63 6b 73 5b 6e 5d 29 3b 0a 20 20 20 20 7d locks[n]);. }
1180: 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 .}..static unsig
1190: 6e 65 64 20 6c 6f 6e 67 0a 43 72 79 70 74 6f 54 ned long.CryptoT
11a0: 68 72 65 61 64 49 64 43 61 6c 6c 62 61 63 6b 28 hreadIdCallback(
11b0: 76 6f 69 64 29 0a 7b 0a 20 20 20 20 72 65 74 75 void).{. retu
11c0: 72 6e 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e rn (unsigned lon
11d0: 67 29 20 54 63 6c 5f 47 65 74 43 75 72 72 65 6e g) Tcl_GetCurren
11e0: 74 54 68 72 65 61 64 28 29 3b 0a 7d 0a 23 65 6e tThread();.}.#en
11f0: 64 69 66 20 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 dif /* OPENSSL_T
1200: 48 52 45 41 44 53 20 2a 2f 0a 23 65 6e 64 69 66 HREADS */.#endif
1210: 20 2f 2a 20 54 43 4c 5f 54 48 52 45 41 44 53 20 /* TCL_THREADS
1220: 2a 2f 0a 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d */..../*. *-----
1230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
1270: 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 *. * InfoCallbac
1280: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 6d 6f 6e 69 74 k --. *. *.monit
1290: 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 ors SSL connecti
12a0: 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a on process. *. *
12b0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
12c0: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 e. *. * Side eff
12d0: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 ects:. *.Calls c
12e0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 allback (if defi
12f0: 6e 65 64 29 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ned). *---------
1300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
1340: 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43 tatic void.InfoC
1350: 61 6c 6c 62 61 63 6b 28 43 4f 4e 53 54 20 53 53 allback(CONST SS
1360: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 L *ssl, int wher
1370: 65 2c 20 69 6e 74 20 72 65 74 29 0a 7b 0a 20 20 e, int ret).{.
1380: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
1390: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f r = (State*)SSL_
13a0: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 get_app_data((SS
13b0: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 L *)ssl);. Tc
13c0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
13d0: 20 20 20 63 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 char *major;
13e0: 63 68 61 72 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 char *minor;..
13f0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
1400: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c callback == (Tcl
1410: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 _Obj*)NULL)..ret
1420: 75 72 6e 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 urn;.. cmdPtr
1430: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
1440: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
1450: 6c 6c 62 61 63 6b 29 3b 0a 0a 23 69 66 20 30 0a llback);..#if 0.
1460: 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 if (where &
1470: 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a SSL_CB_ALERT) {.
1480: 09 73 65 76 20 3d 20 53 53 4c 5f 61 6c 65 72 74 .sev = SSL_alert
1490: 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e _type_string_lon
14a0: 67 28 72 65 74 29 3b 0a 09 69 66 20 28 73 74 72 g(ret);..if (str
14b0: 63 6d 70 28 20 73 65 76 2c 20 22 66 61 74 61 6c cmp( sev, "fatal
14c0: 22 29 3d 3d 30 29 20 7b 09 2f 2a 20 4d 61 70 20 ")==0) {./* Map
14d0: 74 6f 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20 20 to error */..
14e0: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 Tls_Error(state
14f0: 50 74 72 2c 20 53 53 4c 5f 45 52 52 4f 52 28 73 Ptr, SSL_ERROR(s
1500: 73 6c 2c 20 30 29 29 3b 0a 09 20 20 20 20 72 65 sl, 0));.. re
1510: 74 75 72 6e 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 turn;..}. }.#
1520: 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 77 68 endif. if (wh
1530: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e ere & SSL_CB_HAN
1540: 44 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a DSHAKE_START) {.
1550: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 .major = "handsh
1560: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 ake";..minor = "
1570: 73 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c start";. } el
1580: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
1590: 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f SL_CB_HANDSHAKE_
15a0: 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d DONE) {..major =
15b0: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d "handshake";..m
15c0: 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 inor = "done";.
15d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 } else {..if
15e0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
15f0: 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 ALERT)..major =
1600: 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 "alert";..else i
1610: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 f (where & SSL_S
1620: 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 T_CONNECT).major
1630: 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 = "connect";..e
1640: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
1650: 53 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09 SSL_ST_ACCEPT)..
1660: 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22 major = "accept"
1670: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f ;..else.....majo
1680: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a r = "unknown";..
1690: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c .if (where & SSL
16a0: 5f 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 _CB_READ)..minor
16b0: 20 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 = "read";..else
16c0: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c if (where & SSL
16d0: 5f 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f _CB_WRITE)..mino
16e0: 72 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c r = "write";..el
16f0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
1700: 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e SL_CB_LOOP)..min
1710: 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c or = "loop";..el
1720: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 se if (where & S
1730: 53 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e SL_CB_EXIT)..min
1740: 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c or = "exit";..el
1750: 73 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 se.....minor = "
1760: 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a unknown";. }.
1770: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1780: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 AppendElement( s
1790: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
17a0: 20 63 6d 64 50 74 72 2c 20 0a 09 20 20 20 20 54 cmdPtr, .. T
17b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
17c0: 20 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 0a "info", -1));..
17d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
17e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 ppendElement( st
17f0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
1800: 63 6d 64 50 74 72 2c 20 0a 09 20 20 20 20 54 63 cmdPtr, .. Tc
1810: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 l_NewStringObj(
1820: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
1830: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c me(statePtr->sel
1840: 66 29 2c 20 2d 31 29 20 29 3b 0a 0a 20 20 20 20 f), -1) );..
1850: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1860: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 dElement( stateP
1870: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
1880: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
1890: 53 74 72 69 6e 67 4f 62 6a 28 20 6d 61 6a 6f 72 StringObj( major
18a0: 2c 20 2d 31 29 20 29 3b 0a 0a 20 20 20 20 54 63 , -1) );.. Tc
18b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
18c0: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 lement( statePtr
18d0: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
18e0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
18f0: 72 69 6e 67 4f 62 6a 28 20 6d 69 6e 6f 72 2c 20 ringObj( minor,
1900: 2d 31 29 20 29 3b 0a 0a 20 20 20 20 69 66 20 28 -1) );.. if (
1910: 77 68 65 72 65 20 26 20 28 53 53 4c 5f 43 42 5f where & (SSL_CB_
1920: 4c 4f 4f 50 7c 53 53 4c 5f 43 42 5f 45 58 49 54 LOOP|SSL_CB_EXIT
1930: 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 )) {..Tcl_ListOb
1940: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 jAppendElement(
1950: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1960: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 , cmdPtr,.. T
1970: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
1980: 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e SSL_state_strin
1990: 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 g_long(ssl), -1)
19a0: 20 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 );. } else i
19b0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
19c0: 42 5f 41 4c 45 52 54 29 20 7b 0a 09 43 4f 4e 53 B_ALERT) {..CONS
19d0: 54 20 63 68 61 72 20 2a 63 70 20 3d 20 28 63 68 T char *cp = (ch
19e0: 61 72 20 2a 29 20 53 53 4c 5f 61 6c 65 72 74 5f ar *) SSL_alert_
19f0: 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 desc_string_long
1a00: 28 72 65 74 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 (ret);...Tcl_Lis
1a10: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1a20: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 t( statePtr->int
1a30: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
1a40: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
1a50: 62 6a 28 20 63 70 2c 20 2d 31 29 20 29 3b 0a 20 bj( cp, -1) );.
1a60: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c } else {..Tcl
1a70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
1a80: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d ement( statePtr-
1a90: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c >interp, cmdPtr,
1aa0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
1ab0: 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 73 74 61 74 ingObj( SSL_stat
1ac0: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 e_string_long(ss
1ad0: 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20 20 20 7d l), -1) );. }
1ae0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
1af0: 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 e( (ClientData)
1b00: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1b10: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 );. Tcl_Prese
1b20: 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 rve( (ClientData
1b30: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 ) statePtr);..
1b40: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
1b50: 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 nt( cmdPtr);.
1b60: 20 28 76 6f 69 64 29 20 54 63 6c 5f 45 76 61 6c (void) Tcl_Eval
1b70: 4f 62 6a 45 78 28 73 74 61 74 65 50 74 72 2d 3e ObjEx(statePtr->
1b80: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
1b90: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
1ba0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 ;. Tcl_DecrRe
1bb0: 66 43 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b fCount( cmdPtr);
1bc0: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 .. Tcl_Releas
1bd0: 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 e( (ClientData)
1be0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
1bf0: 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69 cl_Release( (Cli
1c00: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
1c10: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 0a 7d 0a 0c r->interp);..}..
1c20: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
1c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
1c70: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d VerifyCallback -
1c80: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 -. *. *.Monitors
1c90: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65 SSL certificate
1ca0: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63 validation proc
1cb0: 65 73 73 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 ess.. *.This is
1cc0: 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 called whenever
1cd0: 61 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 a certificate is
1ce0: 20 69 6e 73 70 65 63 74 65 64 0a 20 2a 09 6f 72 inspected. *.or
1cf0: 20 64 65 63 69 64 65 64 20 69 6e 76 61 6c 69 64 decided invalid
1d00: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
1d10: 0a 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 . *.A callback b
1d20: 6f 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 6b ound to the sock
1d30: 65 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e et may return on
1d40: 65 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 e of:. *. 0..
1d50: 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 .- the certifica
1d60: 74 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e 76 te is deemed inv
1d70: 61 6c 69 64 0a 20 2a 09 20 20 20 20 31 09 09 09 alid. *. 1...
1d80: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 - the certificat
1d90: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 e is deemed vali
1da0: 64 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 d. *. empty s
1db0: 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 tring.- no chang
1dc0: 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 e to certificate
1dd0: 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 validation. *.
1de0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
1df0: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 *.The err field
1e00: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c of the currentl
1e10: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 y operative Stat
1e20: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f e is set. *. to
1e30: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 a string descri
1e40: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 bing the SSL neg
1e50: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 otiation failure
1e60: 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d 2d 2d 2d 2d reason. *------
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 2d 2d 2d 2d 0a 20 2a -------------. *
1eb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 /.static int.Ver
1ec0: 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 ifyCallback(int
1ed0: 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 ok, X509_STORE_C
1ee0: 54 58 20 2a 63 74 78 29 0a 7b 0a 20 20 20 20 54 TX *ctx).{. T
1ef0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 cl_Obj *cmdPtr,
1f00: 2a 72 65 73 75 6c 74 3b 0a 20 20 20 20 63 68 61 *result;. cha
1f10: 72 20 2a 65 72 72 53 74 72 2c 20 2a 73 74 72 69 r *errStr, *stri
1f20: 6e 67 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 67 ng;. int leng
1f30: 74 68 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 th;. SSL *s
1f40: 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 sl..= (SSL*)X509
1f50: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 61 _STORE_CTX_get_a
1f60: 70 70 5f 64 61 74 61 28 63 74 78 29 3b 0a 20 20 pp_data(ctx);.
1f70: 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d X509 *cert..=
1f80: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
1f90: 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 get_current_cert
1fa0: 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 (ctx);. State
1fb0: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 *statePtr.= (St
1fc0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 ate*)SSL_get_app
1fd0: 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 _data(ssl);.
1fe0: 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35 30 int depth..= X50
1ff0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 9_STORE_CTX_get_
2000: 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29 error_depth(ctx)
2010: 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09 3d ;. int err..=
2020: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f X509_STORE_CTX_
2030: 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a get_error(ctx);.
2040: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64 . dprintf(std
2050: 65 72 72 2c 20 22 56 65 72 69 66 79 3a 20 25 64 err, "Verify: %d
2060: 5c 6e 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 \n", ok);.. i
2070: 66 20 28 21 6f 6b 29 20 7b 0a 09 65 72 72 53 74 f (!ok) {..errSt
2080: 72 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f r = (char*)X509_
2090: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f verify_cert_erro
20a0: 72 5f 73 74 72 69 6e 67 28 65 72 72 29 3b 0a 20 r_string(err);.
20b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 65 72 72 } else {..err
20c0: 53 74 72 20 3d 20 28 63 68 61 72 20 2a 29 30 3b Str = (char *)0;
20d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
20e0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
20f0: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
2100: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 NULL) {..if (sta
2110: 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 tePtr->vflags &
2120: 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f SSL_VERIFY_FAIL_
2130: 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 IF_NO_PEER_CERT)
2140: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f {.. return o
2150: 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 k;..} else {..
2160: 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 return 1;..}.
2170: 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 }. cmdPtr
2180: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f = Tcl_DuplicateO
2190: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c bj(statePtr->cal
21a0: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c lback);.. Tcl
21b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
21c0: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d ement( statePtr-
21d0: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c >interp, cmdPtr,
21e0: 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 .. Tcl_NewSt
21f0: 72 69 6e 67 4f 62 6a 28 20 22 76 65 72 69 66 79 ringObj( "verify
2200: 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 ", -1));.. Tc
2210: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2220: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 lement( statePtr
2230: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
2240: 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 , .. Tcl_NewS
2250: 74 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 tringObj( Tcl_Ge
2260: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
2270: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
2280: 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 ) );.. Tcl_Li
2290: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
22a0: 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e nt( statePtr->in
22b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
22c0: 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a Tcl_NewIntObj
22d0: 28 20 64 65 70 74 68 29 20 29 3b 0a 0a 20 20 20 ( depth) );..
22e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
22f0: 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 ndElement( state
2300: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 Ptr->interp, cmd
2310: 50 74 72 2c 0a 09 20 20 20 20 54 6c 73 5f 4e 65 Ptr,.. Tls_Ne
2320: 77 58 35 30 39 4f 62 6a 28 20 73 74 61 74 65 50 wX509Obj( stateP
2330: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 65 72 74 tr->interp, cert
2340: 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 ) );.. Tcl_Li
2350: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2360: 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e nt( statePtr->in
2370: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
2380: 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a Tcl_NewIntObj
2390: 28 20 6f 6b 29 20 29 3b 0a 0a 20 20 20 20 54 63 ( ok) );.. Tc
23a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
23b0: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 lement( statePtr
23c0: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
23d0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
23e0: 72 69 6e 67 4f 62 6a 28 20 65 72 72 53 74 72 20 ringObj( errStr
23f0: 3f 20 65 72 72 53 74 72 20 3a 20 22 22 2c 20 2d ? errStr : "", -
2400: 31 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 1) );.. Tcl_P
2410: 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 reserve( (Client
2420: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e Data) statePtr->
2430: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
2440: 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 _Preserve( (Clie
2450: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
2460: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 );.. statePtr
2470: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 ->flags |= TLS_T
2480: 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20 CL_CALLBACK;..
2490: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
24a0: 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 nt( cmdPtr);.
24b0: 20 69 66 20 28 54 63 6c 5f 45 76 61 6c 4f 62 6a if (Tcl_EvalObj
24c0: 45 78 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 Ex(statePtr->int
24d0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c erp, cmdPtr, TCL
24e0: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 21 3d _EVAL_GLOBAL) !=
24f0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 49 TCL_OK) {../* I
2500: 74 20 67 6f 74 20 61 6e 20 65 72 72 6f 72 20 2d t got an error -
2510: 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 reject the cert
2520: 69 66 69 63 61 74 65 2e 09 09 2a 2f 0a 09 54 63 ificate...*/..Tc
2530: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
2540: 72 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 r( statePtr->int
2550: 65 72 70 29 3b 0a 09 6f 6b 20 3d 20 30 3b 0a 20 erp);..ok = 0;.
2560: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 } else {..res
2570: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a ult = Tcl_GetObj
2580: 52 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d Result(statePtr-
2590: 3e 69 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e >interp);..strin
25a0: 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e g = Tcl_GetStrin
25b0: 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c gFromObj(result,
25c0: 20 26 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 &length);../* A
25d0: 6e 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c n empty result l
25e0: 65 61 76 65 73 20 76 65 72 69 66 69 63 61 74 69 eaves verificati
25f0: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f on unchanged..*/
2600: 0a 09 69 66 20 28 6c 65 6e 67 74 68 20 3e 20 30 ..if (length > 0
2610: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 54 63 6c ) {.. if (Tcl
2620: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 73 _GetIntFromObj(s
2630: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
2640: 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d result, &ok) !=
2650: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 54 63 6c TCL_OK) {...Tcl
2660: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
2670: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 (statePtr->inter
2680: 70 29 3b 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 p);...ok = 0;..
2690: 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 }..}. }.
26a0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
26b0: 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a 20 20 nt( cmdPtr);..
26c0: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 statePtr->flag
26d0: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 s &= ~(TLS_TCL_C
26e0: 41 4c 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 20 54 ALLBACK);.. T
26f0: 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69 cl_Release( (Cli
2700: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
2710: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 r);. Tcl_Rele
2720: 61 73 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 ase( (ClientData
2730: 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ) statePtr->inte
2740: 72 70 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e rp);.. return
2750: 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 (ok);./* By defa
2760: 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 ult, leave verif
2770: 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 ication unchange
2780: 64 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d d..*/.}.../*. *-
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27d0: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 --. *. * Tls_Err
27e0: 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c or --. *. *.Call
27f0: 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 s callback with
2800: 24 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73 $fd and $msg - s
2810: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 o the callback c
2820: 61 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61 an decide. *.wha
2830: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72 t to do with err
2840: 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ors.. *. * Side
2850: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 effects:. *.The
2860: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 err field of the
2870: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 currently opera
2880: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 tive State is se
2890: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 t. *. to a stri
28a0: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 ng describing th
28b0: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f e SSL negotiatio
28c0: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e n failure reason
28d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2910: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a ------. */.void.
2920: 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 Tls_Error(State
2930: 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 *statePtr, char
2940: 2a 6d 73 67 29 0a 7b 0a 20 20 20 20 54 63 6c 5f *msg).{. Tcl_
2950: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 0a 20 20 Obj *cmdPtr;..
2960: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73 if (msg && *ms
2970: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 g) {..Tcl_SetErr
2980: 6f 72 43 6f 64 65 28 73 74 61 74 65 50 74 72 2d orCode(statePtr-
2990: 3e 69 6e 74 65 72 70 2c 20 22 53 53 4c 22 2c 20 >interp, "SSL",
29a0: 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c msg, (char *)NUL
29b0: 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b L);. } else {
29c0: 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 ..msg = Tcl_GetS
29d0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c tringFromObj(Tcl
29e0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 73 74 _GetObjResult(st
29f0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 2c atePtr->interp),
2a00: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 NULL);. }.
2a10: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 statePtr->err
2a20: 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66 20 28 = msg;.. if (
2a30: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
2a40: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
2a50: 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 NULL) {..char bu
2a60: 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70 72 69 f[BUFSIZ];..spri
2a70: 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20 63 68 ntf(buf, "SSL ch
2a80: 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20 65 72 annel \"%s\": er
2a90: 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20 20 54 ror: %s",.. T
2aa0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
2ab0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
2ac0: 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f 53 65 ), msg);..Tcl_Se
2ad0: 74 52 65 73 75 6c 74 28 20 73 74 61 74 65 50 74 tResult( statePt
2ae0: 72 2d 3e 69 6e 74 65 72 70 2c 20 62 75 66 2c 20 r->interp, buf,
2af0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 09 TCL_VOLATILE);..
2b00: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 Tcl_BackgroundEr
2b10: 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d 3e 69 ror( statePtr->i
2b20: 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 3b nterp);..return;
2b30: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 74 . }. cmdPt
2b40: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
2b50: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
2b60: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 allback);.. T
2b70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2b80: 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 Element(statePtr
2b90: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
2ba0: 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 , .. Tcl_NewS
2bb0: 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 tringObj("error"
2bc0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c , -1));.. Tcl
2bd0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2be0: 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e ement(statePtr->
2bf0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
2c00: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
2c10: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
2c20: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
2c30: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
2c40: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
2c50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 jAppendElement(s
2c60: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
2c70: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
2c80: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
2c90: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 sg, -1));.. T
2ca0: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
2cb0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
2cc0: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 r->interp);.
2cd0: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c Tcl_Preserve((Cl
2ce0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
2cf0: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e tr);.. Tcl_In
2d00: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
2d10: 72 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f r);. if (Tcl_
2d20: 45 76 61 6c 4f 62 6a 45 78 28 73 74 61 74 65 50 EvalObjEx(stateP
2d30: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
2d40: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f tr, TCL_EVAL_GLO
2d50: 42 41 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 BAL) != TCL_OK)
2d60: 7b 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e {..Tcl_Backgroun
2d70: 64 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d dError(statePtr-
2d80: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a >interp);. }.
2d90: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2da0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 ount(cmdPtr);..
2db0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 Tcl_Release((
2dc0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
2dd0: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 ePtr);. Tcl_R
2de0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
2df0: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e ta) statePtr->in
2e00: 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a terp);.}.../*. *
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e50: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f ---. *. * Passwo
2e60: 72 64 43 61 6c 6c 62 61 63 6b 20 2d 2d 20 0a 20 rdCallback -- .
2e70: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e *. *.Called when
2e80: 20 61 20 70 61 73 73 77 6f 72 64 20 69 73 20 6e a password is n
2e90: 65 65 64 65 64 20 74 6f 20 75 6e 70 61 63 6b 20 eeded to unpack
2ea0: 52 53 41 20 61 6e 64 20 50 45 4d 20 6b 65 79 73 RSA and PEM keys
2eb0: 2e 0a 20 2a 09 45 76 61 6c 73 20 61 6e 79 20 62 .. *.Evals any b
2ec0: 6f 75 6e 64 20 70 61 73 73 77 6f 72 64 20 73 63 ound password sc
2ed0: 72 69 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 ript and returns
2ee0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 0a 20 the result as.
2ef0: 2a 09 74 68 65 20 70 61 73 73 77 6f 72 64 20 73 *.the password s
2f00: 74 72 69 6e 67 2e 0a 20 2a 2d 2d 2d 2d 2d 2d 2d tring.. *-------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
2f50: 0a 23 69 66 64 65 66 20 50 52 45 5f 4f 50 45 4e .#ifdef PRE_OPEN
2f60: 53 53 4c 5f 30 5f 39 5f 34 0a 2f 2a 0a 20 2a 20 SSL_0_9_4./*. *
2f70: 4e 6f 20 77 61 79 20 74 6f 20 68 61 6e 64 6c 65 No way to handle
2f80: 20 75 73 65 72 2d 64 61 74 61 20 74 68 65 72 65 user-data there
2f90: 66 6f 72 65 20 6e 6f 20 77 61 79 20 77 69 74 68 fore no way with
2fa0: 6f 75 74 20 61 20 67 6c 6f 62 61 6c 0a 20 2a 20 out a global. *
2fb0: 76 61 72 69 61 62 6c 65 20 74 6f 20 61 63 63 65 variable to acce
2fc0: 73 73 20 74 68 65 20 54 63 6c 20 69 6e 74 65 72 ss the Tcl inter
2fd0: 70 72 65 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 preter..*/.stati
2fe0: 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 c int.PasswordCa
2ff0: 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 llback(char *buf
3000: 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 , int size, int
3010: 76 65 72 69 66 79 29 0a 7b 0a 20 20 20 20 72 65 verify).{. re
3020: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 23 65 6c 73 65 turn -1;.}.#else
3030: 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73 .static int.Pass
3040: 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 wordCallback(cha
3050: 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 r *buf, int size
3060: 2c 20 69 6e 74 20 76 65 72 69 66 79 2c 20 76 6f , int verify, vo
3070: 69 64 20 2a 75 64 61 74 61 29 0a 7b 0a 20 20 20 id *udata).{.
3080: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
3090: 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75 64 61 .= (State *) uda
30a0: 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 ta;. Tcl_Inte
30b0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
30c0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
30d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
30e0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 75 tr;. int resu
30f0: 6c 74 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 lt;.. if (sta
3100: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 tePtr->password
3110: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 == NULL) {..if (
3120: 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 Tcl_EvalEx(inter
3130: 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 p, "tls::passwor
3140: 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c d", -1, TCL_EVAL
3150: 5f 47 4c 4f 42 41 4c 29 0a 09 09 3d 3d 20 54 43 _GLOBAL)...== TC
3160: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 L_OK) {.. cha
3170: 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a r *ret = (char *
3180: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 ) Tcl_GetStringR
3190: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 esult(interp);..
31a0: 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c strncpy(buf,
31b0: 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 ret, (size_t) s
31c0: 69 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ize);.. retur
31d0: 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 n (int)strlen(re
31e0: 74 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 t);..} else {..
31f0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d return -1;..}
3200: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 50 . }.. cmdP
3210: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
3220: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
3230: 70 61 73 73 77 6f 72 64 29 3b 0a 0a 20 20 20 20 password);..
3240: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c Tcl_Preserve((Cl
3250: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
3260: 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 tr->interp);.
3270: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 Tcl_Preserve((C
3280: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
3290: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 Ptr);.. Tcl_I
32a0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
32b0: 74 72 29 3b 0a 20 20 20 20 72 65 73 75 6c 74 20 tr);. result
32c0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
32d0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
32e0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
32f0: 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 ;. if (result
3300: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 != TCL_OK) {..T
3310: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 cl_BackgroundErr
3320: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 or(statePtr->int
3330: 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 erp);. }.
3340: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
3350: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 (cmdPtr);.. T
3360: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
3370: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
3380: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 );. Tcl_Relea
3390: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 se((ClientData)
33a0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
33b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 );.. if (resu
33c0: 6c 74 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a lt == TCL_OK) {.
33d0: 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 .char *ret = (ch
33e0: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 ar *) Tcl_GetStr
33f0: 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ingResult(interp
3400: 29 3b 0a 09 73 74 72 6e 63 70 79 28 62 75 66 2c );..strncpy(buf,
3410: 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 ret, (size_t) s
3420: 69 7a 65 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 ize);..return (i
3430: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a nt)strlen(ret);.
3440: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 } else {..re
3450: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 7d turn -1;. }.}
3460: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d .#endif.../*. *-
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34b0: 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 --. *. * Ciphers
34c0: 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 ObjCmd -- list a
34d0: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 vailable ciphers
34e0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
34f0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
3500: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 to process the
3510: 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 "tls::ciphers" c
3520: 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 ommand. *.to lis
3530: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 t available ciph
3540: 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 ers, based upon
3550: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 protocol selecte
3560: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 d.. *. * Results
3570: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
3580: 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e Tcl result list.
3590: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
35a0: 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 cts:. *.construc
35b0: 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 ts and destroys
35c0: 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 SSL context (CTX
35d0: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ). *. *---------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
3620: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 tatic int.Cipher
3630: 73 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 sObjCmd(clientDa
3640: 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 ta, interp, objc
3650: 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 , objv). Clie
3660: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
3670: 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 a;./* Not used.
3680: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 */. Tcl_Inter
3690: 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 p *interp;. i
36a0: 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c nt objc;. Tcl
36b0: 5f 4f 62 6a 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 _Obj.*CONST objv
36c0: 5b 5d 3b 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 [];.{. static
36d0: 20 43 4f 4e 53 54 38 34 20 63 68 61 72 20 2a 70 CONST84 char *p
36e0: 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 rotocols[] = {..
36f0: 22 73 73 6c 32 22 2c 09 22 73 73 6c 33 22 2c 09 "ssl2",."ssl3",.
3700: 22 74 6c 73 31 22 2c 09 4e 55 4c 4c 0a 20 20 20 "tls1",.NULL.
3710: 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 70 72 6f };. enum pro
3720: 74 6f 63 6f 6c 20 7b 0a 09 54 4c 53 5f 53 53 4c tocol {..TLS_SSL
3730: 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 2, TLS_SSL3, TLS
3740: 5f 54 4c 53 31 2c 20 54 4c 53 5f 4e 4f 4e 45 0a _TLS1, TLS_NONE.
3750: 20 20 20 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 4f };. Tcl_O
3760: 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 bj *objPtr;.
3770: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e SSL_CTX *ctx = N
3780: 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 ULL;. SSL *ss
3790: 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 l = NULL;. ST
37a0: 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 ACK_OF(SSL_CIPHE
37b0: 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 R) *sk;. char
37c0: 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 5a *cp, buf[BUFSIZ
37d0: 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 ];. int index
37e0: 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 3b 0a 0a , verbose = 0;..
37f0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
3800: 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 29 20 7b 0a || objc > 3) {.
3810: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
3820: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
3830: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 v, "protocol ?ve
3840: 72 62 6f 73 65 3f 22 29 3b 0a 09 72 65 74 75 72 rbose?");..retur
3850: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
3860: 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 }. if (Tcl_G
3870: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 20 etIndexFromObj(
3880: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c interp, objv[1],
3890: 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f protocols, "pro
38a0: 74 6f 63 6f 6c 22 2c 20 30 2c 0a 09 26 69 6e 64 tocol", 0,..&ind
38b0: 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ex) != TCL_OK) {
38c0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
38d0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
38e0: 20 28 6f 62 6a 63 20 3e 20 32 20 26 26 20 54 63 (objc > 2 && Tc
38f0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d l_GetBooleanFrom
3900: 4f 62 6a 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a Obj( interp, obj
3910: 76 5b 32 5d 2c 0a 09 26 76 65 72 62 6f 73 65 29 v[2],..&verbose)
3920: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
3930: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
3940: 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 . }. switc
3950: 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f h ((enum protoco
3960: 6c 29 69 6e 64 65 78 29 20 7b 0a 20 20 20 20 63 l)index) {. c
3970: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 ase TLS_SSL2:.#i
3980: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c f defined(NO_SSL
3990: 32 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 2)...Tcl_AppendR
39a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 esult(interp, "p
39b0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
39c0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
39d0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
39e0: 52 3b 0a 23 65 6c 73 65 0a 09 09 63 74 78 20 3d R;.#else...ctx =
39f0: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c SSL_CTX_new(SSL
3a00: 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 v2_method()); br
3a10: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
3a20: 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 case TLS_SSL3:.#
3a30: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 if defined(NO_SS
3a40: 4c 33 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 L3)...Tcl_Append
3a50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
3a60: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
3a70: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
3a80: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
3a90: 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 63 74 78 20 OR;.#else...ctx
3aa0: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 = SSL_CTX_new(SS
3ab0: 4c 76 33 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 Lv3_method()); b
3ac0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 reak;.#endif.
3ad0: 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a case TLS_TLS1:.
3ae0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
3af0: 4c 53 31 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e LS1)...Tcl_Appen
3b00: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
3b10: 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 "protocol not su
3b20: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
3b30: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
3b40: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 63 74 78 ROR;.#else...ctx
3b50: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 = SSL_CTX_new(T
3b60: 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 LSv1_method());
3b70: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 break;.#endif.
3b80: 20 20 64 65 66 61 75 6c 74 3a 0a 09 09 62 72 65 default:...bre
3b90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 ak;. }. if
3ba0: 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b (ctx == NULL) {
3bb0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
3bc0: 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f lt(interp, REASO
3bd0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
3be0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
3bf0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
3c00: 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 ssl = SSL_new(
3c10: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 ctx);. if (ss
3c20: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 l == NULL) {..Tc
3c30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
3c40: 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c nterp, REASON(),
3c50: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
3c60: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
3c70: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c tx);..return TCL
3c80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
3c90: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
3ca0: 65 77 4c 69 73 74 4f 62 6a 28 20 30 2c 20 4e 55 ewListObj( 0, NU
3cb0: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 76 LL);.. if (!v
3cc0: 65 72 62 6f 73 65 29 20 7b 0a 09 66 6f 72 20 28 erbose) {..for (
3cd0: 69 6e 64 65 78 20 3d 20 30 3b 20 3b 20 69 6e 64 index = 0; ; ind
3ce0: 65 78 2b 2b 29 20 7b 0a 09 20 20 20 20 63 70 20 ex++) {.. cp
3cf0: 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 = (char*)SSL_get
3d00: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 20 73 73 _cipher_list( ss
3d10: 6c 2c 20 69 6e 64 65 78 29 3b 0a 09 20 20 20 20 l, index);..
3d20: 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 if (cp == NULL)
3d30: 62 72 65 61 6b 3b 0a 09 20 20 20 20 54 63 6c 5f break;.. Tcl_
3d40: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3d50: 6d 65 6e 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 ment( interp, ob
3d60: 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 jPtr,...Tcl_NewS
3d70: 74 72 69 6e 67 4f 62 6a 28 20 63 70 2c 20 2d 31 tringObj( cp, -1
3d80: 29 20 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c ) );..}. } el
3d90: 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 se {..sk = SSL_g
3da0: 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b et_ciphers(ssl);
3db0: 0a 0a 09 66 6f 72 20 28 69 6e 64 65 78 20 3d 20 ...for (index =
3dc0: 30 3b 20 69 6e 64 65 78 20 3c 20 73 6b 5f 53 53 0; index < sk_SS
3dd0: 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 L_CIPHER_num(sk)
3de0: 3b 20 69 6e 64 65 78 2b 2b 29 20 7b 0a 09 20 20 ; index++) {..
3df0: 20 20 72 65 67 69 73 74 65 72 20 73 69 7a 65 5f register size_
3e00: 74 20 69 3b 0a 09 20 20 20 20 53 53 4c 5f 43 49 t i;.. SSL_CI
3e10: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
3e20: 28 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f ( sk_SSL_CIPHER_
3e30: 76 61 6c 75 65 28 20 73 6b 2c 20 69 6e 64 65 78 value( sk, index
3e40: 29 2c 0a 09 09 09 09 20 20 20 20 62 75 66 2c 20 ),..... buf,
3e50: 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 09 20 sizeof(buf));..
3e60: 20 20 20 66 6f 72 20 28 69 20 3d 20 73 74 72 6c for (i = strl
3e70: 65 6e 28 62 75 66 29 20 2d 20 31 3b 20 69 20 3b en(buf) - 1; i ;
3e80: 20 69 2d 2d 29 20 7b 0a 09 09 69 66 20 28 62 75 i--) {...if (bu
3e90: 66 5b 69 5d 20 3d 3d 20 27 20 27 20 7c 7c 20 62 f[i] == ' ' || b
3ea0: 75 66 5b 69 5d 20 3d 3d 20 27 5c 6e 27 20 7c 7c uf[i] == '\n' ||
3eb0: 0a 09 09 20 20 20 20 62 75 66 5b 69 5d 20 3d 3d ... buf[i] ==
3ec0: 20 27 5c 72 27 20 7c 7c 20 62 75 66 5b 69 5d 20 '\r' || buf[i]
3ed0: 3d 3d 20 27 5c 74 27 29 20 7b 0a 09 09 20 20 20 == '\t') {...
3ee0: 20 62 75 66 5b 69 5d 20 3d 20 27 5c 30 27 3b 0a buf[i] = '\0';.
3ef0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 ..} else {...
3f00: 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20 20 20 break;...}..
3f10: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 }.. Tcl_List
3f20: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3f30: 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 ( interp, objPtr
3f40: 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e ,...Tcl_NewStrin
3f50: 67 4f 62 6a 28 20 62 75 66 2c 20 2d 31 29 20 29 gObj( buf, -1) )
3f60: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 ;..}. }. S
3f70: 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 SL_free(ssl);.
3f80: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 SSL_CTX_free(c
3f90: 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 tx);.. Tcl_Se
3fa0: 74 4f 62 6a 52 65 73 75 6c 74 28 20 69 6e 74 65 tObjResult( inte
3fb0: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
3fc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
3fd0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
4020: 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 * HandshakeObjC
4030: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 md --. *. *.This
4040: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 command is used
4050: 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 to verify wheth
4060: 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 er the handshake
4070: 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 is complete. *.
4080: 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 or not.. *. * Re
4090: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
40a0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
40b0: 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 1 means handsha
40c0: 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d ke complete, 0 m
40d0: 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a eans pending.. *
40e0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
40f0: 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 :. *.May force S
4100: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 SL negotiation t
4110: 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a o take place.. *
4120: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4160: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
4170: 69 63 20 69 6e 74 0a 48 61 6e 64 73 68 61 6b 65 ic int.Handshake
4180: 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 ObjCmd(clientDat
4190: 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c a, interp, objc,
41a0: 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e objv). Clien
41b0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
41c0: 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a ;./* Not used. *
41d0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 /. Tcl_Interp
41e0: 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e *interp;. in
41f0: 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f t objc;. Tcl_
4200: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b Obj *CONST objv[
4210: 5d 3b 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ];.{. Tcl_Cha
4220: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
4230: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 he channel to se
4240: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a t a mode on. */.
4250: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
4260: 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 Ptr;../* client
4270: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f state for ssl so
4280: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 cket */. int
4290: 72 65 74 20 3d 20 31 3b 0a 0a 20 20 20 20 69 66 ret = 1;.. if
42a0: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
42b0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
42c0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
42d0: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
42e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
42f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e . }.. chan
4300: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
4310: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
4320: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
4330: 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e bjv[1], NULL), N
4340: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 ULL);. if (ch
4350: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
4360: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
4370: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
4380: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 68 61 }. if (cha
4390: 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 nnelTypeVersion
43a0: 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 == TLS_CHANNEL_V
43b0: 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 2f 2a 0a ERSION_2) {../*.
43c0: 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f . * Make sure to
43d0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
43e0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a topmost channel.
43f0: 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c . */..chan = Tcl
4400: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
4410: 68 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 han);. }.
4420: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
4430: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
4440: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
4450: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
4460: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
4470: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
4480: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
4490: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
44a0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
44b0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 nel", NULL);..re
44c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
44d0: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
44e0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 tr = (State *)Tc
44f0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
4500: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a anceData(chan);.
4510: 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 69 73 . if (!SSL_is
4520: 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 _init_finished(s
4530: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b tatePtr->ssl)) {
4540: 0a 09 69 6e 74 20 65 72 72 3b 0a 09 72 65 74 20 ..int err;..ret
4550: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e = Tls_WaitForCon
4560: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 nect(statePtr, &
4570: 65 72 72 29 3b 0a 09 69 66 20 28 28 73 74 61 74 err);..if ((stat
4580: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c ePtr->flags & TL
4590: 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 S_TCL_ASYNC) &&
45a0: 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b err == EAGAIN) {
45b0: 0a 09 20 20 20 20 72 65 74 20 3d 20 30 3b 0a 09 .. ret = 0;..
45c0: 7d 0a 09 69 66 20 28 72 65 74 20 3c 20 30 29 20 }..if (ret < 0)
45d0: 7b 0a 09 20 20 20 20 43 4f 4e 53 54 20 63 68 61 {.. CONST cha
45e0: 72 20 2a 65 72 72 53 74 72 20 3d 20 73 74 61 74 r *errStr = stat
45f0: 65 50 74 72 2d 3e 65 72 72 3b 0a 09 20 20 20 20 ePtr->err;..
4600: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 Tcl_ResetResult(
4610: 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 54 63 interp);.. Tc
4620: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b l_SetErrno(err);
4630: 0a 0a 09 20 20 20 20 69 66 20 28 21 65 72 72 53 ... if (!errS
4640: 74 72 20 7c 7c 20 2a 65 72 72 53 74 72 20 3d 3d tr || *errStr ==
4650: 20 30 29 20 7b 0a 09 09 65 72 72 53 74 72 20 3d 0) {...errStr =
4660: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 Tcl_PosixError(
4670: 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 7d 0a interp);.. }.
4680: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
4690: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
46a0: 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 handshake failed
46b0: 3a 20 22 2c 20 65 72 72 53 74 72 2c 0a 09 09 20 : ", errStr,...
46c0: 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c (char *) NULL
46d0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
46e0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 CL_ERROR;..}.
46f0: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f }.. Tcl_SetO
4700: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
4710: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 Tcl_NewIntObj(r
4720: 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e et));. return
4730: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
4740: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4780: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f -----. *. * Impo
4790: 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 rtObjCmd --. *.
47a0: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
47b0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
47c0: 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 rocess the "ssl"
47d0: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 command. *. *.T
47e0: 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 he ssl command p
47f0: 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 ushes SSL over a
4800: 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 (newly connecte
4810: 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a d) tcp socket. *
4820: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
4830: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
4840: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
4850: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 e effects:. *.Ma
4860: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 y modify the beh
4870: 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 avior of an IO c
4880: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d hannel.. *. *---
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48d0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
48e0: 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 63 6c .ImportObjCmd(cl
48f0: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 ientData, interp
4900: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 , objc, objv).
4910: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ClientData cli
4920: 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 entData;./* Not
4930: 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c used. */. Tcl
4940: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b _Interp *interp;
4950: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 . int objc;.
4960: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 Tcl_Obj *CONS
4970: 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 T objv[];.{.
4980: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
4990: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
49a0: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 l to set a mode
49b0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 on. */. State
49c0: 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 *statePtr;../*
49d0: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 client state for
49e0: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 ssl socket */.
49f0: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 SSL_CTX *ctx.
4a00: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
4a10: 4f 62 6a 20 2a 73 63 72 69 70 74 09 3d 20 4e 55 Obj *script.= NU
4a20: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
4a30: 2a 70 61 73 73 77 6f 72 64 09 3d 20 4e 55 4c 4c *password.= NULL
4a40: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c ;. int idx, l
4a50: 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 en;. int flag
4a60: 73 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 s..= TLS_TCL_INI
4a70: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 T;. int serve
4a80: 72 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f r..= 0;./* is co
4a90: 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e nnection incomin
4aa0: 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a g or outgoing? *
4ab0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 09 /. char *key.
4ac0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 .= NULL;. cha
4ad0: 72 20 2a 63 65 72 74 09 09 3d 20 4e 55 4c 4c 3b r *cert..= NULL;
4ae0: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 . char *ciphe
4af0: 72 73 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 rs.= NULL;. c
4b00: 68 61 72 20 2a 43 41 66 69 6c 65 09 3d 20 4e 55 har *CAfile.= NU
4b10: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 LL;. char *CA
4b20: 64 69 72 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 dir..= NULL;.
4b30: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 3d 20 char *model..=
4b40: 4e 55 4c 4c 3b 0a 23 69 66 20 64 65 66 69 6e 65 NULL;.#if define
4b50: 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 d(NO_SSL2). i
4b60: 6e 74 20 73 73 6c 32 20 3d 20 30 3b 0a 23 65 6c nt ssl2 = 0;.#el
4b70: 73 65 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 se. int ssl2
4b80: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 1;.#endif.#if
4b90: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
4ba0: 0a 20 20 20 20 69 6e 74 20 73 73 6c 33 20 3d 20 . int ssl3 =
4bb0: 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e 74 0;.#else. int
4bc0: 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64 69 ssl3 = 1;.#endi
4bd0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
4be0: 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65 _SSL2) && define
4bf0: 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 d(NO_SSL3). i
4c00: 6e 74 20 74 6c 73 31 20 3d 20 31 3b 0a 23 65 6c nt tls1 = 1;.#el
4c10: 73 65 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 se. int tls1
4c20: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 = 0;.#endif.
4c30: 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 3b 0a 20 int proto = 0;.
4c40: 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 int verify =
4c50: 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 0, require = 0,
4c60: 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a 20 20 request = 1;..
4c70: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 if (objc < 2)
4c80: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
4c90: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
4ca0: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f bjv, "channel ?o
4cb0: 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 ptions?");..retu
4cc0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
4cd0: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
4ce0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
4cf0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
4d00: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
4d10: 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c [1], NULL), NULL
4d20: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
4d30: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
4d40: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
4d50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
4d60: 7d 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65 }. if (channe
4d70: 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 lTypeVersion ==
4d80: 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 TLS_CHANNEL_VERS
4d90: 49 4f 4e 5f 32 29 20 7b 0a 09 2f 2a 0a 09 20 2a ION_2) {../*.. *
4da0: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
4db0: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
4dc0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a most channel.. *
4dd0: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
4de0: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
4df0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f );. }.. fo
4e00: 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 r (idx = 2; idx
4e10: 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b < objc; idx++) {
4e20: 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 ..char *opt = Tc
4e30: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
4e40: 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 bj(objv[idx], NU
4e50: 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 LL);...if (opt[0
4e60: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 ] != '-').. b
4e70: 72 65 61 6b 3b 0a 0a 09 4f 50 54 53 54 52 28 20 reak;...OPTSTR(
4e80: 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29 "-cadir", CAdir)
4e90: 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d 63 61 66 ;..OPTSTR( "-caf
4ea0: 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 ile", CAfile);..
4eb0: 4f 50 54 53 54 52 28 20 22 2d 63 65 72 74 66 69 OPTSTR( "-certfi
4ec0: 6c 65 22 2c 20 63 65 72 74 29 3b 0a 09 4f 50 54 le", cert);..OPT
4ed0: 53 54 52 28 20 22 2d 63 69 70 68 65 72 22 2c 20 STR( "-cipher",
4ee0: 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 4f 42 ciphers);..OPTOB
4ef0: 4a 28 20 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 J( "-command", s
4f00: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 cript);..OPTSTR(
4f10: 20 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 "-keyfile", key
4f20: 29 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d 6d 6f );..OPTSTR( "-mo
4f30: 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f del", model);..O
4f40: 50 54 4f 42 4a 28 20 22 2d 70 61 73 73 77 6f 72 PTOBJ( "-passwor
4f50: 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 d", password);..
4f60: 4f 50 54 42 4f 4f 4c 28 20 22 2d 72 65 71 75 69 OPTBOOL( "-requi
4f70: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 re", require);..
4f80: 4f 50 54 42 4f 4f 4c 28 20 22 2d 72 65 71 75 65 OPTBOOL( "-reque
4f90: 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 st", request);..
4fa0: 4f 50 54 42 4f 4f 4c 28 20 22 2d 73 65 72 76 65 OPTBOOL( "-serve
4fb0: 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 0a 09 4f r", server);...O
4fc0: 50 54 42 4f 4f 4c 28 20 22 2d 73 73 6c 32 22 2c PTBOOL( "-ssl2",
4fd0: 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c ssl2);..OPTBOOL
4fe0: 28 20 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 ( "-ssl3", ssl3)
4ff0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 74 6c ;..OPTBOOL( "-tl
5000: 73 31 22 2c 20 74 6c 73 31 29 3b 0a 0a 09 4f 50 s1", tls1);...OP
5010: 54 42 41 44 28 20 22 6f 70 74 69 6f 6e 22 2c 20 TBAD( "option",
5020: 22 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 "-cadir, -cafile
5030: 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 , -certfile, -ci
5040: 70 68 65 72 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 pher, -command,
5050: 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c -keyfile, -model
5060: 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 65 , -password, -re
5070: 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 74 2c quire, -request,
5080: 20 2d 73 65 72 76 65 72 2c 20 2d 73 73 6c 32 2c -server, -ssl2,
5090: 20 2d 73 73 6c 33 2c 20 6f 72 20 2d 74 6c 73 31 -ssl3, or -tls1
50a0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c ");...return TCL
50b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
50c0: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 20 if (request).
50d0: 20 20 20 76 65 72 69 66 79 20 7c 3d 20 53 53 4c verify |= SSL
50e0: 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f _VERIFY_CLIENT_O
50f0: 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 NCE | SSL_VERIFY
5100: 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28 72 _PEER;. if (r
5110: 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69 72 equest && requir
5120: 65 29 20 76 65 72 69 66 79 20 7c 3d 20 53 53 4c e) verify |= SSL
5130: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f _VERIFY_FAIL_IF_
5140: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 NO_PEER_CERT;.
5150: 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 if (verify ==
5160: 30 29 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 0).verify = SSL_
5170: 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 VERIFY_NONE;..
5180: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 proto |= (ssl2
5190: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c ? TLS_PROTO_SSL
51a0: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 2 : 0);. prot
51b0: 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 o |= (ssl3 ? TLS
51c0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 _PROTO_SSL3 : 0)
51d0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
51e0: 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f tls1 ? TLS_PROTO
51f0: 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 0a 20 20 20 _TLS1 : 0);..
5200: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c /* reset to NUL
5210: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e L if blank strin
5220: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 g provided */.
5230: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a if (cert && !*
5240: 63 65 72 74 29 09 09 63 65 72 74 09 3d 20 4e 55 cert)..cert.= NU
5250: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 LL;. if (key
5260: 26 26 20 21 2a 6b 65 79 29 09 09 6b 65 79 09 3d && !*key)..key.=
5270: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
5280: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 iphers && !*ciph
5290: 65 72 73 29 09 63 69 70 68 65 72 73 09 3d 20 4e ers).ciphers.= N
52a0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 ULL;. if (CAf
52b0: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 ile && !*CAfile)
52c0: 09 43 41 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a .CAfile.= NULL;.
52d0: 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26 if (CAdir &&
52e0: 20 21 2a 43 41 64 69 72 29 09 43 41 64 69 72 09 !*CAdir).CAdir.
52f0: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 = NULL;.. /*
5300: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f new SSL state */
5310: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d . statePtr..=
5320: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c (State *) ckall
5330: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 oc((unsigned) si
5340: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 zeof(State));.
5350: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 memset(statePt
5360: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 r, 0, sizeof(Sta
5370: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 te));.. state
5380: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 Ptr->flags.= fla
5390: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 gs;. statePtr
53a0: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 ->interp.= inter
53b0: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d p;. statePtr-
53c0: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 >vflags.= verify
53d0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
53e0: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f err.= "";.. /
53f0: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 * allocate scrip
5400: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 t */. if (scr
5410: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 ipt) {..(void) T
5420: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
5430: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e Obj(script, &len
5440: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
5450: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 statePtr->ca
5460: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b llback = script;
5470: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
5480: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
5490: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 >callback);..}.
54a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c }.. /* all
54b0: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a ocate password *
54c0: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f /. if (passwo
54d0: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 rd) {..(void) Tc
54e0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
54f0: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 bj(password, &le
5500: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
5510: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 . statePtr->p
5520: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f assword = passwo
5530: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 rd;.. Tcl_Inc
5540: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 rRefCount(stateP
5550: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 tr->password);..
5560: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 }. }.. if
5570: 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 (model != NULL)
5580: 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a {..int mode;../*
5590: 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 Get the "model"
55a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 context */..cha
55b0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
55c0: 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c el(interp, model
55d0: 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 , &mode);..if (c
55e0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
55f0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 nel) NULL) {..
5600: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
5610: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
5620: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
5630: 52 52 4f 52 3b 0a 09 7d 0a 09 69 66 20 28 63 68 RROR;..}..if (ch
5640: 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e annelTypeVersion
5650: 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f == TLS_CHANNEL_
5660: 56 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 20 20 VERSION_2) {..
5670: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4d 61 6b /*.. * Mak
5680: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
5690: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
56a0: 20 63 68 61 6e 6e 65 6c 0a 09 20 20 20 20 20 2a channel.. *
56b0: 2f 0a 09 20 20 20 20 63 68 61 6e 20 3d 20 54 63 /.. chan = Tc
56c0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
56d0: 63 68 61 6e 29 3b 0a 09 7d 0a 09 69 66 20 28 54 chan);..}..if (T
56e0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
56f0: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
5700: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
5710: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
5720: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
5730: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 0a ad channel \"",.
5740: 09 09 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 .. Tcl_GetCha
5750: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 nnelName(chan),
5760: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
5770: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a hannel", NULL);.
5780: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
5790: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
57a0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
57b0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 L_ERROR;..}..ctx
57c0: 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c = ((State *)Tcl
57d0: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
57e0: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e nceData(chan))->
57f0: 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ctx;. } else
5800: 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 {..if ((ctx = CT
5810: 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c X_Init(statePtr,
5820: 20 70 72 6f 74 6f 2c 20 6b 65 79 2c 20 63 65 72 proto, key, cer
5830: 74 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c 65 t, CAdir, CAfile
5840: 2c 20 63 69 70 68 65 72 73 29 29 0a 09 09 3d 3d , ciphers))...==
5850: 20 28 53 53 4c 5f 43 54 58 2a 29 30 29 20 7b 0a (SSL_CTX*)0) {.
5860: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
5870: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
5880: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
5890: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
58a0: 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d }.. statePtr-
58b0: 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 >ctx = ctx;..
58c0: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 /*. * We ne
58d0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 ed to make sure
58e0: 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c that the channel
58f0: 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 works in binary
5900: 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a (for the. *
5910: 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 encryption not
5920: 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 to get goofed up
5930: 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c ).. * We onl
5940: 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 y want to adjust
5950: 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 the buffering i
5960: 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c n pre-v2 channel
5970: 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 s, where. *
5980: 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 each channel in
5990: 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 the stack mainta
59a0: 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 ined its own buf
59b0: 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 fers.. */.
59c0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
59d0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
59e0: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 han, "-translati
59f0: 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a on", "binary");.
5a00: 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65 6c 54 if (channelT
5a10: 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c ypeVersion == TL
5a20: 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f S_CHANNEL_VERSIO
5a30: 4e 5f 31 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 N_1) {..Tcl_SetC
5a40: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
5a50: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 75 66 erp, chan, "-buf
5a60: 66 65 72 69 6e 67 22 2c 20 22 6e 6f 6e 65 22 29 fering", "none")
5a70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
5a80: 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 (channelTypeVers
5a90: 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e ion == TLS_CHANN
5aa0: 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 20 7b 0a EL_VERSION_2) {.
5ab0: 09 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 .statePtr->self
5ac0: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e = Tcl_StackChann
5ad0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 el(interp, Tls_C
5ae0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 0a 09 09 hannelType(),...
5af0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
5b00: 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 tePtr, (TCL_READ
5b10: 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 ABLE | TCL_WRITA
5b20: 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 BLE), chan);.
5b30: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 } else {..state
5b40: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 63 68 61 6e Ptr->self = chan
5b50: 3b 0a 09 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e ;..Tcl_StackChan
5b60: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f nel(interp, Tls_
5b70: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 0a 09 ChannelType(),..
5b80: 09 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 .(ClientData) st
5b90: 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 atePtr, (TCL_REA
5ba0: 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 DABLE | TCL_WRIT
5bb0: 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 ABLE), chan);.
5bc0: 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
5bd0: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
5be0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
5bf0: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 ) {../*.. * No u
5c00: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 se of Tcl_Eventu
5c10: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 allyFree because
5c20: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c no possible Tcl
5c30: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a _Preserve... */.
5c40: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 .Tls_Free((char
5c50: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 *) statePtr);..r
5c60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
5c70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
5c80: 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 * SSL Initia
5c90: 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f lization. */
5ca0: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
5cb0: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 ssl = SSL_new(st
5cc0: 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 atePtr->ctx);.
5cd0: 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72 2d if (!statePtr-
5ce0: 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 >ssl) {../* SSL
5cf0: 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f library error */
5d00: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
5d10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c lt(interp, "coul
5d20: 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 dn't construct s
5d30: 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52 sl session: ", R
5d40: 45 41 53 4f 4e 28 29 2c 0a 09 09 28 63 68 61 72 EASON(),...(char
5d50: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f *) NULL);..Tls_
5d60: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
5d70: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e atePtr);..return
5d80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
5d90: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
5da0: 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 SSL Callbacks.
5db0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 53 53 4c 5f */.. SSL_
5dc0: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 set_app_data(sta
5dd0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 56 4f 49 tePtr->ssl, (VOI
5de0: 44 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f D *)statePtr);./
5df0: 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 * point back to
5e00: 75 73 20 2a 2f 0a 0a 20 20 20 20 53 53 4c 5f 73 us */.. SSL_s
5e10: 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 et_verify(stateP
5e20: 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c tr->ssl, verify,
5e30: 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 VerifyCallback)
5e40: 3b 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 ;.. SSL_CTX_s
5e50: 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b et_info_callback
5e60: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
5e70: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a InfoCallback);..
5e80: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 /* Create Tc
5e90: 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 l_Channel BIO Ha
5ea0: 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 ndler */. sta
5eb0: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 tePtr->p_bio.= B
5ec0: 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 IO_new_tcl(state
5ed0: 50 74 72 2c 20 42 49 4f 5f 43 4c 4f 53 45 29 3b Ptr, BIO_CLOSE);
5ee0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 . statePtr->b
5ef0: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f io.= BIO_new(BIO
5f00: 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 _f_ssl());..
5f10: 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 73 if (server) {..s
5f20: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c tatePtr->flags |
5f30: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 = TLS_TCL_SERVER
5f40: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 ;..SSL_set_accep
5f50: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 t_state(statePtr
5f60: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c ->ssl);. } el
5f70: 73 65 20 7b 0a 09 53 53 4c 5f 73 65 74 5f 63 6f se {..SSL_set_co
5f80: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 nnect_state(stat
5f90: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
5fa0: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 }. SSL_set_bi
5fb0: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c o(statePtr->ssl,
5fc0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
5fd0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 , statePtr->p_bi
5fe0: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f o);. BIO_set_
5ff0: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 ssl(statePtr->bi
6000: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c o, statePtr->ssl
6010: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a , BIO_NOCLOSE);.
6020: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 . /*. * E
6030: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 nd of SSL Init.
6040: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 */. Tcl_S
6050: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
6060: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 (char *) Tcl_Ge
6070: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
6080: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 0a 09 20 tePtr->self),..
6090: 20 20 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 TCL_VOLATILE)
60a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
60b0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6100: 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 -. *. * Unimport
6110: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
6120: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
6130: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d s invoked to rem
6140: 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 ove the topmost
6150: 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a channel filter..
6160: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
6170: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
6180: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
6190: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
61a0: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 May modify the b
61b0: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f ehavior of an IO
61c0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
61d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
61e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
61f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6210: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
6220: 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d nt.UnimportObjCm
6230: 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e d(clientData, in
6240: 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 terp, objc, objv
6250: 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 ). ClientData
6260: 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20 clientData;./*
6270: 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 Not used. */.
6280: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
6290: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f 62 6a erp;. int obj
62a0: 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a c;. Tcl_Obj *
62b0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a CONST objv[];.{.
62c0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
62d0: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
62e0: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
62f0: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 ode on. */..
6300: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b if (objc != 2) {
6310: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
6320: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
6330: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a jv, "channel");.
6340: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
6350: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 R;. }.. ch
6360: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
6370: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
6380: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 GetString(objv[1
6390: 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 ]), NULL);. i
63a0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
63b0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
63c0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
63d0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
63e0: 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 f (channelTypeVe
63f0: 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 rsion == TLS_CHA
6400: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 20 NNEL_VERSION_2)
6410: 7b 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 {../*.. * Make s
6420: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
6430: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
6440: 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e annel.. */..chan
6450: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
6460: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
6470: 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 }.. if (Tcl_G
6480: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
6490: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
64a0: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
64b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
64c0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
64d0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
64e0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
64f0: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 ,..."\": not a T
6500: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c LS channel", NUL
6510: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
6520: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
6530: 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 if (Tcl_Unstac
6540: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c kChannel(interp,
6550: 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 chan) == TCL_ER
6560: 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ROR) {..return T
6570: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
6580: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
6590: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65e0: 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 . *. * CTX_Init
65f0: 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 -- construct a S
6600: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a SL_CTX instance.
6610: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
6620: 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 *.A valid SSL_CT
6630: 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 X instance or NU
6640: 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 LL.. *. * Side e
6650: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 ffects:. *.const
6660: 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 ructs SSL contex
6670: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d t (CTX). *. *---
6680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66c0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 53 53 4c . */..static SSL
66d0: 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 _CTX *.CTX_Init(
66e0: 73 74 61 74 65 50 74 72 2c 20 70 72 6f 74 6f 2c statePtr, proto,
66f0: 20 6b 65 79 2c 20 63 65 72 74 2c 20 43 41 64 69 key, cert, CAdi
6700: 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 r, CAfile, ciphe
6710: 72 73 29 0a 20 20 20 20 53 74 61 74 65 20 2a 73 rs). State *s
6720: 74 61 74 65 50 74 72 3b 0a 20 20 20 20 69 6e 74 tatePtr;. int
6730: 20 70 72 6f 74 6f 3b 0a 20 20 20 20 63 68 61 72 proto;. char
6740: 20 2a 6b 65 79 3b 0a 20 20 20 20 63 68 61 72 20 *key;. char
6750: 2a 63 65 72 74 3b 0a 20 20 20 20 63 68 61 72 20 *cert;. char
6760: 2a 43 41 64 69 72 3b 0a 20 20 20 20 63 68 61 72 *CAdir;. char
6770: 20 2a 43 41 66 69 6c 65 3b 0a 20 20 20 20 63 68 *CAfile;. ch
6780: 61 72 20 2a 63 69 70 68 65 72 73 3b 0a 7b 0a 20 ar *ciphers;.{.
6790: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
67a0: 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 nterp = statePtr
67b0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 ->interp;. SS
67c0: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c L_CTX *ctx = NUL
67d0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 L;. Tcl_DStri
67e0: 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 ng ds;. Tcl_D
67f0: 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 String ds1;.
6800: 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 0a 20 20 int off = 0;..
6810: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 /* create SSL
6820: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 21 context */.#if !
6830: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
6840: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f && !defined(NO_
6850: 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e SSL3). if (EN
6860: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
6870: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 26 26 0a _PROTO_SSL2) &&.
6880: 09 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 .ENABLED(proto,
6890: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 TLS_PROTO_SSL3))
68a0: 20 7b 0a 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 {..ctx = SSL_CT
68b0: 58 5f 6e 65 77 28 53 53 4c 76 32 33 5f 6d 65 74 X_new(SSLv23_met
68c0: 68 6f 64 28 29 29 3b 0a 20 20 20 20 7d 20 65 6c hod());. } el
68d0: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 se.#endif. if
68e0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
68f0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 TLS_PROTO_SSL2)
6900: 29 20 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 ) {.#if defined(
6910: 4e 4f 5f 53 53 4c 32 29 0a 09 54 63 6c 5f 41 70 NO_SSL2)..Tcl_Ap
6920: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
6930: 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 p, "protocol not
6940: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
6950: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c L);..return (SSL
6960: 5f 43 54 58 20 2a 29 30 3b 0a 23 65 6c 73 65 0a _CTX *)0;.#else.
6970: 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e .ctx = SSL_CTX_n
6980: 65 77 28 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 ew(SSLv2_method(
6990: 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d ));.#endif. }
69a0: 20 65 6c 73 65 20 69 66 20 28 45 4e 41 42 4c 45 else if (ENABLE
69b0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
69c0: 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 63 74 78 TO_TLS1)) {..ctx
69d0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 = SSL_CTX_new(T
69e0: 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 29 3b 0a LSv1_method());.
69f0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 45 } else if (E
6a00: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
6a10: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b S_PROTO_SSL3)) {
6a20: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
6a30: 53 53 4c 33 29 0a 09 54 63 6c 5f 41 70 70 65 6e SSL3)..Tcl_Appen
6a40: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
6a50: 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 "protocol not su
6a60: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
6a70: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
6a80: 58 20 2a 29 30 3b 0a 23 65 6c 73 65 0a 09 63 74 X *)0;.#else..ct
6a90: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
6aa0: 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 29 3b SSLv3_method());
6ab0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 20 65 6c .#endif. } el
6ac0: 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 se {..Tcl_Append
6ad0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
6ae0: 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f no valid protoco
6af0: 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c l selected", NUL
6b00: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c L);..return (SSL
6b10: 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a _CTX *)0;. }.
6b20: 20 20 20 20 6f 66 66 20 7c 3d 20 28 45 4e 41 42 off |= (ENAB
6b30: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
6b40: 52 4f 54 4f 5f 54 4c 53 31 29 20 3f 20 30 20 3a ROTO_TLS1) ? 0 :
6b50: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
6b60: 29 3b 0a 20 20 20 20 6f 66 66 20 7c 3d 20 28 45 );. off |= (E
6b70: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
6b80: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 3f 20 S_PROTO_SSL2) ?
6b90: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 0 : SSL_OP_NO_SS
6ba0: 4c 76 32 29 3b 0a 20 20 20 20 6f 66 66 20 7c 3d Lv2);. off |=
6bb0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c (ENABLED(proto,
6bc0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 TLS_PROTO_SSL3)
6bd0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f ? 0 : SSL_OP_NO
6be0: 5f 53 53 4c 76 33 29 3b 0a 0a 20 20 20 20 53 53 _SSLv3);.. SS
6bf0: 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 L_CTX_set_app_da
6c00: 74 61 28 20 63 74 78 2c 20 28 56 4f 49 44 2a 29 ta( ctx, (VOID*)
6c10: 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 interp);./* reme
6c20: 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 mber the interpr
6c30: 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f eter */. SSL_
6c40: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
6c50: 20 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c ctx, SSL_OP_ALL
6c60: 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 );./* all SSL bu
6c70: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f g workarounds */
6c80: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
6c90: 5f 6f 70 74 69 6f 6e 73 28 20 63 74 78 2c 20 6f _options( ctx, o
6ca0: 66 66 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 ff);./* all SSL
6cb0: 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 bug workarounds
6cc0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
6cd0: 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 ess_set_cache_si
6ce0: 7a 65 28 20 63 74 78 2c 20 31 32 38 29 3b 0a 0a ze( ctx, 128);..
6cf0: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 if (ciphers
6d00: 21 3d 20 4e 55 4c 4c 29 0a 09 53 53 4c 5f 43 54 != NULL)..SSL_CT
6d10: 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 X_set_cipher_lis
6d20: 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 3b t(ctx, ciphers);
6d30: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d .. /* set som
6d40: 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 e callbacks */.
6d50: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 SSL_CTX_set_d
6d60: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 efault_passwd_cb
6d70: 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 (ctx, PasswordCa
6d80: 6c 6c 62 61 63 6b 29 3b 0a 0a 23 69 66 6e 64 65 llback);..#ifnde
6d90: 66 20 42 53 41 46 45 0a 20 20 20 20 53 53 4c 5f f BSAFE. SSL_
6da0: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
6db0: 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 passwd_cb_userda
6dc0: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 ta(ctx, (void *)
6dd0: 73 74 61 74 65 50 74 72 29 3b 0a 23 65 6e 64 69 statePtr);.#endi
6de0: 66 0a 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 44 48 f..#ifndef NO_DH
6df0: 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 20 3d . {..DH* dh =
6e00: 20 67 65 74 5f 64 68 35 31 32 28 29 3b 0a 09 53 get_dh512();..S
6e10: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 SL_CTX_set_tmp_d
6e20: 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f h(ctx, dh);..DH_
6e30: 66 72 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a free(dh);. }.
6e40: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 #endif.. /* s
6e50: 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 et our certifica
6e60: 74 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 te */. if (ce
6e70: 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 rt != NULL) {..T
6e80: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
6e90: 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 ds);...if (SSL_C
6ea0: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 TX_use_certifica
6eb0: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e te_file(ctx, F2N
6ec0: 28 20 63 65 72 74 2c 20 26 64 73 29 2c 0a 09 09 ( cert, &ds),...
6ed0: 09 09 09 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ...SSL_FILETYPE_
6ee0: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 PEM) <= 0) {..
6ef0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
6f00: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c e(&ds);.. Tcl
6f10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
6f20: 74 65 72 70 2c 0a 09 09 09 20 20 20 20 20 22 75 terp,.... "u
6f30: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 nable to set cer
6f40: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c tificate file ",
6f50: 20 63 65 72 74 2c 20 22 3a 20 22 2c 0a 09 09 09 cert, ": ",....
6f60: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 REASON(), (
6f70: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
6f80: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
6f90: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
6fa0: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b rn (SSL_CTX *)0;
6fb0: 0a 09 7d 0a 0a 09 2f 2a 20 67 65 74 20 74 68 65 ..}.../* get the
6fc0: 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 private key ass
6fd0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 ociated with thi
6fe0: 73 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f s certificate */
6ff0: 0a 09 69 66 20 28 6b 65 79 20 3d 3d 20 4e 55 4c ..if (key == NUL
7000: 4c 29 20 6b 65 79 3d 63 65 72 74 3b 0a 0a 09 69 L) key=cert;...i
7010: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 f (SSL_CTX_use_P
7020: 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 rivateKey_file(c
7030: 74 78 2c 20 46 32 4e 28 20 6b 65 79 2c 20 26 64 tx, F2N( key, &d
7040: 73 29 2c 0a 09 09 09 09 09 53 53 4c 5f 46 49 4c s),......SSL_FIL
7050: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 ETYPE_PEM) <= 0)
7060: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 {.. Tcl_DStr
7070: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
7080: 20 20 20 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 /* flush the
7090: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 passphrase which
70a0: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 might be left i
70b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a n the result */.
70c0: 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
70d0: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c lt(interp, NULL,
70e0: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 20 TCL_STATIC);..
70f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
7100: 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09 09 09 20 ult(interp,....
7110: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 "unable to s
7120: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 et public key fi
7130: 6c 65 20 22 2c 20 6b 65 79 2c 20 22 20 22 2c 0a le ", key, " ",.
7140: 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 ... REASON()
7150: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
7160: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
7170: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
7180: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
7190: 29 30 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 )0;..}..Tcl_DStr
71a0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 2f ingFree(&ds);../
71b0: 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 * Now we know th
71c0: 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 at a key and cer
71d0: 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 t have been set
71e0: 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 against.. * the
71f0: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 SSL context */..
7200: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 if (!SSL_CTX_che
7210: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 ck_private_key(c
7220: 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f tx)) {.. Tcl_
7230: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7240: 65 72 70 2c 0a 09 09 09 20 20 20 20 20 22 70 72 erp,.... "pr
7250: 69 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e ivate key does n
7260: 6f 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 ot match the cer
7270: 74 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 tificate public
7280: 6b 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 key",.... (c
7290: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
72a0: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 SSL_CTX_free(
72b0: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ctx);.. retur
72c0: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a n (SSL_CTX *)0;.
72d0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a .}. } else {.
72e0: 09 63 65 72 74 20 3d 20 28 63 68 61 72 2a 29 58 .cert = (char*)X
72f0: 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 509_get_default_
7300: 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 cert_file();...i
7310: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
7320: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
7330: 63 74 78 2c 20 63 65 72 74 2c 0a 09 09 09 09 09 ctx, cert,......
7340: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d SSL_FILETYPE_PEM
7350: 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a ) <= 0) {.#if 0.
7360: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
7370: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
7380: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7390: 28 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20 (interp,....
73a0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 "unable to use
73b0: 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 default certific
73c0: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 ate file ", cert
73d0: 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 , ": ",....
73e0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
73f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
7400: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
7410: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 ;.. return (S
7420: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 23 65 6e 64 SL_CTX *)0;.#end
7430: 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 09 0a 20 20 if..}. }...
7440: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
7450: 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f t(&ds);. Tcl_
7460: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 DStringInit(&ds1
7470: 29 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f );. if (!SSL_
7480: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f CTX_load_verify_
7490: 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 locations(ctx, F
74a0: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 2N(CAfile, &ds),
74b0: 20 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 F2N(CAdir, &ds1
74c0: 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f )) ||..!SSL_CTX_
74d0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 set_default_veri
74e0: 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b fy_paths(ctx)) {
74f0: 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 .#if 0..Tcl_DStr
7500: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 ingFree(&ds);..T
7510: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
7520: 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 ds1);../* Don't
7530: 63 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 currently care i
7540: 66 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a f this fails */.
7550: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
7560: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 t(interp, "SSL d
7570: 65 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 efault verify pa
7580: 74 68 73 3a 20 22 2c 0a 09 09 52 45 41 53 4f 4e ths: ",...REASON
7590: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
75a0: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
75b0: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
75c0: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 23 65 (SSL_CTX *)0;.#e
75d0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 53 ndif. }. S
75e0: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
75f0: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 53 t_CA_list(ctx, S
7600: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 SL_load_client_C
7610: 41 5f 66 69 6c 65 28 20 46 32 4e 28 43 41 66 69 A_file( F2N(CAfi
7620: 6c 65 2c 20 26 64 73 29 20 29 29 3b 0a 0a 20 20 le, &ds) ));..
7630: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
7640: 65 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f e(&ds);. Tcl_
7650: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 DStringFree(&ds1
7660: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 );. return ct
7670: 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d x;.}.../*. *----
7680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
76c0: 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 *. * StatusObjC
76d0: 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 md -- return cer
76e0: 74 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e tificate for con
76f0: 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a nected peer.. *.
7700: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
7710: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
7720: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
7730: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
7740: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
7750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
7790: 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 static int.Statu
77a0: 73 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 sObjCmd(clientDa
77b0: 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 ta, interp, objc
77c0: 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 , objv). Clie
77d0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
77e0: 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 a;./* Not used.
77f0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 */. Tcl_Inter
7800: 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 p *interp;. i
7810: 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c nt objc;. Tcl
7820: 5f 4f 62 6a 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 _Obj.*CONST objv
7830: 5b 5d 3b 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 [];.{. State
7840: 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 *statePtr;. X
7850: 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 509 *peer;. T
7860: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a cl_Obj *objPtr;.
7870: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
7880: 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a chan;. char *
7890: 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 channelName, *ci
78a0: 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d phers;. int m
78b0: 6f 64 65 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 ode;.. switch
78c0: 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 65 20 (objc) {..case
78d0: 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 6c 4e 2:.. channelN
78e0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ame = Tcl_GetStr
78f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
7900: 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 1], NULL);..
7910: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 33 3a break;...case 3:
7920: 0a 09 20 20 20 20 69 66 20 28 21 73 74 72 63 6d .. if (!strcm
7930: 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p (Tcl_GetString
7940: 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f (objv[1]), "-lo
7950: 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 6e 6e cal")) {...chann
7960: 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 elName = Tcl_Get
7970: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 StringFromObj(ob
7980: 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 09 jv[2], NULL);...
7990: 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 break;.. }..
79a0: 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 2e /* else fall.
79b0: 2e 2e 20 2a 2f 0a 09 64 65 66 61 75 6c 74 3a 0a .. */..default:.
79c0: 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 . Tcl_WrongNu
79d0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
79e0: 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f objv, "?-local?
79f0: 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 channel");..
7a00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
7a10: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 R;. }.. ch
7a20: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
7a30: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e nel(interp, chan
7a40: 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b nelName, &mode);
7a50: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
7a60: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
7a70: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
7a80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7a90: 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65 6c 54 if (channelT
7aa0: 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c ypeVersion == TL
7ab0: 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f S_CHANNEL_VERSIO
7ac0: 4e 5f 32 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4d N_2) {../*.. * M
7ad0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
7ae0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
7af0: 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a st channel.. */.
7b00: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 .chan = Tcl_GetT
7b10: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
7b20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 . }. if (T
7b30: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
7b40: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 e(chan) != Tls_C
7b50: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a hannelType()) {.
7b60: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
7b70: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
7b80: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
7b90: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
7ba0: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 han),..."\": not
7bb0: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c a TLS channel",
7bc0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
7bd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7be0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 . statePtr =
7bf0: 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 (State *) Tcl_Ge
7c00: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
7c10: 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 Data(chan);.
7c20: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b if (objc == 2) {
7c30: 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 ..peer = SSL_get
7c40: 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 _peer_certificat
7c50: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
7c60: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
7c70: 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 peer = SSL_get_c
7c80: 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 ertificate(state
7c90: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d Ptr->ssl);. }
7ca0: 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b . if (peer) {
7cb0: 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e ..objPtr = Tls_N
7cc0: 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 ewX509Obj(interp
7cd0: 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 , peer);..if (ob
7ce0: 6a 63 20 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f jc == 2) { X509_
7cf0: 66 72 65 65 28 70 65 65 72 29 3b 20 7d 0a 20 20 free(peer); }.
7d00: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 } else {..objP
7d10: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
7d20: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 Obj(0, NULL);.
7d30: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 }.. Tcl_Lis
7d40: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
7d50: 74 20 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 t (interp, objPt
7d60: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
7d70: 74 72 69 6e 67 4f 62 6a 20 28 22 73 62 69 74 73 tringObj ("sbits
7d80: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
7d90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
7da0: 65 6d 65 6e 74 20 28 69 6e 74 65 72 70 2c 20 6f ement (interp, o
7db0: 62 6a 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f bjPtr,.. Tcl_
7dc0: 4e 65 77 49 6e 74 4f 62 6a 20 28 53 53 4c 5f 67 NewIntObj (SSL_g
7dd0: 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 20 28 et_cipher_bits (
7de0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e statePtr->ssl, N
7df0: 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63 69 70 ULL)));.. cip
7e00: 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 hers = (char*)SS
7e10: 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 L_get_cipher(sta
7e20: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
7e30: 20 69 66 20 28 63 69 70 68 65 72 73 20 21 3d 20 if (ciphers !=
7e40: 4e 55 4c 4c 20 26 26 20 73 74 72 63 6d 70 28 63 NULL && strcmp(c
7e50: 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e 45 29 22 iphers, "(NONE)"
7e60: 29 21 3d 30 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 )!=0) {..Tcl_Lis
7e70: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
7e80: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
7e90: 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e ,...Tcl_NewStrin
7ea0: 67 4f 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d gObj("cipher", -
7eb0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 1));..Tcl_ListOb
7ec0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
7ed0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 nterp, objPtr,..
7ee0: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 .Tcl_NewStringOb
7ef0: 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 j(SSL_get_cipher
7f00: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c (statePtr->ssl),
7f10: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 -1));. }.
7f20: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
7f30: 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 t( interp, objPt
7f40: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
7f50: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
7f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fa0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f ---. *. * Versio
7fb0: 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 nObjCmd -- retur
7fc0: 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 n version string
7fd0: 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 from OpenSSL..
7fe0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
7ff0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
8000: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
8010: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
8020: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
8030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
8070: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 /.static int.Ver
8080: 73 69 6f 6e 4f 62 6a 43 6d 64 28 63 6c 69 65 6e sionObjCmd(clien
8090: 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f tData, interp, o
80a0: 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43 bjc, objv). C
80b0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
80c0: 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 Data;./* Not use
80d0: 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e d. */. Tcl_In
80e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 terp *interp;.
80f0: 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20 int objc;.
8100: 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e 53 54 20 6f Tcl_Obj.*CONST o
8110: 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63 6c bjv[];.{. Tcl
8120: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 _Obj *objPtr;..
8130: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f objPtr = Tcl_
8140: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 NewStringObj(OPE
8150: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 NSSL_VERSION_TEX
8160: 54 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c T, -1);.. Tcl
8170: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
8180: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 terp, objPtr);.
8190: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
81a0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
81b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
81c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
81d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
81e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
81f0: 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 *. * MiscObjCmd
8200: 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 -- misc commands
8210: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
8220: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
8230: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
8240: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
8250: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
8260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
82a0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d */.static int.M
82b0: 69 73 63 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74 iscObjCmd(client
82c0: 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 Data, interp, ob
82d0: 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c jc, objv). Cl
82e0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
82f0: 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64 ata;./* Not used
8300: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 . */. Tcl_Int
8310: 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20 erp *interp;.
8320: 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54 int objc;. T
8330: 63 6c 5f 4f 62 6a 09 2a 43 4f 4e 53 54 20 6f 62 cl_Obj.*CONST ob
8340: 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 73 74 61 74 jv[];.{. stat
8350: 69 63 20 43 4f 4e 53 54 38 34 20 63 68 61 72 20 ic CONST84 char
8360: 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b *commands [] = {
8370: 20 22 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a "req", NULL };.
8380: 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 enum command
8390: 20 7b 20 43 5f 52 45 51 2c 20 43 5f 44 55 4d 4d { C_REQ, C_DUMM
83a0: 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 Y };. int cmd
83b0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
83c0: 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e < 2) {..Tcl_Wron
83d0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
83e0: 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 1, objv, "subco
83f0: 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a mmand ?args?");.
8400: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
8410: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
8420: 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f (Tcl_GetIndexFro
8430: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
8440: 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 0a v[1], commands,.
8450: 09 20 20 20 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 . "command",
8460: 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 0,&cmd) != TCL_O
8470: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
8480: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
8490: 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d switch ((enum
84a0: 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b command) cmd) {
84b0: 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 20 7b 0a ..case C_REQ: {.
84c0: 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 . EVP_PKEY *p
84d0: 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 key=NULL;.. X
84e0: 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 509 *cert=NULL;.
84f0: 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a . X509_NAME *
8500: 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 name=NULL;..
8510: 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b Tcl_Obj **listv;
8520: 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74 63 2c .. int listc,
8530: 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 i;... BIO *ou
8540: 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 t=NULL;... ch
8550: 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 ar *k_C="",*k_ST
8560: 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f ="",*k_L="",*k_O
8570: 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f ="",*k_OU="",*k_
8580: 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 CN="",*k_Email="
8590: 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 ";.. char *ke
85a0: 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 yout,*pemout,*st
85b0: 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 r;.. int keys
85c0: 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 ize,serial=0,day
85d0: 73 3d 33 36 35 3b 0a 09 20 20 20 20 0a 09 20 20 s=365;.. ..
85e0: 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c if ((objc<5) |
85f0: 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 | (objc>6)) {...
8600: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
8610: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 (interp, 2, objv
8620: 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 , "keysize keyfi
8630: 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 le certfile ?inf
8640: 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 o?");...return T
8650: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
8660: 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 ... if (Tcl_G
8670: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
8680: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b erp, objv[2], &k
8690: 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f eysize) != TCL_O
86a0: 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 K) {...return TC
86b0: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
86c0: 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f . keyout=Tcl_
86d0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 GetString(objv[3
86e0: 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d ]);.. pemout=
86f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
8700: 6a 76 5b 34 5d 29 3b 0a 0a 09 20 20 20 20 69 66 jv[4]);... if
8710: 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 (objc>=6) {...i
8720: 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 f (Tcl_ListObjGe
8730: 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 tElements(interp
8740: 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c , objv[5],....&l
8750: 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d istc, &listv) !=
8760: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 TCL_OK) {...
8770: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
8780: 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c R;...}....if ((l
8790: 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a istc%2) != 0) {.
87a0: 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 .. Tcl_SetRes
87b0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f ult(interp,"Info
87c0: 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 rmation list mus
87d0: 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 t have even numb
87e0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 er of arguments"
87f0: 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 ,NULL);... re
8800: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
8810: 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 ..}...for (i=0;
8820: 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b i<listc; i+=2) {
8830: 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 ... str=Tcl_G
8840: 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 etString(listv[i
8850: 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 ]);... if (st
8860: 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 rcmp(str,"days")
8870: 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 ==0) {....if (Tc
8880: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
8890: 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 interp,listv[i+1
88a0: 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b ],&days)!=TCL_OK
88b0: 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 ).... return
88c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
88d0: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
88e0: 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 mp(str,"serial")
88f0: 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 ==0) {....if (Tc
8900: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
8910: 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 interp,listv[i+1
8920: 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f ],&serial)!=TCL_
8930: 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 OK).... retur
8940: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 n TCL_ERROR;...
8950: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
8960: 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c rcmp(str,"serial
8970: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 ")==0) {....if (
8980: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
8990: 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 j(interp,listv[i
89a0: 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 +1],&serial)!=TC
89b0: 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 L_OK).... ret
89c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
89d0: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
89e0: 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d strcmp(str,"C")=
89f0: 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c =0) {....k_C=Tcl
8a00: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
8a10: 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
8a20: 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
8a30: 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a str,"ST")==0) {.
8a40: 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 ...k_ST=Tcl_GetS
8a50: 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
8a60: 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
8a70: 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
8a80: 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c L")==0) {....k_L
8a90: 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
8aa0: 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
8ab0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
8ac0: 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 cmp(str,"O")==0)
8ad0: 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 {....k_O=Tcl_Ge
8ae0: 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
8af0: 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
8b00: 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
8b10: 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 ,"OU")==0) {....
8b20: 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 k_OU=Tcl_GetStri
8b30: 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
8b40: 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
8b50: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 (strcmp(str,"CN"
8b60: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d )==0) {....k_CN=
8b70: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
8b80: 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
8b90: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
8ba0: 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d mp(str,"Email")=
8bb0: 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c =0) {....k_Email
8bc0: 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
8bd0: 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
8be0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 } else {....Tc
8bf0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
8c00: 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 rp,"Unknown para
8c10: 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 meter",NULL);...
8c20: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
8c30: 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 R;... }...}..
8c40: 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28 28 }.. if ((
8c50: 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f pkey = EVP_PKEY_
8c60: 6e 65 77 28 29 29 20 21 3d 20 4e 55 4c 4c 29 20 new()) != NULL)
8c70: 7b 0a 09 09 69 66 20 28 21 45 56 50 5f 50 4b 45 {...if (!EVP_PKE
8c80: 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 Y_assign_RSA(pke
8c90: 79 2c 0a 09 09 09 52 53 41 5f 67 65 6e 65 72 61 y,....RSA_genera
8ca0: 74 65 5f 6b 65 79 28 6b 65 79 73 69 7a 65 2c 20 te_key(keysize,
8cb0: 30 78 31 30 30 30 31 2c 20 4e 55 4c 4c 2c 20 4e 0x10001, NULL, N
8cc0: 55 4c 4c 29 29 29 20 7b 0a 09 09 20 20 20 20 54 ULL))) {... T
8cd0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
8ce0: 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 erp,"Error gener
8cf0: 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 ating private ke
8d00: 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 y",NULL);...
8d10: 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
8d20: 65 79 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 ey);... retur
8d30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
8d40: 0a 09 09 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 ...out=BIO_new(B
8d50: 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 IO_s_file());...
8d60: 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
8d70: 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a me(out,keyout);.
8d80: 09 09 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f ..PEM_write_bio_
8d90: 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 PrivateKey(out,p
8da0: 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c key,NULL,NULL,0,
8db0: 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 42 49 NULL,NULL);...BI
8dc0: 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b O_free_all(out);
8dd0: 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 ....if ((cert=X5
8de0: 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 09_new())==NULL)
8df0: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 {... Tcl_Set
8e00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 Result(interp,"E
8e10: 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 rror generating
8e20: 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75 certificate requ
8e30: 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 est",NULL);...
8e40: 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 EVP_PKEY_free(
8e50: 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 72 65 74 pkey);... ret
8e60: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
8e70: 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f ..}....X509_set_
8e80: 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b version(cert,2);
8e90: 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f ...ASN1_INTEGER_
8ea0: 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 set(X509_get_ser
8eb0: 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c ialNumber(cert),
8ec0: 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f serial);...X509_
8ed0: 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f gmtime_adj(X509_
8ee0: 67 65 74 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 get_notBefore(ce
8ef0: 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 rt),0);...X509_g
8f00: 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
8f10: 65 74 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 et_notAfter(cert
8f20: 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 ),(long)60*60*24
8f30: 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 *days);...X509_s
8f40: 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 et_pubkey(cert,p
8f50: 6b 65 79 29 3b 0a 09 09 0a 09 09 6e 61 6d 65 3d key);......name=
8f60: 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 X509_get_subject
8f70: 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 _name(cert);....
8f80: 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
8f90: 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
8fa0: 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 "C", MBSTRING_AS
8fb0: 43 2c 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 C, k_C, -1, -1,
8fc0: 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
8fd0: 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
8fe0: 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 (name,"ST", MBST
8ff0: 52 49 4e 47 5f 41 53 43 2c 20 6b 5f 53 54 2c 20 RING_ASC, k_ST,
9000: 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 -1, -1, 0);...X5
9010: 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 09_NAME_add_entr
9020: 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c y_by_txt(name,"L
9030: 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
9040: 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_L, -1, -1, 0)
9050: 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
9060: 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
9070: 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e ame,"O", MBSTRIN
9080: 47 5f 41 53 43 2c 20 6b 5f 4f 2c 20 2d 31 2c 20 G_ASC, k_O, -1,
9090: 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
90a0: 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
90b0: 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 _txt(name,"OU",
90c0: 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 6b 5f MBSTRING_ASC, k_
90d0: 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a OU, -1, -1, 0);.
90e0: 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
90f0: 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
9100: 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 e,"CN", MBSTRING
9110: 5f 41 53 43 2c 20 6b 5f 43 4e 2c 20 2d 31 2c 20 _ASC, k_CN, -1,
9120: 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e -1, 0);...X509_N
9130: 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 AME_add_entry_by
9140: 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c _txt(name,"Email
9150: 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
9160: 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 k_Email, -1, -1
9170: 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 , 0);....X509_se
9180: 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 t_subject_name(c
9190: 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 ert,name);....if
91a0: 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 (!X509_sign(cer
91b0: 74 2c 70 6b 65 79 2c 45 56 50 5f 6d 64 35 28 29 t,pkey,EVP_md5()
91c0: 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f )) {... X509_
91d0: 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 free(cert);...
91e0: 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 EVP_PKEY_free(
91f0: 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 54 63 6c pkey);... Tcl
9200: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
9210: 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 p,"Error signing
9220: 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 certificate",NU
9230: 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 LL);... retur
9240: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
9250: 0a 0a 09 09 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 ....out=BIO_new(
9260: 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 BIO_s_file());..
9270: 09 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e .BIO_write_filen
9280: 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b ame(out,pemout);
9290: 0a 0a 09 09 50 45 4d 5f 77 72 69 74 65 5f 62 69 ....PEM_write_bi
92a0: 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 o_X509(out,cert)
92b0: 3b 0a 09 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c ;...BIO_free_all
92c0: 28 6f 75 74 29 3b 0a 0a 09 09 58 35 30 39 5f 66 (out);....X509_f
92d0: 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 ree(cert);...EVP
92e0: 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
92f0: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ;.. } else {.
9300: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
9310: 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 interp,"Error ge
9320: 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 nerating private
9330: 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 key",NULL);...r
9340: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
9350: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 .. }..}..brea
9360: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a k;. default:.
9370: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 .break;. }.
9380: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
9390: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
93a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
93b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
93c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
93d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
93e0: 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a . * Tls_Free --.
93f0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
9400: 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 dure cleans up w
9410: 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 hen a SSL socket
9420: 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 based channel.
9430: 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 *.is closed and
9440: 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f its reference co
9450: 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 unt falls below
9460: 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 1. *. * Results:
9470: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
9480: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
9490: 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
94a0: 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
94b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
94f0: 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 20 .void.Tls_Free(
9500: 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 20 29 char *blockPtr )
9510: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 .{. State *st
9520: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
9530: 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 *)blockPtr;..
9540: 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 Tls_Clean(state
9550: 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 Ptr);. ckfree
9560: 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a (blockPtr);.}...
9570: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
9580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
95c0: 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 ls_Clean --. *.
95d0: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
95e0: 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 cleans up when
95f0: 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 a SSL socket bas
9600: 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 ed channel. *.is
9610: 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 closed and its
9620: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 reference count
9630: 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 falls below 1.
9640: 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 This should. *.b
9650: 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f e called synchro
9660: 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c nously by the Cl
9670: 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 oseProc, not in
9680: 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c the. *.Eventuall
9690: 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a yFree callback..
96a0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
96b0: 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 *.none. *. * Sid
96c0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 e effects:. *.Fr
96d0: 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 ees all the stat
96e0: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
96f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 ----------. */.v
9730: 6f 69 64 0a 54 6c 73 5f 43 6c 65 61 6e 28 53 74 oid.Tls_Clean(St
9740: 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 0a 7b ate *statePtr).{
9750: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 . /*. * w
9760: 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 e're assuming he
9770: 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 re that we're si
9780: 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 ngle-threaded.
9790: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 73 */.. if (s
97a0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 tatePtr->timer !
97b0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
97c0: 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f n) NULL) {..Tcl_
97d0: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c DeleteTimerHandl
97e0: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d er(statePtr->tim
97f0: 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e er);..statePtr->
9800: 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 timer = NULL;.
9810: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
9820: 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f tePtr->bio) {../
9830: 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c * This will call
9840: 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 SSL_shutdown. B
9850: 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 ug 1414045 */..d
9860: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 printf(stderr, "
9870: 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 BIO_free_all(%p)
9880: 5c 6e 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 \n", statePtr->b
9890: 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 io);..BIO_free_a
98a0: 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ll(statePtr->bio
98b0: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 );..statePtr->bi
98c0: 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a o = NULL;. }.
98d0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
98e0: 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 ->ssl) {..dprint
98f0: 66 28 73 74 64 65 72 72 2c 20 22 53 53 4c 5f 66 f(stderr, "SSL_f
9900: 72 65 65 28 25 70 29 5c 6e 22 2c 20 73 74 61 74 ree(%p)\n", stat
9910: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c ePtr->ssl);..SSL
9920: 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e _free(statePtr->
9930: 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ssl);..statePtr-
9940: 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 >ssl = NULL;.
9950: 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }. if (state
9960: 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c Ptr->ctx) {..SSL
9970: 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 _CTX_free(stateP
9980: 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 tr->ctx);..state
9990: 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b Ptr->ctx = NULL;
99a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
99b0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
99c0: 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 k) {..Tcl_DecrRe
99d0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d fCount(statePtr-
99e0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 >callback);..sta
99f0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
9a00: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
9a10: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
9a20: 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c password) {..Tcl
9a30: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _DecrRefCount(st
9a40: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
9a50: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 );..statePtr->pa
9a60: 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 ssword = NULL;.
9a70: 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d }.}.../*. *--
9a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ac0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 -. *. * Tls_Init
9ad0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 --. *. *.This i
9ae0: 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 s a package init
9af0: 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 ialization proce
9b00: 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 dure, which is c
9b10: 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 alled. *.by Tcl
9b20: 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 when this packag
9b30: 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 e is to be added
9b40: 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 to an interpret
9b50: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
9b60: 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 s: Ssl configur
9b70: 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a ed and loaded. *
9b80: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
9b90: 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 :. *. create the
9ba0: 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e ssl command, in
9bb0: 69 74 69 61 6c 69 73 65 20 73 73 6c 20 63 6f 6e itialise ssl con
9bc0: 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d text. *. *------
9bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
9c10: 2f 0a 0a 69 6e 74 0a 54 6c 73 5f 49 6e 69 74 28 /..int.Tls_Init(
9c20: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
9c30: 72 70 29 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 rp)../* Interpre
9c40: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 ter in which the
9c50: 20 70 61 63 6b 61 67 65 20 69 73 0a 09 09 09 09 package is.....
9c60: 09 20 2a 20 74 6f 20 62 65 20 6d 61 64 65 20 61 . * to be made a
9c70: 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 7b 0a 20 vailable. */.{.
9c80: 20 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20 6d 69 int major, mi
9c90: 6e 6f 72 2c 20 70 61 74 63 68 6c 65 76 65 6c 2c nor, patchlevel,
9ca0: 20 72 65 6c 65 61 73 65 3b 0a 0a 20 20 20 20 2f release;.. /
9cb0: 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 6f 72 69 *. * The ori
9cc0: 67 69 6e 61 6c 20 38 2e 32 2e 30 20 73 74 61 63 ginal 8.2.0 stac
9cd0: 6b 65 64 20 63 68 61 6e 6e 65 6c 20 69 6d 70 6c ked channel impl
9ce0: 65 6d 65 6e 74 61 74 69 6f 6e 20 28 61 6e 64 20 ementation (and
9cf0: 74 68 65 20 70 61 74 63 68 0a 20 20 20 20 20 2a the patch. *
9d00: 20 74 68 61 74 20 70 72 65 63 65 64 65 64 20 69 that preceded i
9d10: 74 29 20 68 61 64 20 70 72 6f 62 6c 65 6d 73 20 t) had problems
9d20: 77 69 74 68 20 73 63 61 6c 61 62 69 6c 69 74 79 with scalability
9d30: 20 61 6e 64 20 72 6f 62 75 73 74 6e 65 73 73 2e and robustness.
9d40: 0a 20 20 20 20 20 2a 20 54 68 65 73 65 20 77 65 . * These we
9d50: 72 65 20 61 64 64 72 65 73 73 20 69 6e 20 38 2e re address in 8.
9d60: 33 2e 32 20 2f 20 38 2e 34 61 32 2c 20 73 6f 20 3.2 / 8.4a2, so
9d70: 77 65 20 6e 6f 77 20 72 65 71 75 69 72 65 20 74 we now require t
9d80: 68 61 74 20 61 73 20 61 0a 20 20 20 20 20 2a 20 hat as a. *
9d90: 6d 69 6e 69 6d 75 6d 20 66 6f 72 20 54 4c 53 20 minimum for TLS
9da0: 31 2e 34 2b 2e 20 20 57 65 20 6f 6e 6c 79 20 73 1.4+. We only s
9db0: 75 70 70 6f 72 74 20 38 2e 32 2b 20 6e 6f 77 20 upport 8.2+ now
9dc0: 28 38 2e 33 2e 32 2b 20 70 72 65 66 65 72 72 65 (8.3.2+ preferre
9dd0: 64 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 d).. */.
9de0: 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f if (.#ifdef USE_
9df0: 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f 49 TCL_STUBS..Tcl_I
9e00: 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c nitStubs(interp,
9e10: 20 22 38 2e 32 22 2c 20 30 29 0a 23 65 6c 73 65 "8.2", 0).#else
9e20: 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 ..Tcl_PkgRequire
9e30: 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 (interp, "Tcl",
9e40: 22 38 2e 32 22 2c 20 30 29 0a 23 65 6e 64 69 66 "8.2", 0).#endif
9e50: 0a 09 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 ..== NULL) {..re
9e60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9e70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
9e80: 20 20 20 2a 20 47 65 74 20 74 68 65 20 76 65 72 * Get the ver
9e90: 73 69 6f 6e 20 73 6f 20 77 65 20 63 61 6e 20 72 sion so we can r
9ea0: 75 6e 74 69 6d 65 20 73 77 69 74 63 68 20 6f 6e untime switch on
9eb0: 20 61 76 61 69 6c 61 62 6c 65 20 66 75 6e 63 74 available funct
9ec0: 69 6f 6e 61 6c 69 74 79 2e 0a 20 20 20 20 20 2a ionality.. *
9ed0: 20 54 4c 53 20 73 68 6f 75 6c 64 20 72 65 61 6c TLS should real
9ee0: 6c 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 ly only be used
9ef0: 69 6e 20 38 2e 33 2e 32 2b 2c 20 62 75 74 20 74 in 8.3.2+, but t
9f00: 68 65 20 6f 74 68 65 72 20 77 6f 72 6b 73 20 66 he other works f
9f10: 6f 72 0a 20 20 20 20 20 2a 20 73 6f 6d 65 20 6c or. * some l
9f20: 69 6d 69 74 65 64 20 66 75 6e 63 74 69 6f 6e 61 imited functiona
9f30: 6c 69 74 79 2c 20 73 6f 20 61 6e 20 61 74 74 65 lity, so an atte
9f40: 6d 70 74 20 61 74 20 73 75 70 70 6f 72 74 20 69 mpt at support i
9f50: 73 20 6d 61 64 65 2e 0a 20 20 20 20 20 2a 2f 0a s made.. */.
9f60: 20 20 20 20 54 63 6c 5f 47 65 74 56 65 72 73 69 Tcl_GetVersi
9f70: 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f on(&major, &mino
9f80: 72 2c 20 26 70 61 74 63 68 6c 65 76 65 6c 2c 20 r, &patchlevel,
9f90: 26 72 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 69 &release);. i
9fa0: 66 20 28 28 6d 61 6a 6f 72 20 3e 20 38 29 20 7c f ((major > 8) |
9fb0: 7c 20 28 28 6d 61 6a 6f 72 20 3d 3d 20 38 29 20 | ((major == 8)
9fc0: 26 26 20 28 28 6d 69 6e 6f 72 20 3e 20 33 29 20 && ((minor > 3)
9fd0: 7c 7c 20 28 28 6d 69 6e 6f 72 20 3d 3d 20 33 29 || ((minor == 3)
9fe0: 20 26 26 0a 09 20 20 20 20 28 72 65 6c 65 61 73 &&.. (releas
9ff0: 65 20 3d 3d 20 54 43 4c 5f 46 49 4e 41 4c 5f 52 e == TCL_FINAL_R
a000: 45 4c 45 41 53 45 29 20 26 26 20 28 70 61 74 63 ELEASE) && (patc
a010: 68 6c 65 76 65 6c 20 3e 3d 20 32 29 29 29 29 29 hlevel >= 2)))))
a020: 20 7b 0a 09 2f 2a 20 38 2e 33 2e 32 2b 20 2a 2f {../* 8.3.2+ */
a030: 0a 09 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 ..channelTypeVer
a040: 73 69 6f 6e 20 3d 20 54 4c 53 5f 43 48 41 4e 4e sion = TLS_CHANN
a050: 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 3b 0a 20 20 EL_VERSION_2;.
a060: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 38 } else {../* 8
a070: 2e 32 2e 30 20 2d 20 38 2e 33 2e 31 20 2a 2f 0a .2.0 - 8.3.1 */.
a080: 09 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 .channelTypeVers
a090: 69 6f 6e 20 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 ion = TLS_CHANNE
a0a0: 4c 5f 56 45 52 53 49 4f 4e 5f 31 3b 0a 20 20 20 L_VERSION_1;.
a0b0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c }.. if (TlsL
a0c0: 69 62 49 6e 69 74 28 29 20 21 3d 20 54 43 4c 5f ibInit() != TCL_
a0d0: 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e OK) {..Tcl_Appen
a0e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
a0f0: 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 "could not initi
a100: 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 alize SSL librar
a110: 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 y", NULL);..retu
a120: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
a130: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 }.. Tcl_Cre
a140: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
a150: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 terp, "tls::ciph
a160: 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a ers", CiphersObj
a170: 43 6d 64 2c 0a 09 20 20 20 20 28 43 6c 69 65 6e Cmd,.. (Clien
a180: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
a190: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
a1a0: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f NULL);.. Tcl_
a1b0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
a1c0: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 (interp, "tls::h
a1d0: 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 andshake", Hands
a1e0: 68 61 6b 65 4f 62 6a 43 6d 64 2c 0a 09 20 20 20 hakeObjCmd,..
a1f0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
a200: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
a210: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 roc *) NULL);..
a220: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
a230: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
a240: 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 "tls::import", I
a250: 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 0a 09 20 20 mportObjCmd,..
a260: 20 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 (ClientData) 0
a270: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
a280: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a Proc *) NULL);..
a290: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
a2a0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
a2b0: 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 "tls::unimport"
a2c0: 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 , UnimportObjCmd
a2d0: 2c 0a 09 20 20 20 20 28 43 6c 69 65 6e 74 44 61 ,.. (ClientDa
a2e0: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
a2f0: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
a300: 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 L);.. Tcl_Cre
a310: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
a320: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 terp, "tls::stat
a330: 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d us", StatusObjCm
a340: 64 2c 0a 09 20 20 20 20 28 43 6c 69 65 6e 74 44 d,.. (ClientD
a350: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
a360: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
a370: 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 LL);.. Tcl_Cr
a380: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
a390: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 nterp, "tls::ver
a3a0: 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 sion", VersionOb
a3b0: 6a 43 6d 64 2c 0a 09 20 20 20 20 28 43 6c 69 65 jCmd,.. (Clie
a3c0: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
a3d0: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
a3e0: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c NULL);.. Tcl
a3f0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
a400: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
a410: 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d misc", MiscObjCm
a420: 64 2c 0a 09 20 20 20 20 28 43 6c 69 65 6e 74 44 d,.. (ClientD
a430: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
a440: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
a450: 4c 4c 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e LL);.. return
a460: 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 Tcl_PkgProvide(
a470: 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f interp, PACKAGE_
a480: 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 NAME, PACKAGE_VE
a490: 52 53 49 4f 4e 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 RSION);.}.../*.
a4a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
a4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4d0: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 -------*. *. *.T
a4e0: 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 ls_SafeInit --.
a4f0: 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.-----------
a500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a520: 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 -----*. *.Standa
a530: 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 rd procedure req
a540: 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e uired by 'load'.
a550: 20 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 . *.Initializes
a560: 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 this extension
a570: 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 for a safe inter
a580: 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d preter.. *.-----
a590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
a5c0: 20 2a 09 53 69 64 65 65 66 66 65 63 74 73 3a 0a *.Sideeffects:.
a5d0: 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 *..As of 'Tls_I
a5e0: 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c nit'. *. *.Resul
a5f0: 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 t:. *..A standar
a600: 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 d Tcl error code
a610: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
a620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
a650: 2a 2f 0a 0a 69 6e 74 0a 54 6c 73 5f 53 61 66 65 */..int.Tls_Safe
a660: 49 6e 69 74 20 28 54 63 6c 5f 49 6e 74 65 72 70 Init (Tcl_Interp
a670: 2a 20 69 6e 74 65 72 70 29 0a 7b 0a 20 20 20 20 * interp).{.
a680: 72 65 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74 20 return Tls_Init
a690: 28 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 0c 0a 2f (interp);.}..../
a6a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
a6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
a6e0: 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a *.TlsLibInit --.
a6f0: 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.----------
a700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a720: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 ------*. *.Initi
a730: 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 alizes SSL libra
a740: 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c ry once per appl
a750: 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d ication. *.-----
a760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
a790: 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a *.Side effects:
a7a0: 0a 20 2a 09 09 69 6e 69 74 69 6c 69 7a 65 73 20 . *..initilizes
a7b0: 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 SSL library. *.
a7c0: 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f *.Result:. *..no
a7d0: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ne. *. *--------
a7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
a810: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 */.static int.T
a820: 6c 73 4c 69 62 49 6e 69 74 20 28 29 0a 7b 0a 20 lsLibInit ().{.
a830: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 int i;. ch
a840: 61 72 20 72 6e 64 5f 73 65 65 64 5b 31 36 5d 20 ar rnd_seed[16]
a850: 3d 20 22 47 72 7a 53 6c 70 6c 4b 71 55 64 6e 6e = "GrzSlplKqUdnn
a860: 7a 50 21 22 3b 09 2f 2a 20 31 36 20 62 79 74 65 zP!";./* 16 byte
a870: 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 s */.#if defined
a880: 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
a890: 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
a8a0: 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 _THREADS). si
a8b0: 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a ze_t num_locks;.
a8c0: 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 74 20 73 #endif. int s
a8d0: 74 61 74 75 73 3d 54 43 4c 5f 4f 4b 3b 0a 0a 20 tatus=TCL_OK;..
a8e0: 20 20 20 69 66 20 28 21 69 6e 69 74 69 61 6c 69 if (!initiali
a8f0: 7a 65 64 29 20 7b 0a 09 54 63 6c 5f 4d 75 74 65 zed) {..Tcl_Mute
a900: 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b xLock(&init_mx);
a910: 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a ..if (!initializ
a920: 65 64 29 20 7b 0a 09 20 20 20 20 69 6e 69 74 69 ed) {.. initi
a930: 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 20 20 alized = 1;...
a940: 20 20 69 66 20 28 43 52 59 50 54 4f 5f 73 65 74 if (CRYPTO_set
a950: 5f 6d 65 6d 5f 66 75 6e 63 74 69 6f 6e 73 28 28 _mem_functions((
a960: 76 6f 69 64 20 2a 28 2a 29 28 73 69 7a 65 5f 74 void *(*)(size_t
a970: 29 29 54 63 6c 5f 41 6c 6c 6f 63 2c 0a 09 09 09 ))Tcl_Alloc,....
a980: 09 09 20 28 76 6f 69 64 20 2a 28 2a 29 28 76 6f .. (void *(*)(vo
a990: 69 64 20 2a 2c 20 73 69 7a 65 5f 74 29 29 54 63 id *, size_t))Tc
a9a0: 6c 5f 52 65 61 6c 6c 6f 63 2c 0a 09 09 09 09 09 l_Realloc,......
a9b0: 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 20 2a (void(*)(void *
a9c0: 29 29 54 63 6c 5f 46 72 65 65 29 20 3d 3d 20 30 ))Tcl_Free) == 0
a9d0: 29 20 7b 0a 09 20 20 20 20 20 20 20 2f 2a 20 4e ) {.. /* N
a9e0: 6f 74 20 75 73 69 6e 67 20 54 63 6c 27 73 20 6d ot using Tcl's m
a9f0: 65 6d 20 66 75 6e 63 74 69 6f 6e 73 20 2e 2e 2e em functions ...
aa00: 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 20 2a 2f not critical */
aa10: 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 .. }..#if def
aa20: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
aa30: 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
aa40: 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 20 (TCL_THREADS)..
aa50: 20 20 20 2f 2a 20 73 68 6f 75 6c 64 20 77 65 20 /* should we
aa60: 63 6f 6e 73 69 64 65 72 20 61 6c 6c 6f 63 61 74 consider allocat
aa70: 69 6e 67 20 6d 75 74 65 78 65 73 3f 20 2a 2f 0a ing mutexes? */.
aa80: 09 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d . num_locks =
aa90: 20 43 52 59 50 54 4f 5f 6e 75 6d 5f 6c 6f 63 6b CRYPTO_num_lock
aaa0: 73 28 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 75 s();.. if (nu
aab0: 6d 5f 6c 6f 63 6b 73 20 3e 20 43 52 59 50 54 4f m_locks > CRYPTO
aac0: 5f 4e 55 4d 5f 4c 4f 43 4b 53 29 20 7b 0a 09 09 _NUM_LOCKS) {...
aad0: 73 74 61 74 75 73 3d 54 43 4c 5f 45 52 52 4f 52 status=TCL_ERROR
aae0: 3b 0a 09 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 ;...goto done;..
aaf0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 43 52 59 50 }... CRYP
ab00: 54 4f 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f 63 TO_set_locking_c
ab10: 61 6c 6c 62 61 63 6b 28 43 72 79 70 74 6f 54 68 allback(CryptoTh
ab20: 72 65 61 64 4c 6f 63 6b 43 61 6c 6c 62 61 63 6b readLockCallback
ab30: 29 3b 0a 09 20 20 20 20 43 52 59 50 54 4f 5f 73 );.. CRYPTO_s
ab40: 65 74 5f 69 64 5f 63 61 6c 6c 62 61 63 6b 28 43 et_id_callback(C
ab50: 72 79 70 74 6f 54 68 72 65 61 64 49 64 43 61 6c ryptoThreadIdCal
ab60: 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a lback);.#endif..
ab70: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 6c 69 62 . if (SSL_lib
ab80: 72 61 72 79 5f 69 6e 69 74 28 29 20 21 3d 20 31 rary_init() != 1
ab90: 29 20 7b 0a 09 20 20 20 20 09 73 74 61 74 75 73 ) {.. .status
aba0: 3d 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 67 6f =TCL_ERROR;...go
abb0: 74 6f 20 64 6f 6e 65 3b 0a 09 20 20 20 20 7d 0a to done;.. }.
abc0: 09 20 20 20 20 53 53 4c 5f 6c 6f 61 64 5f 65 72 . SSL_load_er
abd0: 72 6f 72 5f 73 74 72 69 6e 67 73 28 29 3b 0a 09 ror_strings();..
abe0: 20 20 20 20 45 52 52 5f 6c 6f 61 64 5f 63 72 79 ERR_load_cry
abf0: 70 74 6f 5f 73 74 72 69 6e 67 73 28 29 3b 0a 0a pto_strings();..
ac00: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 . /*.. *
ac10: 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 Seed the random
ac20: 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 number generator
ac30: 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 in the SSL libr
ac40: 61 72 79 2c 0a 09 20 20 20 20 20 2a 20 75 73 69 ary,.. * usi
ac50: 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 ng the do/while
ac60: 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73 construct becaus
ac70: 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74 e of the bug not
ac80: 65 20 69 6e 20 74 68 65 0a 09 20 20 20 20 20 2a e in the.. *
ac90: 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 OpenSSL FAQ at
aca0: 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 http://www.opens
acb0: 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 sl.org/support/f
acc0: 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 09 20 aq.html#USER1..
acd0: 20 20 20 20 2a 0a 09 20 20 20 20 20 2a 20 54 68 *.. * Th
ace0: 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 e crux of the pr
acf0: 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f oblem is that So
ad00: 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 laris 7 does not
ad10: 20 68 61 76 65 20 61 20 0a 09 20 20 20 20 20 2a have a .. *
ad20: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 /dev/random or
ad30: 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 /dev/urandom dev
ad40: 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 ice so it cannot
ad50: 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 09 gather enough..
ad60: 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 * entropy f
ad70: 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 rom the RAND_see
ad80: 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 d() when TLS ini
ad90: 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 tializes and ref
ada0: 75 73 65 73 0a 09 20 20 20 20 20 2a 20 74 6f 20 uses.. * to
adb0: 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c go further. Earl
adc0: 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 ier versions of
add0: 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 OpenSSL carried
ade0: 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 09 on regardless...
adf0: 20 20 20 20 20 2a 2f 0a 09 20 20 20 20 73 72 61 */.. sra
ae00: 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 nd((unsigned int
ae10: 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a ) time((time_t *
ae20: 29 20 4e 55 4c 4c 29 29 3b 0a 09 20 20 20 20 64 ) NULL));.. d
ae30: 6f 20 7b 0a 09 09 66 6f 72 20 28 69 20 3d 20 30 o {...for (i = 0
ae40: 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b ; i < 16; i++) {
ae50: 0a 09 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b ... rnd_seed[
ae60: 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 i] = 1 + (char)
ae70: 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f (255.0 * rand()/
ae80: 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b (RAND_MAX+1.0));
ae90: 0a 09 09 7d 0a 09 09 52 41 4e 44 5f 73 65 65 64 ...}...RAND_seed
aea0: 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f (rnd_seed, sizeo
aeb0: 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 09 20 f(rnd_seed));..
aec0: 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 } while (RAND
aed0: 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 29 3b _status() != 1);
aee0: 0a 09 7d 0a 20 20 20 20 09 64 6f 6e 65 3a 0a 0a ..}. .done:..
aef0: 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b .Tcl_MutexUnlock
af00: 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 20 20 20 20 (&init_mx);.
af10: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74 61 }. return sta
af20: 74 75 73 3b 0a 7d 0a tus;.}.