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 32 38 20 32 30 30 38 2f s.c,v 1.28 2008/
0120: 30 33 2f 31 39 20 31 39 3a 35 39 3a 34 30 20 68 03/19 19:59:40 h
0130: 6f 62 62 73 32 20 45 78 70 20 24 0a 20 2a 0a 20 obbs2 Exp $. *.
0140: 2a 20 54 4c 53 20 28 61 6b 61 20 53 53 4c 29 20 * TLS (aka SSL)
0150: 43 68 61 6e 6e 65 6c 20 2d 20 63 61 6e 20 62 65 Channel - can be
0160: 20 6c 61 79 65 72 65 64 20 6f 6e 20 61 6e 79 20 layered on any
0170: 62 69 2d 64 69 72 65 63 74 69 6f 6e 61 6c 0a 20 bi-directional.
0180: 2a 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 28 4e * Tcl_Channel (N
0190: 6f 74 65 3a 20 52 65 71 75 69 72 65 73 20 54 72 ote: Requires Tr
01a0: 66 20 43 6f 72 65 20 50 61 74 63 68 29 0a 20 2a f Core Patch). *
01b0: 0a 20 2a 20 54 68 69 73 20 77 61 73 20 62 75 69 . * This was bui
01c0: 6c 74 20 28 61 6c 6d 6f 73 74 29 20 66 72 6f 6d lt (almost) from
01d0: 20 73 63 72 61 74 63 68 20 62 61 73 65 64 20 75 scratch based u
01e0: 70 6f 6e 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 pon observation
01f0: 6f 66 0a 20 2a 20 4f 70 65 6e 53 53 4c 20 30 2e of. * OpenSSL 0.
0200: 39 2e 32 42 0a 20 2a 0a 20 2a 20 41 64 64 69 74 9.2B. *. * Addit
0210: 69 6f 6e 20 63 72 65 64 69 74 20 69 73 20 64 75 ion credit is du
0220: 65 20 66 6f 72 20 41 6e 64 72 65 61 73 20 4b 75 e for Andreas Ku
0230: 70 72 69 65 73 20 28 61 2e 6b 75 70 72 69 65 73 pries (a.kupries
0240: 40 77 65 73 74 65 6e 64 2e 63 6f 6d 29 2c 20 66 @westend.com), f
0250: 6f 72 0a 20 2a 20 70 72 6f 76 69 64 69 6e 67 20 or. * providing
0260: 74 68 65 20 54 63 6c 5f 52 65 70 6c 61 63 65 43 the Tcl_ReplaceC
0270: 68 61 6e 6e 65 6c 20 6d 65 63 68 61 6e 69 73 6d hannel mechanism
0280: 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 63 6c 6f and working clo
0290: 73 65 6c 79 20 77 69 74 68 20 6d 65 0a 20 2a 20 sely with me. *
02a0: 74 6f 20 65 6e 68 61 6e 63 65 20 69 74 20 74 6f to enhance it to
02b0: 20 73 75 70 70 6f 72 74 20 66 75 6c 6c 20 66 69 support full fi
02c0: 6c 65 65 76 65 6e 74 20 73 65 6d 61 6e 74 69 63 leevent semantic
02d0: 73 2e 0a 20 2a 0a 20 2a 20 41 6c 73 6f 20 77 6f s.. *. * Also wo
02e0: 72 6b 20 64 6f 6e 65 20 62 79 20 74 68 65 20 66 rk done by the f
02f0: 6f 6c 6c 6f 77 20 70 65 6f 70 6c 65 20 70 72 6f ollow people pro
0300: 76 69 64 65 64 20 74 68 65 20 69 6d 70 65 74 75 vided the impetu
0310: 73 20 74 6f 20 64 6f 20 74 68 69 73 20 22 72 69 s to do this "ri
0320: 67 68 74 22 3a 0a 20 2a 09 74 63 6c 53 53 4c 20 ght":. *.tclSSL
0330: 28 43 6f 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 6b (Colin McCormack
0340: 2c 20 53 68 61 72 65 64 20 54 65 63 68 6e 6f 6c , Shared Technol
0350: 6f 67 79 29 0a 20 2a 09 53 53 4c 74 63 6c 20 28 ogy). *.SSLtcl (
0360: 50 65 74 65 72 20 41 6e 74 6d 61 6e 29 0a 20 2a Peter Antman). *
0370: 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 . */..#include "
0380: 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 tlsInt.h".#inclu
0390: 64 65 20 22 74 63 6c 4f 70 74 73 2e 68 22 0a 23 de "tclOpts.h".#
03a0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e include <stdlib.
03b0: 68 3e 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72 6e h>../*. * Extern
03c0: 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a 2f al functions. */
03d0: 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 ../*. * Forward
03e0: 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f declarations. */
03f0: 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 20 6b ..#define F2N( k
0400: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b ey, dsp) \..(((k
0410: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 ey) == NULL) ? (
0420: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c char *) NULL : \
0430: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 ...Tcl_Translate
0440: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c FileName(interp,
0450: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a (key), (dsp))).
0460: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29 #define REASON()
0470: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f .ERR_reason_erro
0480: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74 r_string(ERR_get
0490: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69 _error())..stati
04a0: 63 20 76 6f 69 64 09 49 6e 66 6f 43 61 6c 6c 62 c void.InfoCallb
04b0: 61 63 6b 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 ack _ANSI_ARGS_
04c0: 28 28 43 4f 4e 53 54 20 53 53 4c 20 2a 73 73 6c ((CONST SSL *ssl
04d0: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 , int where, int
04e0: 20 72 65 74 29 29 3b 0a 0a 73 74 61 74 69 63 20 ret));..static
04f0: 69 6e 74 09 43 69 70 68 65 72 73 4f 62 6a 43 6d int.CiphersObjCm
0500: 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 d _ANSI_ARGS_ ((
0510: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
0520: 74 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e tData,....Tcl_In
0530: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
0540: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
0550: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b *CONST objv[]));
0560: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 48 61 6e ..static int.Han
0570: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 5f 41 4e dshakeObjCmd _AN
0580: 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e SI_ARGS_ ((Clien
0590: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
05a0: 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 20 ,....Tcl_Interp
05b0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
05c0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 c, Tcl_Obj *CONS
05d0: 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 61 T objv[]));..sta
05e0: 74 69 63 20 69 6e 74 09 49 6d 70 6f 72 74 4f 62 tic int.ImportOb
05f0: 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f jCmd _ANSI_ARGS_
0600: 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c ((ClientData cl
0610: 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 63 6c ientData,....Tcl
0620: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
0630: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
0640: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d bj *CONST objv[]
0650: 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 ));..static int.
0660: 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 5f 41 4e StatusObjCmd _AN
0670: 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e SI_ARGS_ ((Clien
0680: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
0690: 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 20 ,....Tcl_Interp
06a0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
06b0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 c, Tcl_Obj *CONS
06c0: 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 61 T objv[]));..sta
06d0: 74 69 63 20 69 6e 74 09 56 65 72 73 69 6f 6e 4f tic int.VersionO
06e0: 62 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 bjCmd _ANSI_ARGS
06f0: 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 _ ((ClientData c
0700: 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 63 lientData,....Tc
0710: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
0720: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
0730: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b Obj *CONST objv[
0740: 5d 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 ]));..static int
0750: 09 4d 69 73 63 4f 62 6a 43 6d 64 20 5f 41 4e 53 .MiscObjCmd _ANS
0760: 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 I_ARGS_ ((Client
0770: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
0780: 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a ....Tcl_Interp *
0790: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
07a0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 , Tcl_Obj *CONST
07b0: 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 61 74 objv[]));..stat
07c0: 69 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f ic SSL_CTX *CTX_
07d0: 49 6e 69 74 20 5f 41 4e 53 49 5f 41 52 47 53 5f Init _ANSI_ARGS_
07e0: 28 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 ((State *statePt
07f0: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 r, int proto, ch
0800: 61 72 20 2a 6b 65 79 2c 0a 09 09 09 63 68 61 72 ar *key,....char
0810: 20 2a 63 65 72 74 2c 20 63 68 61 72 20 2a 43 41 *cert, char *CA
0820: 64 69 72 2c 20 63 68 61 72 20 2a 43 41 66 69 6c dir, char *CAfil
0830: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 e, char *ciphers
0840: 29 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53 ));..#define TLS
0850: 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 30 78 30 31 _PROTO_SSL2.0x01
0860: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
0870: 54 4f 5f 53 53 4c 33 09 30 78 30 32 0a 23 64 65 TO_SSL3.0x02.#de
0880: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 fine TLS_PROTO_T
0890: 4c 53 31 09 30 78 30 34 0a 23 64 65 66 69 6e 65 LS1.0x04.#define
08a0: 20 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d ENABLED(flag, m
08b0: 61 73 6b 29 09 28 28 28 66 6c 61 67 29 20 26 20 ask).(((flag) &
08c0: 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b (mask)) == (mask
08d0: 29 29 0a 0a 2f 2a 0a 20 2a 20 53 74 61 74 69 63 ))../*. * Static
08e0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 data structures
08f0: 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 4f . */..#ifndef NO
0900: 5f 44 48 0a 2f 2a 20 66 72 6f 6d 20 6f 70 65 6e _DH./* from open
0910: 73 73 6c 2f 61 70 70 73 2f 73 5f 73 65 72 76 65 ssl/apps/s_serve
0920: 72 2e 63 20 2a 2f 0a 0a 73 74 61 74 69 63 20 75 r.c */..static u
0930: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 68 35 nsigned char dh5
0940: 31 32 5f 70 5b 5d 3d 7b 0a 09 30 78 44 41 2c 30 12_p[]={..0xDA,0
0950: 78 35 38 2c 30 78 33 43 2c 30 78 31 36 2c 30 78 x58,0x3C,0x16,0x
0960: 44 39 2c 30 78 38 35 2c 30 78 32 32 2c 30 78 38 D9,0x85,0x22,0x8
0970: 39 2c 30 78 44 30 2c 30 78 45 34 2c 30 78 41 46 9,0xD0,0xE4,0xAF
0980: 2c 30 78 37 35 2c 0a 09 30 78 36 46 2c 30 78 34 ,0x75,..0x6F,0x4
0990: 43 2c 30 78 43 41 2c 30 78 39 32 2c 30 78 44 44 C,0xCA,0x92,0xDD
09a0: 2c 30 78 34 42 2c 30 78 45 35 2c 30 78 33 33 2c ,0x4B,0xE5,0x33,
09b0: 30 78 42 38 2c 30 78 30 34 2c 30 78 46 42 2c 30 0xB8,0x04,0xFB,0
09c0: 78 30 46 2c 0a 09 30 78 45 44 2c 30 78 39 34 2c x0F,..0xED,0x94,
09d0: 30 78 45 46 2c 30 78 39 43 2c 30 78 38 41 2c 30 0xEF,0x9C,0x8A,0
09e0: 78 34 34 2c 30 78 30 33 2c 30 78 45 44 2c 30 78 x44,0x03,0xED,0x
09f0: 35 37 2c 30 78 34 36 2c 30 78 35 30 2c 30 78 44 57,0x46,0x50,0xD
0a00: 33 2c 0a 09 30 78 36 39 2c 30 78 39 39 2c 30 78 3,..0x69,0x99,0x
0a10: 44 42 2c 30 78 32 39 2c 30 78 44 37 2c 30 78 37 DB,0x29,0xD7,0x7
0a20: 36 2c 30 78 32 37 2c 30 78 36 42 2c 30 78 41 32 6,0x27,0x6B,0xA2
0a30: 2c 30 78 44 33 2c 30 78 44 34 2c 30 78 31 32 2c ,0xD3,0xD4,0x12,
0a40: 0a 09 30 78 45 32 2c 30 78 31 38 2c 30 78 46 34 ..0xE2,0x18,0xF4
0a50: 2c 30 78 44 44 2c 30 78 31 45 2c 30 78 30 38 2c ,0xDD,0x1E,0x08,
0a60: 30 78 34 43 2c 30 78 46 36 2c 30 78 44 38 2c 30 0x4C,0xF6,0xD8,0
0a70: 78 30 30 2c 30 78 33 45 2c 30 78 37 43 2c 0a 09 x00,0x3E,0x7C,..
0a80: 30 78 34 37 2c 30 78 37 34 2c 30 78 45 38 2c 30 0x47,0x74,0xE8,0
0a90: 78 33 33 2c 0a 09 7d 3b 0a 73 74 61 74 69 63 20 x33,..};.static
0aa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 68 unsigned char dh
0ab0: 35 31 32 5f 67 5b 5d 3d 7b 0a 09 30 78 30 32 2c 512_g[]={..0x02,
0ac0: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 44 48 20 2a .};..static DH *
0ad0: 67 65 74 5f 64 68 35 31 32 28 29 0a 7b 0a 20 20 get_dh512().{.
0ae0: 20 20 44 48 20 2a 64 68 3d 4e 55 4c 4c 3b 0a 0a DH *dh=NULL;..
0af0: 20 20 20 20 69 66 20 28 28 64 68 3d 44 48 5f 6e if ((dh=DH_n
0b00: 65 77 28 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 72 ew()) == NULL) r
0b10: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 20 20 eturn(NULL);..
0b20: 20 20 64 68 2d 3e 70 3d 42 4e 5f 62 69 6e 32 62 dh->p=BN_bin2b
0b30: 6e 28 64 68 35 31 32 5f 70 2c 73 69 7a 65 6f 66 n(dh512_p,sizeof
0b40: 28 64 68 35 31 32 5f 70 29 2c 4e 55 4c 4c 29 3b (dh512_p),NULL);
0b50: 0a 20 20 20 20 64 68 2d 3e 67 3d 42 4e 5f 62 69 . dh->g=BN_bi
0b60: 6e 32 62 6e 28 64 68 35 31 32 5f 67 2c 73 69 7a n2bn(dh512_g,siz
0b70: 65 6f 66 28 64 68 35 31 32 5f 67 29 2c 4e 55 4c eof(dh512_g),NUL
0b80: 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 64 68 L);.. if ((dh
0b90: 2d 3e 70 20 3d 3d 20 4e 55 4c 4c 29 20 7c 7c 20 ->p == NULL) ||
0ba0: 28 64 68 2d 3e 67 20 3d 3d 20 4e 55 4c 4c 29 29 (dh->g == NULL))
0bb0: 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
0bc0: 20 20 20 20 72 65 74 75 72 6e 28 64 68 29 3b 0a return(dh);.
0bd0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 }.#endif../*. *
0be0: 44 65 66 69 6e 65 64 20 69 6e 20 54 6c 73 5f 49 Defined in Tls_I
0bf0: 6e 69 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 nit to determine
0c00: 20 77 68 61 74 20 6b 69 6e 64 20 6f 66 20 63 68 what kind of ch
0c10: 61 6e 6e 65 6c 73 20 77 65 20 61 72 65 20 75 73 annels we are us
0c20: 69 6e 67 0a 20 2a 20 28 6f 6c 64 2d 73 74 79 6c ing. * (old-styl
0c30: 65 20 38 2e 32 2e 30 2d 38 2e 33 2e 31 20 6f 72 e 8.2.0-8.3.1 or
0c40: 20 6e 65 77 2d 73 74 79 6c 65 20 38 2e 33 2e 32 new-style 8.3.2
0c50: 2b 29 2e 0a 20 2a 2f 0a 69 6e 74 20 63 68 61 6e +).. */.int chan
0c60: 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 3b 0a nelTypeVersion;.
0c70: 0a 2f 2a 0a 20 2a 20 57 65 20 6c 6f 73 65 20 74 ./*. * We lose t
0c80: 68 65 20 74 63 6c 20 70 61 73 73 77 6f 72 64 20 he tcl password
0c90: 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 77 65 callback when we
0ca0: 20 75 73 65 20 74 68 65 20 52 53 41 20 42 53 41 use the RSA BSA
0cb0: 46 45 20 53 53 4c 2d 43 20 31 2e 31 2e 32 0a 20 FE SSL-C 1.1.2.
0cc0: 2a 20 6c 69 62 72 61 72 69 65 73 20 69 6e 73 74 * libraries inst
0cd0: 65 61 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 ead of the curre
0ce0: 6e 74 20 4f 70 65 6e 53 53 4c 20 6c 69 62 72 61 nt OpenSSL libra
0cf0: 72 69 65 73 2e 0a 20 2a 2f 0a 0a 23 69 66 64 65 ries.. */..#ifde
0d00: 66 20 42 53 41 46 45 0a 23 64 65 66 69 6e 65 20 f BSAFE.#define
0d10: 50 52 45 5f 4f 50 45 4e 53 53 4c 5f 30 5f 39 5f PRE_OPENSSL_0_9_
0d20: 34 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 4 1.#endif../*.
0d30: 2a 20 50 72 65 20 4f 70 65 6e 53 53 4c 20 30 2e * Pre OpenSSL 0.
0d40: 39 2e 34 20 43 6f 6d 70 61 74 0a 20 2a 2f 0a 0a 9.4 Compat. */..
0d50: 23 69 66 6e 64 65 66 20 53 54 41 43 4b 5f 4f 46 #ifndef STACK_OF
0d60: 0a 23 64 65 66 69 6e 65 20 53 54 41 43 4b 5f 4f .#define STACK_O
0d70: 46 28 78 29 09 09 09 53 54 41 43 4b 0a 23 64 65 F(x)...STACK.#de
0d80: 66 69 6e 65 20 73 6b 5f 53 53 4c 5f 43 49 50 48 fine sk_SSL_CIPH
0d90: 45 52 5f 6e 75 6d 28 73 6b 29 09 09 73 6b 5f 6e ER_num(sk)..sk_n
0da0: 75 6d 28 28 73 6b 29 29 0a 23 64 65 66 69 6e 65 um((sk)).#define
0db0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 sk_SSL_CIPHER_v
0dc0: 61 6c 75 65 28 20 73 6b 2c 20 69 6e 64 65 78 29 alue( sk, index)
0dd0: 09 28 53 53 4c 5f 43 49 50 48 45 52 2a 29 73 6b .(SSL_CIPHER*)sk
0de0: 5f 76 61 6c 75 65 28 28 73 6b 29 2c 20 28 69 6e _value((sk), (in
0df0: 64 65 78 29 29 0a 23 65 6e 64 69 66 0a 0a 0c 0a dex)).#endif....
0e00: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 --------. *. * I
0e50: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 nfoCallback --.
0e60: 2a 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 *. *.monitors SS
0e70: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f L connection pro
0e80: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c cess. *. * Resul
0e90: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
0ea0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0eb0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 *.Calls callbac
0ec0: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 k (if defined).
0ed0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f10: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
0f20: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 void.InfoCallbac
0f30: 6b 28 43 4f 4e 53 54 20 53 53 4c 20 2a 73 73 6c k(CONST SSL *ssl
0f40: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 , int where, int
0f50: 20 72 65 74 29 0a 7b 0a 20 20 20 20 53 74 61 74 ret).{. Stat
0f60: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
0f70: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 tate*)SSL_get_ap
0f80: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 p_data((SSL *)ss
0f90: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 l);. Tcl_Obj
0fa0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 *cmdPtr;. cha
0fb0: 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 20 2a r *major; char *
0fc0: 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 69 66 20 28 minor;.. if (
0fd0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
0fe0: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
0ff0: 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a NULL)..return;..
1000: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
1010: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
1020: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
1030: 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 );..#if 0. if
1040: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
1050: 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65 76 20 3d _ALERT) {..sev =
1060: 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f SSL_alert_type_
1070: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 string_long(ret)
1080: 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 28 20 73 ;..if (strcmp( s
1090: 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d 30 29 ev, "fatal")==0)
10a0: 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 72 72 {./* Map to err
10b0: 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 5f 45 or */.. Tls_E
10c0: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 53 rror(statePtr, S
10d0: 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 30 29 SL_ERROR(ssl, 0)
10e0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 3b 0a );.. return;.
10f0: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a .}. }.#endif.
1100: 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 if (where &
1110: 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 SSL_CB_HANDSHAKE
1120: 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 _START) {..major
1130: 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a = "handshake";.
1140: 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 .minor = "start"
1150: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
1160: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1170: 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 HANDSHAKE_DONE)
1180: 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 {..major = "hand
1190: 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d shake";..minor =
11a0: 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 "done";. } e
11b0: 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65 lse {..if (where
11c0: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 & SSL_CB_ALERT)
11d0: 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 ..major = "alert
11e0: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 ";..else if (whe
11f0: 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e re & SSL_ST_CONN
1200: 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f ECT).major = "co
1210: 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 nnect";..else if
1220: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 (where & SSL_ST
1230: 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 _ACCEPT)..major
1240: 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 = "accept";..els
1250: 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 e.....major = "u
1260: 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 nknown";...if (w
1270: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 here & SSL_CB_RE
1280: 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 AD)..minor = "re
1290: 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 ad";..else if (w
12a0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 here & SSL_CB_WR
12b0: 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 ITE)..minor = "w
12c0: 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 rite";..else if
12d0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
12e0: 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 LOOP)..minor = "
12f0: 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 loop";..else if
1300: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1310: 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 EXIT)..minor = "
1320: 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 exit";..else....
1330: 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 .minor = "unknow
1340: 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 n";. }.. T
1350: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1360: 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 Element( statePt
1370: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 r->interp, cmdPt
1380: 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 r, .. Tcl_New
1390: 53 74 72 69 6e 67 4f 62 6a 28 20 22 69 6e 66 6f StringObj( "info
13a0: 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 ", -1));.. Tc
13b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
13c0: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 lement( statePtr
13d0: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
13e0: 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 , .. Tcl_NewS
13f0: 74 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 tringObj( Tcl_Ge
1400: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
1410: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
1420: 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 ) );.. Tcl_Li
1430: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1440: 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e nt( statePtr->in
1450: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
1460: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
1470: 4f 62 6a 28 20 6d 61 6a 6f 72 2c 20 2d 31 29 20 Obj( major, -1)
1480: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 );.. Tcl_List
1490: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
14a0: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ( statePtr->inte
14b0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
14c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
14d0: 6a 28 20 6d 69 6e 6f 72 2c 20 2d 31 29 20 29 3b j( minor, -1) );
14e0: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 .. if (where
14f0: 26 20 28 53 53 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 & (SSL_CB_LOOP|S
1500: 53 4c 5f 43 42 5f 45 58 49 54 29 29 20 7b 0a 09 SL_CB_EXIT)) {..
1510: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1520: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 dElement( stateP
1530: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
1540: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
1550: 53 74 72 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 73 StringObj( SSL_s
1560: 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 tate_string_long
1570: 28 73 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20 (ssl), -1) );.
1580: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 } else if (whe
1590: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 re & SSL_CB_ALER
15a0: 54 29 20 7b 0a 09 43 4f 4e 53 54 20 63 68 61 72 T) {..CONST char
15b0: 20 2a 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20 *cp = (char *)
15c0: 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 SSL_alert_desc_s
15d0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b tring_long(ret);
15e0: 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
15f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 pendElement( sta
1600: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 tePtr->interp, c
1610: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
1620: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 63 70 NewStringObj( cp
1630: 2c 20 2d 31 29 20 29 3b 0a 20 20 20 20 7d 20 65 , -1) );. } e
1640: 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f lse {..Tcl_ListO
1650: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1660: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
1670: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
1680: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
1690: 28 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 ( SSL_state_stri
16a0: 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 ng_long(ssl), -1
16b0: 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 ) );. }. T
16c0: 63 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c cl_Preserve( (Cl
16d0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
16e0: 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 tr->interp);.
16f0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 20 28 Tcl_Preserve( (
1700: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
1710: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f ePtr);.. Tcl_
1720: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d IncrRefCount( cm
1730: 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 dPtr);. (void
1740: 29 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c ) Tcl_GlobalEval
1750: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 69 6e Obj(statePtr->in
1760: 74 65 72 70 2c 20 63 6d 64 50 74 72 29 3b 0a 20 terp, cmdPtr);.
1770: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
1780: 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a 20 unt( cmdPtr);..
1790: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20 Tcl_Release(
17a0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
17b0: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f tePtr);. Tcl_
17c0: 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74 Release( (Client
17d0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e Data) statePtr->
17e0: 69 6e 74 65 72 70 29 3b 0a 0a 7d 0a 0c 0a 2f 2a interp);..}.../*
17f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1830: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 ------. *. * Ver
1840: 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 ifyCallback --.
1850: 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 *. *.Monitors SS
1860: 4c 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61 L certificate va
1870: 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 lidation process
1880: 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 63 61 6c .. *.This is cal
1890: 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 63 led whenever a c
18a0: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 6e ertificate is in
18b0: 73 70 65 63 74 65 64 0a 20 2a 09 6f 72 20 64 65 spected. *.or de
18c0: 63 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 0a 20 cided invalid..
18d0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
18e0: 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e .A callback boun
18f0: 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 d to the socket
1900: 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f may return one o
1910: 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 f:. *. 0...-
1920: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 the certificate
1930: 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 is deemed invali
1940: 64 0a 20 2a 09 20 20 20 20 31 09 09 09 2d 20 74 d. *. 1...- t
1950: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 he certificate i
1960: 73 20 64 65 65 6d 65 64 20 76 61 6c 69 64 0a 20 s deemed valid.
1970: 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74 72 69 *. empty stri
1980: 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 ng.- no change t
1990: 6f 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61 o certificate va
19a0: 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 lidation. *. * S
19b0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
19c0: 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 The err field of
19d0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f the currently o
19e0: 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 perative State i
19f0: 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 s set. *. to a
1a00: 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e string describin
1a10: 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 g the SSL negoti
1a20: 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 ation failure re
1a30: 61 73 6f 6e 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ason. *---------
1a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
1a80: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 tatic int.Verify
1a90: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c Callback(int ok,
1aa0: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 X509_STORE_CTX
1ab0: 2a 63 74 78 29 0a 7b 0a 20 20 20 20 54 63 6c 5f *ctx).{. Tcl_
1ac0: 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 72 65 Obj *cmdPtr, *re
1ad0: 73 75 6c 74 3b 0a 20 20 20 20 63 68 61 72 20 2a sult;. char *
1ae0: 65 72 72 53 74 72 2c 20 2a 73 74 72 69 6e 67 3b errStr, *string;
1af0: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 3b . int length;
1b00: 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 . SSL *ssl.
1b10: 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 .= (SSL*)X509_ST
1b20: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 61 70 70 5f ORE_CTX_get_app_
1b30: 64 61 74 61 28 63 74 78 29 3b 0a 20 20 20 20 58 data(ctx);. X
1b40: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35 509 *cert..= X5
1b50: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
1b60: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 _current_cert(ct
1b70: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 x);. State *s
1b80: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 tatePtr.= (State
1b90: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 *)SSL_get_app_da
1ba0: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 69 6e 74 ta(ssl);. int
1bb0: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 depth..= X509_S
1bc0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 TORE_CTX_get_err
1bd0: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 or_depth(ctx);.
1be0: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 int err..= X5
1bf0: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 09_STORE_CTX_get
1c00: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 _error(ctx);..
1c10: 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 dprintf(stderr
1c20: 2c 20 22 56 65 72 69 66 79 3a 20 25 64 5c 6e 22 , "Verify: %d\n"
1c30: 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 , ok);.. if (
1c40: 21 6f 6b 29 20 7b 0a 09 65 72 72 53 74 72 20 3d !ok) {..errStr =
1c50: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 (char*)X509_ver
1c60: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 ify_cert_error_s
1c70: 74 72 69 6e 67 28 65 72 72 29 3b 0a 20 20 20 20 tring(err);.
1c80: 7d 20 65 6c 73 65 20 7b 0a 09 65 72 72 53 74 72 } else {..errStr
1c90: 20 3d 20 28 63 68 61 72 20 2a 29 30 3b 0a 20 20 = (char *)0;.
1ca0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
1cb0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
1cc0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
1cd0: 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65 50 L) {..if (stateP
1ce0: 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c tr->vflags & SSL
1cf0: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f _VERIFY_FAIL_IF_
1d00: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a NO_PEER_CERT) {.
1d10: 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a . return ok;.
1d20: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 .} else {.. r
1d30: 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 eturn 1;..}.
1d40: 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 }. cmdPtr = T
1d50: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
1d60: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
1d70: 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 ck);.. Tcl_Li
1d80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1d90: 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e nt( statePtr->in
1da0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 terp, cmdPtr, ..
1db0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
1dc0: 67 4f 62 6a 28 20 22 76 65 72 69 66 79 22 2c 20 gObj( "verify",
1dd0: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c -1));.. Tcl_L
1de0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1df0: 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 ent( statePtr->i
1e00: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a nterp, cmdPtr, .
1e10: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
1e20: 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43 68 ngObj( Tcl_GetCh
1e30: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
1e40: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20 29 tr->self), -1) )
1e50: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
1e60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1e70: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
1e80: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
1e90: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 20 64 Tcl_NewIntObj( d
1ea0: 65 70 74 68 29 20 29 3b 0a 0a 20 20 20 20 54 63 epth) );.. Tc
1eb0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1ec0: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 lement( statePtr
1ed0: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
1ee0: 2c 0a 09 20 20 20 20 54 6c 73 5f 4e 65 77 58 35 ,.. Tls_NewX5
1ef0: 30 39 4f 62 6a 28 20 73 74 61 74 65 50 74 72 2d 09Obj( statePtr-
1f00: 3e 69 6e 74 65 72 70 2c 20 63 65 72 74 29 20 29 >interp, cert) )
1f10: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
1f20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
1f30: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
1f40: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
1f50: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 20 6f Tcl_NewIntObj( o
1f60: 6b 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c k) );.. Tcl_L
1f70: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1f80: 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 ent( statePtr->i
1f90: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
1fa0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
1fb0: 67 4f 62 6a 28 20 65 72 72 53 74 72 20 3f 20 65 gObj( errStr ? e
1fc0: 72 72 53 74 72 20 3a 20 22 22 2c 20 2d 31 29 20 rrStr : "", -1)
1fd0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 );.. Tcl_Pres
1fe0: 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 erve( (ClientDat
1ff0: 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 a) statePtr->int
2000: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 erp);. Tcl_Pr
2010: 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 eserve( (ClientD
2020: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
2030: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 . statePtr->f
2040: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f lags |= TLS_TCL_
2050: 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20 20 20 54 CALLBACK;.. T
2060: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
2070: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 cmdPtr);. if
2080: 20 28 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c (Tcl_GlobalEval
2090: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 69 6e Obj(statePtr->in
20a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 29 20 21 3d terp, cmdPtr) !=
20b0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 49 TCL_OK) {../* I
20c0: 74 20 67 6f 74 20 61 6e 20 65 72 72 6f 72 20 2d t got an error -
20d0: 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 reject the cert
20e0: 69 66 69 63 61 74 65 2e 09 09 2a 2f 0a 09 54 63 ificate...*/..Tc
20f0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
2100: 72 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 r( statePtr->int
2110: 65 72 70 29 3b 0a 09 6f 6b 20 3d 20 30 3b 0a 20 erp);..ok = 0;.
2120: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 } else {..res
2130: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a ult = Tcl_GetObj
2140: 52 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d Result(statePtr-
2150: 3e 69 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e >interp);..strin
2160: 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e g = Tcl_GetStrin
2170: 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c gFromObj(result,
2180: 20 26 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 &length);../* A
2190: 6e 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c n empty result l
21a0: 65 61 76 65 73 20 76 65 72 69 66 69 63 61 74 69 eaves verificati
21b0: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f on unchanged..*/
21c0: 0a 09 69 66 20 28 6c 65 6e 67 74 68 20 3e 20 30 ..if (length > 0
21d0: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 54 63 6c ) {.. if (Tcl
21e0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 73 _GetIntFromObj(s
21f0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
2200: 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d result, &ok) !=
2210: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 54 63 6c TCL_OK) {...Tcl
2220: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
2230: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 (statePtr->inter
2240: 70 29 3b 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20 p);...ok = 0;..
2250: 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 }..}. }.
2260: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
2270: 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a 20 20 nt( cmdPtr);..
2280: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 statePtr->flag
2290: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 s &= ~(TLS_TCL_C
22a0: 41 4c 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 20 54 ALLBACK);.. T
22b0: 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69 cl_Release( (Cli
22c0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
22d0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 r);. Tcl_Rele
22e0: 61 73 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 ase( (ClientData
22f0: 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ) statePtr->inte
2300: 72 70 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e rp);.. return
2310: 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 (ok);./* By defa
2320: 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 ult, leave verif
2330: 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 ication unchange
2340: 64 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d d..*/.}.../*. *-
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2390: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 --. *. * Tls_Err
23a0: 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c or --. *. *.Call
23b0: 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 s callback with
23c0: 24 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73 $fd and $msg - s
23d0: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 o the callback c
23e0: 61 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61 an decide. *.wha
23f0: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72 t to do with err
2400: 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ors.. *. * Side
2410: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 effects:. *.The
2420: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 err field of the
2430: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 currently opera
2440: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 tive State is se
2450: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 t. *. to a stri
2460: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 ng describing th
2470: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f e SSL negotiatio
2480: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e n failure reason
2490: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a ------. */.void.
24e0: 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 Tls_Error(State
24f0: 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 *statePtr, char
2500: 2a 6d 73 67 29 0a 7b 0a 20 20 20 20 54 63 6c 5f *msg).{. Tcl_
2510: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 0a 20 20 Obj *cmdPtr;..
2520: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73 if (msg && *ms
2530: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 g) {..Tcl_SetErr
2540: 6f 72 43 6f 64 65 28 73 74 61 74 65 50 74 72 2d orCode(statePtr-
2550: 3e 69 6e 74 65 72 70 2c 20 22 53 53 4c 22 2c 20 >interp, "SSL",
2560: 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c msg, (char *)NUL
2570: 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b L);. } else {
2580: 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 ..msg = Tcl_GetS
2590: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c tringFromObj(Tcl
25a0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 73 74 _GetObjResult(st
25b0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 2c atePtr->interp),
25c0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 NULL);. }.
25d0: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 statePtr->err
25e0: 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66 20 28 = msg;.. if (
25f0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
2600: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 ck == (Tcl_Obj*)
2610: 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 NULL) {..char bu
2620: 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70 72 69 f[BUFSIZ];..spri
2630: 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20 63 68 ntf(buf, "SSL ch
2640: 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20 65 72 annel \"%s\": er
2650: 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20 20 54 ror: %s",.. T
2660: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
2670: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
2680: 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f 53 65 ), msg);..Tcl_Se
2690: 74 52 65 73 75 6c 74 28 20 73 74 61 74 65 50 74 tResult( statePt
26a0: 72 2d 3e 69 6e 74 65 72 70 2c 20 62 75 66 2c 20 r->interp, buf,
26b0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 09 TCL_VOLATILE);..
26c0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 Tcl_BackgroundEr
26d0: 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d 3e 69 ror( statePtr->i
26e0: 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 3b nterp);..return;
26f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 74 . }. cmdPt
2700: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
2710: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
2720: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 allback);.. T
2730: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2740: 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 Element(statePtr
2750: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
2760: 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 , .. Tcl_NewS
2770: 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 tringObj("error"
2780: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c , -1));.. Tcl
2790: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
27a0: 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e ement(statePtr->
27b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
27c0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
27d0: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
27e0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
27f0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b tr->self), -1));
2800: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 .. Tcl_ListOb
2810: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 jAppendElement(s
2820: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
2830: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
2840: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d l_NewStringObj(m
2850: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 sg, -1));.. T
2860: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 cl_Preserve((Cli
2870: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
2880: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 r->interp);.
2890: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c Tcl_Preserve((Cl
28a0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
28b0: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e tr);.. Tcl_In
28c0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
28d0: 72 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f r);. if (Tcl_
28e0: 47 6c 6f 62 61 6c 45 76 61 6c 4f 62 6a 28 73 74 GlobalEvalObj(st
28f0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
2900: 63 6d 64 50 74 72 29 20 21 3d 20 54 43 4c 5f 4f cmdPtr) != TCL_O
2910: 4b 29 20 7b 0a 09 54 63 6c 5f 42 61 63 6b 67 72 K) {..Tcl_Backgr
2920: 6f 75 6e 64 45 72 72 6f 72 28 73 74 61 74 65 50 oundError(stateP
2930: 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 tr->interp);.
2940: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 }. Tcl_DecrR
2950: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
2960: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 .. Tcl_Releas
2970: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
2980: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 tatePtr);. Tc
2990: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
29a0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d tData) statePtr-
29b0: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a >interp);.}.../*
29c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
29d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a00: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 ------. *. * Pas
2a10: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 20 2d 2d swordCallback --
2a20: 20 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 . *. *.Called w
2a30: 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 69 hen a password i
2a40: 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e 70 61 s needed to unpa
2a50: 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d 20 6b ck RSA and PEM k
2a60: 65 79 73 2e 0a 20 2a 09 45 76 61 6c 73 20 61 6e eys.. *.Evals an
2a70: 79 20 62 6f 75 6e 64 20 70 61 73 73 77 6f 72 64 y bound password
2a80: 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 script and retu
2a90: 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 61 rns the result a
2aa0: 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77 6f 72 s. *.the passwor
2ab0: 64 20 73 74 72 69 6e 67 2e 0a 20 2a 2d 2d 2d 2d d string.. *----
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2b00: 20 2a 2f 0a 23 69 66 64 65 66 20 50 52 45 5f 4f */.#ifdef PRE_O
2b10: 50 45 4e 53 53 4c 5f 30 5f 39 5f 34 0a 2f 2a 0a PENSSL_0_9_4./*.
2b20: 20 2a 20 4e 6f 20 77 61 79 20 74 6f 20 68 61 6e * No way to han
2b30: 64 6c 65 20 75 73 65 72 2d 64 61 74 61 20 74 68 dle user-data th
2b40: 65 72 65 66 6f 72 65 20 6e 6f 20 77 61 79 20 77 erefore no way w
2b50: 69 74 68 6f 75 74 20 61 20 67 6c 6f 62 61 6c 0a ithout a global.
2b60: 20 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 61 * variable to a
2b70: 63 63 65 73 73 20 74 68 65 20 54 63 6c 20 69 6e ccess the Tcl in
2b80: 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 73 74 terpreter..*/.st
2b90: 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 atic int.Passwor
2ba0: 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a dCallback(char *
2bb0: 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 buf, int size, i
2bc0: 6e 74 20 76 65 72 69 66 79 29 0a 7b 0a 20 20 20 nt verify).{.
2bd0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 23 65 return -1;.}.#e
2be0: 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 lse.static int.P
2bf0: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 asswordCallback(
2c00: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 char *buf, int s
2c10: 69 7a 65 2c 20 69 6e 74 20 76 65 72 69 66 79 2c ize, int verify,
2c20: 20 76 6f 69 64 20 2a 75 64 61 74 61 29 0a 7b 0a void *udata).{.
2c30: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
2c40: 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr.= (State *)
2c50: 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 udata;. Tcl_I
2c60: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 nterp *interp.=
2c70: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2c80: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
2c90: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 72 mdPtr;. int r
2ca0: 65 73 75 6c 74 3b 0a 0a 20 20 20 20 69 66 20 28 esult;.. if (
2cb0: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
2cc0: 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 rd == NULL) {..i
2cd0: 66 20 28 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 f (Tcl_Eval(inte
2ce0: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f rp, "tls::passwo
2cf0: 72 64 22 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 rd") == TCL_OK)
2d00: 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65 74 {.. char *ret
2d10: 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f = (char *) Tcl_
2d20: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 GetStringResult(
2d30: 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73 74 interp);.. st
2d40: 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 rncpy(buf, ret,
2d50: 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a (size_t) size);.
2d60: 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 . return (int
2d70: 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d )strlen(ret);..}
2d80: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 else {.. ret
2d90: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d urn -1;..}. }
2da0: 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 .. cmdPtr = T
2db0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 cl_DuplicateObj(
2dc0: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
2dd0: 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 rd);.. Tcl_Pr
2de0: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((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 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
2e10: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
2e20: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
2e30: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
2e40: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
2e50: 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f result = Tcl_
2e60: 47 6c 6f 62 61 6c 45 76 61 6c 4f 62 6a 28 69 6e GlobalEvalObj(in
2e70: 74 65 72 70 2c 20 63 6d 64 50 74 72 29 3b 0a 20 terp, cmdPtr);.
2e80: 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d if (result !=
2e90: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f TCL_OK) {..Tcl_
2ea0: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 BackgroundError(
2eb0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2ec0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c );. }. Tcl
2ed0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
2ee0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f dPtr);.. Tcl_
2ef0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
2f00: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
2f10: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
2f20: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
2f30: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a tePtr->interp);.
2f40: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 . if (result
2f50: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 == TCL_OK) {..ch
2f60: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 ar *ret = (char
2f70: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 *) Tcl_GetString
2f80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
2f90: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 .strncpy(buf, re
2fa0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 t, (size_t) size
2fb0: 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e 74 29 );..return (int)
2fc0: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 20 20 20 strlen(ret);.
2fd0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 74 75 72 } else {..retur
2fe0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 7d 0a 23 65 n -1;. }.}.#e
2ff0: 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ndif.../*. *----
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3040: 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a *. * CiphersObj
3050: 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 Cmd -- list avai
3060: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a lable ciphers. *
3070: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
3080: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f re is invoked to
3090: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c process the "tl
30a0: 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d s::ciphers" comm
30b0: 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 and. *.to list a
30c0: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 vailable ciphers
30d0: 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f , based upon pro
30e0: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a tocol selected..
30f0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
3100: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
3110: 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a result list.. *
3120: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
3130: 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 :. *.constructs
3140: 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c and destroys SSL
3150: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 context (CTX).
3160: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
31b0: 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 ic int.CiphersOb
31c0: 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c jCmd(clientData,
31d0: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f interp, objc, o
31e0: 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 bjv). ClientD
31f0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 ata clientData;.
3200: 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a /* Not used. */.
3210: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
3220: 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 interp;. int
3230: 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 objc;. Tcl_Ob
3240: 6a 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b j.*CONST objv[];
3250: 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20 43 4f .{. static CO
3260: 4e 53 54 38 34 20 63 68 61 72 20 2a 70 72 6f 74 NST84 char *prot
3270: 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 ocols[] = {.."ss
3280: 6c 32 22 2c 09 22 73 73 6c 33 22 2c 09 22 74 6c l2",."ssl3",."tl
3290: 73 31 22 2c 09 4e 55 4c 4c 0a 20 20 20 20 7d 3b s1",.NULL. };
32a0: 0a 20 20 20 20 65 6e 75 6d 20 70 72 6f 74 6f 63 . enum protoc
32b0: 6f 6c 20 7b 0a 09 54 4c 53 5f 53 53 4c 32 2c 20 ol {..TLS_SSL2,
32c0: 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c TLS_SSL3, TLS_TL
32d0: 53 31 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 20 20 20 S1, TLS_NONE.
32e0: 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 };. Tcl_Obj
32f0: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 53 53 4c *objPtr;. SSL
3300: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
3310: 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d ;. SSL *ssl =
3320: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b NULL;. STACK
3330: 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20 _OF(SSL_CIPHER)
3340: 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 *sk;. char *c
3350: 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a p, buf[BUFSIZ];.
3360: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 int index, v
3370: 65 72 62 6f 73 65 20 3d 20 30 3b 0a 0a 20 20 20 erbose = 0;..
3380: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c if (objc < 2 ||
3390: 20 6f 62 6a 63 20 3e 20 33 29 20 7b 0a 09 54 63 objc > 3) {..Tc
33a0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
33b0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
33c0: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f "protocol ?verbo
33d0: 73 65 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 se?");..return T
33e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
33f0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 if (Tcl_GetI
3400: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 20 69 6e 74 ndexFromObj( int
3410: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 erp, objv[1], pr
3420: 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 otocols, "protoc
3430: 6f 6c 22 2c 20 30 2c 0a 09 26 69 6e 64 65 78 29 ol", 0,..&index)
3440: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
3450: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
3460: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6f . }. if (o
3470: 62 6a 63 20 3e 20 32 20 26 26 20 54 63 6c 5f 47 bjc > 2 && Tcl_G
3480: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a etBooleanFromObj
3490: 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 ( interp, objv[2
34a0: 5d 2c 0a 09 26 76 65 72 62 6f 73 65 29 20 21 3d ],..&verbose) !=
34b0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
34c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
34d0: 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 }. switch (
34e0: 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 (enum protocol)i
34f0: 6e 64 65 78 29 20 7b 0a 20 20 20 20 63 61 73 65 ndex) {. case
3500: 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 64 TLS_SSL2:.#if d
3510: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a efined(NO_SSL2).
3520: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
3530: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 lt(interp, "prot
3540: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
3550: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 ed", NULL);...re
3560: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
3570: 23 65 6c 73 65 0a 09 09 63 74 78 20 3d 20 53 53 #else...ctx = SS
3580: 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f L_CTX_new(SSLv2_
3590: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b method()); break
35a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 ;.#endif. cas
35b0: 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 e TLS_SSL3:.#if
35c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
35d0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
35e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f ult(interp, "pro
35f0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
3600: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72 ted", NULL);...r
3610: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
3620: 0a 23 65 6c 73 65 0a 09 09 63 74 78 20 3d 20 53 .#else...ctx = S
3630: 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 SL_CTX_new(SSLv3
3640: 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 _method()); brea
3650: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 k;.#endif. ca
3660: 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 se TLS_TLS1:.#if
3670: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
3680: 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 )...Tcl_AppendRe
3690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 sult(interp, "pr
36a0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
36b0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 rted", NULL);...
36c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
36d0: 3b 0a 23 65 6c 73 65 0a 09 09 63 74 78 20 3d 20 ;.#else...ctx =
36e0: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 SSL_CTX_new(TLSv
36f0: 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 1_method()); bre
3700: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 ak;.#endif. d
3710: 65 66 61 75 6c 74 3a 0a 09 09 62 72 65 61 6b 3b efault:...break;
3720: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 . }. if (c
3730: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 tx == NULL) {..T
3740: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
3750: 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 interp, REASON()
3760: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
3770: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
3780: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 ROR;. }. s
3790: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 sl = SSL_new(ctx
37a0: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d );. if (ssl =
37b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
37c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
37d0: 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 rp, REASON(), (c
37e0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 har *) NULL);..S
37f0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
3800: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
3810: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f ROR;. }. o
3820: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c bjPtr = Tcl_NewL
3830: 69 73 74 4f 62 6a 28 20 30 2c 20 4e 55 4c 4c 29 istObj( 0, NULL)
3840: 3b 0a 0a 20 20 20 20 69 66 20 28 21 76 65 72 62 ;.. if (!verb
3850: 6f 73 65 29 20 7b 0a 09 66 6f 72 20 28 69 6e 64 ose) {..for (ind
3860: 65 78 20 3d 20 30 3b 20 3b 20 69 6e 64 65 78 2b ex = 0; ; index+
3870: 2b 29 20 7b 0a 09 20 20 20 20 63 70 20 3d 20 28 +) {.. cp = (
3880: 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 char*)SSL_get_ci
3890: 70 68 65 72 5f 6c 69 73 74 28 20 73 73 6c 2c 20 pher_list( ssl,
38a0: 69 6e 64 65 78 29 3b 0a 09 20 20 20 20 69 66 20 index);.. if
38b0: 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 (cp == NULL) bre
38c0: 61 6b 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 ak;.. Tcl_Lis
38d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
38e0: 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 t( interp, objPt
38f0: 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 r,...Tcl_NewStri
3900: 6e 67 4f 62 6a 28 20 63 70 2c 20 2d 31 29 20 29 ngObj( cp, -1) )
3910: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
3920: 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f {..sk = SSL_get_
3930: 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 0a 09 ciphers(ssl);...
3940: 66 6f 72 20 28 69 6e 64 65 78 20 3d 20 30 3b 20 for (index = 0;
3950: 69 6e 64 65 78 20 3c 20 73 6b 5f 53 53 4c 5f 43 index < sk_SSL_C
3960: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 IPHER_num(sk); i
3970: 6e 64 65 78 2b 2b 29 20 7b 0a 09 20 20 20 20 72 ndex++) {.. r
3980: 65 67 69 73 74 65 72 20 73 69 7a 65 5f 74 20 69 egister size_t i
3990: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 49 50 48 45 ;.. SSL_CIPHE
39a0: 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 20 73 R_description( s
39b0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c k_SSL_CIPHER_val
39c0: 75 65 28 20 73 6b 2c 20 69 6e 64 65 78 29 2c 0a ue( sk, index),.
39d0: 09 09 09 09 20 20 20 20 62 75 66 2c 20 73 69 7a .... buf, siz
39e0: 65 6f 66 28 62 75 66 29 29 3b 0a 09 20 20 20 20 eof(buf));..
39f0: 66 6f 72 20 28 69 20 3d 20 73 74 72 6c 65 6e 28 for (i = strlen(
3a00: 62 75 66 29 20 2d 20 31 3b 20 69 20 3b 20 69 2d buf) - 1; i ; i-
3a10: 2d 29 20 7b 0a 09 09 69 66 20 28 62 75 66 5b 69 -) {...if (buf[i
3a20: 5d 20 3d 3d 20 27 20 27 20 7c 7c 20 62 75 66 5b ] == ' ' || buf[
3a30: 69 5d 20 3d 3d 20 27 5c 6e 27 20 7c 7c 0a 09 09 i] == '\n' ||...
3a40: 20 20 20 20 62 75 66 5b 69 5d 20 3d 3d 20 27 5c buf[i] == '\
3a50: 72 27 20 7c 7c 20 62 75 66 5b 69 5d 20 3d 3d 20 r' || buf[i] ==
3a60: 27 5c 74 27 29 20 7b 0a 09 09 20 20 20 20 62 75 '\t') {... bu
3a70: 66 5b 69 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 7d f[i] = '\0';...}
3a80: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 62 72 else {... br
3a90: 65 61 6b 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a eak;...}.. }.
3aa0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
3ab0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69 AppendElement( i
3ac0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 nterp, objPtr,..
3ad0: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 .Tcl_NewStringOb
3ae0: 6a 28 20 62 75 66 2c 20 2d 31 29 20 29 3b 0a 09 j( buf, -1) );..
3af0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f }. }. SSL_
3b00: 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 free(ssl);. S
3b10: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
3b20: 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 ;.. Tcl_SetOb
3b30: 6a 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c jResult( interp,
3b40: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 objPtr);. re
3b50: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
3b60: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
3b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
3bb0: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 HandshakeObjCmd
3bc0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f --. *. *.This co
3bd0: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f mmand is used to
3be0: 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20 verify whether
3bf0: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 the handshake is
3c00: 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 complete. *.or
3c10: 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c not.. *. * Resul
3c20: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
3c30: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 d Tcl result. 1
3c40: 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 means handshake
3c50: 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e complete, 0 mean
3c60: 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a s pending.. *. *
3c70: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
3c80: 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 *.May force SSL
3c90: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 negotiation to t
3ca0: 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a ake place.. *. *
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cf0: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 ---. */..static
3d00: 69 6e 74 0a 48 61 6e 64 73 68 61 6b 65 4f 62 6a int.HandshakeObj
3d10: 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 Cmd(clientData,
3d20: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 interp, objc, ob
3d30: 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 jv). ClientDa
3d40: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f ta clientData;./
3d50: 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 * Not used. */.
3d60: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
3d70: 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f nterp;. int o
3d80: 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a bjc;. Tcl_Obj
3d90: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a *CONST objv[];.
3da0: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
3db0: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
3dc0: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
3dd0: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 mode on. */.
3de0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
3df0: 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 ;../* client sta
3e00: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 te for ssl socke
3e10: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 t */. int ret
3e20: 20 3d 20 31 3b 0a 0a 20 20 20 20 69 66 20 28 6f = 1;.. if (o
3e30: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
3e40: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
3e50: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
3e60: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 channel");..retu
3e70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
3e80: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 }.. chan =
3e90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 Tcl_GetChannel(i
3ea0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 nterp, Tcl_GetSt
3eb0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
3ec0: 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c [1], NULL), NULL
3ed0: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
3ee0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
3ef0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
3f00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
3f10: 7d 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65 }. if (channe
3f20: 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 lTypeVersion ==
3f30: 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 TLS_CHANNEL_VERS
3f40: 49 4f 4e 5f 32 29 20 7b 0a 09 2f 2a 0a 09 20 2a ION_2) {../*.. *
3f50: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 Make sure to op
3f60: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 erate on the top
3f70: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a most channel.. *
3f80: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
3f90: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
3fa0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 );. }. if
3fb0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
3fc0: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 ype(chan) != Tls
3fd0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 _ChannelType())
3fe0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
3ff0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 ult(interp, "bad
4000: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 channel \"", Tc
4010: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
4020: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e (chan),..."\": n
4030: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c ot a TLS channel
4040: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
4050: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
4060: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 }. statePtr
4070: 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 = (State *)Tcl_G
4080: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
4090: 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 eData(chan);..
40a0: 20 20 69 66 20 28 21 53 53 4c 5f 69 73 5f 69 6e if (!SSL_is_in
40b0: 69 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61 74 it_finished(stat
40c0: 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 69 ePtr->ssl)) {..i
40d0: 6e 74 20 65 72 72 3b 0a 09 72 65 74 20 3d 20 54 nt err;..ret = T
40e0: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 ls_WaitForConnec
40f0: 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 t(statePtr, &err
4100: 29 3b 0a 09 69 66 20 28 28 73 74 61 74 65 50 74 );..if ((statePt
4110: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 r->flags & TLS_T
4120: 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 65 72 72 CL_ASYNC) && err
4130: 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09 20 == EAGAIN) {..
4140: 20 20 20 72 65 74 20 3d 20 30 3b 0a 09 7d 0a 09 ret = 0;..}..
4150: 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 if (ret < 0) {..
4160: 20 20 20 20 43 4f 4e 53 54 20 63 68 61 72 20 2a CONST char *
4170: 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 errStr = statePt
4180: 72 2d 3e 65 72 72 3b 0a 09 20 20 20 20 54 63 6c r->err;.. Tcl
4190: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 _ResetResult(int
41a0: 65 72 70 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 erp);.. Tcl_S
41b0: 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 etErrno(err);...
41c0: 20 20 20 20 69 66 20 28 21 65 72 72 53 74 72 20 if (!errStr
41d0: 7c 7c 20 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 || *errStr == 0)
41e0: 20 7b 0a 09 09 65 72 72 53 74 72 20 3d 20 54 63 {...errStr = Tc
41f0: 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 l_PosixError(int
4200: 65 72 70 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 erp);.. }...
4210: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
4220: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e ult(interp, "han
4230: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 dshake failed: "
4240: 2c 20 65 72 72 53 74 72 2c 0a 09 09 20 20 20 20 , errStr,...
4250: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
4260: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
4270: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
4280: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
4290: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
42a0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 l_NewIntObj(ret)
42b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
42c0: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4310: 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f --. *. * ImportO
4320: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 bjCmd --. *. *.T
4330: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
4340: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
4350: 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f ess the "ssl" co
4360: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 mmand. *. *.The
4370: 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 ssl command push
4380: 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e es SSL over a (n
4390: 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 ewly connected)
43a0: 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a tcp socket. *. *
43b0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
43c0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
43d0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
43e0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d ffects:. *.May m
43f0: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 odify the behavi
4400: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e or of an IO chan
4410: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nel.. *. *------
4420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4460: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d /..static int.Im
4470: 70 6f 72 74 4f 62 6a 43 6d 64 28 63 6c 69 65 6e portObjCmd(clien
4480: 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f tData, interp, o
4490: 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43 bjc, objv). C
44a0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
44b0: 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 Data;./* Not use
44c0: 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e d. */. Tcl_In
44d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 terp *interp;.
44e0: 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20 int objc;.
44f0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f Tcl_Obj *CONST o
4500: 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63 6c bjv[];.{. Tcl
4510: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 _Channel chan;..
4520: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 /* The channel t
4530: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e o set a mode on.
4540: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 */. State *s
4550: 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 tatePtr;../* cli
4560: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 ent state for ss
4570: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 l socket */.
4580: 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 3d 20 4e SSL_CTX *ctx.= N
4590: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
45a0: 20 2a 73 63 72 69 70 74 09 3d 20 4e 55 4c 4c 3b *script.= NULL;
45b0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 . Tcl_Obj *pa
45c0: 73 73 77 6f 72 64 09 3d 20 4e 55 4c 4c 3b 0a 20 ssword.= NULL;.
45d0: 20 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 int idx;.
45e0: 69 6e 74 20 66 6c 61 67 73 09 09 3d 20 54 4c 53 int flags..= TLS
45f0: 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 _TCL_INIT;. i
4600: 6e 74 20 73 65 72 76 65 72 09 09 3d 20 30 3b 09 nt server..= 0;.
4610: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e /* is connection
4620: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 incoming or out
4630: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 going? */. ch
4640: 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b ar *key..= NULL;
4650: 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 09 . char *cert.
4660: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 .= NULL;. cha
4670: 72 20 2a 63 69 70 68 65 72 73 09 3d 20 4e 55 4c r *ciphers.= NUL
4680: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 L;. char *CAf
4690: 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ile.= NULL;.
46a0: 63 68 61 72 20 2a 43 41 64 69 72 09 09 3d 20 4e char *CAdir..= N
46b0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d ULL;. char *m
46c0: 6f 64 65 6c 09 09 3d 20 4e 55 4c 4c 3b 0a 23 69 odel..= NULL;.#i
46d0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c f defined(NO_SSL
46e0: 32 29 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 2). int ssl2
46f0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 = 0;.#else. i
4700: 6e 74 20 73 73 6c 32 20 3d 20 31 3b 0a 23 65 6e nt ssl2 = 1;.#en
4710: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
4720: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 6e 74 NO_SSL3). int
4730: 20 73 73 6c 33 20 3d 20 30 3b 0a 23 65 6c 73 65 ssl3 = 0;.#else
4740: 0a 20 20 20 20 69 6e 74 20 73 73 6c 33 20 3d 20 . int ssl3 =
4750: 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 1;.#endif.#if de
4760: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 fined(NO_SSL2) &
4770: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c & defined(NO_SSL
4780: 33 29 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3). int tls1
4790: 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 = 1;.#else. i
47a0: 6e 74 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e nt tls1 = 0;.#en
47b0: 64 69 66 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 dif. int prot
47c0: 6f 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 76 o = 0;. int v
47d0: 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 erify = 0, requi
47e0: 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 re = 0, request
47f0: 3d 20 31 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 = 1;.. if (ob
4800: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc < 2) {..Tcl_W
4810: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
4820: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
4830: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 annel ?options?"
4840: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
4850: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
4860: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
4870: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
4880: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
4890: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c Obj(objv[1], NUL
48a0: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 L), NULL);. i
48b0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
48c0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
48d0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
48e0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
48f0: 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 (channelTypeVer
4900: 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e sion == TLS_CHAN
4910: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 20 7b NEL_VERSION_2) {
4920: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 ../*.. * Make su
4930: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
4940: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
4950: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 nnel.. */..chan
4960: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
4970: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 7d nel(chan);. }
4980: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d .. for (idx =
4990: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 2; idx < objc;
49a0: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a idx++) {..char *
49b0: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 opt = Tcl_GetStr
49c0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
49d0: 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 idx], NULL);...i
49e0: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 f (opt[0] != '-'
49f0: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ).. break;...
4a00: 4f 50 54 53 54 52 28 20 22 2d 63 61 64 69 72 22 OPTSTR( "-cadir"
4a10: 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 , CAdir);..OPTST
4a20: 52 28 20 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 R( "-cafile", CA
4a30: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 20 file);..OPTSTR(
4a40: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 "-certfile", cer
4a50: 74 29 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d 63 t);..OPTSTR( "-c
4a60: 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 ipher", ciphers)
4a70: 3b 0a 09 4f 50 54 4f 42 4a 28 20 22 2d 63 6f 6d ;..OPTOBJ( "-com
4a80: 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a mand", script);.
4a90: 09 4f 50 54 53 54 52 28 20 22 2d 6b 65 79 66 69 .OPTSTR( "-keyfi
4aa0: 6c 65 22 2c 20 6b 65 79 29 3b 0a 09 4f 50 54 53 le", key);..OPTS
4ab0: 54 52 28 20 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f TR( "-model", mo
4ac0: 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 20 22 del);..OPTOBJ( "
4ad0: 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73 -password", pass
4ae0: 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 word);..OPTBOOL(
4af0: 20 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 "-require", req
4b00: 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 uire);..OPTBOOL(
4b10: 20 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 "-request", req
4b20: 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 uest);..OPTBOOL(
4b30: 20 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 "-server", serv
4b40: 65 72 29 3b 0a 0a 09 4f 50 54 42 4f 4f 4c 28 20 er);...OPTBOOL(
4b50: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a "-ssl2", ssl2);.
4b60: 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 73 73 6c 33 .OPTBOOL( "-ssl3
4b70: 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f ", ssl3);..OPTBO
4b80: 4f 4c 28 20 22 2d 74 6c 73 31 22 2c 20 74 6c 73 OL( "-tls1", tls
4b90: 31 29 3b 0a 0a 09 4f 50 54 42 41 44 28 20 22 6f 1);...OPTBAD( "o
4ba0: 70 74 69 6f 6e 22 2c 20 22 2d 63 61 64 69 72 2c ption", "-cadir,
4bb0: 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 66 -cafile, -certf
4bc0: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 ile, -cipher, -c
4bd0: 6f 6d 6d 61 6e 64 2c 20 2d 6b 65 79 66 69 6c 65 ommand, -keyfile
4be0: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 , -model, -passw
4bf0: 6f 72 64 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d ord, -require, -
4c00: 72 65 71 75 65 73 74 2c 20 2d 73 65 72 76 65 72 request, -server
4c10: 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 , -ssl2, -ssl3,
4c20: 6f 72 20 2d 74 6c 73 31 22 29 3b 0a 0a 09 72 65 or -tls1");...re
4c30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
4c40: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 }. if (re
4c50: 71 75 65 73 74 29 09 20 20 20 20 76 65 72 69 66 quest). verif
4c60: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
4c70: 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 CLIENT_ONCE | SS
4c80: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 L_VERIFY_PEER;.
4c90: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 if (request &
4ca0: 26 20 72 65 71 75 69 72 65 29 20 76 65 72 69 66 & require) verif
4cb0: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f y |= SSL_VERIFY_
4cc0: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f FAIL_IF_NO_PEER_
4cd0: 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 76 65 CERT;. if (ve
4ce0: 72 69 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66 rify == 0).verif
4cf0: 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e y = SSL_VERIFY_N
4d00: 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 ONE;.. proto
4d10: 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 |= (ssl2 ? TLS_P
4d20: 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a ROTO_SSL2 : 0);.
4d30: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 proto |= (ss
4d40: 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 l3 ? TLS_PROTO_S
4d50: 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 SL3 : 0);. pr
4d60: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 oto |= (tls1 ? T
4d70: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 LS_PROTO_TLS1 :
4d80: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 0);.. /* rese
4d90: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 t to NULL if bla
4da0: 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 nk string provid
4db0: 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 ed */. if (ce
4dc0: 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 63 rt && !*cert)..c
4dd0: 65 72 74 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ert.= NULL;.
4de0: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 if (key && !*key
4df0: 29 09 09 6b 65 79 09 3d 20 4e 55 4c 4c 3b 0a 20 )..key.= NULL;.
4e00: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 if (ciphers &
4e10: 26 20 21 2a 63 69 70 68 65 72 73 29 09 63 69 70 & !*ciphers).cip
4e20: 68 65 72 73 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 hers.= NULL;.
4e30: 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 if (CAfile && !
4e40: 2a 43 41 66 69 6c 65 29 09 43 41 66 69 6c 65 09 *CAfile).CAfile.
4e50: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
4e60: 43 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72 CAdir && !*CAdir
4e70: 29 09 43 41 64 69 72 09 3d 20 4e 55 4c 4c 3b 0a ).CAdir.= NULL;.
4e80: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 . /* new SSL
4e90: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 state */. sta
4ea0: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 tePtr..= (State
4eb0: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 *) ckalloc((unsi
4ec0: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 gned) sizeof(Sta
4ed0: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 te));. memset
4ee0: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 (statePtr, 0, si
4ef0: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 zeof(State));..
4f00: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 statePtr->fla
4f10: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 gs.= flags;.
4f20: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
4f30: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 .= interp;. s
4f40: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 tatePtr->vflags.
4f50: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74 = verify;. st
4f60: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 atePtr->err.= ""
4f70: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 ;.. /* alloca
4f80: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 te script */.
4f90: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 if (script) {..
4fa0: 63 68 61 72 20 2a 74 6d 70 20 3d 20 54 63 6c 5f char *tmp = Tcl_
4fb0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
4fc0: 28 73 63 72 69 70 74 2c 20 4e 55 4c 4c 29 3b 0a (script, NULL);.
4fd0: 09 69 66 20 28 74 6d 70 20 26 26 20 2a 74 6d 70 .if (tmp && *tmp
4fe0: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 ) {.. statePt
4ff0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 54 63 r->callback = Tc
5000: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 l_DuplicateObj(s
5010: 63 72 69 70 74 29 3b 0a 09 20 20 20 20 54 63 6c cript);.. Tcl
5020: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
5030: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
5040: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
5050: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 /* allocate pas
5060: 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 sword */. if
5070: 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 63 68 (password) {..ch
5080: 61 72 20 2a 74 6d 70 20 3d 20 54 63 6c 5f 47 65 ar *tmp = Tcl_Ge
5090: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 tStringFromObj(p
50a0: 61 73 73 77 6f 72 64 2c 20 4e 55 4c 4c 29 3b 0a assword, NULL);.
50b0: 09 69 66 20 28 74 6d 70 20 26 26 20 2a 74 6d 70 .if (tmp && *tmp
50c0: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 ) {.. statePt
50d0: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 54 63 r->password = Tc
50e0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 l_DuplicateObj(p
50f0: 61 73 73 77 6f 72 64 29 3b 0a 09 20 20 20 20 54 assword);.. T
5100: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
5110: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
5120: 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 rd);..}. }..
5130: 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 if (model !=
5140: 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 NULL) {..int mod
5150: 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 e;../* Get the "
5160: 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a model" context *
5170: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 /..chan = Tcl_Ge
5180: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
5190: 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a model, &mode);.
51a0: 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 .if (chan == (Tc
51b0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
51c0: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
51d0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
51e0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
51f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 TCL_ERROR;..}..
5200: 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 if (channelTypeV
5210: 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 ersion == TLS_CH
5220: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 ANNEL_VERSION_2)
5230: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 {.. /*..
5240: 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 * Make sure to
5250: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
5260: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 opmost channel..
5270: 20 20 20 20 20 2a 2f 0a 09 20 20 20 20 63 68 61 */.. cha
5280: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
5290: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 7d 0a annel(chan);..}.
52a0: 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e .if (Tcl_GetChan
52b0: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
52c0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
52d0: 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 ()) {.. Tcl_A
52e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
52f0: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
5300: 20 5c 22 22 2c 0a 09 09 20 20 20 20 54 63 6c 5f \"",... Tcl_
5310: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
5320: 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 han), "\": not a
5330: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
5340: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
5350: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
5360: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
5370: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
5380: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 }..ctx = ((State
5390: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
53a0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
53b0: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d an))->ctx;. }
53c0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 else {..if ((ct
53d0: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 x = CTX_Init(sta
53e0: 74 65 50 74 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 tePtr, proto, ke
53f0: 79 2c 20 63 65 72 74 2c 20 43 41 64 69 72 2c 20 y, cert, CAdir,
5400: 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 29 CAfile, ciphers)
5410: 29 0a 09 20 20 20 20 3d 3d 20 28 53 53 4c 5f 43 ).. == (SSL_C
5420: 54 58 2a 29 30 29 20 7b 0a 09 20 20 20 20 54 6c TX*)0) {.. Tl
5430: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 s_Free((char *)
5440: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 statePtr);..
5450: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5460: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
5470: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 statePtr->ctx =
5480: 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 ctx;.. /*.
5490: 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d * We need to m
54a0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 ake sure that th
54b0: 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 e channel works
54c0: 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 in binary (for t
54d0: 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 he. * encryp
54e0: 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 tion not to get
54f0: 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 goofed up)..
5500: 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 * We only want
5510: 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 to adjust the bu
5520: 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 ffering in pre-v
5530: 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 2 channels, wher
5540: 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 e. * each ch
5550: 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 annel in the sta
5560: 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 ck maintained it
5570: 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 s own buffers..
5580: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 */. Tcl_S
5590: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
55a0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
55b0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 translation", "b
55c0: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 69 66 20 inary");. if
55d0: 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 (channelTypeVers
55e0: 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e ion == TLS_CHANN
55f0: 45 4c 5f 56 45 52 53 49 4f 4e 5f 31 29 20 7b 0a EL_VERSION_1) {.
5600: 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f .Tcl_SetChannelO
5610: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
5620: 61 6e 2c 20 22 2d 62 75 66 66 65 72 69 6e 67 22 an, "-buffering"
5630: 2c 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 7d , "none");. }
5640: 0a 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65 .. if (channe
5650: 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 lTypeVersion ==
5660: 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 TLS_CHANNEL_VERS
5670: 49 4f 4e 5f 32 29 20 7b 0a 09 73 74 61 74 65 50 ION_2) {..stateP
5680: 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 tr->self = Tcl_S
5690: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 tackChannel(inte
56a0: 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 rp, Tls_ChannelT
56b0: 79 70 65 28 29 2c 0a 09 09 28 43 6c 69 65 6e 74 ype(),...(Client
56c0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 Data) statePtr,
56d0: 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 (TCL_READABLE |
56e0: 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 TCL_WRITABLE), c
56f0: 68 61 6e 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 han);. } else
5700: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 65 {..statePtr->se
5710: 6c 66 20 3d 20 63 68 61 6e 3b 0a 09 54 63 6c 5f lf = chan;..Tcl_
5720: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 StackChannel(int
5730: 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c erp, Tls_Channel
5740: 54 79 70 65 28 29 2c 0a 09 09 28 43 6c 69 65 6e Type(),...(Clien
5750: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c tData) statePtr,
5760: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c (TCL_READABLE |
5770: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 TCL_WRITABLE),
5780: 63 68 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 chan);. }.
5790: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
57a0: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e elf == (Tcl_Chan
57b0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a nel) NULL) {../*
57c0: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 .. * No use of T
57d0: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 cl_EventuallyFre
57e0: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 e because no pos
57f0: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 sible Tcl_Preser
5800: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 ve... */..Tls_Fr
5810: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
5820: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 ePtr);..return T
5830: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
5840: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
5850: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f SL Initializatio
5860: 6e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 n. */.. s
5870: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 tatePtr->ssl = S
5880: 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d SL_new(statePtr-
5890: 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 >ctx);. if (!
58a0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b statePtr->ssl) {
58b0: 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 ../* SSL library
58c0: 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 error */..Tcl_A
58d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
58e0: 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f rp, "couldn't co
58f0: 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 nstruct ssl sess
5900: 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 ion: ", REASON()
5910: 2c 0a 09 09 28 63 68 61 72 20 2a 29 20 4e 55 4c ,...(char *) NUL
5920: 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 L);..Tls_Free((c
5930: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
5940: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
5950: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
5960: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 /*. * SSL Ca
5970: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a llbacks. */.
5980: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 . SSL_set_app
5990: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e _data(statePtr->
59a0: 73 73 6c 2c 20 28 56 4f 49 44 20 2a 29 73 74 61 ssl, (VOID *)sta
59b0: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 tePtr);./* point
59c0: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a back to us */..
59d0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 SSL_set_veri
59e0: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c fy(statePtr->ssl
59f0: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 , verify, Verify
5a00: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 Callback);..
5a10: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 69 6e 66 6f SSL_CTX_set_info
5a20: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 _callback(stateP
5a30: 74 72 2d 3e 63 74 78 2c 20 49 6e 66 6f 43 61 6c tr->ctx, InfoCal
5a40: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 lback);.. /*
5a50: 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e Create Tcl_Chann
5a60: 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a el BIO Handler *
5a70: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e /. statePtr->
5a80: 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f p_bio.= BIO_new_
5a90: 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 tcl(statePtr, BI
5aa0: 4f 5f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 O_CLOSE);. st
5ab0: 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 atePtr->bio.= BI
5ac0: 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 O_new(BIO_f_ssl(
5ad0: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 ));.. if (ser
5ae0: 76 65 72 29 20 7b 0a 09 73 74 61 74 65 50 74 72 ver) {..statePtr
5af0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 ->flags |= TLS_T
5b00: 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f CL_SERVER;..SSL_
5b10: 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 set_accept_state
5b20: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
5b30: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 53 . } else {..S
5b40: 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 SL_set_connect_s
5b50: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 tate(statePtr->s
5b60: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 sl);. }. S
5b70: 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 SL_set_bio(state
5b80: 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 Ptr->ssl, stateP
5b90: 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 tr->p_bio, state
5ba0: 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 Ptr->p_bio);.
5bb0: 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 BIO_set_ssl(sta
5bc0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 tePtr->bio, stat
5bd0: 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e ePtr->ssl, BIO_N
5be0: 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a OCLOSE);.. /*
5bf0: 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 . * End of S
5c00: 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a SL Init. */.
5c10: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
5c20: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 t(interp, (char
5c30: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *) Tcl_GetChanne
5c40: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e lName(statePtr->
5c50: 73 65 6c 66 29 2c 0a 09 20 20 20 20 54 43 4c 5f self),.. TCL_
5c60: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 VOLATILE);. r
5c70: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
5c80: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
5c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
5cd0: 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e CTX_Init -- con
5ce0: 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 struct a SSL_CTX
5cf0: 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 instance. *. *
5d00: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 Results:. *.A va
5d10: 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 lid SSL_CTX inst
5d20: 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a ance or NULL.. *
5d30: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
5d40: 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 :. *.constructs
5d50: 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 SSL context (CTX
5d60: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ). *. *---------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
5db0: 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a static SSL_CTX *
5dc0: 0a 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 .CTX_Init(stateP
5dd0: 74 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 2c 20 tr, proto, key,
5de0: 63 65 72 74 2c 20 43 41 64 69 72 2c 20 43 41 66 cert, CAdir, CAf
5df0: 69 6c 65 2c 20 63 69 70 68 65 72 73 29 0a 20 20 ile, ciphers).
5e00: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
5e10: 72 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f r;. int proto
5e20: 3b 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 3b ;. char *key;
5e30: 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 3b . char *cert;
5e40: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 . char *CAdir
5e50: 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 ;. char *CAfi
5e60: 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 le;. char *ci
5e70: 70 68 65 72 73 3b 0a 7b 0a 20 20 20 20 54 63 6c phers;.{. Tcl
5e80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 _Interp *interp
5e90: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
5ea0: 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 rp;. SSL_CTX
5eb0: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ctx = NULL;.
5ec0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b Tcl_DString ds;
5ed0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
5ee0: 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 ds1;. int of
5ef0: 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 63 f = 0;.. /* c
5f00: 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 reate SSL contex
5f10: 74 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 t */.#if !define
5f20: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 d(NO_SSL2) && !d
5f30: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a efined(NO_SSL3).
5f40: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
5f50: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
5f60: 5f 53 53 4c 32 29 20 26 26 0a 09 45 4e 41 42 4c _SSL2) &&..ENABL
5f70: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
5f80: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 63 74 OTO_SSL3)) {..ct
5f90: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 x = SSL_CTX_new(
5fa0: 53 53 4c 76 32 33 5f 6d 65 74 68 6f 64 28 29 29 SSLv23_method())
5fb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 0a 23 65 6e ;. } else.#en
5fc0: 64 69 66 0a 20 20 20 20 69 66 20 28 45 4e 41 42 dif. if (ENAB
5fd0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
5fe0: 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 23 69 ROTO_SSL2)) {.#i
5ff0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c f defined(NO_SSL
6000: 32 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 2)..Tcl_AppendRe
6010: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 sult(interp, "pr
6020: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
6030: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 rted", NULL);..r
6040: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
6050: 29 30 3b 0a 23 65 6c 73 65 0a 09 63 74 78 20 3d )0;.#else..ctx =
6060: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c SSL_CTX_new(SSL
6070: 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 23 65 v2_method());.#e
6080: 6e 64 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 ndif. } else
6090: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
60a0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 o, TLS_PROTO_TLS
60b0: 31 29 29 20 7b 0a 09 63 74 78 20 3d 20 53 53 4c 1)) {..ctx = SSL
60c0: 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 6d _CTX_new(TLSv1_m
60d0: 65 74 68 6f 64 28 29 29 3b 0a 20 20 20 20 7d 20 ethod());. }
60e0: 65 6c 73 65 20 69 66 20 28 45 4e 41 42 4c 45 44 else if (ENABLED
60f0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
6100: 4f 5f 53 53 4c 33 29 29 20 7b 0a 23 69 66 20 64 O_SSL3)) {.#if d
6110: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a efined(NO_SSL3).
6120: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
6130: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f t(interp, "proto
6140: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 col not supporte
6150: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 d", NULL);..retu
6160: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b rn (SSL_CTX *)0;
6170: 0a 23 65 6c 73 65 0a 09 63 74 78 20 3d 20 53 53 .#else..ctx = SS
6180: 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f L_CTX_new(SSLv3_
6190: 6d 65 74 68 6f 64 28 29 29 3b 0a 23 65 6e 64 69 method());.#endi
61a0: 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 f. } else {..
61b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
61c0: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c (interp, "no val
61d0: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 id protocol sele
61e0: 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 cted", NULL);..r
61f0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
6200: 29 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 66 )0;. }. of
6210: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
6220: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
6230: 4c 53 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f LS1) ? 0 : SSL_O
6240: 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 20 20 20 P_NO_TLSv1);.
6250: 20 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 off |= (ENABLED
6260: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
6270: 4f 5f 53 53 4c 32 29 20 3f 20 30 20 3a 20 53 53 O_SSL2) ? 0 : SS
6280: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a L_OP_NO_SSLv2);.
6290: 20 20 20 20 6f 66 66 20 7c 3d 20 28 45 4e 41 42 off |= (ENAB
62a0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
62b0: 52 4f 54 4f 5f 53 53 4c 33 29 20 3f 20 30 20 3a ROTO_SSL3) ? 0 :
62c0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 SSL_OP_NO_SSLv3
62d0: 29 3b 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
62e0: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 20 63 74 set_app_data( ct
62f0: 78 2c 20 28 56 4f 49 44 2a 29 69 6e 74 65 72 70 x, (VOID*)interp
6300: 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 );./* remember t
6310: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a he interpreter *
6320: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 /. SSL_CTX_se
6330: 74 5f 6f 70 74 69 6f 6e 73 28 20 63 74 78 2c 20 t_options( ctx,
6340: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 SSL_OP_ALL);./*
6350: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b all SSL bug work
6360: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 arounds */. S
6370: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f SL_CTX_set_optio
6380: 6e 73 28 20 63 74 78 2c 20 6f 66 66 29 3b 09 2f ns( ctx, off);./
6390: 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f * all SSL bug wo
63a0: 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 rkarounds */.
63b0: 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 SSL_CTX_sess_se
63c0: 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 20 63 74 t_cache_size( ct
63d0: 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 69 66 x, 128);.. if
63e0: 20 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c (ciphers != NUL
63f0: 4c 29 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f L)..SSL_CTX_set_
6400: 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c cipher_list(ctx,
6410: 20 63 69 70 68 65 72 73 29 3b 0a 0a 20 20 20 20 ciphers);..
6420: 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c /* set some call
6430: 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c backs */. SSL
6440: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 _CTX_set_default
6450: 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 _passwd_cb(ctx,
6460: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b PasswordCallback
6470: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 42 53 41 46 );..#ifndef BSAF
6480: 45 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 E. SSL_CTX_se
6490: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 t_default_passwd
64a0: 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 _cb_userdata(ctx
64b0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
64c0: 74 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 tr);.#endif..#if
64d0: 6e 64 65 66 20 4e 4f 5f 44 48 0a 20 20 20 20 7b ndef NO_DH. {
64e0: 0a 09 44 48 2a 20 64 68 20 3d 20 67 65 74 5f 64 ..DH* dh = get_d
64f0: 68 35 31 32 28 29 3b 0a 09 53 53 4c 5f 43 54 58 h512();..SSL_CTX
6500: 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c _set_tmp_dh(ctx,
6510: 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 dh);..DH_free(d
6520: 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 h);. }.#endif
6530: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 .. /* set our
6540: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
6550: 20 20 20 20 69 66 20 28 63 65 72 74 20 21 3d 20 if (cert !=
6560: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 53 74 NULL) {..Tcl_DSt
6570: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a ringInit(&ds);..
6580: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
6590: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c _certificate_fil
65a0: 65 28 63 74 78 2c 20 46 32 4e 28 20 63 65 72 74 e(ctx, F2N( cert
65b0: 2c 20 26 64 73 29 2c 0a 09 09 09 09 09 53 53 4c , &ds),......SSL
65c0: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c _FILETYPE_PEM) <
65d0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
65e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
65f0: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ;.. Tcl_Appen
6600: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a dResult(interp,.
6610: 09 09 09 20 20 20 20 20 22 75 6e 61 62 6c 65 20 ... "unable
6620: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 to set certifica
6630: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 2c te file ", cert,
6640: 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 ": ",.... R
6650: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
6660: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
6670: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
6680: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 .. return (SS
6690: 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 0a 09 L_CTX *)0;..}...
66a0: 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 /* get the priva
66b0: 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 te key associate
66c0: 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 d with this cert
66d0: 69 66 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 ificate */..if (
66e0: 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 6b 65 79 key == NULL) key
66f0: 3d 63 65 72 74 3b 0a 0a 09 69 66 20 28 53 53 4c =cert;...if (SSL
6700: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 _CTX_use_Private
6710: 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 Key_file(ctx, F2
6720: 4e 28 20 6b 65 79 2c 20 26 64 73 29 2c 0a 09 09 N( key, &ds),...
6730: 09 09 09 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f ...SSL_FILETYPE_
6740: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 PEM) <= 0) {..
6750: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
6760: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 2f 2a 20 e(&ds);.. /*
6770: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 flush the passph
6780: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 rase which might
6790: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 be left in the
67a0: 72 65 73 75 6c 74 20 2a 2f 0a 09 20 20 20 20 54 result */.. T
67b0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
67c0: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 erp, NULL, TCL_S
67d0: 54 41 54 49 43 29 3b 0a 09 20 20 20 20 54 63 6c TATIC);.. Tcl
67e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
67f0: 74 65 72 70 2c 0a 09 09 09 20 20 20 20 20 22 75 terp,.... "u
6800: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 nable to set pub
6810: 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 lic key file ",
6820: 6b 65 79 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 key, " ",....
6830: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 REASON(), (cha
6840: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
6850: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 SSL_CTX_free(ct
6860: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
6870: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d (SSL_CTX *)0;..}
6880: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
6890: 65 28 26 64 73 29 3b 0a 09 2f 2a 20 4e 6f 77 20 e(&ds);../* Now
68a0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b we know that a k
68b0: 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 65 ey and cert have
68c0: 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e 73 been set agains
68d0: 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63 6f t.. * the SSL co
68e0: 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 ntext */..if (!S
68f0: 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 SL_CTX_check_pri
6900: 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20 7b vate_key(ctx)) {
6910: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
6920: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09 Result(interp,..
6930: 09 09 20 20 20 20 20 22 70 72 69 76 61 74 65 20 .. "private
6940: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 key does not mat
6950: 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 ch the certifica
6960: 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a te public key",.
6970: 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 ... (char *)
6980: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c NULL);.. SSL
6990: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
69a0: 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c . return (SSL
69b0: 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 _CTX *)0;..}.
69c0: 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 20 } else {..cert
69d0: 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 = (char*)X509_ge
69e0: 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 t_default_cert_f
69f0: 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c ile();...if (SSL
6a00: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 _CTX_use_certifi
6a10: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 cate_file(ctx, c
6a20: 65 72 74 2c 0a 09 09 09 09 09 53 53 4c 5f 46 49 ert,......SSL_FI
6a30: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
6a40: 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 ) {.#if 0.. T
6a50: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
6a60: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 ds);.. Tcl_Ap
6a70: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
6a80: 70 2c 0a 09 09 09 20 20 20 20 20 22 75 6e 61 62 p,.... "unab
6a90: 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c le to use defaul
6aa0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 t certificate fi
6ab0: 6c 65 20 22 2c 20 63 65 72 74 2c 20 22 3a 20 22 le ", cert, ": "
6ac0: 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e ,.... REASON
6ad0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
6ae0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
6af0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
6b00: 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 return (SSL_CTX
6b10: 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a *)0;.#endif..}.
6b20: 20 20 20 20 7d 0a 09 0a 20 20 20 20 54 63 6c 5f }... Tcl_
6b30: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
6b40: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
6b50: 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 gInit(&ds1);.
6b60: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f if (!SSL_CTX_lo
6b70: 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 ad_verify_locati
6b80: 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 ons(ctx, F2N(CAf
6b90: 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 ile, &ds), F2N(C
6ba0: 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a Adir, &ds1)) ||.
6bb0: 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 .!SSL_CTX_set_de
6bc0: 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 fault_verify_pat
6bd0: 68 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 hs(ctx)) {.#if 0
6be0: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
6bf0: 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 e(&ds);..Tcl_DSt
6c00: 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a ringFree(&ds1);.
6c10: 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e ./* Don't curren
6c20: 74 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73 tly care if this
6c30: 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 fails */..Tcl_A
6c40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
6c50: 72 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 rp, "SSL default
6c60: 20 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 verify paths: "
6c70: 2c 0a 09 09 52 45 41 53 4f 4e 28 29 2c 20 28 63 ,...REASON(), (c
6c80: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 har *) NULL);..S
6c90: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
6ca0: 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 ;..return (SSL_C
6cb0: 54 58 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 20 TX *)0;.#endif.
6cc0: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 43 54 58 }. SSL_CTX
6cd0: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c _set_client_CA_l
6ce0: 69 73 74 28 63 74 78 2c 20 53 53 4c 5f 6c 6f 61 ist(ctx, SSL_loa
6cf0: 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 d_client_CA_file
6d00: 28 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 ( F2N(CAfile, &d
6d10: 73 29 20 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f s) ));.. Tcl_
6d20: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
6d30: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
6d40: 67 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 gFree(&ds1);.
6d50: 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c return ctx;.}..
6d60: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
6db0: 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 StatusObjCmd --
6dc0: 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 return certifica
6dd0: 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 te for connected
6de0: 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 peer.. *. * Res
6df0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
6e00: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
6e10: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
6e20: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
6e30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e70: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
6e80: 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d int.StatusObjCm
6e90: 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e d(clientData, in
6ea0: 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 terp, objc, objv
6eb0: 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 ). ClientData
6ec0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20 clientData;./*
6ed0: 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 Not used. */.
6ee0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
6ef0: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f 62 6a erp;. int obj
6f00: 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a c;. Tcl_Obj.*
6f10: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a CONST objv[];.{.
6f20: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
6f30: 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 Ptr;. X509 *p
6f40: 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a eer;. Tcl_Obj
6f50: 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 *objPtr;. Tc
6f60: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a l_Channel chan;.
6f70: 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 char *channe
6f80: 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b lName, *ciphers;
6f90: 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 0a . int mode;..
6fa0: 20 20 20 20 73 77 69 74 63 68 20 28 6f 62 6a 63 switch (objc
6fb0: 29 20 7b 0a 09 63 61 73 65 20 32 3a 0a 09 20 20 ) {..case 2:..
6fc0: 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 channelName =
6fd0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
6fe0: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 mObj(objv[1], NU
6ff0: 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b LL);.. break;
7000: 0a 0a 09 63 61 73 65 20 33 3a 0a 09 20 20 20 20 ...case 3:..
7010: 69 66 20 28 21 73 74 72 63 6d 70 20 28 54 63 6c if (!strcmp (Tcl
7020: 5f 47 65 74 53 74 72 69 6e 67 20 28 6f 62 6a 76 _GetString (objv
7030: 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 [1]), "-local"))
7040: 20 7b 0a 09 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 {...channelName
7050: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
7060: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c FromObj(objv[2],
7070: 20 4e 55 4c 4c 29 3b 0a 09 09 62 72 65 61 6b 3b NULL);...break;
7080: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2f 2a 20 .. }.. /*
7090: 65 6c 73 65 20 66 61 6c 6c 2e 2e 2e 20 2a 2f 0a else fall... */.
70a0: 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 54 .default:.. T
70b0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
70c0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
70d0: 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e "?-local? chann
70e0: 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 el");.. retur
70f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
7100: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
7110: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
7120: 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d terp, channelNam
7130: 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 e, &mode);. i
7140: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
7150: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
7160: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7170: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
7180: 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 (channelTypeVer
7190: 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e sion == TLS_CHAN
71a0: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 20 7b NEL_VERSION_2) {
71b0: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 ../*.. * Make su
71c0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
71d0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
71e0: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 nnel.. */..chan
71f0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
7200: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 7d nel(chan);. }
7210: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
7220: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
7230: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c ) != Tls_Channel
7240: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 Type()) {..Tcl_A
7250: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7260: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c rp, "bad channel
7270: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 \"", Tcl_GetCha
7280: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a nnelName(chan),.
7290: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 .."\": not a TLS
72a0: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 channel", NULL)
72b0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
72c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 ROR;. }. s
72d0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 tatePtr.= (State
72e0: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e *) Tcl_GetChann
72f0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
7300: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 han);. if (ob
7310: 6a 63 20 3d 3d 20 32 29 0a 09 70 65 65 72 09 3d jc == 2)..peer.=
7320: 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 SSL_get_peer_ce
7330: 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 rtificate(stateP
7340: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 65 6c tr->ssl);. el
7350: 73 65 0a 09 70 65 65 72 09 3d 20 53 53 4c 5f 67 se..peer.= SSL_g
7360: 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 et_certificate(s
7370: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
7380: 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 if (peer) {..
7390: 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 objPtr = Tls_New
73a0: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 X509Obj(interp,
73b0: 70 65 65 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 peer);. } els
73c0: 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 e {..objPtr = Tc
73d0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
73e0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL);. }..
73f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
7400: 65 6e 64 45 6c 65 6d 65 6e 74 20 28 69 6e 74 65 endElement (inte
7410: 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 20 20 20 rp, objPtr,..
7420: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
7430: 6a 20 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29 j ("sbits", -1))
7440: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
7450: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 20 28 jAppendElement (
7460: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a interp, objPtr,.
7470: 09 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f . Tcl_NewIntO
7480: 62 6a 20 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 bj (SSL_get_ciph
7490: 65 72 5f 62 69 74 73 20 28 73 74 61 74 65 50 74 er_bits (statePt
74a0: 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b r->ssl, NULL)));
74b0: 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 .. ciphers =
74c0: 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 (char*)SSL_get_c
74d0: 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e ipher(statePtr->
74e0: 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 ssl);. if (ci
74f0: 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 20 26 26 phers != NULL &&
7500: 20 73 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c strcmp(ciphers,
7510: 20 22 28 4e 4f 4e 45 29 22 29 21 3d 30 29 20 7b "(NONE)")!=0) {
7520: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
7530: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
7540: 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 54 63 6c p, objPtr,...Tcl
7550: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 _NewStringObj("c
7560: 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 ipher", -1));..T
7570: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
7580: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
7590: 6f 62 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 objPtr,...Tcl_Ne
75a0: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 wStringObj(SSL_g
75b0: 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 et_cipher(stateP
75c0: 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a tr->ssl), -1));.
75d0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 }. Tcl_Se
75e0: 74 4f 62 6a 52 65 73 75 6c 74 28 20 69 6e 74 65 tObjResult( inte
75f0: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
7600: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
7610: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
7660: 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 * VersionObjCmd
7670: 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 -- return versi
7680: 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f on string from O
7690: 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 penSSL.. *. * Re
76a0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
76b0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
76c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
76d0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
76e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
76f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7720: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
7730: 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a c int.VersionObj
7740: 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 Cmd(clientData,
7750: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 interp, objc, ob
7760: 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 jv). ClientDa
7770: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f ta clientData;./
7780: 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 * Not used. */.
7790: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
77a0: 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f nterp;. int o
77b0: 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a bjc;. Tcl_Obj
77c0: 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a .*CONST objv[];.
77d0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f {. Tcl_Obj *o
77e0: 62 6a 50 74 72 3b 0a 0a 20 20 20 20 6f 62 6a 50 bjPtr;.. objP
77f0: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 tr = Tcl_NewStri
7800: 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 ngObj(OPENSSL_VE
7810: 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b RSION_TEXT, -1);
7820: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
7830: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
7840: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
7850: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
7860: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
7870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 -------. *. * Mi
78b0: 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 scObjCmd -- misc
78c0: 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 commands. *. *
78d0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
78e0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
78f0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
7900: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
7910: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
7920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7950: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
7960: 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 tic int.MiscObjC
7970: 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 md(clientData, i
7980: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a nterp, objc, obj
7990: 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 v). ClientDat
79a0: 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a a clientData;./*
79b0: 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 Not used. */.
79c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
79d0: 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f 62 terp;. int ob
79e0: 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 jc;. Tcl_Obj.
79f0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a 7b *CONST objv[];.{
7a00: 0a 20 20 20 20 43 4f 4e 53 54 38 34 20 63 68 61 . CONST84 cha
7a10: 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d r *commands [] =
7a20: 20 7b 20 22 72 65 71 22 2c 20 4e 55 4c 4c 20 7d { "req", NULL }
7a30: 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 ;. enum comma
7a40: 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 44 55 nd { C_REQ, C_DU
7a50: 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 MMY };. int c
7a60: 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a md;.. if (obj
7a70: 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 c < 2) {..Tcl_Wr
7a80: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
7a90: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 p, 1, objv, "sub
7aa0: 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 command ?args?")
7ab0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
7ac0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
7ad0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 f (Tcl_GetIndexF
7ae0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
7af0: 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 bjv[1], commands
7b00: 2c 0a 09 20 20 20 20 22 63 6f 6d 6d 61 6e 64 22 ,.. "command"
7b10: 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c , 0,&cmd) != TCL
7b20: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
7b30: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7b40: 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e . switch ((en
7b50: 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 um command) cmd)
7b60: 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 20 {..case C_REQ:
7b70: 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 {.. EVP_PKEY
7b80: 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 *pkey=NULL;..
7b90: 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c X509 *cert=NULL
7ba0: 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 ;.. X509_NAME
7bb0: 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 *name=NULL;..
7bc0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 Tcl_Obj **list
7bd0: 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74 v;.. int list
7be0: 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a c,i;... BIO *
7bf0: 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 out=NULL;...
7c00: 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f char *k_C="",*k_
7c10: 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b ST="",*k_L="",*k
7c20: 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a _O="",*k_OU="",*
7c30: 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c k_CN="",*k_Email
7c40: 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a ="";.. char *
7c50: 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a keyout,*pemout,*
7c60: 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 str;.. int ke
7c70: 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 ysize,serial=0,d
7c80: 61 79 73 3d 33 36 35 3b 0a 09 20 20 20 20 0a 09 ays=365;.. ..
7c90: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 if ((objc<5)
7ca0: 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a || (objc>6)) {.
7cb0: 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
7cc0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 gs(interp, 2, ob
7cd0: 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 jv, "keysize key
7ce0: 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 file certfile ?i
7cf0: 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e nfo?");...return
7d00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
7d10: 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c }... if (Tcl
7d20: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 _GetIntFromObj(i
7d30: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 nterp, objv[2],
7d40: 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c &keysize) != TCL
7d50: 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 _OK) {...return
7d60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
7d70: 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 }.. keyout=Tc
7d80: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
7d90: 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 [3]);.. pemou
7da0: 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 t=Tcl_GetString(
7db0: 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 09 20 20 20 20 objv[4]);...
7dc0: 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 if (objc>=6) {..
7dd0: 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a .if (Tcl_ListObj
7de0: 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 GetElements(inte
7df0: 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 rp, objv[5],....
7e00: 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 &listc, &listv)
7e10: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 != TCL_OK) {...
7e20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
7e30: 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ROR;...}....if (
7e40: 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 (listc%2) != 0)
7e50: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 {... Tcl_SetR
7e60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e esult(interp,"In
7e70: 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d formation list m
7e80: 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 ust have even nu
7e90: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
7ea0: 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 s",NULL);...
7eb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7ec0: 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 ;...}...for (i=0
7ed0: 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 ; i<listc; i+=2)
7ee0: 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c {... str=Tcl
7ef0: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
7f00: 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 [i]);... if (
7f10: 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 strcmp(str,"days
7f20: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 ")==0) {....if (
7f30: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
7f40: 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 j(interp,listv[i
7f50: 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f +1],&days)!=TCL_
7f60: 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 OK).... retur
7f70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 n TCL_ERROR;...
7f80: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
7f90: 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c rcmp(str,"serial
7fa0: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 ")==0) {....if (
7fb0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
7fc0: 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 j(interp,listv[i
7fd0: 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 +1],&serial)!=TC
7fe0: 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 L_OK).... ret
7ff0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
8000: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
8010: 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 strcmp(str,"seri
8020: 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 al")==0) {....if
8030: 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d (Tcl_GetIntFrom
8040: 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 Obj(interp,listv
8050: 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d [i+1],&serial)!=
8060: 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 TCL_OK).... r
8070: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8080: 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
8090: 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 (strcmp(str,"C"
80a0: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 )==0) {....k_C=T
80b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
80c0: 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
80d0: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
80e0: 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 p(str,"ST")==0)
80f0: 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 {....k_ST=Tcl_Ge
8100: 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
8110: 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
8120: 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
8130: 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"L")==0) {....k
8140: 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _L=Tcl_GetString
8150: 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
8160: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
8170: 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d trcmp(str,"O")==
8180: 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 0) {....k_O=Tcl_
8190: 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
81a0: 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
81b0: 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
81c0: 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 tr,"OU")==0) {..
81d0: 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 ..k_OU=Tcl_GetSt
81e0: 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
81f0: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
8200: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 f (strcmp(str,"C
8210: 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 N")==0) {....k_C
8220: 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 N=Tcl_GetString(
8230: 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
8240: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
8250: 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 rcmp(str,"Email"
8260: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 )==0) {....k_Ema
8270: 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 il=Tcl_GetString
8280: 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
8290: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 } else {....
82a0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
82b0: 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 terp,"Unknown pa
82c0: 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a rameter",NULL);.
82d0: 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
82e0: 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d ROR;... }...}
82f0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 .. }.. if
8300: 28 28 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 ((pkey = EVP_PKE
8310: 59 5f 6e 65 77 28 29 29 20 21 3d 20 4e 55 4c 4c Y_new()) != NULL
8320: 29 20 7b 0a 09 09 69 66 20 28 21 45 56 50 5f 50 ) {...if (!EVP_P
8330: 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 KEY_assign_RSA(p
8340: 6b 65 79 2c 0a 09 09 09 52 53 41 5f 67 65 6e 65 key,....RSA_gene
8350: 72 61 74 65 5f 6b 65 79 28 6b 65 79 73 69 7a 65 rate_key(keysize
8360: 2c 20 30 78 31 30 30 30 31 2c 20 4e 55 4c 4c 2c , 0x10001, NULL,
8370: 20 4e 55 4c 4c 29 29 29 20 7b 0a 09 09 20 20 20 NULL))) {...
8380: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
8390: 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
83a0: 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 erating private
83b0: 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 key",NULL);...
83c0: 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 EVP_PKEY_free(
83d0: 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 72 65 74 pkey);... ret
83e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
83f0: 09 7d 0a 09 09 6f 75 74 3d 42 49 4f 5f 6e 65 77 .}...out=BIO_new
8400: 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
8410: 09 09 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 ..BIO_write_file
8420: 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 name(out,keyout)
8430: 3b 0a 09 09 50 45 4d 5f 77 72 69 74 65 5f 62 69 ;...PEM_write_bi
8440: 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 o_PrivateKey(out
8450: 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c ,pkey,NULL,NULL,
8460: 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 0,NULL,NULL);...
8470: 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 BIO_free_all(out
8480: 29 3b 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d );....if ((cert=
8490: 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c X509_new())==NUL
84a0: 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 L) {... Tcl_S
84b0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
84c0: 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
84d0: 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65 g certificate re
84e0: 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 quest",NULL);...
84f0: 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 EVP_PKEY_fre
8500: 65 28 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 72 e(pkey);... r
8510: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
8520: 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 ;...}....X509_se
8530: 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 t_version(cert,2
8540: 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 );...ASN1_INTEGE
8550: 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 R_set(X509_get_s
8560: 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 erialNumber(cert
8570: 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 ),serial);...X50
8580: 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 9_gmtime_adj(X50
8590: 39 5f 67 65 74 5f 6e 6f 74 42 65 66 6f 72 65 28 9_get_notBefore(
85a0: 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 cert),0);...X509
85b0: 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 _gmtime_adj(X509
85c0: 5f 67 65 74 5f 6e 6f 74 41 66 74 65 72 28 63 65 _get_notAfter(ce
85d0: 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a rt),(long)60*60*
85e0: 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 24*days);...X509
85f0: 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 _set_pubkey(cert
8600: 2c 70 6b 65 79 29 3b 0a 09 09 0a 09 09 6e 61 6d ,pkey);......nam
8610: 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 e=X509_get_subje
8620: 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a ct_name(cert);..
8630: 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
8640: 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
8650: 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f e,"C", MBSTRING_
8660: 41 53 43 2c 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 ASC, k_C, -1, -1
8670: 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d , 0);...X509_NAM
8680: 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 E_add_entry_by_t
8690: 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 xt(name,"ST", MB
86a0: 53 54 52 49 4e 47 5f 41 53 43 2c 20 6b 5f 53 54 STRING_ASC, k_ST
86b0: 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
86c0: 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
86d0: 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
86e0: 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 "L", MBSTRING_AS
86f0: 43 2c 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 C, k_L, -1, -1,
8700: 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 0);...X509_NAME_
8710: 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
8720: 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 (name,"O", MBSTR
8730: 49 4e 47 5f 41 53 43 2c 20 6b 5f 4f 2c 20 2d 31 ING_ASC, k_O, -1
8740: 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
8750: 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
8760: 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 by_txt(name,"OU"
8770: 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
8780: 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_OU, -1, -1, 0)
8790: 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
87a0: 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
87b0: 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 ame,"CN", MBSTRI
87c0: 4e 47 5f 41 53 43 2c 20 6b 5f 43 4e 2c 20 2d 31 NG_ASC, k_CN, -1
87d0: 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 , -1, 0);...X509
87e0: 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f _NAME_add_entry_
87f0: 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 by_txt(name,"Ema
8800: 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 il", MBSTRING_AS
8810: 43 2c 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 C, k_Email, -1,
8820: 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f -1, 0);....X509_
8830: 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 set_subject_name
8840: 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 (cert,name);....
8850: 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 if (!X509_sign(c
8860: 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 6d 64 35 ert,pkey,EVP_md5
8870: 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 ())) {... X50
8880: 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 9_free(cert);...
8890: 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 EVP_PKEY_fre
88a0: 65 28 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 54 e(pkey);... T
88b0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
88c0: 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 erp,"Error signi
88d0: 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c ng certificate",
88e0: 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 NULL);... ret
88f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
8900: 09 7d 0a 0a 09 09 6f 75 74 3d 42 49 4f 5f 6e 65 .}....out=BIO_ne
8910: 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b w(BIO_s_file());
8920: 0a 09 09 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c ...BIO_write_fil
8930: 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 ename(out,pemout
8940: 29 3b 0a 0a 09 09 50 45 4d 5f 77 72 69 74 65 5f );....PEM_write_
8950: 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 bio_X509(out,cer
8960: 74 29 3b 0a 09 09 42 49 4f 5f 66 72 65 65 5f 61 t);...BIO_free_a
8970: 6c 6c 28 6f 75 74 29 3b 0a 0a 09 09 58 35 30 39 ll(out);....X509
8980: 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 _free(cert);...E
8990: 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 VP_PKEY_free(pke
89a0: 79 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 y);.. } else
89b0: 7b 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c {...Tcl_SetResul
89c0: 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
89d0: 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 generating priva
89e0: 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 te key",NULL);..
89f0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
8a00: 52 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 R;.. }..}..br
8a10: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 eak;. default
8a20: 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a :..break;. }.
8a30: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
8a40: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
8a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
8a90: 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d *. * Tls_Free -
8aa0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
8ab0: 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 cedure cleans up
8ac0: 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b when a SSL sock
8ad0: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
8ae0: 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e . *.is closed an
8af0: 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 d its reference
8b00: 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f count falls belo
8b10: 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 w 1. *. * Result
8b20: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.none. *. *
8b30: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
8b40: 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 *.Frees all the
8b50: 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d state. *. *-----
8b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8ba0: 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 */.void.Tls_Free
8bb0: 28 20 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 ( char *blockPtr
8bc0: 20 29 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a ).{. State *
8bd0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
8be0: 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 e *)blockPtr;..
8bf0: 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 Tls_Clean(sta
8c00: 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 tePtr);. ckfr
8c10: 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a ee(blockPtr);.}.
8c20: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
8c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
8c70: 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a Tls_Clean --. *
8c80: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
8c90: 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 re cleans up whe
8ca0: 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 n a SSL socket b
8cb0: 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 ased channel. *.
8cc0: 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 is closed and it
8cd0: 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e s reference coun
8ce0: 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e t falls below 1.
8cf0: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a This should. *
8d00: 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 .be called synch
8d10: 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 ronously by the
8d20: 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 CloseProc, not i
8d30: 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 n the. *.Eventua
8d40: 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b llyFree callback
8d50: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
8d60: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.none. *. * S
8d70: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
8d80: 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 Frees all the st
8d90: 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ate. *. *-------
8da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
8de0: 0a 76 6f 69 64 0a 54 6c 73 5f 43 6c 65 61 6e 28 .void.Tls_Clean(
8df0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 State *statePtr)
8e00: 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a .{. /*. *
8e10: 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 we're assuming
8e20: 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 here that we're
8e30: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a single-threaded.
8e40: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 */.. if
8e50: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
8e60: 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f != (Tcl_TimerTo
8e70: 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 ken) NULL) {..Tc
8e80: 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e l_DeleteTimerHan
8e90: 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 dler(statePtr->t
8ea0: 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 imer);..statePtr
8eb0: 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a ->timer = NULL;.
8ec0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
8ed0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a tatePtr->bio) {.
8ee0: 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 ./* This will ca
8ef0: 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e ll SSL_shutdown.
8f00: 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a Bug 1414045 */.
8f10: 09 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c .dprintf(stderr,
8f20: 20 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 "BIO_free_all(%
8f30: 70 29 5c 6e 22 2c 20 73 74 61 74 65 50 74 72 2d p)\n", statePtr-
8f40: 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 >bio);..BIO_free
8f50: 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 _all(statePtr->b
8f60: 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e io);..statePtr->
8f70: 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 bio = NULL;.
8f80: 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
8f90: 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 tr->ssl) {..dpri
8fa0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 53 4c ntf(stderr, "SSL
8fb0: 5f 66 72 65 65 28 25 70 29 5c 6e 22 2c 20 73 74 _free(%p)\n", st
8fc0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 atePtr->ssl);..S
8fd0: 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 SL_free(statePtr
8fe0: 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 ->ssl);..statePt
8ff0: 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 r->ssl = NULL;.
9000: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
9010: 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 tePtr->ctx) {..S
9020: 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 SL_CTX_free(stat
9030: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 ePtr->ctx);..sta
9040: 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c tePtr->ctx = NUL
9050: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
9060: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
9070: 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 ack) {..Tcl_Decr
9080: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
9090: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 r->callback);..s
90a0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
90b0: 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a k = NULL;. }.
90c0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
90d0: 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 ->password) {..T
90e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
90f0: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
9100: 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e rd);..statePtr->
9110: 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b password = NULL;
9120: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a . }.}.../*. *
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9170: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e ---. *. * Tls_In
9180: 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 it --. *. *.This
9190: 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e is a package in
91a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f itialization pro
91b0: 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 cedure, which is
91c0: 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 called. *.by Tc
91d0: 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b l when this pack
91e0: 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 age is to be add
91f0: 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 ed to an interpr
9200: 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 eter.. *. * Resu
9210: 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 lts: Ssl config
9220: 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a ured and loaded.
9230: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
9240: 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 ts:. *. create t
9250: 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 he ssl command,
9260: 69 6e 69 74 69 61 6c 69 73 65 20 73 73 6c 20 63 initialise ssl c
9270: 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d ontext. *. *----
9280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
92c0: 20 2a 2f 0a 0a 69 6e 74 0a 54 6c 73 5f 49 6e 69 */..int.Tls_Ini
92d0: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e t(Tcl_Interp *in
92e0: 74 65 72 70 29 09 09 2f 2a 20 49 6e 74 65 72 70 terp)../* Interp
92f0: 72 65 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 reter in which t
9300: 68 65 20 70 61 63 6b 61 67 65 20 69 73 0a 09 09 he package is...
9310: 09 09 09 20 2a 20 74 6f 20 62 65 20 6d 61 64 65 ... * to be made
9320: 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 7b available. */.{
9330: 0a 20 20 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20 . int major,
9340: 6d 69 6e 6f 72 2c 20 70 61 74 63 68 6c 65 76 65 minor, patchleve
9350: 6c 2c 20 72 65 6c 65 61 73 65 2c 20 69 3b 0a 20 l, release, i;.
9360: 20 20 20 63 68 61 72 20 72 6e 64 5f 73 65 65 64 char rnd_seed
9370: 5b 31 36 5d 20 3d 20 22 47 72 7a 53 6c 70 6c 4b [16] = "GrzSlplK
9380: 71 55 64 6e 6e 7a 50 21 22 3b 09 2f 2a 20 31 36 qUdnnzP!";./* 16
9390: 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20 2f bytes */.. /
93a0: 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 6f 72 69 *. * The ori
93b0: 67 69 6e 61 6c 20 38 2e 32 2e 30 20 73 74 61 63 ginal 8.2.0 stac
93c0: 6b 65 64 20 63 68 61 6e 6e 65 6c 20 69 6d 70 6c ked channel impl
93d0: 65 6d 65 6e 74 61 74 69 6f 6e 20 28 61 6e 64 20 ementation (and
93e0: 74 68 65 20 70 61 74 63 68 0a 20 20 20 20 20 2a the patch. *
93f0: 20 74 68 61 74 20 70 72 65 63 65 64 65 64 20 69 that preceded i
9400: 74 29 20 68 61 64 20 70 72 6f 62 6c 65 6d 73 20 t) had problems
9410: 77 69 74 68 20 73 63 61 6c 61 62 69 6c 69 74 79 with scalability
9420: 20 61 6e 64 20 72 6f 62 75 73 74 6e 65 73 73 2e and robustness.
9430: 0a 20 20 20 20 20 2a 20 54 68 65 73 65 20 77 65 . * These we
9440: 72 65 20 61 64 64 72 65 73 73 20 69 6e 20 38 2e re address in 8.
9450: 33 2e 32 20 2f 20 38 2e 34 61 32 2c 20 73 6f 20 3.2 / 8.4a2, so
9460: 77 65 20 6e 6f 77 20 72 65 71 75 69 72 65 20 74 we now require t
9470: 68 61 74 20 61 73 20 61 0a 20 20 20 20 20 2a 20 hat as a. *
9480: 6d 69 6e 69 6d 75 6d 20 66 6f 72 20 54 4c 53 20 minimum for TLS
9490: 31 2e 34 2b 2e 20 20 57 65 20 6f 6e 6c 79 20 73 1.4+. We only s
94a0: 75 70 70 6f 72 74 20 38 2e 32 2b 20 6e 6f 77 20 upport 8.2+ now
94b0: 28 38 2e 33 2e 32 2b 20 70 72 65 66 65 72 72 65 (8.3.2+ preferre
94c0: 64 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 d).. */.
94d0: 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f if (.#ifdef USE_
94e0: 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f 49 TCL_STUBS..Tcl_I
94f0: 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c nitStubs(interp,
9500: 20 22 38 2e 32 22 2c 20 30 29 0a 23 65 6c 73 65 "8.2", 0).#else
9510: 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 ..Tcl_PkgRequire
9520: 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 (interp, "Tcl",
9530: 22 38 2e 32 22 2c 20 30 29 0a 23 65 6e 64 69 66 "8.2", 0).#endif
9540: 0a 09 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 ..== NULL) {..re
9550: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9560: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
9570: 20 20 20 2a 20 47 65 74 20 74 68 65 20 76 65 72 * Get the ver
9580: 73 69 6f 6e 20 73 6f 20 77 65 20 63 61 6e 20 72 sion so we can r
9590: 75 6e 74 69 6d 65 20 73 77 69 74 63 68 20 6f 6e untime switch on
95a0: 20 61 76 61 69 6c 61 62 6c 65 20 66 75 6e 63 74 available funct
95b0: 69 6f 6e 61 6c 69 74 79 2e 0a 20 20 20 20 20 2a ionality.. *
95c0: 20 54 4c 53 20 73 68 6f 75 6c 64 20 72 65 61 6c TLS should real
95d0: 6c 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 ly only be used
95e0: 69 6e 20 38 2e 33 2e 32 2b 2c 20 62 75 74 20 74 in 8.3.2+, but t
95f0: 68 65 20 6f 74 68 65 72 20 77 6f 72 6b 73 20 66 he other works f
9600: 6f 72 0a 20 20 20 20 20 2a 20 73 6f 6d 65 20 6c or. * some l
9610: 69 6d 69 74 65 64 20 66 75 6e 63 74 69 6f 6e 61 imited functiona
9620: 6c 69 74 79 2c 20 73 6f 20 61 6e 20 61 74 74 65 lity, so an atte
9630: 6d 70 74 20 61 74 20 73 75 70 70 6f 72 74 20 69 mpt at support i
9640: 73 20 6d 61 64 65 2e 0a 20 20 20 20 20 2a 2f 0a s made.. */.
9650: 20 20 20 20 54 63 6c 5f 47 65 74 56 65 72 73 69 Tcl_GetVersi
9660: 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f on(&major, &mino
9670: 72 2c 20 26 70 61 74 63 68 6c 65 76 65 6c 2c 20 r, &patchlevel,
9680: 26 72 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 69 &release);. i
9690: 66 20 28 28 6d 61 6a 6f 72 20 3e 20 38 29 20 7c f ((major > 8) |
96a0: 7c 20 28 28 6d 61 6a 6f 72 20 3d 3d 20 38 29 20 | ((major == 8)
96b0: 26 26 20 28 28 6d 69 6e 6f 72 20 3e 20 33 29 20 && ((minor > 3)
96c0: 7c 7c 20 28 28 6d 69 6e 6f 72 20 3d 3d 20 33 29 || ((minor == 3)
96d0: 20 26 26 0a 09 20 20 20 20 28 72 65 6c 65 61 73 &&.. (releas
96e0: 65 20 3d 3d 20 54 43 4c 5f 46 49 4e 41 4c 5f 52 e == TCL_FINAL_R
96f0: 45 4c 45 41 53 45 29 20 26 26 20 28 70 61 74 63 ELEASE) && (patc
9700: 68 6c 65 76 65 6c 20 3e 3d 20 32 29 29 29 29 29 hlevel >= 2)))))
9710: 20 7b 0a 09 2f 2a 20 38 2e 33 2e 32 2b 20 2a 2f {../* 8.3.2+ */
9720: 0a 09 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 ..channelTypeVer
9730: 73 69 6f 6e 20 3d 20 54 4c 53 5f 43 48 41 4e 4e sion = TLS_CHANN
9740: 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 3b 0a 20 20 EL_VERSION_2;.
9750: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 38 } else {../* 8
9760: 2e 32 2e 30 20 2d 20 38 2e 33 2e 31 20 2a 2f 0a .2.0 - 8.3.1 */.
9770: 09 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 .channelTypeVers
9780: 69 6f 6e 20 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 ion = TLS_CHANNE
9790: 4c 5f 56 45 52 53 49 4f 4e 5f 31 3b 0a 20 20 20 L_VERSION_1;.
97a0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 53 53 4c 5f }.. if (SSL_
97b0: 6c 69 62 72 61 72 79 5f 69 6e 69 74 28 29 20 21 library_init() !
97c0: 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 = 1) {..Tcl_Appe
97d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
97e0: 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 "could not init
97f0: 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 ialize SSL libra
9800: 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ry", NULL);..ret
9810: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
9820: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 6c 6f 61 }. SSL_loa
9830: 64 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 73 28 d_error_strings(
9840: 29 3b 0a 20 20 20 20 45 52 52 5f 6c 6f 61 64 5f );. ERR_load_
9850: 63 72 79 70 74 6f 5f 73 74 72 69 6e 67 73 28 29 crypto_strings()
9860: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
9870: 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d Seed the random
9880: 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f number generato
9890: 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 r in the SSL lib
98a0: 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69 rary,. * usi
98b0: 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 ng the do/while
98c0: 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73 construct becaus
98d0: 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74 e of the bug not
98e0: 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 e in the. *
98f0: 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68 OpenSSL FAQ at h
9900: 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 ttp://www.openss
9910: 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61 l.org/support/fa
9920: 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20 q.html#USER1.
9930: 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63 *. * The c
9940: 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c rux of the probl
9950: 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72 em is that Solar
9960: 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61 is 7 does not ha
9970: 76 65 20 61 20 0a 20 20 20 20 20 2a 20 2f 64 65 ve a . * /de
9980: 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 v/random or /dev
9990: 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 /urandom device
99a0: 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 so it cannot gat
99b0: 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 her enough.
99c0: 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 * entropy from t
99d0: 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 he RAND_seed() w
99e0: 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 hen TLS initiali
99f0: 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a zes and refuses.
9a00: 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 * to go fur
9a10: 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 ther. Earlier ve
9a20: 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 rsions of OpenSS
9a30: 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 L carried on reg
9a40: 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f ardless.. */
9a50: 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 . srand((unsi
9a60: 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 gned int) time((
9a70: 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 time_t *) NULL))
9a80: 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 ;. do {..for
9a90: 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 (i = 0; i < 16;
9aa0: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f i++) {.. rnd_
9ab0: 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 seed[i] = 1 + (c
9ac0: 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 har) (255.0 * ra
9ad0: 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 nd()/(RAND_MAX+1
9ae0: 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 .0));..}..RAND_s
9af0: 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 eed(rnd_seed, si
9b00: 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b zeof(rnd_seed));
9b10: 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 . } while (RA
9b20: 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 ND_status() != 1
9b30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 );.. Tcl_Crea
9b40: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
9b50: 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 erp, "tls::ciphe
9b60: 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 rs", CiphersObjC
9b70: 6d 64 2c 0a 09 20 20 20 20 28 43 6c 69 65 6e 74 md,.. (Client
9b80: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
9b90: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
9ba0: 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 ULL);.. Tcl_C
9bb0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
9bc0: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 interp, "tls::ha
9bd0: 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 ndshake", Handsh
9be0: 61 6b 65 4f 62 6a 43 6d 64 2c 0a 09 20 20 20 20 akeObjCmd,..
9bf0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
9c00: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
9c10: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 oc *) NULL);..
9c20: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
9c30: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
9c40: 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d tls::import", Im
9c50: 70 6f 72 74 4f 62 6a 43 6d 64 2c 0a 09 20 20 20 portObjCmd,..
9c60: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
9c70: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
9c80: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 roc *) NULL);..
9c90: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
9ca0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
9cb0: 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 "tls::status", S
9cc0: 74 61 74 75 73 4f 62 6a 43 6d 64 2c 0a 09 20 20 tatusObjCmd,..
9cd0: 20 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 (ClientData) 0
9ce0: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
9cf0: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a Proc *) NULL);..
9d00: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
9d10: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
9d20: 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c "tls::version",
9d30: 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 0a VersionObjCmd,.
9d40: 09 20 20 20 20 28 43 6c 69 65 6e 74 44 61 74 61 . (ClientData
9d50: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
9d60: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
9d70: 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 ;.. Tcl_Creat
9d80: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
9d90: 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c rp, "tls::misc",
9da0: 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 0a 09 20 20 MiscObjCmd,..
9db0: 20 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 (ClientData) 0
9dc0: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
9dd0: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a Proc *) NULL);..
9de0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 return Tcl_P
9df0: 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 kgProvide(interp
9e00: 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 , PACKAGE_NAME,
9e10: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 PACKAGE_VERSION)
9e20: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
9e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e60: 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 -*. *. *.Tls_Saf
9e70: 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d eInit --. *. *.-
9e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
9eb0: 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f . *.Standard pro
9ec0: 63 65 64 75 72 65 20 72 65 71 75 69 72 65 64 20 cedure required
9ed0: 62 79 20 27 6c 6f 61 64 27 2e 20 0a 20 2a 09 49 by 'load'. . *.I
9ee0: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 nitializes this
9ef0: 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 extension for a
9f00: 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 safe interpreter
9f10: 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *.-----------
9f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f40: 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 -----*. *. *.Sid
9f50: 65 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 eeffects:. *..As
9f60: 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 of 'Tls_Init'.
9f70: 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 *. *.Result:. *.
9f80: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
9f90: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 error code.. *.
9fa0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
9fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9fd0: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 69 6e -------*. */..in
9fe0: 74 0a 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 28 t.Tls_SafeInit (
9ff0: 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 Tcl_Interp* inte
a000: 72 70 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e rp).{. return
a010: 20 54 6c 73 5f 49 6e 69 74 20 28 69 6e 74 65 72 Tls_Init (inter
a020: 70 29 3b 0a 7d 0a p);.}.