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 0a tarfish Systems.
00d0: 20 2a 0a 20 2a 20 54 4c 53 20 28 61 6b 61 20 53 *. * TLS (aka S
00e0: 53 4c 29 20 43 68 61 6e 6e 65 6c 20 2d 20 63 61 SL) Channel - ca
00f0: 6e 20 62 65 20 6c 61 79 65 72 65 64 20 6f 6e 20 n be layered on
0100: 61 6e 79 20 62 69 2d 64 69 72 65 63 74 69 6f 6e any bi-direction
0110: 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 61 6e 6e 65 al. * Tcl_Channe
0120: 6c 20 28 4e 6f 74 65 3a 20 52 65 71 75 69 72 65 l (Note: Require
0130: 73 20 54 72 66 20 43 6f 72 65 20 50 61 74 63 68 s Trf Core Patch
0140: 29 0a 20 2a 0a 20 2a 20 54 68 69 73 20 77 61 73 ). *. * This was
0150: 20 62 75 69 6c 74 20 28 61 6c 6d 6f 73 74 29 20 built (almost)
0160: 66 72 6f 6d 20 73 63 72 61 74 63 68 20 62 61 73 from scratch bas
0170: 65 64 20 75 70 6f 6e 20 6f 62 73 65 72 76 61 74 ed upon observat
0180: 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 65 6e 53 53 ion of. * OpenSS
0190: 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a 20 2a 20 41 L 0.9.2B. *. * A
01a0: 64 64 69 74 69 6f 6e 20 63 72 65 64 69 74 20 69 ddition credit i
01b0: 73 20 64 75 65 20 66 6f 72 20 41 6e 64 72 65 61 s due for Andrea
01c0: 73 20 4b 75 70 72 69 65 73 20 28 61 2e 6b 75 70 s Kupries (a.kup
01d0: 72 69 65 73 40 77 65 73 74 65 6e 64 2e 63 6f 6d ries@westend.com
01e0: 29 2c 20 66 6f 72 0a 20 2a 20 70 72 6f 76 69 64 ), for. * provid
01f0: 69 6e 67 20 74 68 65 20 54 63 6c 5f 52 65 70 6c ing the Tcl_Repl
0200: 61 63 65 43 68 61 6e 6e 65 6c 20 6d 65 63 68 61 aceChannel mecha
0210: 6e 69 73 6d 20 61 6e 64 20 77 6f 72 6b 69 6e 67 nism and working
0220: 20 63 6c 6f 73 65 6c 79 20 77 69 74 68 20 6d 65 closely with me
0230: 0a 20 2a 20 74 6f 20 65 6e 68 61 6e 63 65 20 69 . * to enhance i
0240: 74 20 74 6f 20 73 75 70 70 6f 72 74 20 66 75 6c t to support ful
0250: 6c 20 66 69 6c 65 65 76 65 6e 74 20 73 65 6d 61 l fileevent sema
0260: 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a 20 41 6c 73 ntics.. *. * Als
0270: 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 62 79 20 74 o work done by t
0280: 68 65 20 66 6f 6c 6c 6f 77 20 70 65 6f 70 6c 65 he follow people
0290: 20 70 72 6f 76 69 64 65 64 20 74 68 65 20 69 6d provided the im
02a0: 70 65 74 75 73 20 74 6f 20 64 6f 20 74 68 69 73 petus to do this
02b0: 20 22 72 69 67 68 74 22 3a 0a 20 2a 09 74 63 6c "right":. *.tcl
02c0: 53 53 4c 20 28 43 6f 6c 69 6e 20 4d 63 43 6f 72 SSL (Colin McCor
02d0: 6d 61 63 6b 2c 20 53 68 61 72 65 64 20 54 65 63 mack, Shared Tec
02e0: 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 53 53 4c 74 hnology). *.SSLt
02f0: 63 6c 20 28 50 65 74 65 72 20 41 6e 74 6d 61 6e cl (Peter Antman
0300: 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 ). *. */..#inclu
0310: 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 69 de "tlsInt.h".#i
0320: 6e 63 6c 75 64 65 20 22 74 63 6c 4f 70 74 73 2e nclude "tclOpts.
0330: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 h".#include <std
0340: 6c 69 62 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 45 78 lib.h>../*. * Ex
0350: 74 65 72 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 ternal functions
0360: 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 . */../*. * Forw
0370: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 ard declarations
0380: 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 . */..#define F2
0390: 4e 28 20 6b 65 79 2c 20 64 73 70 29 20 5c 0a 09 N( key, dsp) \..
03a0: 28 28 28 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 (((key) == NULL)
03b0: 20 3f 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ? (char *) NULL
03c0: 20 3a 20 5c 0a 09 09 54 63 6c 5f 54 72 61 6e 73 : \...Tcl_Trans
03d0: 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 lateFileName(int
03e0: 65 72 70 2c 20 28 6b 65 79 29 2c 20 28 64 73 70 erp, (key), (dsp
03f0: 29 29 29 0a 23 64 65 66 69 6e 65 20 52 45 41 53 ))).#define REAS
0400: 4f 4e 28 29 09 45 52 52 5f 72 65 61 73 6f 6e 5f ON().ERR_reason_
0410: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52 error_string(ERR
0420: 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 0a 0a 73 _get_error())..s
0430: 74 61 74 69 63 20 76 6f 69 64 09 49 6e 66 6f 43 tatic void.InfoC
0440: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
0450: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 L *ssl, int wher
0460: 65 2c 20 69 6e 74 20 72 65 74 29 3b 0a 0a 73 74 e, int ret);..st
0470: 61 74 69 63 20 69 6e 74 09 43 69 70 68 65 72 73 atic int.Ciphers
0480: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
0490: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 a clientData,...
04a0: 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 .Tcl_Interp *int
04b0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
04c0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
04d0: 6a 76 5b 5d 29 3b 0a 0a 73 74 61 74 69 63 20 69 jv[]);..static i
04e0: 6e 74 09 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 nt.HandshakeObjC
04f0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
0500: 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 63 6c ientData,....Tcl
0510: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
0520: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
0530: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
0540: 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 49 );..static int.I
0550: 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 mportObjCmd(Clie
0560: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
0570: 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 a,....Tcl_Interp
0580: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
0590: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
05a0: 73 74 20 6f 62 6a 76 5b 5d 29 3b 0a 0a 73 74 61 st objv[]);..sta
05b0: 74 69 63 20 69 6e 74 09 53 74 61 74 75 73 4f 62 tic int.StatusOb
05c0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
05d0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 clientData,....T
05e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
05f0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
0600: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
0610: 5b 5d 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 []);..static int
0620: 09 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 .VersionObjCmd(C
0630: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
0640: 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 Data,....Tcl_Int
0650: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
0660: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
0670: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 3b 0a 0a const objv[]);..
0680: 73 74 61 74 69 63 20 69 6e 74 09 4d 69 73 63 4f static int.MiscO
0690: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
06a0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 clientData,....
06b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
06c0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
06d0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
06e0: 76 5b 5d 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e v[]);..static in
06f0: 74 09 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 t.UnimportObjCmd
0700: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
0710: 6e 74 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 ntData,....Tcl_I
0720: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
0730: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
0740: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 3b *const objv[]);
0750: 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 ..static SSL_CTX
0760: 20 2a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 *CTX_Init(State
0770: 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 *statePtr, int
0780: 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 isServer, int pr
0790: 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a oto, char *key,.
07a0: 09 09 09 63 68 61 72 20 2a 63 65 72 74 66 69 6c ...char *certfil
07b0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 e, unsigned char
07c0: 20 2a 6b 65 79 5f 61 73 6e 31 2c 20 75 6e 73 69 *key_asn1, unsi
07d0: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 5f gned char *cert_
07e0: 61 73 6e 31 2c 0a 09 09 09 69 6e 74 20 6b 65 79 asn1,....int key
07f0: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 69 6e 74 20 63 _asn1_len, int c
0800: 65 72 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 ert_asn1_len, ch
0810: 61 72 20 2a 43 41 64 69 72 2c 20 63 68 61 72 20 ar *CAdir, char
0820: 2a 43 41 66 69 6c 65 2c 0a 20 20 20 20 20 20 63 *CAfile,. c
0830: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 har *ciphers, ch
0840: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a ar *DHparams);..
0850: 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 4c 69 static int.TlsLi
0860: 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 bInit(int uninit
0870: 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 69 6e ialize);..#defin
0880: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 e TLS_PROTO_SSL2
0890: 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20 54 ..0x01.#define T
08a0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 09 30 LS_PROTO_SSL3..0
08b0: 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f x02.#define TLS_
08c0: 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 30 34 PROTO_TLS1..0x04
08d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f .#define TLS_PRO
08e0: 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 0a 23 TO_TLS1_1.0x08.#
08f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f define TLS_PROTO
0900: 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 64 65 _TLS1_2.0x10.#de
0910: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 fine TLS_PROTO_T
0920: 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 66 69 LS1_3.0x20.#defi
0930: 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c ne ENABLED(flag,
0940: 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29 20 mask).(((flag)
0950: 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61 & (mask)) == (ma
0960: 73 6b 29 29 0a 0a 2f 2a 0a 20 2a 20 53 74 61 74 sk))../*. * Stat
0970: 69 63 20 64 61 74 61 20 73 74 72 75 63 74 75 72 ic data structur
0980: 65 73 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 es. */..#ifndef
0990: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 23 69 OPENSSL_NO_DH.#i
09a0: 6e 63 6c 75 64 65 20 22 64 68 5f 70 61 72 61 6d nclude "dh_param
09b0: 73 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a s.h".#endif../*.
09c0: 20 2a 20 57 65 20 6c 6f 73 65 20 74 68 65 20 74 * We lose the t
09d0: 63 6c 20 70 61 73 73 77 6f 72 64 20 63 61 6c 6c cl password call
09e0: 62 61 63 6b 20 77 68 65 6e 20 77 65 20 75 73 65 back when we use
09f0: 20 74 68 65 20 52 53 41 20 42 53 41 46 45 20 53 the RSA BSAFE S
0a00: 53 4c 2d 43 20 31 2e 31 2e 32 0a 20 2a 20 6c 69 SL-C 1.1.2. * li
0a10: 62 72 61 72 69 65 73 20 69 6e 73 74 65 61 64 20 braries instead
0a20: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4f of the current O
0a30: 70 65 6e 53 53 4c 20 6c 69 62 72 61 72 69 65 73 penSSL libraries
0a40: 2e 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 42 53 .. */..#ifdef BS
0a50: 41 46 45 0a 23 64 65 66 69 6e 65 20 50 52 45 5f AFE.#define PRE_
0a60: 4f 50 45 4e 53 53 4c 5f 30 5f 39 5f 34 20 31 0a OPENSSL_0_9_4 1.
0a70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 50 72 #endif../*. * Pr
0a80: 65 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 34 20 e OpenSSL 0.9.4
0a90: 43 6f 6d 70 61 74 0a 20 2a 2f 0a 0a 23 69 66 6e Compat. */..#ifn
0aa0: 64 65 66 20 53 54 41 43 4b 5f 4f 46 0a 23 64 65 def STACK_OF.#de
0ab0: 66 69 6e 65 20 53 54 41 43 4b 5f 4f 46 28 78 29 fine STACK_OF(x)
0ac0: 09 09 09 53 54 41 43 4b 0a 23 64 65 66 69 6e 65 ...STACK.#define
0ad0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e sk_SSL_CIPHER_n
0ae0: 75 6d 28 73 6b 29 09 09 73 6b 5f 6e 75 6d 28 28 um(sk)..sk_num((
0af0: 73 6b 29 29 0a 23 64 65 66 69 6e 65 20 73 6b 5f sk)).#define sk_
0b00: 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 SSL_CIPHER_value
0b10: 28 20 73 6b 2c 20 69 6e 64 65 78 29 09 28 53 53 ( sk, index).(SS
0b20: 4c 5f 43 49 50 48 45 52 2a 29 73 6b 5f 76 61 6c L_CIPHER*)sk_val
0b30: 75 65 28 28 73 6b 29 2c 20 28 69 6e 64 65 78 29 ue((sk), (index)
0b40: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 ).#endif../*. *
0b50: 54 68 72 65 61 64 2d 53 61 66 65 20 54 4c 53 20 Thread-Safe TLS
0b60: 43 6f 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 Code. */..#ifdef
0b70: 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 TCL_THREADS.#de
0b80: 66 69 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 fine OPENSSL_THR
0b90: 45 41 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 EAD_DEFINES.#inc
0ba0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 lude <openssl/op
0bb0: 65 6e 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 ensslconf.h>..#i
0bc0: 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 fdef OPENSSL_THR
0bd0: 45 41 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f EADS.#include <o
0be0: 70 65 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e penssl/crypto.h>
0bf0: 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65 64 ../*. * Threaded
0c00: 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75 69 operation requi
0c10: 72 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c res locking call
0c20: 62 61 63 6b 73 0a 20 2a 20 42 61 73 65 64 20 66 backs. * Based f
0c30: 72 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79 70 rom /crypto/cryp
0c40: 74 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53 53 tlib.c of OpenSS
0c50: 4c 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c 2e L and NSOpenSSL.
0c60: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c . */..static Tcl
0c70: 5f 4d 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d 20 _Mutex *locks =
0c80: 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74 NULL;.static int
0c90: 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b locksCount = 0;
0ca0: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 .static Tcl_Mute
0cb0: 78 20 69 6e 69 74 5f 6d 78 3b 0a 0a 76 6f 69 64 x init_mx;..void
0cc0: 20 43 72 79 70 74 6f 54 68 72 65 61 64 4c 6f 63 CryptoThreadLoc
0cd0: 6b 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6d 6f kCallback(int mo
0ce0: 64 65 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 de, int n, const
0cf0: 20 63 68 61 72 20 2a 66 69 6c 65 2c 20 69 6e 74 char *file, int
0d00: 20 6c 69 6e 65 29 20 7b 0a 0a 09 69 66 20 28 6d line) {...if (m
0d10: 6f 64 65 20 26 20 43 52 59 50 54 4f 5f 4c 4f 43 ode & CRYPTO_LOC
0d20: 4b 29 20 7b 0a 09 09 2f 2a 20 54 68 69 73 20 64 K) {.../* This d
0d30: 65 62 75 67 67 69 6e 67 20 69 73 20 74 75 72 6e ebugging is turn
0d40: 65 64 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c ed off by defaul
0d50: 74 20 2d 2d 20 69 74 27 73 20 74 6f 6f 20 6e 6f t -- it's too no
0d60: 69 73 79 2e 20 2a 2f 0a 09 09 2f 2a 20 64 70 72 isy. */.../* dpr
0d70: 69 6e 74 66 28 22 43 61 6c 6c 65 64 20 74 6f 20 intf("Called to
0d80: 6c 6f 63 6b 20 28 6e 3d 25 69 20 6f 66 20 25 69 lock (n=%i of %i
0d90: 29 22 2c 20 6e 2c 20 6c 6f 63 6b 73 43 6f 75 6e )", n, locksCoun
0da0: 74 29 3b 20 2a 2f 0a 09 09 54 63 6c 5f 4d 75 74 t); */...Tcl_Mut
0db0: 65 78 4c 6f 63 6b 28 26 6c 6f 63 6b 73 5b 6e 5d exLock(&locks[n]
0dc0: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f );..} else {.../
0dd0: 2a 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 * dprintf("Calle
0de0: 64 20 74 6f 20 75 6e 6c 6f 63 6b 20 28 6e 3d 25 d to unlock (n=%
0df0: 69 20 6f 66 20 25 69 29 22 2c 20 6e 2c 20 6c 6f i of %i)", n, lo
0e00: 63 6b 73 43 6f 75 6e 74 29 3b 20 2a 2f 0a 09 09 cksCount); */...
0e10: 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 Tcl_MutexUnlock(
0e20: 26 6c 6f 63 6b 73 5b 6e 5d 29 3b 0a 09 7d 0a 0a &locks[n]);..}..
0e30: 09 2f 2a 20 64 70 72 69 6e 74 66 28 22 52 65 74 ./* dprintf("Ret
0e40: 75 72 6e 69 6e 67 22 29 3b 20 2a 2f 0a 0a 09 72 urning"); */...r
0e50: 65 74 75 72 6e 3b 0a 09 66 69 6c 65 20 3d 20 66 eturn;..file = f
0e60: 69 6c 65 3b 0a 09 6c 69 6e 65 20 3d 20 6c 69 6e ile;..line = lin
0e70: 65 3b 0a 7d 0a 0a 75 6e 73 69 67 6e 65 64 20 6c e;.}..unsigned l
0e80: 6f 6e 67 20 43 72 79 70 74 6f 54 68 72 65 61 64 ong CryptoThread
0e90: 49 64 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 29 IdCallback(void)
0ea0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e {..unsigned lon
0eb0: 67 20 72 65 74 3b 0a 0a 09 64 70 72 69 6e 74 66 g ret;...dprintf
0ec0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 09 72 65 ("Called");...re
0ed0: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f t = (unsigned lo
0ee0: 6e 67 29 20 54 63 6c 5f 47 65 74 43 75 72 72 65 ng) Tcl_GetCurre
0ef0: 6e 74 54 68 72 65 61 64 28 29 3b 0a 0a 09 64 70 ntThread();...dp
0f00: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
0f10: 20 25 6c 75 22 2c 20 72 65 74 29 3b 0a 0a 09 72 %lu", ret);...r
0f20: 65 74 75 72 6e 28 72 65 74 29 3b 0a 7d 0a 23 65 eturn(ret);.}.#e
0f30: 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 53 4c 5f ndif /* OPENSSL_
0f40: 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 6e 64 69 THREADS */.#endi
0f50: 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 41 44 53 f /* TCL_THREADS
0f60: 20 2a 2f 0a 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d */..../*. *----
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0fb0: 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 *. * InfoCallba
0fc0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 6d 6f 6e 69 ck --. *. *.moni
0fd0: 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 tors SSL connect
0fe0: 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 ion process. *.
0ff0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
1000: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
1010: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
1020: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
1030: 69 6e 65 64 29 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ined). *--------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
1080: 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f static void.Info
1090: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 Callback(const S
10a0: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 SL *ssl, int whe
10b0: 72 65 2c 20 69 6e 74 20 72 65 74 29 0a 7b 0a 20 re, int ret).{.
10c0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
10d0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c tr = (State*)SSL
10e0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 _get_app_data((S
10f0: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 SL *)ssl);. T
1100: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a cl_Obj *cmdPtr;.
1110: 20 20 20 20 63 68 61 72 20 2a 6d 61 6a 6f 72 3b char *major;
1120: 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 char *minor;..
1130: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
1140: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
1150: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
1160: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
1170: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 ULL)..return;..
1180: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
1190: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
11a0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
11b0: 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 20 ;..#if 0. if
11c0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
11d0: 41 4c 45 52 54 29 20 7b 0a 09 73 65 76 20 3d 20 ALERT) {..sev =
11e0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 SSL_alert_type_s
11f0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b tring_long(ret);
1200: 0a 09 69 66 20 28 73 74 72 63 6d 70 28 20 73 65 ..if (strcmp( se
1210: 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d 30 29 20 v, "fatal")==0)
1220: 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 72 72 6f {./* Map to erro
1230: 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 5f 45 72 r */.. Tls_Er
1240: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 53 53 ror(statePtr, SS
1250: 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 30 29 29 L_ERROR(ssl, 0))
1260: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 ;.. return;..
1270: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 }. }.#endif.
1280: 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 if (where & S
1290: 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f SL_CB_HANDSHAKE_
12a0: 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 START) {..major
12b0: 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 = "handshake";..
12c0: 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 3b minor = "start";
12d0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
12e0: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 where & SSL_CB_H
12f0: 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b ANDSHAKE_DONE) {
1300: 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 ..major = "hands
1310: 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 hake";..minor =
1320: 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c "done";. } el
1330: 73 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65 20 se {..if (where
1340: 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 & SSL_CB_ALERT).
1350: 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 .major = "alert"
1360: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1370: 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 e & SSL_ST_CONNE
1380: 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e CT).major = "con
1390: 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 nect";..else if
13a0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f (where & SSL_ST_
13b0: 41 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d ACCEPT)..major =
13c0: 20 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 "accept";..else
13d0: 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e .....major = "un
13e0: 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 known";...if (wh
13f0: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 ere & SSL_CB_REA
1400: 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 D)..minor = "rea
1410: 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 d";..else if (wh
1420: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 ere & SSL_CB_WRI
1430: 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 TE)..minor = "wr
1440: 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 ite";..else if (
1450: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c where & SSL_CB_L
1460: 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c OOP)..minor = "l
1470: 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 oop";..else if (
1480: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 where & SSL_CB_E
1490: 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 XIT)..minor = "e
14a0: 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 xit";..else.....
14b0: 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e minor = "unknown
14c0: 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 ";. }.. Tc
14d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
14e0: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 lement( statePtr
14f0: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
1500: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
1510: 72 69 6e 67 4f 62 6a 28 20 22 69 6e 66 6f 22 2c ringObj( "info",
1520: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f -1));.. Tcl_
1530: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1540: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e ment( statePtr->
1550: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
1560: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
1570: 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43 68 ngObj( Tcl_GetCh
1580: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
1590: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20 29 tr->self), -1) )
15a0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
15b0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
15c0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
15d0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
15e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
15f0: 28 20 6d 61 6a 6f 72 2c 20 2d 31 29 20 29 3b 0a ( major, -1) );.
1600: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
1610: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 AppendElement( s
1620: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
1630: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 cmdPtr,.. Tc
1640: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 l_NewStringObj(
1650: 6d 69 6e 6f 72 2c 20 2d 31 29 20 29 3b 0a 0a 20 minor, -1) );..
1660: 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 28 if (where & (
1670: 53 53 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c 5f SSL_CB_LOOP|SSL_
1680: 43 42 5f 45 58 49 54 29 29 20 7b 0a 09 54 63 6c CB_EXIT)) {..Tcl
1690: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
16a0: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d ement( statePtr-
16b0: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c >interp, cmdPtr,
16c0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
16d0: 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 73 74 61 74 ingObj( SSL_stat
16e0: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 e_string_long(ss
16f0: 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20 20 20 7d l), -1) );. }
1700: 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 else if (where
1710: 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 & SSL_CB_ALERT)
1720: 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 {..const char *c
1730: 70 20 3d 20 28 63 68 61 72 20 2a 29 20 53 53 4c p = (char *) SSL
1740: 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 69 _alert_desc_stri
1750: 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 0a 09 ng_long(ret);...
1760: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1770: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 dElement( stateP
1780: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
1790: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
17a0: 53 74 72 69 6e 67 4f 62 6a 28 20 63 70 2c 20 2d StringObj( cp, -
17b0: 31 29 20 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 1) );. } else
17c0: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
17d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 ppendElement( st
17e0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
17f0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
1800: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 53 _NewStringObj( S
1810: 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f SL_state_string_
1820: 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 20 29 long(ssl), -1) )
1830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
1840: 50 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e Preserve( (Clien
1850: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d tData) statePtr-
1860: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 >interp);. Tc
1870: 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c 69 l_Preserve( (Cli
1880: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
1890: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 r);.. Tcl_Inc
18a0: 72 52 65 66 43 6f 75 6e 74 28 20 63 6d 64 50 74 rRefCount( cmdPt
18b0: 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 54 r);. (void) T
18c0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 73 74 61 cl_EvalObjEx(sta
18d0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 tePtr->interp, c
18e0: 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f mdPtr, TCL_EVAL_
18f0: 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 54 63 6c GLOBAL);. Tcl
1900: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 20 63 _DecrRefCount( c
1910: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c mdPtr);.. Tcl
1920: 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e _Release( (Clien
1930: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
1940: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
1950: 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 e( (ClientData)
1960: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1970: 29 3b 0a 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d );..}.../*. *---
1980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19c0: 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c . *. * VerifyCal
19d0: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d lback --. *. *.M
19e0: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74 onitors SSL cert
19f0: 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 ificate validati
1a00: 6f 6e 20 70 72 6f 63 65 73 73 2e 0a 20 2a 09 54 on process.. *.T
1a10: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 his is called wh
1a20: 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 enever a certifi
1a30: 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 cate is inspecte
1a40: 64 0a 20 2a 09 6f 72 20 64 65 63 69 64 65 64 20 d. *.or decided
1a50: 69 6e 76 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 invalid.. *. * R
1a60: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c esults:. *.A cal
1a70: 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 lback bound to t
1a80: 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 he socket may re
1a90: 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 turn one of:. *.
1aa0: 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 0...- the ce
1ab0: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 rtificate is dee
1ac0: 6d 65 64 20 69 6e 76 61 6c 69 64 0a 20 2a 09 20 med invalid. *.
1ad0: 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72 1...- the cer
1ae0: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d tificate is deem
1af0: 65 64 20 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 ed valid. *.
1b00: 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d 20 6e empty string.- n
1b10: 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65 72 74 o change to cert
1b20: 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 ificate validati
1b30: 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 on. *. * Side ef
1b40: 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 fects:. *.The er
1b50: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 r field of the c
1b60: 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 urrently operati
1b70: 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a ve State is set.
1b80: 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 *. to a string
1b90: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 describing the
1ba0: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 SSL negotiation
1bb0: 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 failure reason.
1bc0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c00: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
1c10: 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 int.VerifyCallba
1c20: 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f ck(int ok, X509_
1c30: 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 0a STORE_CTX *ctx).
1c40: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 {. Tcl_Obj *c
1c50: 6d 64 50 74 72 2c 20 2a 72 65 73 75 6c 74 3b 0a mdPtr, *result;.
1c60: 20 20 20 20 63 68 61 72 20 2a 65 72 72 53 74 72 char *errStr
1c70: 2c 20 2a 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 , *string;. i
1c80: 6e 74 20 6c 65 6e 67 74 68 3b 0a 20 20 20 20 53 nt length;. S
1c90: 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 SL *ssl..= (SS
1ca0: 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 L*)X509_STORE_CT
1cb0: 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63 74 X_get_ex_data(ct
1cc0: 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 x, SSL_get_ex_da
1cd0: 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 ta_X509_STORE_CT
1ce0: 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58 35 X_idx());. X5
1cf0: 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35 30 09 *cert..= X50
1d00: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 9_STORE_CTX_get_
1d10: 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 78 current_cert(ctx
1d20: 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 );. State *st
1d30: 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 2a atePtr.= (State*
1d40: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 )SSL_get_app_dat
1d50: 61 28 73 73 6c 29 3b 0a 20 20 20 20 69 6e 74 20 a(ssl);. int
1d60: 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 depth..= X509_ST
1d70: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f ORE_CTX_get_erro
1d80: 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 r_depth(ctx);.
1d90: 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 int err..= X50
1da0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 9_STORE_CTX_get_
1db0: 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 error(ctx);..
1dc0: 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 dprintf("Verify
1dd0: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 : %d", ok);..
1de0: 20 69 66 20 28 21 6f 6b 29 20 7b 0a 09 65 72 72 if (!ok) {..err
1df0: 53 74 72 20 3d 20 28 63 68 61 72 2a 29 58 35 30 Str = (char*)X50
1e00: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 9_verify_cert_er
1e10: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 3b ror_string(err);
1e20: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 65 . } else {..e
1e30: 72 72 53 74 72 20 3d 20 28 63 68 61 72 20 2a 29 rrStr = (char *)
1e40: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 0;. }.. if
1e50: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
1e60: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
1e70: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73 *)NULL) {..if (s
1e80: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 tatePtr->vflags
1e90: 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 & SSL_VERIFY_FAI
1ea0: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 L_IF_NO_PEER_CER
1eb0: 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e T) {.. return
1ec0: 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 ok;..} else {..
1ed0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d return 1;..}
1ee0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 74 . }. cmdPt
1ef0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
1f00: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
1f10: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 allback);.. T
1f20: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1f30: 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 Element( statePt
1f40: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 r->interp, cmdPt
1f50: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1f60: 74 72 69 6e 67 4f 62 6a 28 20 22 76 65 72 69 66 tringObj( "verif
1f70: 79 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 y", -1));.. T
1f80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
1f90: 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 Element( statePt
1fa0: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 r->interp, cmdPt
1fb0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1fc0: 74 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 tringObj( Tcl_Ge
1fd0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
1fe0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
1ff0: 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 ) );.. Tcl_Li
2000: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2010: 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e nt( statePtr->in
2020: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
2030: 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a Tcl_NewIntObj
2040: 28 20 64 65 70 74 68 29 20 29 3b 0a 0a 20 20 20 ( depth) );..
2050: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2060: 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 ndElement( state
2070: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 Ptr->interp, cmd
2080: 50 74 72 2c 0a 09 20 20 20 20 54 6c 73 5f 4e 65 Ptr,.. Tls_Ne
2090: 77 58 35 30 39 4f 62 6a 28 20 73 74 61 74 65 50 wX509Obj( stateP
20a0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 65 72 74 tr->interp, cert
20b0: 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 ) );.. Tcl_Li
20c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
20d0: 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e nt( statePtr->in
20e0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
20f0: 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a Tcl_NewIntObj
2100: 28 20 6f 6b 29 20 29 3b 0a 0a 20 20 20 20 54 63 ( ok) );.. Tc
2110: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2120: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 lement( statePtr
2130: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 ->interp, cmdPtr
2140: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
2150: 72 69 6e 67 4f 62 6a 28 20 65 72 72 53 74 72 20 ringObj( errStr
2160: 3f 20 65 72 72 53 74 72 20 3a 20 22 22 2c 20 2d ? errStr : "", -
2170: 31 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 1) );.. Tcl_P
2180: 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 reserve( (Client
2190: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e Data) statePtr->
21a0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
21b0: 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 _Preserve( (Clie
21c0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
21d0: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 );.. statePtr
21e0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 ->flags |= TLS_T
21f0: 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20 CL_CALLBACK;..
2200: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
2210: 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 nt( cmdPtr);.
2220: 20 69 66 20 28 54 63 6c 5f 45 76 61 6c 4f 62 6a if (Tcl_EvalObj
2230: 45 78 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 Ex(statePtr->int
2240: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c erp, cmdPtr, TCL
2250: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 21 3d _EVAL_GLOBAL) !=
2260: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 49 TCL_OK) {../* I
2270: 74 20 67 6f 74 20 61 6e 20 65 72 72 6f 72 20 2d t got an error -
2280: 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 reject the cert
2290: 69 66 69 63 61 74 65 2e 09 09 2a 2f 0a 09 54 63 ificate...*/..Tc
22a0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
22b0: 72 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 r( statePtr->int
22c0: 65 72 70 29 3b 0a 09 6f 6b 20 3d 20 30 3b 0a 20 erp);..ok = 0;.
22d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 } else {..res
22e0: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a ult = Tcl_GetObj
22f0: 52 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d Result(statePtr-
2300: 3e 69 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e >interp);..strin
2310: 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e g = Tcl_GetStrin
2320: 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c gFromObj(result,
2330: 20 26 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 &length);../* A
2340: 6e 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c n empty result l
2350: 65 61 76 65 73 20 76 65 72 69 66 69 63 61 74 69 eaves verificati
2360: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f on unchanged..*/
2370: 0a 09 69 66 20 28 73 74 72 69 6e 67 20 21 3d 20 ..if (string !=
2380: 4e 55 4c 4c 20 26 26 20 6c 65 6e 67 74 68 20 3e NULL && length >
2390: 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28 54 0) {.. if (T
23a0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
23b0: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 (statePtr->inter
23c0: 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 p, result, &ok)
23d0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 54 != TCL_OK) {...T
23e0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 cl_BackgroundErr
23f0: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 or(statePtr->int
2400: 65 72 70 29 3b 0a 09 09 6f 6b 20 3d 20 30 3b 0a erp);...ok = 0;.
2410: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a . }..}. }.
2420: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2430: 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a ount( cmdPtr);..
2440: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c statePtr->fl
2450: 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c ags &= ~(TLS_TCL
2460: 5f 43 41 4c 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 _CALLBACK);..
2470: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 43 Tcl_Release( (C
2480: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
2490: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 Ptr);. Tcl_Re
24a0: 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74 44 61 lease( (ClientDa
24b0: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e ta) statePtr->in
24c0: 74 65 72 70 29 3b 0a 0a 20 20 20 20 72 65 74 75 terp);.. retu
24d0: 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 rn(ok);./* By de
24e0: 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 fault, leave ver
24f0: 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e ification unchan
2500: 67 65 64 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 ged..*/.}.../*.
2510: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2550: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 ----. *. * Tls_E
2560: 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 rror --. *. *.Ca
2570: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 lls callback wit
2580: 68 20 24 66 64 20 61 6e 64 20 24 6d 73 67 20 2d h $fd and $msg -
2590: 20 73 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b so the callback
25a0: 20 63 61 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 can decide. *.w
25b0: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 65 hat to do with e
25c0: 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 rrors.. *. * Sid
25d0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 e effects:. *.Th
25e0: 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 e err field of t
25f0: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 he currently ope
2600: 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 rative State is
2610: 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 set. *. to a st
2620: 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 ring describing
2630: 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 the SSL negotiat
2640: 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 ion failure reas
2650: 6f 6e 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d on. *-----------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2690: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
26a0: 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 d.Tls_Error(Stat
26b0: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 e *statePtr, cha
26c0: 72 20 2a 6d 73 67 29 0a 7b 0a 20 20 20 20 54 63 r *msg).{. Tc
26d0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 0a l_Obj *cmdPtr;..
26e0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
26f0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 led");.. if (
2700: 6d 73 67 20 26 26 20 2a 6d 73 67 29 20 7b 0a 09 msg && *msg) {..
2710: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
2720: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 (statePtr->inter
2730: 70 2c 20 22 53 53 4c 22 2c 20 6d 73 67 2c 20 28 p, "SSL", msg, (
2740: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 char *)NULL);.
2750: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6d 73 67 20 } else {..msg
2760: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 = Tcl_GetString(
2770: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_GetObjResult
2780: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 (statePtr->inter
2790: 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 p));. }. s
27a0: 74 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d tatePtr->err = m
27b0: 73 67 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 sg;.. if (sta
27c0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
27d0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
27e0: 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 L) {..char buf[B
27f0: 55 46 53 49 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 UFSIZ];..sprintf
2800: 28 62 75 66 2c 20 22 53 53 4c 20 63 68 61 6e 6e (buf, "SSL chann
2810: 65 6c 20 5c 22 25 73 5c 22 3a 20 65 72 72 6f 72 el \"%s\": error
2820: 3a 20 25 73 22 2c 0a 09 20 20 20 20 54 63 6c 5f : %s",.. Tcl_
2830: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
2840: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
2850: 6d 73 67 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65 msg);..Tcl_SetRe
2860: 73 75 6c 74 28 20 73 74 61 74 65 50 74 72 2d 3e sult( statePtr->
2870: 69 6e 74 65 72 70 2c 20 62 75 66 2c 20 54 43 4c interp, buf, TCL
2880: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 09 54 63 6c _VOLATILE);..Tcl
2890: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 _BackgroundError
28a0: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ( statePtr->inte
28b0: 72 70 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 rp);..return;.
28c0: 20 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d }. cmdPtr =
28d0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
28e0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c j(statePtr->call
28f0: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f back);.. Tcl_
2900: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2910: 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 ment(statePtr->i
2920: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
2930: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
2940: 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 gObj("error", -1
2950: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 ));.. Tcl_Lis
2960: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2970: 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 t(statePtr->inte
2980: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 rp, cmdPtr,..
2990: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
29a0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c j(Tcl_GetChannel
29b0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
29c0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 elf), -1));..
29d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
29e0: 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 ndElement(stateP
29f0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 tr->interp, cmdP
2a00: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
2a10: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d StringObj(msg, -
2a20: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 1));.. Tcl_Pr
2a30: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
2a40: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e ta) statePtr->in
2a50: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 terp);. Tcl_P
2a60: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
2a70: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a ata) statePtr);.
2a80: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
2a90: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
2aa0: 20 20 20 69 66 20 28 54 63 6c 5f 45 76 61 6c 4f if (Tcl_EvalO
2ab0: 62 6a 45 78 28 73 74 61 74 65 50 74 72 2d 3e 69 bjEx(statePtr->i
2ac0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2ad0: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 CL_EVAL_GLOBAL)
2ae0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 != TCL_OK) {..Tc
2af0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f l_BackgroundErro
2b00: 72 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 r(statePtr->inte
2b10: 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 rp);. }. T
2b20: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
2b30: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 cmdPtr);.. Tc
2b40: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
2b50: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
2b60: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 ;. Tcl_Releas
2b70: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
2b80: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 tatePtr->interp)
2b90: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2be0: 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 43 61 6c *. * PasswordCal
2bf0: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 lback --. *. *.C
2c00: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 alled when a pas
2c10: 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 sword is needed
2c20: 74 6f 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e to unpack RSA an
2c30: 64 20 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 d PEM keys.. *.E
2c40: 76 61 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 vals any bound p
2c50: 61 73 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 assword script a
2c60: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 nd returns the r
2c70: 65 73 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 esult as. *.the
2c80: 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e password string.
2c90: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cd0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 ------. */.#ifde
2ce0: 66 20 50 52 45 5f 4f 50 45 4e 53 53 4c 5f 30 5f f PRE_OPENSSL_0_
2cf0: 39 5f 34 0a 2f 2a 0a 20 2a 20 4e 6f 20 77 61 79 9_4./*. * No way
2d00: 20 74 6f 20 68 61 6e 64 6c 65 20 75 73 65 72 2d to handle user-
2d10: 64 61 74 61 20 74 68 65 72 65 66 6f 72 65 20 6e data therefore n
2d20: 6f 20 77 61 79 20 77 69 74 68 6f 75 74 20 61 20 o way without a
2d30: 67 6c 6f 62 61 6c 0a 20 2a 20 76 61 72 69 61 62 global. * variab
2d40: 6c 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 le to access the
2d50: 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 Tcl interpreter
2d60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a ..*/.static int.
2d70: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b PasswordCallback
2d80: 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 (char *buf, int
2d90: 73 69 7a 65 2c 20 69 6e 74 20 76 65 72 69 66 79 size, int verify
2da0: 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d ).{. return -
2db0: 31 3b 0a 20 20 20 20 09 62 75 66 20 3d 20 62 75 1;. .buf = bu
2dc0: 66 3b 0a 09 73 69 7a 65 20 3d 20 73 69 7a 65 3b f;..size = size;
2dd0: 0a 09 76 65 72 69 66 79 20 3d 20 76 65 72 69 66 ..verify = verif
2de0: 79 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74 61 74 69 y;.}.#else.stati
2df0: 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 c int.PasswordCa
2e00: 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 llback(char *buf
2e10: 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 , int size, int
2e20: 76 65 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 verify, void *ud
2e30: 61 74 61 29 0a 7b 0a 20 20 20 20 53 74 61 74 65 ata).{. State
2e40: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 *statePtr.= (St
2e50: 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 ate *) udata;.
2e60: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
2e70: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
2e80: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
2e90: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
2ea0: 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 0a 20 int result;..
2eb0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
2ec0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
2ed0: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
2ee0: 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 d == NULL) {..if
2ef0: 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 (Tcl_EvalEx(int
2f00: 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 erp, "tls::passw
2f10: 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 ord", -1, TCL_EV
2f20: 41 4c 5f 47 4c 4f 42 41 4c 29 0a 09 09 3d 3d 20 AL_GLOBAL)...==
2f30: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 TCL_OK) {.. c
2f40: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 har *ret = (char
2f50: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e *) Tcl_GetStrin
2f60: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b gResult(interp);
2f70: 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 .. strncpy(bu
2f80: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 f, ret, (size_t)
2f90: 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 size);.. ret
2fa0: 75 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 urn (int)strlen(
2fb0: 72 65 74 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a ret);..} else {.
2fc0: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
2fd0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d .}. }.. cm
2fe0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 dPtr = Tcl_Dupli
2ff0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 cateObj(statePtr
3000: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 0a 20 20 ->password);..
3010: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
3020: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
3030: 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 ePtr->interp);.
3040: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
3050: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
3060: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c tePtr);.. Tcl
3070: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
3080: 64 50 74 72 29 3b 0a 20 20 20 20 72 65 73 75 6c dPtr);. resul
3090: 74 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 t = Tcl_EvalObjE
30a0: 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 x(interp, cmdPtr
30b0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 , TCL_EVAL_GLOBA
30c0: 4c 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 L);. if (resu
30d0: 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a lt != TCL_OK) {.
30e0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 .Tcl_BackgroundE
30f0: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 69 rror(statePtr->i
3100: 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 nterp);. }.
3110: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
3120: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 nt(cmdPtr);..
3130: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c Tcl_Release((Cl
3140: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
3150: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c tr);. Tcl_Rel
3160: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 ease((ClientData
3170: 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ) statePtr->inte
3180: 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 rp);.. if (re
3190: 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 sult == TCL_OK)
31a0: 7b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 {..char *ret = (
31b0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 char *) Tcl_GetS
31c0: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 tringResult(inte
31d0: 72 70 29 3b 0a 09 73 74 72 6e 63 70 79 28 62 75 rp);..strncpy(bu
31e0: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 f, ret, (size_t)
31f0: 20 73 69 7a 65 29 3b 0a 09 72 65 74 75 72 6e 20 size);..return
3200: 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 (int)strlen(ret)
3210: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
3220: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d return -1;. }
3230: 0a 20 20 20 20 09 76 65 72 69 66 79 20 3d 20 76 . .verify = v
3240: 65 72 69 66 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a erify;.}.#endif.
3250: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
32a0: 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d CiphersObjCmd -
32b0: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 - list available
32c0: 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 ciphers. *. *.T
32d0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
32e0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
32f0: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 ess the "tls::ci
3300: 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 phers" command.
3310: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 *.to list availa
3320: 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 ble ciphers, bas
3330: 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c ed upon protocol
3340: 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a selected.. *. *
3350: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
3360: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
3370: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 lt list.. *. * S
3380: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
3390: 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 constructs and d
33a0: 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 estroys SSL cont
33b0: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d ext (CTX). *. *-
33c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3400: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
3410: 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 t.CiphersObjCmd(
3420: 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 clientData, inte
3430: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a rp, objc, objv).
3440: 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 ClientData c
3450: 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f lientData;./* No
3460: 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 t used. */. T
3470: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3480: 70 3b 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b p;. int objc;
3490: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f . Tcl_Obj.*co
34a0: 6e 73 74 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 nst objv[];.{.
34b0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 static const c
34c0: 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d har *protocols[]
34d0: 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 09 22 73 = {.."ssl2",."s
34e0: 73 6c 33 22 2c 09 22 74 6c 73 31 22 2c 09 22 74 sl3",."tls1",."t
34f0: 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22 ls1.1", "tls1.2"
3500: 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c , "tls1.3", NULL
3510: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 65 6e 75 6d . };. enum
3520: 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 09 54 4c 53 protocol {..TLS
3530: 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c _SSL2, TLS_SSL3,
3540: 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 TLS_TLS1, TLS_T
3550: 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f LS1_1, TLS_TLS1_
3560: 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 2, TLS_TLS1_3, T
3570: 4c 53 5f 4e 4f 4e 45 0a 20 20 20 20 7d 3b 0a 20 LS_NONE. };.
3580: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
3590: 74 72 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 tr;. SSL_CTX
35a0: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ctx = NULL;.
35b0: 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c SSL *ssl = NULL
35c0: 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 ;. STACK_OF(S
35d0: 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a SL_CIPHER) *sk;.
35e0: 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 char *cp, bu
35f0: 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 f[BUFSIZ];. i
3600: 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 nt index, verbos
3610: 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 e = 0;.. dpri
3620: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
3630: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
3640: 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 29 20 7b 0a || objc > 3) {.
3650: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
3660: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
3670: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 v, "protocol ?ve
3680: 72 62 6f 73 65 3f 22 29 3b 0a 09 72 65 74 75 72 rbose?");..retur
3690: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
36a0: 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 }. if (Tcl_G
36b0: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 20 etIndexFromObj(
36c0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c interp, objv[1],
36d0: 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f protocols, "pro
36e0: 74 6f 63 6f 6c 22 2c 20 30 2c 0a 09 26 69 6e 64 tocol", 0,..&ind
36f0: 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ex) != TCL_OK) {
3700: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
3710: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
3720: 20 28 6f 62 6a 63 20 3e 20 32 20 26 26 20 54 63 (objc > 2 && Tc
3730: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d l_GetBooleanFrom
3740: 4f 62 6a 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a Obj( interp, obj
3750: 76 5b 32 5d 2c 0a 09 26 76 65 72 62 6f 73 65 29 v[2],..&verbose)
3760: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
3770: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
3780: 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 . }. switc
3790: 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f h ((enum protoco
37a0: 6c 29 69 6e 64 65 78 29 20 7b 0a 20 20 20 20 63 l)index) {. c
37b0: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 ase TLS_SSL2:.#i
37c0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c f defined(NO_SSL
37d0: 32 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 2)...Tcl_AppendR
37e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 esult(interp, "p
37f0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
3800: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
3810: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
3820: 52 3b 0a 23 65 6c 73 65 0a 09 09 63 74 78 20 3d R;.#else...ctx =
3830: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c SSL_CTX_new(SSL
3840: 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 v2_method()); br
3850: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
3860: 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 case TLS_SSL3:.#
3870: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 if defined(NO_SS
3880: 4c 33 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 L3)...Tcl_Append
3890: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
38a0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
38b0: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
38c0: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
38d0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 63 74 78 20 OR;.#else...ctx
38e0: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 = SSL_CTX_new(SS
38f0: 4c 76 33 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 Lv3_method()); b
3900: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 reak;.#endif.
3910: 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a case TLS_TLS1:.
3920: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
3930: 4c 53 31 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e LS1)...Tcl_Appen
3940: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
3950: 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 "protocol not su
3960: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
3970: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
3980: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 63 74 78 ROR;.#else...ctx
3990: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 = SSL_CTX_new(T
39a0: 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 LSv1_method());
39b0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 break;.#endif.
39c0: 20 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f case TLS_TLS1_
39d0: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 1:.#if defined(N
39e0: 4f 5f 54 4c 53 31 5f 31 29 0a 09 09 54 63 6c 5f O_TLS1_1)...Tcl_
39f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
3a00: 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e erp, "protocol n
3a10: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
3a20: 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 ULL);...return T
3a30: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
3a40: 09 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f ..ctx = SSL_CTX_
3a50: 6e 65 77 28 54 4c 53 76 31 5f 31 5f 6d 65 74 68 new(TLSv1_1_meth
3a60: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 od()); break;.#e
3a70: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c ndif. case TL
3a80: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 S_TLS1_2:.#if de
3a90: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
3aa0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
3ab0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f ult(interp, "pro
3ac0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
3ad0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72 ted", NULL);...r
3ae0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
3af0: 0a 23 65 6c 73 65 0a 09 09 63 74 78 20 3d 20 53 .#else...ctx = S
3b00: 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 SL_CTX_new(TLSv1
3b10: 5f 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 _2_method()); br
3b20: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 eak;.#endif.
3b30: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a case TLS_TLS1_3:
3b40: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
3b50: 54 4c 53 31 5f 33 29 0a 09 09 54 63 6c 5f 41 70 TLS1_3)...Tcl_Ap
3b60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
3b70: 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 p, "protocol not
3b80: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
3b90: 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c L);...return TCL
3ba0: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 _ERROR;.#else...
3bb0: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 ctx = SSL_CTX_ne
3bc0: 77 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b w(TLS_method());
3bd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 break;.
3be0: 20 20 20 20 20 20 20 20 53 53 4c 5f 43 54 58 5f SSL_CTX_
3bf0: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 set_min_proto_ve
3c00: 72 73 69 6f 6e 20 28 63 74 78 2c 20 54 4c 53 31 rsion (ctx, TLS1
3c10: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 _3_VERSION);.
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 53 4c SSL
3c30: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f _CTX_set_max_pro
3c40: 74 6f 5f 76 65 72 73 69 6f 6e 20 28 63 74 78 2c to_version (ctx,
3c50: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 TLS1_3_VERSION)
3c60: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 ;.#endif. def
3c70: 61 75 6c 74 3a 0a 09 09 62 72 65 61 6b 3b 0a 20 ault:...break;.
3c80: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 74 78 }. if (ctx
3c90: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c == NULL) {..Tcl
3ca0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
3cb0: 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 terp, REASON(),
3cc0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
3cd0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
3ce0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 73 6c R;. }. ssl
3cf0: 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b = SSL_new(ctx);
3d00: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 . if (ssl ==
3d10: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
3d20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
3d30: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 , REASON(), (cha
3d40: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c r *) NULL);..SSL
3d50: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
3d60: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
3d70: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 62 6a R;. }. obj
3d80: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
3d90: 74 4f 62 6a 28 20 30 2c 20 4e 55 4c 4c 29 3b 0a tObj( 0, NULL);.
3da0: 0a 20 20 20 20 69 66 20 28 21 76 65 72 62 6f 73 . if (!verbos
3db0: 65 29 20 7b 0a 09 66 6f 72 20 28 69 6e 64 65 78 e) {..for (index
3dc0: 20 3d 20 30 3b 20 3b 20 69 6e 64 65 78 2b 2b 29 = 0; ; index++)
3dd0: 20 7b 0a 09 20 20 20 20 63 70 20 3d 20 28 63 68 {.. cp = (ch
3de0: 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 ar*)SSL_get_ciph
3df0: 65 72 5f 6c 69 73 74 28 20 73 73 6c 2c 20 69 6e er_list( ssl, in
3e00: 64 65 78 29 3b 0a 09 20 20 20 20 69 66 20 28 63 dex);.. if (c
3e10: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b p == NULL) break
3e20: 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f ;.. Tcl_ListO
3e30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3e40: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c interp, objPtr,
3e50: 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 ...Tcl_NewString
3e60: 4f 62 6a 28 20 63 70 2c 20 2d 31 29 20 29 3b 0a Obj( cp, -1) );.
3e70: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a .}. } else {.
3e80: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 .sk = SSL_get_ci
3e90: 70 68 65 72 73 28 73 73 6c 29 3b 0a 0a 09 66 6f phers(ssl);...fo
3ea0: 72 20 28 69 6e 64 65 78 20 3d 20 30 3b 20 69 6e r (index = 0; in
3eb0: 64 65 78 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 dex < sk_SSL_CIP
3ec0: 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 6e 64 HER_num(sk); ind
3ed0: 65 78 2b 2b 29 20 7b 0a 09 20 20 20 20 72 65 67 ex++) {.. reg
3ee0: 69 73 74 65 72 20 73 69 7a 65 5f 74 20 69 3b 0a ister size_t i;.
3ef0: 09 20 20 20 20 53 53 4c 5f 43 49 50 48 45 52 5f . SSL_CIPHER_
3f00: 64 65 73 63 72 69 70 74 69 6f 6e 28 20 73 6b 5f description( sk_
3f10: 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 SSL_CIPHER_value
3f20: 28 20 73 6b 2c 20 69 6e 64 65 78 29 2c 0a 09 09 ( sk, index),...
3f30: 09 09 20 20 20 20 62 75 66 2c 20 73 69 7a 65 6f .. buf, sizeo
3f40: 66 28 62 75 66 29 29 3b 0a 09 20 20 20 20 66 6f f(buf));.. fo
3f50: 72 20 28 69 20 3d 20 73 74 72 6c 65 6e 28 62 75 r (i = strlen(bu
3f60: 66 29 20 2d 20 31 3b 20 69 20 3b 20 69 2d 2d 29 f) - 1; i ; i--)
3f70: 20 7b 0a 09 09 69 66 20 28 62 75 66 5b 69 5d 20 {...if (buf[i]
3f80: 3d 3d 20 27 20 27 20 7c 7c 20 62 75 66 5b 69 5d == ' ' || buf[i]
3f90: 20 3d 3d 20 27 5c 6e 27 20 7c 7c 0a 09 09 20 20 == '\n' ||...
3fa0: 20 20 62 75 66 5b 69 5d 20 3d 3d 20 27 5c 72 27 buf[i] == '\r'
3fb0: 20 7c 7c 20 62 75 66 5b 69 5d 20 3d 3d 20 27 5c || buf[i] == '\
3fc0: 74 27 29 20 7b 0a 09 09 20 20 20 20 62 75 66 5b t') {... buf[
3fd0: 69 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 7d 20 65 i] = '\0';...} e
3fe0: 6c 73 65 20 7b 0a 09 09 20 20 20 20 62 72 65 61 lse {... brea
3ff0: 6b 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 k;...}.. }..
4000: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4010: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e 74 pendElement( int
4020: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 54 erp, objPtr,...T
4030: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
4040: 20 62 75 66 2c 20 2d 31 29 20 29 3b 0a 09 7d 0a buf, -1) );..}.
4050: 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 }. SSL_fr
4060: 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c ee(ssl);. SSL
4070: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
4080: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
4090: 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 6f esult( interp, o
40a0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 bjPtr);. retu
40b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 09 rn TCL_OK;. .
40c0: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
40d0: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
40e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4120: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 -----. *. * Hand
4130: 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 shakeObjCmd --.
4140: 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e *. *.This comman
4150: 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 d is used to ver
4160: 69 66 79 20 77 68 65 74 68 65 72 20 74 68 65 20 ify whether the
4170: 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d handshake is com
4180: 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e plete. *.or not.
4190: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
41a0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
41b0: 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e l result. 1 mean
41c0: 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 s handshake comp
41d0: 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 lete, 0 means pe
41e0: 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 nding.. *. * Sid
41f0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 e effects:. *.Ma
4200: 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f y force SSL nego
4210: 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 tiation to take
4220: 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d place.. *. *----
4230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4270: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 */..static int
4280: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 HandshakeObjCmd(
4290: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
42a0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
42b0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
42c0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
42d0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09 54 nst objv[]) {..T
42e0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
42f0: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c ../* The channel
4300: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
4310: 6e 2e 20 2a 2f 0a 09 53 74 61 74 65 20 2a 73 74 n. */..State *st
4320: 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 atePtr;../* clie
4330: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
4340: 20 73 6f 63 6b 65 74 20 2a 2f 0a 09 63 6f 6e 73 socket */..cons
4350: 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d t char *errStr =
4360: 20 4e 55 4c 4c 3b 0a 09 69 6e 74 20 72 65 74 20 NULL;..int ret
4370: 3d 20 31 3b 0a 09 69 6e 74 20 65 72 72 20 3d 20 = 1;..int err =
4380: 30 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43 61 0;...dprintf("Ca
4390: 6c 6c 65 64 22 29 3b 0a 0a 09 69 66 20 28 6f 62 lled");...if (ob
43a0: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 09 54 63 6c jc != 2) {...Tcl
43b0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
43c0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
43d0: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 09 72 65 74 channel");...ret
43e0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a urn(TCL_ERROR);.
43f0: 09 7d 0a 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f .}...chan = Tcl_
4400: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
4410: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
4420: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
4430: 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 ;..if (chan == (
4440: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
4450: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 54 43 L) {...return(TC
4460: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f L_ERROR);..}.../
4470: 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 *.. * Make sure
4480: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
4490: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
44a0: 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 l.. */..chan = T
44b0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
44c0: 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c (chan);..if (Tcl
44d0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
44e0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
44f0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 09 nnelType()) {...
4500: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
4510: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
4520: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
4530: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
4540: 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 an), "\": not a
4550: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
4560: 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 28 54 43 LL);...return(TC
4570: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 09 73 74 L_ERROR);..}..st
4580: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
4590: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c *)Tcl_GetChannel
45a0: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
45b0: 6e 29 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43 n);...dprintf("C
45c0: 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 alling Tls_WaitF
45d0: 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 09 72 65 orConnect");..re
45e0: 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 t = Tls_WaitForC
45f0: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c onnect(statePtr,
4600: 20 26 65 72 72 2c 20 31 29 3b 0a 09 64 70 72 69 &err, 1);..dpri
4610: 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 ntf("Tls_WaitFor
4620: 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 Connect returned
4630: 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 09 69 : %i", ret);...i
4640: 66 20 28 0a 09 20 20 20 20 72 65 74 20 3c 20 30 f (.. ret < 0
4650: 20 26 26 20 5c 0a 09 20 20 20 20 28 28 73 74 61 && \.. ((sta
4660: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
4670: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 LS_TCL_ASYNC) &&
4680: 20 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 0a err == EAGAIN).
4690: 09 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 .) {...dprintf("
46a0: 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 Async set and er
46b0: 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 09 r = EAGAIN");...
46c0: 72 65 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 ret = 0;..} else
46d0: 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a if (ret < 0) {.
46e0: 09 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 ..errStr = state
46f0: 50 74 72 2d 3e 65 72 72 3b 0a 09 09 54 63 6c 5f Ptr->err;...Tcl_
4700: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 ResetResult(inte
4710: 72 70 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 rp);...Tcl_SetEr
4720: 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 09 69 66 20 rno(err);....if
4730: 28 21 65 72 72 53 74 72 20 7c 7c 20 2a 65 72 72 (!errStr || *err
4740: 53 74 72 20 3d 3d 20 30 29 20 7b 0a 09 09 09 65 Str == 0) {....e
4750: 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 rrStr = Tcl_Posi
4760: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a xError(interp);.
4770: 09 09 7d 0a 0a 09 09 54 63 6c 5f 41 70 70 65 6e ..}....Tcl_Appen
4780: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
4790: 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 "handshake faile
47a0: 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 d: ", errStr, (c
47b0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
47c0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
47d0: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 ng TCL_ERROR wit
47e0: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c h handshake fail
47f0: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 ed: %s", errStr)
4800: 3b 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 ;...return(TCL_E
4810: 52 52 4f 52 29 3b 0a 09 7d 20 65 6c 73 65 20 7b RROR);..} else {
4820: 0a 09 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 ...if (err != 0)
4830: 20 7b 0a 09 09 09 64 70 72 69 6e 74 66 28 22 47 {....dprintf("G
4840: 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 ot an error with
4850: 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e a completed han
4860: 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 dshake: err = %i
4870: 22 2c 20 65 72 72 29 3b 0a 09 09 7d 0a 0a 09 09 ", err);...}....
4880: 72 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 64 70 ret = 1;..}...dp
4890: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
48a0: 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 TCL_OK with dat
48b0: 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b a \"%i\"", ret);
48c0: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
48d0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
48e0: 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a ewIntObj(ret));.
48f0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b .return(TCL_OK);
4900: 0a 0a 20 20 20 20 09 63 6c 69 65 6e 74 44 61 74 .. .clientDat
4910: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
4920: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
4970: 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d * ImportObjCmd -
4980: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
4990: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
49a0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 d to process the
49b0: 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 "ssl" command.
49c0: 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d *. *.The ssl com
49d0: 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 mand pushes SSL
49e0: 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f over a (newly co
49f0: 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 nnected) tcp soc
4a00: 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ket. *. * Result
4a10: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
4a20: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
4a30: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4a40: 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 . *.May modify t
4a50: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 he behavior of a
4a60: 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a n IO channel.. *
4a70: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ab0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
4ac0: 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a ic int.ImportObj
4ad0: 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 Cmd(clientData,
4ae0: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 interp, objc, ob
4af0: 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 jv). ClientDa
4b00: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f ta clientData;./
4b10: 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 * Not used. */.
4b20: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
4b30: 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f nterp;. int o
4b40: 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a bjc;. Tcl_Obj
4b50: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 3b 0a *const objv[];.
4b60: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
4b70: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
4b80: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
4b90: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 mode on. */.
4ba0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
4bb0: 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 ;../* client sta
4bc0: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 te for ssl socke
4bd0: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 t */. SSL_CTX
4be0: 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d 20 *ctx. =
4bf0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
4c00: 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 20 20 j *script.
4c10: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 = NULL;. Tc
4c20: 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 l_Obj *password.
4c30: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
4c40: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
4c50: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
4c60: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 slation, upperCh
4c70: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 annelBlocking, u
4c80: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
4c90: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ing, upperChanne
4ca0: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e lEOFChar;. in
4cb0: 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 t idx, len;.
4cc0: 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20 20 int flags..
4cd0: 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 = TLS_TCL_INI
4ce0: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 T;. int serve
4cf0: 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09 r.. = 0;.
4d00: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e /* is connection
4d10: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 incoming or out
4d20: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 going? */. ch
4d30: 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 ar *keyfile.
4d40: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
4d50: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20 char *certfile.
4d60: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
4d70: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
4d80: 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a *key .= NULL;.
4d90: 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 int key_len
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4db0: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 = 0;. unsigne
4dc0: 64 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 d char *cert
4dd0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
4de0: 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 int cert_len
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 = 0
4e00: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
4e10: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ers. = NU
4e20: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 LL;. char *CA
4e30: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e file. = N
4e40: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 ULL;. char *C
4e50: 41 64 69 72 09 09 20 20 20 20 20 20 20 20 3d 20 Adir.. =
4e60: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
4e70: 44 48 70 61 72 61 6d 73 09 20 20 20 20 20 20 20 DHparams.
4e80: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
4e90: 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 r *model..
4ea0: 20 20 3d 20 4e 55 4c 4c 3b 0a 23 69 66 6e 64 65 = NULL;.#ifnde
4eb0: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 f OPENSSL_NO_TLS
4ec0: 45 58 54 0a 20 20 20 20 63 68 61 72 20 2a 73 65 EXT. char *se
4ed0: 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20 20 rvername.
4ee0: 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 = NULL;./* host
4ef0: 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 name for Server
4f00: 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 Name Indication
4f10: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e */.#endif. in
4f20: 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 t ssl2 = 0, ssl3
4f30: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c = 0;. int tl
4f40: 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d s1 = 1, tls1_1 =
4f50: 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 1, tls1_2 = 1,
4f60: 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 tls1_3 = 1;.
4f70: 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 3b 0a 20 int proto = 0;.
4f80: 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 int verify =
4f90: 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 0, require = 0,
4fa0: 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a 20 20 request = 1;..
4fb0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
4fc0: 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 d");..#if define
4fd0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 d(NO_TLS1) && de
4fe0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
4ff0: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 && defined(NO_T
5000: 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 LS1_2) && define
5010: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 d(NO_SSL3) && !d
5020: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a efined(NO_SSL2).
5030: 20 20 20 20 73 73 6c 32 20 3d 20 31 3b 0a 23 65 ssl2 = 1;.#e
5040: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
5050: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66 (NO_TLS1) && def
5060: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
5070: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c && defined(NO_TL
5080: 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64 S1_2) && defined
5090: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 (NO_SSL2) && !de
50a0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 fined(NO_SSL3).
50b0: 20 20 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e ssl3 = 1;.#en
50c0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
50d0: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 NO_TLS1). tls
50e0: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 1 = 0;.#endif.#i
50f0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 f defined(NO_TLS
5100: 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 1_1). tls1_1
5110: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 = 0;.#endif.#if
5120: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
5130: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 2). tls1_2 =
5140: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 0;.#endif.#if de
5150: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 fined(NO_TLS1_3)
5160: 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b . tls1_3 = 0;
5170: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 .#endif.. if
5180: 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 (objc < 2) {..Tc
5190: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
51a0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
51b0: 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e "channel ?option
51c0: 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 s?");..return TC
51d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
51e0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
51f0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
5200: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 , Tcl_GetString(
5210: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b objv[1]), NULL);
5220: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
5230: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
5240: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
5250: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
5260: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d . /*. * M
5270: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
5280: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
5290: 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 st channel.
52a0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
52b0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
52c0: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 chan);.. for
52d0: 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 (idx = 2; idx <
52e0: 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 objc; idx++) {..
52f0: 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f char *opt = Tcl_
5300: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 GetString(objv[i
5310: 64 78 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b dx]);...if (opt[
5320: 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 0] != '-')..
5330: 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 53 54 52 28 break;...OPTSTR(
5340: 20 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 "-cadir", CAdir
5350: 29 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d 63 61 );..OPTSTR( "-ca
5360: 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a file", CAfile);.
5370: 09 4f 50 54 53 54 52 28 20 22 2d 63 65 72 74 66 .OPTSTR( "-certf
5380: 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b ile", certfile);
5390: 0a 09 4f 50 54 53 54 52 28 20 22 2d 63 69 70 68 ..OPTSTR( "-ciph
53a0: 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 er", ciphers);..
53b0: 4f 50 54 4f 42 4a 28 20 22 2d 63 6f 6d 6d 61 6e OPTOBJ( "-comman
53c0: 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 d", script);..OP
53d0: 54 53 54 52 28 20 22 2d 64 68 70 61 72 61 6d 73 TSTR( "-dhparams
53e0: 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f ", DHparams);..O
53f0: 50 54 53 54 52 28 20 22 2d 6b 65 79 66 69 6c 65 PTSTR( "-keyfile
5400: 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 ", keyfile);..OP
5410: 54 53 54 52 28 20 22 2d 6d 6f 64 65 6c 22 2c 20 TSTR( "-model",
5420: 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 model);..OPTOBJ(
5430: 20 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 "-password", pa
5440: 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f ssword);..OPTBOO
5450: 4c 28 20 22 2d 72 65 71 75 69 72 65 22 2c 20 72 L( "-require", r
5460: 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f equire);..OPTBOO
5470: 4c 28 20 22 2d 72 65 71 75 65 73 74 22 2c 20 72 L( "-request", r
5480: 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f equest);..OPTBOO
5490: 4c 28 20 22 2d 73 65 72 76 65 72 22 2c 20 73 65 L( "-server", se
54a0: 72 76 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 4f rver);.#ifndef O
54b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 PENSSL_NO_TLSEXT
54c0: 0a 20 20 20 20 20 20 20 20 4f 50 54 53 54 52 28 . OPTSTR(
54d0: 20 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 "-servername",
54e0: 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 23 65 6e servername);.#en
54f0: 64 69 66 0a 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 dif...OPTBOOL( "
5500: 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 -ssl2", ssl2);..
5510: 4f 50 54 42 4f 4f 4c 28 20 22 2d 73 73 6c 33 22 OPTBOOL( "-ssl3"
5520: 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f , ssl3);..OPTBOO
5530: 4c 28 20 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 L( "-tls1", tls1
5540: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 74 );..OPTBOOL( "-t
5550: 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b ls1.1", tls1_1);
5560: 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 74 6c 73 ..OPTBOOL( "-tls
5570: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 1.2", tls1_2);..
5580: 4f 50 54 42 4f 4f 4c 28 20 22 2d 74 6c 73 31 2e OPTBOOL( "-tls1.
5590: 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 20 20 4f 3", tls1_3);. O
55a0: 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 PTBYTE("-cert",
55b0: 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b cert, cert_len);
55c0: 0a 20 20 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 . OPTBYTE("-key
55d0: 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 ", key, key_len)
55e0: 3b 0a 0a 09 4f 50 54 42 41 44 28 20 22 6f 70 74 ;...OPTBAD( "opt
55f0: 69 6f 6e 22 2c 20 22 2d 63 61 64 69 72 2c 20 2d ion", "-cadir, -
5600: 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d cafile, -cert, -
5610: 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 certfile, -ciphe
5620: 72 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 r, -command, -dh
5630: 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b params, -key, -k
5640: 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 eyfile, -model,
5650: 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 65 71 75 -password, -requ
5660: 69 72 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d ire, -request, -
5670: 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e server, -servern
5680: 61 6d 65 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c ame, -ssl2, -ssl
5690: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 3, -tls1, -tls1.
56a0: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72 20 74 1, -tls1.2, or t
56b0: 6c 73 31 2e 33 22 29 3b 0a 0a 09 72 65 74 75 72 ls1.3");...retur
56c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
56d0: 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 }. if (reque
56e0: 73 74 29 09 20 20 20 20 76 65 72 69 66 79 20 7c st). verify |
56f0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 = SSL_VERIFY_CLI
5700: 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 ENT_ONCE | SSL_V
5710: 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 ERIFY_PEER;.
5720: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 if (request && r
5730: 65 71 75 69 72 65 29 20 76 65 72 69 66 79 20 7c equire) verify |
5740: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 = SSL_VERIFY_FAI
5750: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 L_IF_NO_PEER_CER
5760: 54 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 T;. if (verif
5770: 79 20 3d 3d 20 30 29 09 76 65 72 69 66 79 20 3d y == 0).verify =
5780: 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 SSL_VERIFY_NONE
5790: 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 ;.. proto |=
57a0: 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 (ssl2 ? TLS_PROT
57b0: 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 O_SSL2 : 0);.
57c0: 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 proto |= (ssl3
57d0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 ? TLS_PROTO_SSL3
57e0: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f : 0);. proto
57f0: 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f |= (tls1 ? TLS_
5800: 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b PROTO_TLS1 : 0);
5810: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 . proto |= (t
5820: 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 ls1_1 ? TLS_PROT
5830: 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 O_TLS1_1 : 0);.
5840: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 proto |= (tls
5850: 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 1_2 ? TLS_PROTO_
5860: 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 TLS1_2 : 0);.
5870: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f proto |= (tls1_
5880: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 3 ? TLS_PROTO_TL
5890: 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 S1_3 : 0);..
58a0: 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c /* reset to NULL
58b0: 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 if blank string
58c0: 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 provided */.
58d0: 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 if (cert && !*c
58e0: 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65 ert).. ce
58f0: 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c rt. = NUL
5900: 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 L;. if (key &
5910: 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 & !*key)..
5920: 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 key. =
5930: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 NULL;. if (ce
5940: 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 rtfile && !*cert
5950: 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 file) ce
5960: 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 rtfile.= NULL;.
5970: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 if (keyfile &
5980: 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 & !*keyfile)..ke
5990: 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 yfile. =
59a0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 NULL;. if (ci
59b0: 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 phers && !*ciphe
59c0: 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68 rs). ciph
59d0: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ers. = NU
59e0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 LL;. if (CAfi
59f0: 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 le && !*CAfile).
5a00: 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 CAfile.
5a10: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
5a20: 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26 20 if (CAdir &&
5a30: 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 20 !*CAdir).
5a40: 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20 3d CAdir. =
5a50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 NULL;. if (D
5a60: 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 Hparams && !*DHp
5a70: 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 arams). D
5a80: 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d Hparams =
5a90: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e NULL;.. /* n
5aa0: 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a ew SSL state */.
5ab0: 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 statePtr..=
5ac0: 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f (State *) ckallo
5ad0: 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a c((unsigned) siz
5ae0: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 eof(State));.
5af0: 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 memset(statePtr
5b00: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 , 0, sizeof(Stat
5b10: 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 e));.. stateP
5b20: 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 tr->flags.= flag
5b30: 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d s;. statePtr-
5b40: 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 >interp.= interp
5b50: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
5b60: 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b vflags.= verify;
5b70: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 . statePtr->e
5b80: 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a rr.= "";.. /*
5b90: 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 allocate script
5ba0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 */. if (scri
5bb0: 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 pt) {..(void) Tc
5bc0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
5bd0: 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 bj(script, &len)
5be0: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 ;..if (len) {..
5bf0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c statePtr->cal
5c00: 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a lback = script;.
5c10: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
5c20: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
5c30: 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 callback);..}.
5c40: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f }.. /* allo
5c50: 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f cate password */
5c60: 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 . if (passwor
5c70: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c d) {..(void) Tcl
5c80: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
5c90: 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e j(password, &len
5ca0: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
5cb0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 statePtr->pa
5cc0: 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 ssword = passwor
5cd0: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 d;.. Tcl_Incr
5ce0: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
5cf0: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d r->password);..}
5d00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
5d10: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b model != NULL) {
5d20: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 ..int mode;../*
5d30: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 Get the "model"
5d40: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e context */..chan
5d50: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
5d60: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c l(interp, model,
5d70: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 &mode);..if (ch
5d80: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an == (Tcl_Chann
5d90: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 el) NULL) {..
5da0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 Tls_Free((char
5db0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 *) statePtr);..
5dc0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
5dd0: 52 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20 20 20 20 ROR;..}..
5de0: 20 2f 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 4d /*. * M
5df0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
5e00: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
5e10: 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 st channel.
5e20: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 */. c
5e30: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
5e40: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 Channel(chan);..
5e50: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
5e60: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
5e70: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
5e80: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
5e90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
5ea0: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
5eb0: 5c 22 22 2c 0a 09 09 20 20 20 20 54 63 6c 5f 47 \"",... Tcl_G
5ec0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
5ed0: 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 an), "\": not a
5ee0: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 TLS channel", NU
5ef0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
5f00: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
5f10: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
5f20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
5f30: 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 ..ctx = ((State
5f40: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c *)Tcl_GetChannel
5f50: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 InstanceData(cha
5f60: 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 n))->ctx;. }
5f70: 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 else {..if ((ctx
5f80: 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 = CTX_Init(stat
5f90: 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 ePtr, server, pr
5fa0: 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 oto, keyfile, ce
5fb0: 72 74 66 69 6c 65 2c 20 6b 65 79 2c 0a 20 20 20 rtfile, key,.
5fc0: 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 20 cert, key_len,
5fd0: 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c cert_len, CAdir,
5fe0: 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 CAfile, ciphers
5ff0: 2c 0a 20 20 20 20 44 48 70 61 72 61 6d 73 29 29 ,. DHparams))
6000: 20 3d 3d 20 28 53 53 4c 5f 43 54 58 2a 29 30 29 == (SSL_CTX*)0)
6010: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 {.. Tls_Free
6020: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
6030: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
6040: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
6050: 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 }.. stateP
6060: 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a tr->ctx = ctx;..
6070: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 /*. * We
6080: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 need to make su
6090: 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e re that the chan
60a0: 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e nel works in bin
60b0: 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 ary (for the.
60c0: 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e * encryption n
60d0: 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 ot to get goofed
60e0: 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 up).. * We
60f0: 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a only want to adj
6100: 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e ust the bufferin
6110: 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e g in pre-v2 chan
6120: 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 nels, where.
6130: 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 * each channel
6140: 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 in the stack mai
6150: 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 ntained its own
6160: 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f buffers.. */
6170: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
6180: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
6190: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a elTranslation);.
61a0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
61b0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 nit(&upperChanne
61c0: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 lBlocking);.
61d0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
61e0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
61f0: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 Char);. Tcl_D
6200: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 StringInit(&uppe
6210: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
6220: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
6230: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
6240: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 rp, chan, "-eofc
6250: 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e har", &upperChan
6260: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
6270: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
6280: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
6290: 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c an, "-encoding",
62a0: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e &upperChannelEn
62b0: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c coding);. Tcl
62c0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
62d0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
62e0: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 "-translation",
62f0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 &upperChannelTra
6300: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 nslation);. T
6310: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
6320: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
6330: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 , "-blocking", &
6340: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
6350: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 king);. Tcl_S
6360: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
6370: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
6380: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 translation", "b
6390: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c inary");. Tcl
63a0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
63b0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
63c0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 "-blocking", "tr
63d0: 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 ue");. dprint
63e0: 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c f("Consuming Tcl
63f0: 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 channel %s", Tc
6400: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
6410: 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 (chan));. sta
6420: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 tePtr->self = Tc
6430: 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 l_StackChannel(i
6440: 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e nterp, Tls_Chann
6450: 65 6c 54 79 70 65 28 29 2c 20 73 74 61 74 65 50 elType(), stateP
6460: 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c tr, (TCL_READABL
6470: 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 E | TCL_WRITABLE
6480: 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 ), chan);. dp
6490: 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 rintf("Created c
64a0: 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 hannel named %s"
64b0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
64c0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
64d0: 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 elf));. if (s
64e0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d tatePtr->self ==
64f0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
6500: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e ULL) {../*.. * N
6510: 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 o use of Tcl_Eve
6520: 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 ntuallyFree beca
6530: 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 use no possible
6540: 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 Tcl_Preserve...
6550: 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 */..Tls_Free((ch
6560: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
6570: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
6580: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
6590: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
65a0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ion(interp, stat
65b0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 ePtr->self, "-tr
65c0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f anslation", Tcl_
65d0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 DStringValue(&up
65e0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c perChannelTransl
65f0: 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c ation));. Tcl
6600: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
6610: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
6620: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f tr->self, "-enco
6630: 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 ding", Tcl_DStri
6640: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
6650: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b annelEncoding));
6660: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
6670: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
6680: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
6690: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 , "-eofchar", Tc
66a0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
66b0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 upperChannelEOFC
66c0: 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 har));. Tcl_S
66d0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
66e0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
66f0: 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 ->self, "-blocki
6700: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 ng", Tcl_DString
6710: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
6720: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a nelBlocking));..
6730: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 /*. * SS
6740: 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e L Initialization
6750: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 74 . */.. st
6760: 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 atePtr->ssl = SS
6770: 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e L_new(statePtr->
6780: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 ctx);. if (!s
6790: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a tatePtr->ssl) {.
67a0: 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 ./* SSL library
67b0: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 error */..Tcl_Ap
67c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
67d0: 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e p, "couldn't con
67e0: 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 struct ssl sessi
67f0: 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c on: ", REASON(),
6800: 0a 09 09 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ...(char *) NULL
6810: 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 );..Tls_Free((ch
6820: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
6830: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
6840: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 OR;. }..#ifnd
6850: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ef OPENSSL_NO_TL
6860: 53 45 58 54 0a 20 20 20 20 69 66 20 28 73 65 72 SEXT. if (ser
6870: 76 65 72 6e 61 6d 65 29 20 7b 0a 20 20 20 20 20 vername) {.
6880: 20 20 20 69 66 20 28 21 53 53 4c 5f 73 65 74 5f if (!SSL_set_
6890: 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 tlsext_host_name
68a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
68b0: 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 servername) && r
68c0: 65 71 75 69 72 65 29 20 7b 0a 20 20 20 20 20 20 equire) {.
68d0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 Tcl_Append
68e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
68f0: 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 setting TLS host
6900: 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 name extension
6910: 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20 20 20 failed",.
6920: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a (char *
6930: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 ) NULL);.
6940: 20 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 Tls_Free((c
6950: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
6960: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 ;. re
6970: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6980: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a }. }.
6990: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 0a 20 #endif.. /*.
69a0: 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 * SSL Callba
69b0: 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 cks. */..
69c0: 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 SSL_set_app_dat
69d0: 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c a(statePtr->ssl,
69e0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
69f0: 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 r);./* point bac
6a00: 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a 20 20 20 20 k to us */..
6a10: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 SSL_set_verify(s
6a20: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 tatePtr->ssl, ve
6a30: 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c rify, VerifyCall
6a40: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 53 53 4c 5f back);.. SSL_
6a50: 43 54 58 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c CTX_set_info_cal
6a60: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e lback(statePtr->
6a70: 63 74 78 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 ctx, InfoCallbac
6a80: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 k);.. /* Crea
6a90: 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 te Tcl_Channel B
6aa0: 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 IO Handler */.
6ab0: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 statePtr->p_bi
6ac0: 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 o.= BIO_new_tcl(
6ad0: 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f statePtr, BIO_NO
6ae0: 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 CLOSE);. stat
6af0: 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f ePtr->bio.= BIO_
6b00: 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 new(BIO_f_ssl())
6b10: 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 ;.. if (serve
6b20: 72 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e r) {..statePtr->
6b30: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c flags |= TLS_TCL
6b40: 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 _SERVER;..SSL_se
6b50: 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 t_accept_state(s
6b60: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
6b70: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 53 53 4c } else {..SSL
6b80: 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 _set_connect_sta
6b90: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
6ba0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c );. }. SSL
6bb0: 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 _set_bio(statePt
6bc0: 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 r->ssl, statePtr
6bd0: 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 ->p_bio, statePt
6be0: 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 r->p_bio);. B
6bf0: 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 IO_set_ssl(state
6c00: 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 Ptr->bio, stateP
6c10: 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 tr->ssl, BIO_NOC
6c20: 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 LOSE);.. /*.
6c30: 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c * End of SSL
6c40: 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 Init. */.
6c50: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 dprintf("Retur
6c60: 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 ning %s", Tcl_Ge
6c70: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
6c80: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 tePtr->self));.
6c90: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
6ca0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a (interp, (char *
6cb0: 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c ) Tcl_GetChannel
6cc0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 Name(statePtr->s
6cd0: 65 6c 66 29 2c 0a 09 20 20 20 20 54 43 4c 5f 56 elf),.. TCL_V
6ce0: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 OLATILE);. re
6cf0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 turn TCL_OK;.
6d00: 20 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 .clientData = c
6d10: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f lientData;.}.../
6d20: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e -------. *. * Un
6d70: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a importObjCmd --.
6d80: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
6d90: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
6da0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f to remove the to
6db0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 pmost channel fi
6dc0: 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 lter.. *. * Resu
6dd0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
6de0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
6df0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
6e00: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 s:. *.May modify
6e10: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 the behavior of
6e20: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a an IO channel..
6e30: 20 2a 0a 20 2a 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 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
6e80: 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 atic int.Unimpor
6e90: 74 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 tObjCmd(clientDa
6ea0: 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 ta, interp, objc
6eb0: 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 , objv). Clie
6ec0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
6ed0: 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 a;./* Not used.
6ee0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 */. Tcl_Inter
6ef0: 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 p *interp;. i
6f00: 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c nt objc;. Tcl
6f10: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
6f20: 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 [];.{. Tcl_Ch
6f30: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
6f40: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
6f50: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
6f60: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
6f70: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
6f80: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
6f90: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
6fa0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
6fb0: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
6fc0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6fd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e . }.. chan
6fe0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
6ff0: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
7000: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
7010: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
7020: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
7030: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
7040: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7050: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
7060: 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 * Make sure
7070: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
7080: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
7090: 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 el. */. c
70a0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
70b0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a Channel(chan);..
70c0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
70d0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
70e0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
70f0: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
7100: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7110: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
7120: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
7130: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
7140: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 ."\": not a TLS
7150: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 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 0a 20 20 20 20 69 OR;. }.. i
7180: 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 f (Tcl_UnstackCh
7190: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 annel(interp, ch
71a0: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 an) == TCL_ERROR
71b0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
71c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
71d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
71e0: 0a 20 20 20 20 09 63 6c 69 65 6e 74 44 61 74 61 . .clientData
71f0: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d = clientData;.}
7200: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
7210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
7250: 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f * CTX_Init -- co
7260: 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 nstruct a SSL_CT
7270: 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a X instance. *. *
7280: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 Results:. *.A v
7290: 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 alid SSL_CTX ins
72a0: 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 tance or NULL..
72b0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
72c0: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 s:. *.constructs
72d0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 SSL context (CT
72e0: 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d X). *. *--------
72f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
7330: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 .static SSL_CTX
7340: 2a 0a 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 *.CTX_Init(state
7350: 50 74 72 2c 20 69 73 53 65 72 76 65 72 2c 20 70 Ptr, isServer, p
7360: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 roto, keyfile, c
7370: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 ertfile, key, ce
7380: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 6b 65 79 rt,. key
7390: 5f 6c 65 6e 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 _len, cert_len,
73a0: 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 CAdir, CAfile, c
73b0: 69 70 68 65 72 73 2c 20 44 48 70 61 72 61 6d 73 iphers, DHparams
73c0: 29 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 ). State *sta
73d0: 74 65 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 69 tePtr;. int i
73e0: 73 53 65 72 76 65 72 3b 0a 20 20 20 20 69 6e 74 sServer;. int
73f0: 20 70 72 6f 74 6f 3b 0a 20 20 20 20 63 68 61 72 proto;. char
7400: 20 2a 6b 65 79 66 69 6c 65 3b 0a 20 20 20 20 63 *keyfile;. c
7410: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 3b 0a 20 har *certfile;.
7420: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
7430: 20 2a 6b 65 79 3b 0a 20 20 20 20 75 6e 73 69 67 *key;. unsig
7440: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 3b 0a ned char *cert;.
7450: 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 3b int key_len;
7460: 0a 20 20 20 20 69 6e 74 20 63 65 72 74 5f 6c 65 . int cert_le
7470: 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 64 n;. char *CAd
7480: 69 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 ir;. char *CA
7490: 66 69 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a file;. char *
74a0: 63 69 70 68 65 72 73 3b 0a 20 20 20 20 63 68 61 ciphers;. cha
74b0: 72 20 2a 44 48 70 61 72 61 6d 73 3b 0a 7b 0a 20 r *DHparams;.{.
74c0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
74d0: 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 nterp = statePtr
74e0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 ->interp;. SS
74f0: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c L_CTX *ctx = NUL
7500: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 L;. Tcl_DStri
7510: 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 ng ds;. Tcl_D
7520: 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 String ds1;.
7530: 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 int off = 0;.
7540: 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 int load_privat
7550: 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 e_key;. const
7560: 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 SSL_METHOD *met
7570: 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 hod;.. dprint
7580: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
7590: 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a if (!proto) {.
75a0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
75b0: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 t(interp, "no va
75c0: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c lid protocol sel
75d0: 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 ected", NULL);..
75e0: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
75f0: 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 *)0;. }..
7600: 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f /* create SSL co
7610: 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 64 65 66 ntext */.#if def
7620: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 20 ined(NO_SSL2).
7630: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
7640: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 oto, TLS_PROTO_S
7650: 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 SL2)) {..Tcl_App
7660: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7670: 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 , "protocol not
7680: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
7690: 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f );..return (SSL_
76a0: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 CTX *)0;. }.#
76b0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
76c0: 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 d(NO_SSL3). i
76d0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f f (ENABLED(proto
76e0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 , TLS_PROTO_SSL3
76f0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
7700: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
7710: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
7720: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
7730: 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 .return (SSL_CTX
7740: 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 *)0;. }.#end
7750: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
7760: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 O_TLS1). if (
7770: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
7780: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 LS_PROTO_TLS1))
7790: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
77a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f ult(interp, "pro
77b0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
77c0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
77d0: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
77e0: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0;. }.#endif.
77f0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
7800: 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 LS1_1). if (E
7810: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
7820: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 S_PROTO_TLS1_1))
7830: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
7840: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 sult(interp, "pr
7850: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
7860: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 rted", NULL);..r
7870: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a eturn (SSL_CTX *
7880: 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 )0;. }.#endif
7890: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
78a0: 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 TLS1_2). if (
78b0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 ENABLED(proto, T
78c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 LS_PROTO_TLS1_2)
78d0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
78e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 esult(interp, "p
78f0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
7900: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
7910: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 return (SSL_CTX
7920: 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 *)0;. }.#endi
7930: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
7940: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
7950: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
7960: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
7970: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
7980: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
7990: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
79a0: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
79b0: 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 .return (SSL_CTX
79c0: 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 *)0;. }.#end
79d0: 69 66 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 if.. switch (
79e0: 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 21 64 65 proto) {.#if !de
79f0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 fined(NO_SSL2).
7a00: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 case TLS_PROT
7a10: 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 O_SSL2:..method
7a20: 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64 20 28 = SSLv2_method (
7a30: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
7a40: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
7a50: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 O_SSL3). case
7a60: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a TLS_PROTO_SSL3:
7a70: 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 ..method = SSLv3
7a80: 5f 6d 65 74 68 6f 64 20 28 29 3b 0a 09 62 72 65 _method ();..bre
7a90: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
7aa0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
7ab0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
7ac0: 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f OTO_TLS1:..metho
7ad0: 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 d = TLSv1_method
7ae0: 20 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e ();..break;.#en
7af0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
7b00: 28 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 (NO_TLS1_1).
7b10: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
7b20: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_1:..method =
7b30: 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 20 TLSv1_1_method
7b40: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 ();..break;.#end
7b50: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
7b60: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 63 NO_TLS1_2). c
7b70: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
7b80: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_2:..method =
7b90: 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 20 28 TLSv1_2_method (
7ba0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 );..break;.#endi
7bb0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
7bc0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 O_TLS1_3). ca
7bd0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 se TLS_PROTO_TLS
7be0: 31 5f 33 3a 0a 20 20 20 20 20 20 20 20 2f 2a 0a 1_3:. /*.
7bf0: 20 20 20 20 20 20 20 20 20 2a 20 54 68 65 20 76 * The v
7c00: 65 72 73 69 6f 6e 20 72 61 6e 67 65 20 69 73 20 ersion range is
7c10: 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 65 6c 6f constrained belo
7c20: 77 2c 0a 20 20 20 20 20 20 20 20 20 2a 20 61 66 w,. * af
7c30: 74 65 72 20 74 68 65 20 63 6f 6e 74 65 78 74 20 ter the context
7c40: 69 73 20 63 72 65 61 74 65 64 2e 20 20 55 73 65 is created. Use
7c50: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 2a 20 the. *
7c60: 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 68 generic method h
7c70: 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 2a 2f ere.. */
7c80: 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d ..method = TLS_m
7c90: 65 74 68 6f 64 20 28 29 3b 0a 09 62 72 65 61 6b ethod ();..break
7ca0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 ;.#endif. def
7cb0: 61 75 6c 74 3a 0a 23 69 66 64 65 66 20 48 41 56 ault:.#ifdef HAV
7cc0: 45 5f 54 4c 53 5f 4d 45 54 48 4f 44 0a 20 20 20 E_TLS_METHOD.
7cd0: 20 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c method = TL
7ce0: 53 5f 6d 65 74 68 6f 64 20 28 29 3b 0a 23 65 6c S_method ();.#el
7cf0: 73 65 0a 20 20 20 20 20 20 20 20 6d 65 74 68 6f se. metho
7d00: 64 20 3d 20 53 53 4c 76 32 33 5f 6d 65 74 68 6f d = SSLv23_metho
7d10: 64 20 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 d ();.#endif.#if
7d20: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
7d30: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 2)..off |= (ENAB
7d40: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 LED(proto, TLS_P
7d50: 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 ROTO_SSL2) ? 0
7d60: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c : SSL_OP_NO_SSL
7d70: 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 v2);.#endif.#if
7d80: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 !defined(NO_SSL3
7d90: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
7da0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
7db0: 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 OTO_SSL3) ? 0
7dc0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 : SSL_OP_NO_SSLv
7dd0: 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 3);.#endif.#if !
7de0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
7df0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
7e00: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
7e10: 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a TO_TLS1) ? 0 :
7e20: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
7e30: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
7e40: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
7e50: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
7e60: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
7e70: 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 OTO_TLS1_1) ? 0
7e80: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 : SSL_OP_NO_TLSv
7e90: 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 1_1);.#endif.#if
7ea0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
7eb0: 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 1_2)..off |= (EN
7ec0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
7ed0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f _PROTO_TLS1_2) ?
7ee0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 0 : SSL_OP_NO_T
7ef0: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a LSv1_2);.#endif.
7f00: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
7f10: 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 TLS1_3)..off |=
7f20: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
7f30: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 TLS_PROTO_TLS1_3
7f40: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e ) ? 0 : SSL_OP_N
7f50: 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 O_TLSv1_3);.#end
7f60: 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d if..break;. }
7f70: 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f .. ctx = SSL_
7f80: 43 54 58 5f 6e 65 77 20 28 6d 65 74 68 6f 64 29 CTX_new (method)
7f90: 3b 0a 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 ;.. if (!ctx)
7fa0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 {. retur
7fb0: 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a n(NULL);. }..
7fc0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
7fd0: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 TLS1_3). if (
7fe0: 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f proto == TLS_PRO
7ff0: 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 20 20 20 TO_TLS1_3) {.
8000: 20 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 SSL_CTX_set
8010: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _min_proto_versi
8020: 6f 6e 20 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f on (ctx, TLS1_3_
8030: 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 20 20 VERSION);.
8040: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 SSL_CTX_set_ma
8050: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 20 x_proto_version
8060: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 (ctx, TLS1_3_VER
8070: 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e SION);. }.#en
8080: 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 dif.. SSL_CTX
8090: 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 20 63 _set_app_data( c
80a0: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 tx, (void*)inter
80b0: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 p);./* remember
80c0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
80d0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 */. SSL_CTX_s
80e0: 65 74 5f 6f 70 74 69 6f 6e 73 28 20 63 74 78 2c et_options( ctx,
80f0: 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a SSL_OP_ALL);./*
8100: 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 all SSL bug wor
8110: 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 karounds */.
8120: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
8130: 6f 6e 73 28 20 63 74 78 2c 20 6f 66 66 29 3b 09 ons( ctx, off);.
8140: 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 /* all SSL bug w
8150: 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 orkarounds */.
8160: 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 SSL_CTX_sess_s
8170: 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 20 63 et_cache_size( c
8180: 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 69 tx, 128);.. i
8190: 66 20 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 f (ciphers != NU
81a0: 4c 4c 29 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 LL)..SSL_CTX_set
81b0: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 _cipher_list(ctx
81c0: 2c 20 63 69 70 68 65 72 73 29 3b 0a 0a 20 20 20 , ciphers);..
81d0: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c /* set some cal
81e0: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 lbacks */. SS
81f0: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
8200: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c t_passwd_cb(ctx,
8210: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 PasswordCallbac
8220: 6b 29 3b 0a 0a 23 69 66 6e 64 65 66 20 42 53 41 k);..#ifndef BSA
8230: 46 45 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 FE. SSL_CTX_s
8240: 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 et_default_passw
8250: 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 d_cb_userdata(ct
8260: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 x, (void *)state
8270: 50 74 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 Ptr);.#endif..
8280: 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 /* read a Diff
8290: 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d ie-Hellman param
82a0: 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 eters file, or u
82b0: 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 se the built-in
82c0: 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 one */.#ifdef OP
82d0: 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 ENSSL_NO_DH.
82e0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 if (DHparams !=
82f0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
8300: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
8310: 2c 0a 09 20 20 20 20 22 44 48 20 70 61 72 61 6d ,.. "DH param
8320: 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 eter support not
8330: 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 available", (ch
8340: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 ar *) NULL);..SS
8350: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
8360: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 ..return (SSL_CT
8370: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6c X *)0;. }.#el
8380: 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 se. {..DH* dh
8390: 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 ;..if (DHparams
83a0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
83b0: 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 BIO *bio;.. T
83c0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
83d0: 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 ds);.. bio =
83e0: 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e BIO_new_file(F2N
83f0: 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c (DHparams, &ds),
8400: 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 "r");.. if (
8410: 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 !bio) {...Tcl_DS
8420: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
8430: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
8440: 6c 74 28 69 6e 74 65 72 70 2c 0a 09 09 20 20 20 lt(interp,...
8450: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 "Could not find
8460: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 DH parameters f
8470: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ile", (char *) N
8480: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f ULL);...SSL_CTX_
8490: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 free(ctx);...ret
84a0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 urn (SSL_CTX *)0
84b0: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 ;.. }... d
84c0: 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f h = PEM_read_bio
84d0: 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e _DHparams(bio, N
84e0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 ULL, NULL, NULL)
84f0: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 ;.. BIO_free(
8500: 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 bio);.. Tcl_D
8510: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
8520: 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b .. if (!dh) {
8530: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 ...Tcl_AppendRes
8540: 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09 09 20 20 ult(interp,...
8550: 20 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 "Could not rea
8560: 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 d DH parameters
8570: 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 from file", (cha
8580: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
8590: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
85a0: 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 ...return (SSL_C
85b0: 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 TX *)0;.. }..
85c0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 } else {.. dh
85d0: 20 3d 20 67 65 74 5f 64 68 50 61 72 61 6d 73 28 = get_dhParams(
85e0: 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 );..}..SSL_CTX_s
85f0: 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 et_tmp_dh(ctx, d
8600: 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29 h);..DH_free(dh)
8610: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a ;. }.#endif..
8620: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 /* set our c
8630: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 ertificate */.
8640: 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b load_private_k
8650: 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 ey = 0;. if (
8660: 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c certfile != NULL
8670: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 ) {..load_privat
8680: 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c e_key = 1;...Tcl
8690: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
86a0: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 );...if (SSL_CTX
86b0: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 _use_certificate
86c0: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 20 _file(ctx, F2N(
86d0: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 0a certfile, &ds),.
86e0: 09 09 09 09 09 53 53 4c 5f 46 49 4c 45 54 59 50 .....SSL_FILETYP
86f0: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 E_PEM) <= 0) {..
8700: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
8710: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
8720: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8730: 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20 20 interp,....
8740: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 "unable to set c
8750: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 ertificate file
8760: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 ", certfile, ":
8770: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f ",.... REASO
8780: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
8790: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
87a0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
87b0: 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 return (SSL_CT
87c0: 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 X *)0;..}. }
87d0: 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d else if (cert !=
87e0: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 NULL) {..load_p
87f0: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a rivate_key = 1;.
8800: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
8810: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e _certificate_ASN
8820: 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 1(ctx, cert_len,
8830: 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 cert) <= 0) {..
8840: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
8850: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
8860: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8870: 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20 20 interp,....
8880: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 "unable to set c
8890: 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 ertificate: ",..
88a0: 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c .. REASON(),
88b0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
88c0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
88d0: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
88e0: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 turn (SSL_CTX *)
88f0: 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 0;..}. } else
8900: 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 {..certfile = (
8910: 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 char*)X509_get_d
8920: 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 efault_cert_file
8930: 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 ();...if (SSL_CT
8940: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 X_use_certificat
8950: 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 e_file(ctx, cert
8960: 66 69 6c 65 2c 0a 09 09 09 09 09 53 53 4c 5f 46 file,......SSL_F
8970: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 ILETYPE_PEM) <=
8980: 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 0) {.#if 0..
8990: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
89a0: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 &ds);.. Tcl_A
89b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
89c0: 72 70 2c 0a 09 09 09 20 20 20 20 20 22 75 6e 61 rp,.... "una
89d0: 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 ble to use defau
89e0: 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 lt certificate f
89f0: 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c ile ", certfile,
8a00: 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 ": ",.... R
8a10: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
8a20: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 ) NULL);.. SS
8a30: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
8a40: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 .. return (SS
8a50: 4c 5f 43 54 58 20 2a 29 30 3b 0a 23 65 6e 64 69 L_CTX *)0;.#endi
8a60: 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 f..}. }..
8a70: 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 /* set our priva
8a80: 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 te key */. if
8a90: 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b (load_private_k
8aa0: 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 ey) {..if (keyfi
8ab0: 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 le == NULL && ke
8ac0: 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 y == NULL) {..
8ad0: 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 keyfile = cert
8ae0: 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b file;..}...if (k
8af0: 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 eyfile != NULL)
8b00: 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 {.. /* get th
8b10: 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 e private key as
8b20: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 sociated with th
8b30: 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 2a is certificate *
8b40: 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 /.. if (keyfi
8b50: 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 le == NULL) {...
8b60: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 keyfile = certfi
8b70: 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 le;.. }...
8b80: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 if (SSL_CTX_use
8b90: 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 _PrivateKey_file
8ba0: 28 63 74 78 2c 20 46 32 4e 28 20 6b 65 79 66 69 (ctx, F2N( keyfi
8bb0: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 le, &ds), SSL_FI
8bc0: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
8bd0: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
8be0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a gFree(&ds);.../*
8bf0: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
8c00: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
8c10: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
8c20: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
8c30: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
8c40: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
8c50: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
8c60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
8c70: 0a 09 09 09 20 20 20 20 20 20 20 20 20 22 75 6e .... "un
8c80: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c able to set publ
8c90: 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b ic key file ", k
8ca0: 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 eyfile, " ",....
8cb0: 20 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 REASON(
8cc0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
8cd0: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
8ce0: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
8cf0: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 (SSL_CTX *)0;..
8d00: 20 20 20 20 7d 0a 0a 09 20 20 20 20 54 63 6c 5f }... Tcl_
8d10: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
8d20: 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 ;..} else if (ke
8d30: 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 y != NULL) {..
8d40: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 if (SSL_CTX_us
8d50: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e e_PrivateKey_ASN
8d60: 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 1(EVP_PKEY_RSA,
8d70: 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e ctx, key,key_len
8d80: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f ) <= 0) {...Tcl_
8d90: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
8da0: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 ;.../* flush the
8db0: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 passphrase whic
8dc0: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 h might be left
8dd0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f in the result */
8de0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
8df0: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 (interp, NULL, T
8e00: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 CL_STATIC);...Tc
8e10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
8e20: 6e 74 65 72 70 2c 0a 09 09 20 20 20 20 20 20 20 nterp,...
8e30: 20 20 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c "unabl
8e40: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 e to set public
8e50: 6b 65 79 3a 20 22 2c 0a 09 09 20 20 20 20 20 20 key: ",...
8e60: 20 20 20 20 20 20 20 20 20 20 20 52 45 41 53 4f REASO
8e70: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
8e80: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 LL);...SSL_CTX_f
8e90: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 ree(ctx);...retu
8ea0: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b rn (SSL_CTX *)0;
8eb0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e .. }..}../* N
8ec0: 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 ow we know that
8ed0: 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 a key and cert h
8ee0: 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 ave been set aga
8ef0: 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c inst.. * the SSL
8f00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 context */..if
8f10: 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f (!SSL_CTX_check_
8f20: 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 private_key(ctx)
8f30: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
8f40: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
8f50: 2c 0a 09 09 09 20 20 20 20 20 22 70 72 69 76 61 ,.... "priva
8f60: 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 te key does not
8f70: 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 match the certif
8f80: 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 icate public key
8f90: 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 ",.... (char
8fa0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
8fb0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
8fc0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 );.. return (
8fd0: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a SSL_CTX *)0;..}.
8fe0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
8ff0: 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 43 t verification C
9000: 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 As */. Tcl_DS
9010: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a tringInit(&ds);.
9020: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 Tcl_DStringI
9030: 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 69 nit(&ds1);. i
9040: 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 f (!SSL_CTX_load
9050: 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e _verify_location
9060: 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c s(ctx, F2N(CAfil
9070: 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64 e, &ds), F2N(CAd
9080: 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 ir, &ds1)) ||..!
9090: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
90a0: 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 ult_verify_paths
90b0: 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 (ctx)) {.#if 0..
90c0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
90d0: 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 &ds);..Tcl_DStri
90e0: 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f ngFree(&ds1);../
90f0: 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c * Don't currentl
9100: 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20 66 y care if this f
9110: 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 ails */..Tcl_App
9120: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
9130: 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76 , "SSL default v
9140: 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c 0a erify paths: ",.
9150: 09 09 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 ..REASON(), (cha
9160: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c r *) NULL);..SSL
9170: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
9180: 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 .return (SSL_CTX
9190: 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 *)0;.#endif.
91a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 }.. /* https
91b0: 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e ://sourceforge.n
91c0: 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 et/p/tls/bugs/57
91d0: 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a / */. /* XXX:
91e0: 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 TODO: Let the us
91f0: 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 er supply values
9200: 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 here instead of
9210: 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 something that
9220: 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 exists on the fi
9230: 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 lesystem */.
9240: 69 66 20 28 20 43 41 66 69 6c 65 20 21 3d 20 4e if ( CAfile != N
9250: 55 4c 4c 20 29 20 7b 0a 20 20 20 20 20 20 20 20 ULL ) {.
9260: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 STACK_OF(X509_NA
9270: 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d ME) *certNames =
9280: 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 SSL_load_client
9290: 5f 43 41 5f 66 69 6c 65 28 20 46 32 4e 28 43 41 _CA_file( F2N(CA
92a0: 66 69 6c 65 2c 20 26 64 73 29 20 29 3b 0a 09 69 file, &ds) );..i
92b0: 66 20 28 20 63 65 72 74 4e 61 6d 65 73 20 21 3d f ( certNames !=
92c0: 20 4e 55 4c 4c 20 29 20 7b 0a 09 20 20 20 20 53 NULL ) {.. S
92d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
92e0: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 t_CA_list(ctx, c
92f0: 65 72 74 4e 61 6d 65 73 20 29 3b 0a 09 7d 0a 20 ertNames );..}.
9300: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
9310: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
9320: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
9330: 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 ree(&ds1);. r
9340: 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f eturn ctx;.}.../
9350: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9390: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 -------. *. * St
93a0: 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 atusObjCmd -- re
93b0: 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 turn certificate
93c0: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 for connected p
93d0: 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c eer.. *. * Resul
93e0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
93f0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
9400: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
9410: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
9420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9460: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
9470: 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 nt.StatusObjCmd(
9480: 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 clientData, inte
9490: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a rp, objc, objv).
94a0: 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 ClientData c
94b0: 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f lientData;./* No
94c0: 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 t used. */. T
94d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
94e0: 70 3b 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b p;. int objc;
94f0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f . Tcl_Obj.*co
9500: 6e 73 74 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 nst objv[];.{.
9510: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
9520: 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 r;. X509 *pee
9530: 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a r;. Tcl_Obj *
9540: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f objPtr;. Tcl_
9550: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 Channel chan;.
9560: 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e char *channelN
9570: 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 ame, *ciphers;.
9580: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 0a 20 20 int mode;..
9590: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
95a0: 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 d");.. switch
95b0: 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 65 20 (objc) {..case
95c0: 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 6c 4e 2:.. channelN
95d0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ame = Tcl_GetStr
95e0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 09 20 ing(objv[1]);..
95f0: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 break;...case
9600: 20 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 3:.. if (!st
9610: 72 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 rcmp (Tcl_GetStr
9620: 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 ing (objv[1]), "
9630: 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 -local")) {...ch
9640: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f annelName = Tcl_
9650: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 GetString(objv[2
9660: 5d 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 ]);...break;..
9670: 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65 }.. /* else
9680: 20 66 61 6c 6c 2e 2e 2e 20 2a 2f 0a 09 64 65 66 fall... */..def
9690: 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57 ault:.. Tcl_W
96a0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
96b0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d rp, 1, objv, "?-
96c0: 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 local? channel")
96d0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
96e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
96f0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
9700: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
9710: 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 , channelName, &
9720: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 mode);. if (c
9730: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
9740: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
9750: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9760: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 }. /*.
9770: 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f * Make sure to
9780: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
9790: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a topmost channel.
97a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e */. chan
97b0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
97c0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
97d0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
97e0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
97f0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
9800: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
9810: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
9820: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
9830: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
9840: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 ame(chan),..."\"
9850: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e : not a TLS chan
9860: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 nel", NULL);..re
9870: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9880: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
9890: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 tr = (State *) T
98a0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
98b0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b tanceData(chan);
98c0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d . if (objc ==
98d0: 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 2) {..peer = SS
98e0: 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 L_get_peer_certi
98f0: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d ficate(statePtr-
9900: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 >ssl);. } els
9910: 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f e {..peer = SSL_
9920: 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 get_certificate(
9930: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
9940: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 65 }. if (pe
9950: 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 er) {..objPtr =
9960: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 Tls_NewX509Obj(i
9970: 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 nterp, peer);..i
9980: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 20 f (objc == 2) {
9990: 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b X509_free(peer);
99a0: 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a }. } else {.
99b0: 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 .objPtr = Tcl_Ne
99c0: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c wListObj(0, NULL
99d0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 );. }.. Tc
99e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
99f0: 6c 65 6d 65 6e 74 20 28 69 6e 74 65 72 70 2c 20 lement (interp,
9a00: 6f 62 6a 50 74 72 2c 0a 09 20 20 20 20 54 63 6c objPtr,.. Tcl
9a10: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 20 28 22 _NewStringObj ("
9a20: 73 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20 sbits", -1));.
9a30: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
9a40: 65 6e 64 45 6c 65 6d 65 6e 74 20 28 69 6e 74 65 endElement (inte
9a50: 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 20 20 20 rp, objPtr,..
9a60: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 20 28 Tcl_NewIntObj (
9a70: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 SSL_get_cipher_b
9a80: 69 74 73 20 28 73 74 61 74 65 50 74 72 2d 3e 73 its (statePtr->s
9a90: 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 sl, NULL)));..
9aa0: 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 ciphers = (cha
9ab0: 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 r*)SSL_get_ciphe
9ac0: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 r(statePtr->ssl)
9ad0: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 ;. if (cipher
9ae0: 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 73 74 72 s != NULL && str
9af0: 63 6d 70 28 63 69 70 68 65 72 73 2c 20 22 28 4e cmp(ciphers, "(N
9b00: 4f 4e 45 29 22 29 21 3d 30 29 20 7b 0a 09 54 63 ONE)")!=0) {..Tc
9b10: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
9b20: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
9b30: 62 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 bjPtr,...Tcl_New
9b40: 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 StringObj("ciphe
9b50: 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c r", -1));..Tcl_L
9b60: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
9b70: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ent(interp, objP
9b80: 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 tr,...Tcl_NewStr
9b90: 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 ingObj(SSL_get_c
9ba0: 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e ipher(statePtr->
9bb0: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ssl), -1));.
9bc0: 7d 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f }.. Tcl_ListO
9bd0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
9be0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a interp, objPtr,.
9bf0: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 .Tcl_NewStringOb
9c00: 6a 28 22 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 j("version", -1)
9c10: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
9c20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
9c30: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a interp, objPtr,.
9c40: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 .Tcl_NewStringOb
9c50: 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f j(SSL_get_versio
9c60: 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 n(statePtr->ssl)
9c70: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c , -1));.. Tcl
9c80: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 20 69 _SetObjResult( i
9c90: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
9ca0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
9cb0: 4b 3b 0a 20 20 20 20 09 63 6c 69 65 6e 74 44 61 K;. .clientDa
9cc0: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
9cd0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
9ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
9d20: 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d . * VersionObjCm
9d30: 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 d -- return vers
9d40: 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 ion string from
9d50: 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 OpenSSL.. *. * R
9d60: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
9d70: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
9d80: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
9d90: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
9da0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
9db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9de0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
9df0: 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 ic int.VersionOb
9e00: 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c jCmd(clientData,
9e10: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f interp, objc, o
9e20: 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 bjv). ClientD
9e30: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 ata clientData;.
9e40: 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a /* Not used. */.
9e50: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
9e60: 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 interp;. int
9e70: 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 objc;. Tcl_Ob
9e80: 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 3b j.*const objv[];
9e90: 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a .{. Tcl_Obj *
9ea0: 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 objPtr;.. dpr
9eb0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
9ec0: 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 . objPtr = Tc
9ed0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f l_NewStringObj(O
9ee0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 PENSSL_VERSION_T
9ef0: 45 58 54 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 EXT, -1);.. T
9f00: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
9f10: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
9f20: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
9f30: 4f 4b 3b 0a 20 20 20 20 09 63 6c 69 65 6e 74 44 OK;. .clientD
9f40: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
9f50: 3b 0a 20 20 20 20 09 6f 62 6a 63 20 3d 20 6f 62 ;. .objc = ob
9f60: 6a 63 3b 0a 20 20 20 20 09 6f 62 6a 76 20 3d 20 jc;. .objv =
9f70: 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d objv;.}.../*. *-
9f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9fa0: 2d 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 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a --. *. * MiscObj
9fd0: 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d Cmd -- misc comm
9fe0: 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ands. *. * Resul
9ff0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
a000: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
a010: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
a020: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
a030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a070: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
a080: 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 63 6c nt.MiscObjCmd(cl
a090: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 ientData, interp
a0a0: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 , objc, objv).
a0b0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ClientData cli
a0c0: 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 entData;./* Not
a0d0: 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c used. */. Tcl
a0e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b _Interp *interp;
a0f0: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 . int objc;.
a100: 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e 73 Tcl_Obj.*cons
a110: 74 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 t objv[];.{.
a120: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
a130: 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d r *commands [] =
a140: 20 7b 20 22 72 65 71 22 2c 20 4e 55 4c 4c 20 7d { "req", NULL }
a150: 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 ;. enum comma
a160: 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 44 55 nd { C_REQ, C_DU
a170: 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 MMY };. int c
a180: 6d 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 md;.. dprintf
a190: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
a1a0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b if (objc < 2) {
a1b0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
a1c0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
a1d0: 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 jv, "subcommand
a1e0: 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 ?args?");..retur
a1f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
a200: 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 }. if (Tcl_G
a210: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 etIndexFromObj(i
a220: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 nterp, objv[1],
a230: 63 6f 6d 6d 61 6e 64 73 2c 0a 09 20 20 20 20 22 commands,.. "
a240: 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63 6d 64 command", 0,&cmd
a250: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
a260: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a270: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 ;. }.. swi
a280: 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 tch ((enum comma
a290: 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 nd) cmd) {..case
a2a0: 20 43 5f 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 C_REQ: {.. E
a2b0: 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 VP_PKEY *pkey=NU
a2c0: 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 LL;.. X509 *c
a2d0: 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 ert=NULL;.. X
a2e0: 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 509_NAME *name=N
a2f0: 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 ULL;.. Tcl_Ob
a300: 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 j **listv;..
a310: 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 int listc,i;...
a320: 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c BIO *out=NULL
a330: 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f ;... char *k_
a340: 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b C="",*k_ST="",*k
a350: 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b _L="",*k_O="",*k
a360: 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c _OU="",*k_CN="",
a370: 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 *k_Email="";..
a380: 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a char *keyout,*
a390: 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 pemout,*str;..
a3a0: 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 int keysize,se
a3b0: 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b rial=0,days=365;
a3c0: 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 ... if ((objc
a3d0: 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 <5) || (objc>6))
a3e0: 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 {...Tcl_WrongNu
a3f0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c mArgs(interp, 2,
a400: 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 objv, "keysize
a410: 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 keyfile certfile
a420: 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 ?info?");...ret
a430: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
a440: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 }... if (
a450: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
a460: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 j(interp, objv[2
a470: 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 ], &keysize) !=
a480: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 TCL_OK) {...retu
a490: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
a4a0: 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 }.. keyout
a4b0: 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f =Tcl_GetString(o
a4c0: 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 bjv[3]);.. pe
a4d0: 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 mout=Tcl_GetStri
a4e0: 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 09 20 ng(objv[4]);...
a4f0: 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 if (objc>=6)
a500: 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 {...if (Tcl_List
a510: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 ObjGetElements(i
a520: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a nterp, objv[5],.
a530: 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 ...&listc, &list
a540: 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a v) != TCL_OK) {.
a550: 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
a560: 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 _ERROR;...}....i
a570: 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 f ((listc%2) !=
a580: 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 0) {... Tcl_S
a590: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
a5a0: 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 "Information lis
a5b0: 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e t must have even
a5c0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d number of argum
a5d0: 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ents",NULL);...
a5e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
a5f0: 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 ROR;...}...for (
a600: 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b i=0; i<listc; i+
a610: 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d =2) {... str=
a620: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
a630: 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 stv[i]);... i
a640: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 f (strcmp(str,"d
a650: 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 ays")==0) {....i
a660: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
a670: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 mObj(interp,list
a680: 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 v[i+1],&days)!=T
a690: 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 CL_OK).... re
a6a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
a6b0: 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
a6c0: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 (strcmp(str,"ser
a6d0: 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 ial")==0) {....i
a6e0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
a6f0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 mObj(interp,list
a700: 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 v[i+1],&serial)!
a710: 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 =TCL_OK)....
a720: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a730: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
a740: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 f (strcmp(str,"s
a750: 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 erial")==0) {...
a760: 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 .if (Tcl_GetIntF
a770: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 romObj(interp,li
a780: 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c stv[i+1],&serial
a790: 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 )!=TCL_OK)....
a7a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
a7b0: 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 OR;... } else
a7c0: 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
a7d0: 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "C")==0) {....k_
a7e0: 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 C=Tcl_GetString(
a7f0: 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
a800: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
a810: 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d rcmp(str,"ST")==
a820: 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 0) {....k_ST=Tcl
a830: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
a840: 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
a850: 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
a860: 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 str,"L")==0) {..
a870: 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 ..k_L=Tcl_GetStr
a880: 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
a890: 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
a8a0: 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 (strcmp(str,"O"
a8b0: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 )==0) {....k_O=T
a8c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
a8d0: 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
a8e0: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
a8f0: 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 p(str,"OU")==0)
a900: 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 {....k_OU=Tcl_Ge
a910: 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
a920: 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
a930: 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
a940: 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 ,"CN")==0) {....
a950: 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 k_CN=Tcl_GetStri
a960: 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
a970: 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
a980: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 (strcmp(str,"Ema
a990: 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f il")==0) {....k_
a9a0: 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 Email=Tcl_GetStr
a9b0: 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
a9c0: 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ... } else {.
a9d0: 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
a9e0: 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e (interp,"Unknown
a9f0: 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c parameter",NULL
aa00: 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c );....return TCL
aa10: 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a _ERROR;... }.
aa20: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ..}.. }..
aa30: 69 66 20 28 28 70 6b 65 79 20 3d 20 45 56 50 5f if ((pkey = EVP_
aa40: 50 4b 45 59 5f 6e 65 77 28 29 29 20 21 3d 20 4e PKEY_new()) != N
aa50: 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 21 45 56 ULL) {...if (!EV
aa60: 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 P_PKEY_assign_RS
aa70: 41 28 70 6b 65 79 2c 0a 09 09 09 52 53 41 5f 67 A(pkey,....RSA_g
aa80: 65 6e 65 72 61 74 65 5f 6b 65 79 28 6b 65 79 73 enerate_key(keys
aa90: 69 7a 65 2c 20 30 78 31 30 30 30 31 2c 20 4e 55 ize, 0x10001, NU
aaa0: 4c 4c 2c 20 4e 55 4c 4c 29 29 29 20 7b 0a 09 09 LL, NULL))) {...
aab0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
aac0: 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
aad0: 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 generating priva
aae0: 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 te key",NULL);..
aaf0: 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 . EVP_PKEY_fr
ab00: 65 65 28 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 ee(pkey);...
ab10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
ab20: 3b 0a 09 09 7d 0a 09 09 6f 75 74 3d 42 49 4f 5f ;...}...out=BIO_
ab30: 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 new(BIO_s_file()
ab40: 29 3b 0a 09 09 42 49 4f 5f 77 72 69 74 65 5f 66 );...BIO_write_f
ab50: 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f ilename(out,keyo
ab60: 75 74 29 3b 0a 09 09 50 45 4d 5f 77 72 69 74 65 ut);...PEM_write
ab70: 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 _bio_PrivateKey(
ab80: 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 out,pkey,NULL,NU
ab90: 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b LL,0,NULL,NULL);
aba0: 0a 09 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 ...BIO_free_all(
abb0: 6f 75 74 29 3b 0a 0a 09 09 69 66 20 28 28 63 65 out);....if ((ce
abc0: 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d rt=X509_new())==
abd0: 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 NULL) {... Tc
abe0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
abf0: 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 rp,"Error genera
ac00: 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 ting certificate
ac10: 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b request",NULL);
ac20: 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f ... EVP_PKEY_
ac30: 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 20 20 free(pkey);...
ac40: 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 return(TCL_ERR
ac50: 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 OR);...}....X509
ac60: 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 _set_version(cer
ac70: 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 t,2);...ASN1_INT
ac80: 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 EGER_set(X509_ge
ac90: 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 t_serialNumber(c
aca0: 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 ert),serial);...
acb0: 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 X509_gmtime_adj(
acc0: 58 35 30 39 5f 67 65 74 5f 6e 6f 74 42 65 66 6f X509_get_notBefo
acd0: 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 re(cert),0);...X
ace0: 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 509_gmtime_adj(X
acf0: 35 30 39 5f 67 65 74 5f 6e 6f 74 41 66 74 65 72 509_get_notAfter
ad00: 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a (cert),(long)60*
ad10: 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 60*24*days);...X
ad20: 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 509_set_pubkey(c
ad30: 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 ert,pkey);....na
ad40: 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a me=X509_get_subj
ad50: 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a ect_name(cert);.
ad60: 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 ...X509_NAME_add
ad70: 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 _entry_by_txt(na
ad80: 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 me,"C", MBSTRING
ad90: 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 _ASC, (unsigned
ada0: 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c char *) k_C, -1,
adb0: 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
adc0: 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
add0: 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c y_txt(name,"ST",
ade0: 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 MBSTRING_ASC, (
adf0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
ae00: 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 k_ST, -1, -1, 0
ae10: 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
ae20: 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
ae30: 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 name,"L", MBSTRI
ae40: 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 NG_ASC, (unsigne
ae50: 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d d char *) k_L, -
ae60: 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
ae70: 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
ae80: 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 _by_txt(name,"O"
ae90: 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
aea0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
aeb0: 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 ) k_O, -1, -1, 0
aec0: 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 );...X509_NAME_a
aed0: 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 dd_entry_by_txt(
aee0: 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 name,"OU", MBSTR
aef0: 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e ING_ASC, (unsign
af00: 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c ed char *) k_OU,
af10: 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 -1, -1, 0);...X
af20: 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
af30: 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
af40: 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 CN", MBSTRING_AS
af50: 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 C, (unsigned cha
af60: 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d r *) k_CN, -1, -
af70: 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
af80: 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
af90: 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 txt(name,"Email"
afa0: 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
afb0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
afc0: 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d ) k_Email, -1, -
afd0: 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 1, 0);....X509_s
afe0: 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 et_subject_name(
aff0: 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 cert,name);....i
b000: 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 f (!X509_sign(ce
b010: 72 74 2c 70 6b 65 79 2c 45 56 50 5f 6d 64 35 28 rt,pkey,EVP_md5(
b020: 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 ))) {... X509
b030: 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 _free(cert);...
b040: 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 EVP_PKEY_free
b050: 28 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 54 63 (pkey);... Tc
b060: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
b070: 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e rp,"Error signin
b080: 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e g certificate",N
b090: 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 ULL);... retu
b0a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
b0b0: 7d 0a 0a 09 09 6f 75 74 3d 42 49 4f 5f 6e 65 77 }....out=BIO_new
b0c0: 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
b0d0: 09 09 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 ..BIO_write_file
b0e0: 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 name(out,pemout)
b0f0: 3b 0a 0a 09 09 50 45 4d 5f 77 72 69 74 65 5f 62 ;....PEM_write_b
b100: 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
b110: 29 3b 0a 09 09 42 49 4f 5f 66 72 65 65 5f 61 6c );...BIO_free_al
b120: 6c 28 6f 75 74 29 3b 0a 0a 09 09 58 35 30 39 5f l(out);....X509_
b130: 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 free(cert);...EV
b140: 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
b150: 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b );.. } else {
b160: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 ...Tcl_SetResult
b170: 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 (interp,"Error g
b180: 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 enerating privat
b190: 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 e key",NULL);...
b1a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
b1b0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 ;.. }..}..bre
b1c0: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
b1d0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 ..break;. }.
b1e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
b1f0: 3b 0a 20 20 20 20 09 63 6c 69 65 6e 74 44 61 74 ;. .clientDat
b200: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
b210: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
b220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
b260: 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 * Tls_Free --.
b270: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
b280: 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 ure cleans up wh
b290: 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 en a SSL socket
b2a0: 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a based channel. *
b2b0: 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 .is closed and i
b2c0: 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 ts reference cou
b2d0: 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 nt falls below 1
b2e0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
b2f0: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.none. *. * Si
b300: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
b310: 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 rees all the sta
b320: 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d te. *. *--------
b330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
b370: 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 20 63 void.Tls_Free( c
b380: 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 20 29 0a har *blockPtr ).
b390: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
b3a0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
b3b0: 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 )blockPtr;..
b3c0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
b3d0: 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 );.. Tls_Clea
b3e0: 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 n(statePtr);.
b3f0: 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 ckfree(blockPtr
b400: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
b410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
b450: 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 *. * Tls_Clean
b460: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
b470: 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 ocedure cleans u
b480: 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 p when a SSL soc
b490: 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
b4a0: 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 l. *.is closed a
b4b0: 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 nd its reference
b4c0: 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c count falls bel
b4d0: 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 ow 1. This shou
b4e0: 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 ld. *.be called
b4f0: 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 synchronously by
b500: 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 the CloseProc,
b510: 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 not in the. *.Ev
b520: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c entuallyFree cal
b530: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
b540: 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
b550: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
b560: 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
b570: 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
b580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b5c0: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 -. */.void Tls_C
b5d0: 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 lean(State *stat
b5e0: 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 ePtr) {. dpri
b5f0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
b600: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 /*. * we
b610: 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 're assuming her
b620: 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e e that we're sin
b630: 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 gle-threaded.
b640: 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 */. if (sta
b650: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 tePtr->timer !=
b660: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
b670: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 NULL) {..Tcl_De
b680: 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 leteTimerHandler
b690: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
b6a0: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 );..statePtr->ti
b6b0: 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 mer = NULL;.
b6c0: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
b6d0: 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 Ptr->bio) {../*
b6e0: 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 This will call S
b6f0: 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 SL_shutdown. Bug
b700: 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 1414045 */..dpr
b710: 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 intf("BIO_free_a
b720: 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 ll(%p)", statePt
b730: 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 r->bio);..BIO_fr
b740: 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d ee_all(statePtr-
b750: 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 >bio);..statePtr
b760: 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->bio = NULL;.
b770: 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
b780: 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 ePtr->ssl) {..dp
b790: 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 rintf("SSL_free(
b7a0: 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e %p)", statePtr->
b7b0: 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 ssl);..SSL_free(
b7c0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a statePtr->ssl);.
b7d0: 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d .statePtr->ssl =
b7e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
b7f0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
b800: 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 tx) {..SSL_CTX_f
b810: 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ree(statePtr->ct
b820: 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 x);..statePtr->c
b830: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d tx = NULL;. }
b840: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
b850: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 r->callback) {..
b860: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
b870: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 (statePtr->callb
b880: 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d ack);..statePtr-
b890: 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c >callback = NULL
b8a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
b8b0: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
b8c0: 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 rd) {..Tcl_DecrR
b8d0: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
b8e0: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 ->password);..st
b8f0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
b900: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a = NULL;. }..
b910: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
b920: 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a urning");.}.../*
b930: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
b940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b970: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
b980: 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 _Init --. *. *.T
b990: 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 his is a package
b9a0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 initialization
b9b0: 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 procedure, which
b9c0: 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 is called. *.by
b9d0: 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 Tcl when this p
b9e0: 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 ackage is to be
b9f0: 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 added to an inte
ba00: 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 rpreter.. *. * R
ba10: 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e esults: Ssl con
ba20: 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 figured and load
ba30: 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ed. *. * Side ef
ba40: 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 fects:. *. creat
ba50: 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e e the ssl comman
ba60: 64 2c 20 69 6e 69 74 69 61 6c 69 73 65 20 73 73 d, initialise ss
ba70: 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d l context. *. *-
ba80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ba90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
baa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bac0: 2d 2d 0a 20 2a 2f 0a 0a 44 4c 4c 45 58 50 4f 52 --. */..DLLEXPOR
bad0: 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 T int Tls_Init(T
bae0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
baf0: 70 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 p) {..const char
bb00: 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 tlsTclInitScrip
bb10: 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 t[] = {.#include
bb20: 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 20 20 20 "tls.tcl.h".
bb30: 20 20 20 20 20 20 20 20 20 30 78 30 30 0a 09 7d 0x00..}
bb40: 3b 0a 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e ;.. dprin
bb50: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 09 tf("Called");...
bb60: 2f 2a 0a 09 20 2a 20 57 65 20 6f 6e 6c 79 20 73 /*.. * We only s
bb70: 75 70 70 6f 72 74 20 54 63 6c 20 38 2e 34 20 6f upport Tcl 8.4 o
bb80: 72 20 6e 65 77 65 72 0a 09 20 2a 2f 0a 09 69 66 r newer.. */..if
bb90: 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 (.#ifdef USE_TC
bba0: 4c 5f 53 54 55 42 53 0a 09 20 20 20 20 54 63 6c L_STUBS.. Tcl
bbb0: 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 _InitStubs(inter
bbc0: 70 2c 20 22 38 2e 36 2d 22 2c 20 30 29 0a 23 65 p, "8.6-", 0).#e
bbd0: 6c 73 65 0a 09 20 20 20 20 54 63 6c 5f 50 6b 67 lse.. Tcl_Pkg
bbe0: 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 Require(interp,
bbf0: 22 54 63 6c 22 2c 20 22 38 2e 36 2d 22 2c 20 30 "Tcl", "8.6-", 0
bc00: 29 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 20 3d ).#endif.. =
bc10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 = NULL) {...retu
bc20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
bc30: 0a 0a 09 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 ...if (TlsLibIni
bc40: 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 t(0) != TCL_OK)
bc50: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {...Tcl_AppendRe
bc60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
bc70: 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 uld not initiali
bc80: 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c ze SSL library",
bc90: 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e NULL);...return
bca0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
bcb0: 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f .Tcl_CreateObjCo
bcc0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
bcd0: 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 ls::ciphers", Ci
bce0: 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c phersObjCmd, (Cl
bcf0: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
bd00: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
bd10: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 *) NULL);..Tcl_C
bd20: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
bd30: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 interp, "tls::ha
bd40: 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 ndshake", Handsh
bd50: 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 akeObjCmd, (Clie
bd60: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
bd70: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
bd80: 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 NULL);..Tcl_Cre
bd90: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
bda0: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f terp, "tls::impo
bdb0: 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d rt", ImportObjCm
bdc0: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
bdd0: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
bde0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
bdf0: 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f .Tcl_CreateObjCo
be00: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
be10: 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 ls::unimport", U
be20: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 nimportObjCmd, (
be30: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
be40: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
be50: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c c *) NULL);..Tcl
be60: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
be70: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
be80: 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f status", StatusO
be90: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
bea0: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
beb0: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
bec0: 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f L);..Tcl_CreateO
bed0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
bee0: 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 , "tls::version"
bef0: 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c , VersionObjCmd,
bf00: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
bf10: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
bf20: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 roc *) NULL);..T
bf30: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
bf40: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
bf50: 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a ::misc", MiscObj
bf60: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
bf70: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
bf80: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
bf90: 3b 0a 0a 09 69 66 20 28 69 6e 74 65 72 70 29 20 ;...if (interp)
bfa0: 7b 0a 09 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 {...Tcl_Eval(int
bfb0: 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 erp, tlsTclInitS
bfc0: 63 72 69 70 74 29 3b 0a 09 7d 0a 0a 09 72 65 74 cript);..}...ret
bfd0: 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76 69 urn(Tcl_PkgProvi
bfe0: 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 22 de(interp, "tls"
bff0: 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f , PACKAGE_VERSIO
c000: 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d N));.}../*. *---
c010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c040: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 ---*. *. *.Tls_S
c050: 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a afeInit --. *. *
c060: 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .---------------
c070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c090: 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 -*. *.Standard p
c0a0: 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 rocedure require
c0b0: 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 d by 'load'.. *.
c0c0: 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 Initializes this
c0d0: 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 extension for a
c0e0: 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 safe interprete
c0f0: 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d r.. *.----------
c100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c120: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 ------*. *. *.Si
c130: 64 65 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 deeffects:. *..A
c140: 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a s of 'Tls_Init'.
c150: 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a *. *.Result:. *
c160: 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c ..A standard Tcl
c170: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a error code.. *.
c180: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
c190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 44 --------*. */..D
c1c0: 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 LLEXPORT int Tls
c1d0: 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e _SafeInit(Tcl_In
c1e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a terp *interp) {.
c1f0: 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 .dprintf("Called
c200: 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 6c 73 5f ");..return(Tls_
c210: 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d Init(interp));.}
c220: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
c230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
c260: 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 *. *.TlsLibInit
c270: 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d --. *. *.-------
c280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e ---------*. *.In
c2b0: 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 itializes SSL li
c2c0: 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 brary once per a
c2d0: 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d pplication. *.--
c2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
c310: 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 *. *.Side effec
c320: 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 6c 69 7a ts:. *..initiliz
c330: 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 es SSL library.
c340: 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 *. *.Result:. *.
c350: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d .none. *. *-----
c360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c390: 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e -*. */.static in
c3a0: 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 t TlsLibInit(int
c3b0: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b uninitialize) {
c3c0: 0a 09 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 ..static int ini
c3d0: 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 09 69 tialized = 0;..i
c3e0: 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f nt status = TCL_
c3f0: 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 OK;.#if defined(
c400: 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
c410: 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
c420: 54 48 52 45 41 44 53 29 0a 09 73 69 7a 65 5f 74 THREADS)..size_t
c430: 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 num_locks;.#end
c440: 69 66 0a 0a 09 69 66 20 28 75 6e 69 6e 69 74 69 if...if (uniniti
c450: 61 6c 69 7a 65 29 20 7b 0a 09 09 69 66 20 28 21 alize) {...if (!
c460: 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
c470: 09 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 ..dprintf("Asked
c480: 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 to uninitialize
c490: 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 , but we are not
c4a0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a initialized");.
c4b0: 0a 09 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f ....return(TCL_O
c4c0: 4b 29 3b 0a 09 09 7d 0a 0a 09 09 64 70 72 69 6e K);...}....dprin
c4d0: 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 tf("Asked to uni
c4e0: 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 nitialize");..#i
c4f0: 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
c500: 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
c510: 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
c520: 53 29 0a 09 09 54 63 6c 5f 4d 75 74 65 78 4c 6f S)...Tcl_MutexLo
c530: 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 ck(&init_mx);...
c540: 09 43 52 59 50 54 4f 5f 73 65 74 5f 6c 6f 63 6b .CRYPTO_set_lock
c550: 69 6e 67 5f 63 61 6c 6c 62 61 63 6b 28 4e 55 4c ing_callback(NUL
c560: 4c 29 3b 0a 09 09 43 52 59 50 54 4f 5f 73 65 74 L);...CRYPTO_set
c570: 5f 69 64 5f 63 61 6c 6c 62 61 63 6b 28 4e 55 4c _id_callback(NUL
c580: 4c 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 63 6b 73 L);....if (locks
c590: 29 20 7b 0a 09 09 09 66 72 65 65 28 6c 6f 63 6b ) {....free(lock
c5a0: 73 29 3b 0a 09 09 09 6c 6f 63 6b 73 20 3d 20 4e s);....locks = N
c5b0: 55 4c 4c 3b 0a 09 09 09 6c 6f 63 6b 73 43 6f 75 ULL;....locksCou
c5c0: 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a 23 65 6e 64 nt = 0;...}.#end
c5d0: 69 66 0a 09 09 69 6e 69 74 69 61 6c 69 7a 65 64 if...initialized
c5e0: 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e = 0;..#if defin
c5f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ed(OPENSSL_THREA
c600: 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 DS) && defined(T
c610: 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 09 54 63 CL_THREADS)...Tc
c620: 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 l_MutexUnlock(&i
c630: 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a nit_mx);.#endif.
c640: 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b ...return(TCL_OK
c650: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 6e 69 74 );..}...if (init
c660: 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 64 70 72 ialized) {...dpr
c670: 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 intf("Called, bu
c680: 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 t using cached v
c690: 61 6c 75 65 22 29 3b 0a 09 09 72 65 74 75 72 6e alue");...return
c6a0: 28 73 74 61 74 75 73 29 3b 0a 09 7d 0a 0a 09 64 (status);..}...d
c6b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
c6c0: 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
c6d0: 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
c6e0: 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
c6f0: 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 HREADS)..Tcl_Mut
c700: 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 exLock(&init_mx)
c710: 3b 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 ;.#endif..initia
c720: 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 lized = 1;..#if
c730: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
c740: 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
c750: 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
c760: 0a 09 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 43 52 ..num_locks = CR
c770: 59 50 54 4f 5f 6e 75 6d 5f 6c 6f 63 6b 73 28 29 YPTO_num_locks()
c780: 3b 0a 09 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 ;..locksCount =
c790: 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 09 6c 6f 63 6b num_locks;..lock
c7a0: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f s = malloc(sizeo
c7b0: 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f f(*locks) * num_
c7c0: 6c 6f 63 6b 73 29 3b 0a 09 6d 65 6d 73 65 74 28 locks);..memset(
c7d0: 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 locks, 0, sizeof
c7e0: 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c (*locks) * num_l
c7f0: 6f 63 6b 73 29 3b 0a 0a 09 43 52 59 50 54 4f 5f ocks);...CRYPTO_
c800: 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f 63 61 6c 6c set_locking_call
c810: 62 61 63 6b 28 43 72 79 70 74 6f 54 68 72 65 61 back(CryptoThrea
c820: 64 4c 6f 63 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a dLockCallback);.
c830: 09 43 52 59 50 54 4f 5f 73 65 74 5f 69 64 5f 63 .CRYPTO_set_id_c
c840: 61 6c 6c 62 61 63 6b 28 43 72 79 70 74 6f 54 68 allback(CryptoTh
c850: 72 65 61 64 49 64 43 61 6c 6c 62 61 63 6b 29 3b readIdCallback);
c860: 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 53 53 .#endif...if (SS
c870: 4c 5f 6c 69 62 72 61 72 79 5f 69 6e 69 74 28 29 L_library_init()
c880: 20 21 3d 20 31 29 20 7b 0a 09 09 73 74 61 74 75 != 1) {...statu
c890: 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 s = TCL_ERROR;..
c8a0: 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 0a .goto done;..}..
c8b0: 09 53 53 4c 5f 6c 6f 61 64 5f 65 72 72 6f 72 5f .SSL_load_error_
c8c0: 73 74 72 69 6e 67 73 28 29 3b 0a 09 45 52 52 5f strings();..ERR_
c8d0: 6c 6f 61 64 5f 63 72 79 70 74 6f 5f 73 74 72 69 load_crypto_stri
c8e0: 6e 67 73 28 29 3b 0a 0a 09 42 49 4f 5f 6e 65 77 ngs();...BIO_new
c8f0: 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a _tcl(NULL, 0);..
c900: 23 69 66 20 30 0a 09 2f 2a 0a 09 20 2a 20 58 58 #if 0../*.. * XX
c910: 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 X:TODO: Remove t
c920: 68 69 73 20 63 6f 64 65 20 61 6e 64 20 72 65 70 his code and rep
c930: 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20 63 lace it with a c
c940: 68 65 63 6b 0a 09 20 2a 20 66 6f 72 20 65 6e 6f heck.. * for eno
c950: 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 ugh entropy and
c960: 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 do not try to cr
c970: 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 09 20 2a eate our own.. *
c980: 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 terrible entrop
c990: 79 0a 09 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 y.. */. /*.
c9a0: 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 * Seed the ra
c9b0: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 ndom number gene
c9c0: 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c rator in the SSL
c9d0: 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a library,. *
c9e0: 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 using the do/wh
c9f0: 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 ile construct be
ca00: 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 cause of the bug
ca10: 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 note in the.
ca20: 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 * OpenSSL FAQ
ca30: 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 at http://www.op
ca40: 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 enssl.org/suppor
ca50: 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 t/faq.html#USER1
ca60: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 . *. * T
ca70: 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 he crux of the p
ca80: 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 roblem is that S
ca90: 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f olaris 7 does no
caa0: 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 t have a. *
cab0: 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f /dev/random or /
cac0: 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 dev/urandom devi
cad0: 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 ce so it cannot
cae0: 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 gather enough.
caf0: 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f * entropy fro
cb00: 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 m the RAND_seed(
cb10: 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 ) when TLS initi
cb20: 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 alizes and refus
cb30: 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 es. * to go
cb40: 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 further. Earlier
cb50: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 versions of Ope
cb60: 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 nSSL carried on
cb70: 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 regardless..
cb80: 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 */. srand((u
cb90: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d nsigned int) tim
cba0: 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c e((time_t *) NUL
cbb0: 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 L));. do {..f
cbc0: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 or (i = 0; i < 1
cbd0: 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6; i++) {.. r
cbe0: 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b nd_seed[i] = 1 +
cbf0: 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a (char) (255.0 *
cc00: 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 rand()/(RAND_MA
cc10: 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e X+1.0));..}..RAN
cc20: 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c D_seed(rnd_seed,
cc30: 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 sizeof(rnd_seed
cc40: 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 ));. } while
cc50: 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 (RAND_status() !
cc60: 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 64 6f = 1);.#endif..do
cc70: 6e 65 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 ne:.#if defined(
cc80: 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
cc90: 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
cca0: 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 THREADS)..Tcl_Mu
ccb0: 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f texUnlock(&init_
ccc0: 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 mx);.#endif...re
ccd0: 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a turn(status);.}.