Hex Artifact Content

Artifact 391c72843cd0173d964b2a3d19e4a52adec07f31e55e3d75bbde2782f1b1fcdc:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 20  tarfish Systems 
00d0: 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 6b 61 20  . *. * TLS (aka 
00e0: 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 2d 20 63  SSL) Channel - c
00f0: 61 6e 20 62 65 20 6c 61 79 65 72 65 64 20 6f 6e  an be layered on
0100: 20 61 6e 79 20 62 69 2d 64 69 72 65 63 74 69 6f   any bi-directio
0110: 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 61 6e 6e  nal. * Tcl_Chann
0120: 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 75 69 72  el (Note: Requir
0130: 65 73 20 54 72 66 20 43 6f 72 65 20 50 61 74 63  es Trf Core Patc
0140: 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 20 77 61  h). *. * This wa
0150: 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f 73 74 29  s built (almost)
0160: 20 66 72 6f 6d 20 73 63 72 61 74 63 68 20 62 61   from scratch ba
0170: 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 72 76 61  sed upon observa
0180: 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 65 6e 53  tion of. * OpenS
0190: 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a 20 2a 20  SL 0.9.2B. *. * 
01a0: 41 64 64 69 74 69 6f 6e 20 63 72 65 64 69 74 20  Addition credit 
01b0: 69 73 20 64 75 65 20 66 6f 72 20 41 6e 64 72 65  is due for Andre
01c0: 61 73 20 4b 75 70 72 69 65 73 20 28 61 2e 6b 75  as Kupries (a.ku
01d0: 70 72 69 65 73 40 77 65 73 74 65 6e 64 2e 63 6f  pries@westend.co
01e0: 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 6f 76 69  m), for. * provi
01f0: 64 69 6e 67 20 74 68 65 20 54 63 6c 5f 52 65 70  ding the Tcl_Rep
0200: 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d 65 63 68  laceChannel mech
0210: 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 6b 69 6e  anism and workin
0220: 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 68 20 6d  g closely with m
0230: 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e 63 65 20  e. * to enhance 
0240: 69 74 20 74 6f 20 73 75 70 70 6f 72 74 20 66 75  it to support fu
0250: 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 73 65 6d  ll fileevent sem
0260: 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a 20 41 6c  antics.. *. * Al
0270: 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 62 79 20  so work done by 
0280: 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 6f 70 6c  the follow peopl
0290: 65 20 70 72 6f 76 69 64 65 64 20 74 68 65 20 69  e provided the i
02a0: 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 74 68 69  mpetus to do thi
02b0: 73 20 22 72 69 67 68 74 22 3a 0a 20 2a 09 74 63  s "right":. *.tc
02c0: 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d 63 43 6f  lSSL (Colin McCo
02d0: 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 20 54 65  rmack, Shared Te
02e0: 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 53 53 4c  chnology). *.SSL
02f0: 74 63 6c 20 28 50 65 74 65 72 20 41 6e 74 6d 61  tcl (Peter Antma
0300: 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c  n). *. */..#incl
0310: 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23  ude "tlsInt.h".#
0320: 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f 70 74 73  include "tclOpts
0330: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h".#include <st
0340: 64 6c 69 62 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 45  dlib.h>../*. * E
0350: 78 74 65 72 6e 61 6c 20 66 75 6e 63 74 69 6f 6e  xternal function
0360: 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72  s. */../*. * For
0370: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
0380: 73 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46  s. */..#define F
0390: 32 4e 28 20 6b 65 79 2c 20 64 73 70 29 20 5c 0a  2N( key, dsp) \.
03a0: 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c  .(((key) == NULL
03b0: 29 20 3f 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  ) ? (char *) NUL
03c0: 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f 54 72 61 6e  L : \...Tcl_Tran
03d0: 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e  slateFileName(in
03e0: 74 65 72 70 2c 20 28 6b 65 79 29 2c 20 28 64 73  terp, (key), (ds
03f0: 70 29 29 29 0a 23 64 65 66 69 6e 65 20 52 45 41  p))).#define REA
0400: 53 4f 4e 28 29 09 45 52 52 5f 72 65 61 73 6f 6e  SON().ERR_reason
0410: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52  _error_string(ER
0420: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 0a 0a  R_get_error())..
0430: 73 74 61 74 69 63 20 76 6f 69 64 09 49 6e 66 6f  static void.Info
0440: 43 61 6c 6c 62 61 63 6b 28 43 4f 4e 53 54 20 53  Callback(CONST S
0450: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65  SL *ssl, int whe
0460: 72 65 2c 20 69 6e 74 20 72 65 74 29 3b 0a 0a 73  re, int ret);..s
0470: 74 61 74 69 63 20 69 6e 74 09 43 69 70 68 65 72  tatic int.Cipher
0480: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  sObjCmd(ClientDa
0490: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09  ta clientData,..
04a0: 09 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  ..Tcl_Interp *in
04b0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
04c0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
04d0: 62 6a 76 5b 5d 29 3b 0a 0a 73 74 61 74 69 63 20  bjv[]);..static 
04e0: 69 6e 74 09 48 61 6e 64 73 68 61 6b 65 4f 62 6a  int.HandshakeObj
04f0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
0500: 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 63  lientData,....Tc
0510: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0520: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
0530: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
0540: 5d 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09  ]);..static int.
0550: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69  ImportObjCmd(Cli
0560: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
0570: 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72  ta,....Tcl_Inter
0580: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
0590: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  bjc, Tcl_Obj *CO
05a0: 4e 53 54 20 6f 62 6a 76 5b 5d 29 3b 0a 0a 73 74  NST objv[]);..st
05b0: 61 74 69 63 20 69 6e 74 09 53 74 61 74 75 73 4f  atic int.StatusO
05c0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
05d0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09   clientData,....
05e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
05f0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
0600: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
0610: 76 5b 5d 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e  v[]);..static in
0620: 74 09 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28  t.VersionObjCmd(
0630: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
0640: 74 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e  tData,....Tcl_In
0650: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
0660: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
0670: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 3b 0a  *CONST objv[]);.
0680: 0a 73 74 61 74 69 63 20 69 6e 74 09 4d 69 73 63  .static int.Misc
0690: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
06a0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09  a clientData,...
06b0: 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  .Tcl_Interp *int
06c0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
06d0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
06e0: 6a 76 5b 5d 29 3b 0a 0a 73 74 61 74 69 63 20 69  jv[]);..static i
06f0: 6e 74 09 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d  nt.UnimportObjCm
0700: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
0710: 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f  entData,....Tcl_
0720: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0730: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
0740: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29  j *CONST objv[])
0750: 3b 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54  ;..static SSL_CT
0760: 58 20 2a 43 54 58 5f 49 6e 69 74 28 53 74 61 74  X *CTX_Init(Stat
0770: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74  e *statePtr, int
0780: 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70   isServer, int p
0790: 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 2c  roto, char *key,
07a0: 0a 09 09 09 63 68 61 72 20 2a 63 65 72 74 2c 20  ....char *cert, 
07b0: 63 68 61 72 20 2a 43 41 64 69 72 2c 20 63 68 61  char *CAdir, cha
07c0: 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20  r *CAfile, char 
07d0: 2a 63 69 70 68 65 72 73 2c 0a 09 09 09 63 68 61  *ciphers,....cha
07e0: 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a 73  r *DHparams);..s
07f0: 74 61 74 69 63 20 69 6e 74 09 54 6c 73 4c 69 62  tatic int.TlsLib
0800: 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69  Init(int uniniti
0810: 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 69 6e 65  alize);..#define
0820: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 09   TLS_PROTO_SSL2.
0830: 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20 54 4c  .0x01.#define TL
0840: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 09 30 78  S_PROTO_SSL3..0x
0850: 30 32 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  02.#define TLS_P
0860: 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 30 34 0a  ROTO_TLS1..0x04.
0870: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
0880: 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 0a 23 64  O_TLS1_1.0x08.#d
0890: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f  efine TLS_PROTO_
08a0: 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 64 65 66  TLS1_2.0x10.#def
08b0: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ine TLS_PROTO_TL
08c0: 53 31 5f 33 09 30 78 32 30 0a 23 64 65 66 69 6e  S1_3.0x20.#defin
08d0: 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c 20  e ENABLED(flag, 
08e0: 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29 20 26  mask).(((flag) &
08f0: 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61 73   (mask)) == (mas
0900: 6b 29 29 0a 0a 2f 2a 0a 20 2a 20 53 74 61 74 69  k))../*. * Stati
0910: 63 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  c data structure
0920: 73 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4f  s. */..#ifndef O
0930: 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 23 69 6e  PENSSL_NO_DH.#in
0940: 63 6c 75 64 65 20 22 64 68 5f 70 61 72 61 6d 73  clude "dh_params
0950: 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  .h".#endif../*. 
0960: 2a 20 57 65 20 6c 6f 73 65 20 74 68 65 20 74 63  * We lose the tc
0970: 6c 20 70 61 73 73 77 6f 72 64 20 63 61 6c 6c 62  l password callb
0980: 61 63 6b 20 77 68 65 6e 20 77 65 20 75 73 65 20  ack when we use 
0990: 74 68 65 20 52 53 41 20 42 53 41 46 45 20 53 53  the RSA BSAFE SS
09a0: 4c 2d 43 20 31 2e 31 2e 32 0a 20 2a 20 6c 69 62  L-C 1.1.2. * lib
09b0: 72 61 72 69 65 73 20 69 6e 73 74 65 61 64 20 6f  raries instead o
09c0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4f 70  f the current Op
09d0: 65 6e 53 53 4c 20 6c 69 62 72 61 72 69 65 73 2e  enSSL libraries.
09e0: 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 42 53 41  . */..#ifdef BSA
09f0: 46 45 0a 23 64 65 66 69 6e 65 20 50 52 45 5f 4f  FE.#define PRE_O
0a00: 50 45 4e 53 53 4c 5f 30 5f 39 5f 34 20 31 0a 23  PENSSL_0_9_4 1.#
0a10: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 50 72 65  endif../*. * Pre
0a20: 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 34 20 43   OpenSSL 0.9.4 C
0a30: 6f 6d 70 61 74 0a 20 2a 2f 0a 0a 23 69 66 6e 64  ompat. */..#ifnd
0a40: 65 66 20 53 54 41 43 4b 5f 4f 46 0a 23 64 65 66  ef STACK_OF.#def
0a50: 69 6e 65 20 53 54 41 43 4b 5f 4f 46 28 78 29 09  ine STACK_OF(x).
0a60: 09 09 53 54 41 43 4b 0a 23 64 65 66 69 6e 65 20  ..STACK.#define 
0a70: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75  sk_SSL_CIPHER_nu
0a80: 6d 28 73 6b 29 09 09 73 6b 5f 6e 75 6d 28 28 73  m(sk)..sk_num((s
0a90: 6b 29 29 0a 23 64 65 66 69 6e 65 20 73 6b 5f 53  k)).#define sk_S
0aa0: 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28  SL_CIPHER_value(
0ab0: 20 73 6b 2c 20 69 6e 64 65 78 29 09 28 53 53 4c   sk, index).(SSL
0ac0: 5f 43 49 50 48 45 52 2a 29 73 6b 5f 76 61 6c 75  _CIPHER*)sk_valu
0ad0: 65 28 28 73 6b 29 2c 20 28 69 6e 64 65 78 29 29  e((sk), (index))
0ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
0af0: 68 72 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43  hread-Safe TLS C
0b00: 6f 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ode. */..#ifdef 
0b10: 54 43 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66  TCL_THREADS.#def
0b20: 69 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ine OPENSSL_THRE
0b30: 41 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c  AD_DEFINES.#incl
0b40: 75 64 65 20 4f 50 45 4e 53 53 4c 5f 48 45 41 44  ude OPENSSL_HEAD
0b50: 45 52 28 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  ER(openssl/opens
0b60: 73 6c 63 6f 6e 66 2e 68 29 0a 0a 23 69 66 64 65  slconf.h)..#ifde
0b70: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
0b80: 53 0a 23 69 6e 63 6c 75 64 65 20 4f 50 45 4e 53  S.#include OPENS
0b90: 53 4c 5f 48 45 41 44 45 52 28 6f 70 65 6e 73 73  SL_HEADER(openss
0ba0: 6c 2f 63 72 79 70 74 6f 2e 68 29 0a 0a 2f 2a 0a  l/crypto.h)../*.
0bb0: 20 2a 20 54 68 72 65 61 64 65 64 20 6f 70 65 72   * Threaded oper
0bc0: 61 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 6c  ation requires l
0bd0: 6f 63 6b 69 6e 67 20 63 61 6c 6c 62 61 63 6b 73  ocking callbacks
0be0: 0a 20 2a 20 42 61 73 65 64 20 66 72 6f 6d 20 2f  . * Based from /
0bf0: 63 72 79 70 74 6f 2f 63 72 79 70 74 6c 69 62 2e  crypto/cryptlib.
0c00: 63 20 6f 66 20 4f 70 65 6e 53 53 4c 20 61 6e 64  c of OpenSSL and
0c10: 20 4e 53 4f 70 65 6e 53 53 4c 2e 0a 20 2a 2f 0a   NSOpenSSL.. */.
0c20: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65  .static Tcl_Mute
0c30: 78 20 2a 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b  x *locks = NULL;
0c40: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
0c50: 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 73 74 61 74  sCount = 0;.stat
0c60: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 69 6e 69  ic Tcl_Mutex ini
0c70: 74 5f 6d 78 3b 0a 0a 76 6f 69 64 20 43 72 79 70  t_mx;..void Cryp
0c80: 74 6f 54 68 72 65 61 64 4c 6f 63 6b 43 61 6c 6c  toThreadLockCall
0c90: 62 61 63 6b 28 69 6e 74 20 6d 6f 64 65 2c 20 69  back(int mode, i
0ca0: 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72  nt n, const char
0cb0: 20 2a 66 69 6c 65 2c 20 69 6e 74 20 6c 69 6e 65   *file, int line
0cc0: 29 20 7b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26  ) {...if (mode &
0cd0: 20 43 52 59 50 54 4f 5f 4c 4f 43 4b 29 20 7b 0a   CRYPTO_LOCK) {.
0ce0: 09 09 2f 2a 20 54 68 69 73 20 64 65 62 75 67 67  ../* This debugg
0cf0: 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66  ing is turned of
0d00: 66 20 62 79 20 64 65 66 61 75 6c 74 20 2d 2d 20  f by default -- 
0d10: 69 74 27 73 20 74 6f 6f 20 6e 6f 69 73 79 2e 20  it's too noisy. 
0d20: 2a 2f 0a 09 09 2f 2a 20 64 70 72 69 6e 74 66 28  */.../* dprintf(
0d30: 22 43 61 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20  "Called to lock 
0d40: 28 6e 3d 25 69 20 6f 66 20 25 69 29 22 2c 20 6e  (n=%i of %i)", n
0d50: 2c 20 6c 6f 63 6b 73 43 6f 75 6e 74 29 3b 20 2a  , locksCount); *
0d60: 2f 0a 09 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63  /...Tcl_MutexLoc
0d70: 6b 28 26 6c 6f 63 6b 73 5b 6e 5d 29 3b 0a 09 7d  k(&locks[n]);..}
0d80: 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 64 70 72   else {.../* dpr
0d90: 69 6e 74 66 28 22 43 61 6c 6c 65 64 20 74 6f 20  intf("Called to 
0da0: 75 6e 6c 6f 63 6b 20 28 6e 3d 25 69 20 6f 66 20  unlock (n=%i of 
0db0: 25 69 29 22 2c 20 6e 2c 20 6c 6f 63 6b 73 43 6f  %i)", n, locksCo
0dc0: 75 6e 74 29 3b 20 2a 2f 0a 09 09 54 63 6c 5f 4d  unt); */...Tcl_M
0dd0: 75 74 65 78 55 6e 6c 6f 63 6b 28 26 6c 6f 63 6b  utexUnlock(&lock
0de0: 73 5b 6e 5d 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 64  s[n]);..}.../* d
0df0: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
0e00: 67 22 29 3b 20 2a 2f 0a 0a 09 72 65 74 75 72 6e  g"); */...return
0e10: 3b 0a 09 66 69 6c 65 20 3d 20 66 69 6c 65 3b 0a  ;..file = file;.
0e20: 09 6c 69 6e 65 20 3d 20 6c 69 6e 65 3b 0a 7d 0a  .line = line;.}.
0e30: 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 43  .unsigned long C
0e40: 72 79 70 74 6f 54 68 72 65 61 64 49 64 43 61 6c  ryptoThreadIdCal
0e50: 6c 62 61 63 6b 28 76 6f 69 64 29 20 7b 0a 09 75  lback(void) {..u
0e60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74  nsigned long ret
0e70: 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c  ;...dprintf("Cal
0e80: 6c 65 64 22 29 3b 0a 0a 09 72 65 74 20 3d 20 28  led");...ret = (
0e90: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54  unsigned long) T
0ea0: 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 54 68 72  cl_GetCurrentThr
0eb0: 65 61 64 28 29 3b 0a 0a 09 64 70 72 69 6e 74 66  ead();...dprintf
0ec0: 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 22  ("Returning %lu"
0ed0: 2c 20 72 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e  , ret);...return
0ee0: 28 72 65 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  (ret);.}.#endif 
0ef0: 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  /* OPENSSL_THREA
0f00: 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  DS */.#endif /* 
0f10: 54 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 0a  TCL_THREADS */..
0f20: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
0f70: 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d   InfoCallback --
0f80: 0a 20 2a 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20  . *. *.monitors 
0f90: 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  SSL connection p
0fa0: 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73  rocess. *. * Res
0fb0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
0fc0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
0fd0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
0fe0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
0ff0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
1040: 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62  c void.InfoCallb
1050: 61 63 6b 28 43 4f 4e 53 54 20 53 53 4c 20 2a 73  ack(CONST SSL *s
1060: 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69  sl, int where, i
1070: 6e 74 20 72 65 74 29 0a 7b 0a 20 20 20 20 53 74  nt ret).{.    St
1080: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
1090: 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f  (State*)SSL_get_
10a0: 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29  app_data((SSL *)
10b0: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  ssl);.    Tcl_Ob
10c0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
10d0: 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72  har *major; char
10e0: 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70   *minor;..    dp
10f0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
1100: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
1110: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
1120: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a  (Tcl_Obj*)NULL).
1130: 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 63 6d  .return;..    cm
1140: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
1150: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
1160: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 23 69  ->callback);..#i
1170: 66 20 30 0a 20 20 20 20 69 66 20 28 77 68 65 72  f 0.    if (wher
1180: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54  e & SSL_CB_ALERT
1190: 29 20 7b 0a 09 73 65 76 20 3d 20 53 53 4c 5f 61  ) {..sev = SSL_a
11a0: 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e 67  lert_type_string
11b0: 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 09 69 66 20  _long(ret);..if 
11c0: 28 73 74 72 63 6d 70 28 20 73 65 76 2c 20 22 66  (strcmp( sev, "f
11d0: 61 74 61 6c 22 29 3d 3d 30 29 20 7b 09 2f 2a 20  atal")==0) {./* 
11e0: 4d 61 70 20 74 6f 20 65 72 72 6f 72 20 2a 2f 0a  Map to error */.
11f0: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73  .    Tls_Error(s
1200: 74 61 74 65 50 74 72 2c 20 53 53 4c 5f 45 52 52  tatePtr, SSL_ERR
1210: 4f 52 28 73 73 6c 2c 20 30 29 29 3b 0a 09 20 20  OR(ssl, 0));..  
1220: 20 20 72 65 74 75 72 6e 3b 0a 09 7d 0a 20 20 20    return;..}.   
1230: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
1240: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1250: 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54  _HANDSHAKE_START
1260: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
1270: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
1280: 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20   = "start";.    
1290: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  } else if (where
12a0: 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48   & SSL_CB_HANDSH
12b0: 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a  AKE_DONE) {..maj
12c0: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
12d0: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65  ;..minor = "done
12e0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ";.    } else {.
12f0: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c  .if (where & SSL
1300: 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f  _CB_ALERT)..majo
1310: 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c  r = "alert";..el
1320: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
1330: 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d  SL_ST_CONNECT).m
1340: 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22  ajor = "connect"
1350: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1360: 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50  e & SSL_ST_ACCEP
1370: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63  T)..major = "acc
1380: 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09  ept";..else.....
1390: 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e  major = "unknown
13a0: 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26  ";...if (where &
13b0: 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d   SSL_CB_READ)..m
13c0: 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09  inor = "read";..
13d0: 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26  else if (where &
13e0: 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09   SSL_CB_WRITE)..
13f0: 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b  minor = "write";
1400: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1410: 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09   & SSL_CB_LOOP).
1420: 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b  .minor = "loop";
1430: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1440: 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09   & SSL_CB_EXIT).
1450: 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b  .minor = "exit";
1460: 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72  ..else.....minor
1470: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20   = "unknown";.  
1480: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73    }..    Tcl_Lis
1490: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14a0: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  t( statePtr->int
14b0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20  erp, cmdPtr, .. 
14c0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
14d0: 4f 62 6a 28 20 22 69 6e 66 6f 22 2c 20 2d 31 29  Obj( "info", -1)
14e0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
14f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1500: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ( statePtr->inte
1510: 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 20  rp, cmdPtr, ..  
1520: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
1530: 62 6a 28 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  bj( Tcl_GetChann
1540: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
1550: 3e 73 65 6c 66 29 2c 20 2d 31 29 20 29 3b 0a 0a  >self), -1) );..
1560: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1570: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74  ppendElement( st
1580: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20  atePtr->interp, 
1590: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
15a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 6d  _NewStringObj( m
15b0: 61 6a 6f 72 2c 20 2d 31 29 20 29 3b 0a 0a 20 20  ajor, -1) );..  
15c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
15d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74  endElement( stat
15e0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d  ePtr->interp, cm
15f0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1600: 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 6d 69 6e  ewStringObj( min
1610: 6f 72 2c 20 2d 31 29 20 29 3b 0a 0a 20 20 20 20  or, -1) );..    
1620: 69 66 20 28 77 68 65 72 65 20 26 20 28 53 53 4c  if (where & (SSL
1630: 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c 5f 43 42 5f  _CB_LOOP|SSL_CB_
1640: 45 58 49 54 29 29 20 7b 0a 09 54 63 6c 5f 4c 69  EXIT)) {..Tcl_Li
1650: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1660: 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  nt( statePtr->in
1670: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1680: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1690: 4f 62 6a 28 20 53 53 4c 5f 73 74 61 74 65 5f 73  Obj( SSL_state_s
16a0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c  tring_long(ssl),
16b0: 20 2d 31 29 20 29 3b 0a 20 20 20 20 7d 20 65 6c   -1) );.    } el
16c0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
16d0: 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09  SL_CB_ALERT) {..
16e0: 43 4f 4e 53 54 20 63 68 61 72 20 2a 63 70 20 3d  CONST char *cp =
16f0: 20 28 63 68 61 72 20 2a 29 20 53 53 4c 5f 61 6c   (char *) SSL_al
1700: 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f  ert_desc_string_
1710: 6c 6f 6e 67 28 72 65 74 29 3b 0a 0a 09 54 63 6c  long(ret);...Tcl
1720: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1730: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d  ement( statePtr-
1740: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
1750: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1760: 69 6e 67 4f 62 6a 28 20 63 70 2c 20 2d 31 29 20  ingObj( cp, -1) 
1770: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
1780: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
1790: 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65  ndElement( state
17a0: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64  Ptr->interp, cmd
17b0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
17c0: 77 53 74 72 69 6e 67 4f 62 6a 28 20 53 53 4c 5f  wStringObj( SSL_
17d0: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e  state_string_lon
17e0: 67 28 73 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20  g(ssl), -1) );. 
17f0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 50 72 65     }.    Tcl_Pre
1800: 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61  serve( (ClientDa
1810: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  ta) statePtr->in
1820: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50  terp);.    Tcl_P
1830: 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74  reserve( (Client
1840: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
1850: 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
1860: 66 43 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b  fCount( cmdPtr);
1870: 0a 20 20 20 20 28 76 6f 69 64 29 20 54 63 6c 5f  .    (void) Tcl_
1880: 45 76 61 6c 4f 62 6a 45 78 28 73 74 61 74 65 50  EvalObjEx(stateP
1890: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
18a0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  tr, TCL_EVAL_GLO
18b0: 42 41 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  BAL);.    Tcl_De
18c0: 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d 64 50  crRefCount( cmdP
18d0: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65  tr);..    Tcl_Re
18e0: 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74 44 61  lease( (ClientDa
18f0: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20  ta) statePtr);. 
1900: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20     Tcl_Release( 
1910: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
1920: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a  tePtr->interp);.
1930: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
1940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1980: 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61  . * VerifyCallba
1990: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69  ck --. *. *.Moni
19a0: 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69  tors SSL certifi
19b0: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20  cate validation 
19c0: 70 72 6f 63 65 73 73 2e 0a 20 2a 09 54 68 69 73  process.. *.This
19d0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
19e0: 76 65 72 20 61 20 63 65 72 74 69 66 69 63 61 74  ver a certificat
19f0: 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 0a 20  e is inspected. 
1a00: 2a 09 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76  *.or decided inv
1a10: 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  alid.. *. * Resu
1a20: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61  lts:. *.A callba
1a30: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  ck bound to the 
1a40: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72  socket may retur
1a50: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20  n one of:. *.   
1a60: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69   0...- the certi
1a70: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64  ficate is deemed
1a80: 20 69 6e 76 61 6c 69 64 0a 20 2a 09 20 20 20 20   invalid. *.    
1a90: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66  1...- the certif
1aa0: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20  icate is deemed 
1ab0: 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 65 6d 70  valid. *.    emp
1ac0: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63  ty string.- no c
1ad0: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69  hange to certifi
1ae0: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a  cate validation.
1af0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
1b00: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66  ts:. *.The err f
1b10: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
1b20: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20  ently operative 
1b30: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09  State is set. *.
1b40: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65    to a string de
1b50: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c  scribing the SSL
1b60: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69   negotiation fai
1b70: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d  lure reason. *--
1b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
1bd0: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28  .VerifyCallback(
1be0: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f  int ok, X509_STO
1bf0: 52 45 5f 43 54 58 20 2a 63 74 78 29 0a 7b 0a 20  RE_CTX *ctx).{. 
1c00: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
1c10: 74 72 2c 20 2a 72 65 73 75 6c 74 3b 0a 20 20 20  tr, *result;.   
1c20: 20 63 68 61 72 20 2a 65 72 72 53 74 72 2c 20 2a   char *errStr, *
1c30: 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20  string;.    int 
1c40: 6c 65 6e 67 74 68 3b 0a 20 20 20 20 53 53 4c 20  length;.    SSL 
1c50: 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29    *ssl..= (SSL*)
1c60: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
1c70: 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20  et_ex_data(ctx, 
1c80: 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f  SSL_get_ex_data_
1c90: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69  X509_STORE_CTX_i
1ca0: 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20  dx());.    X509 
1cb0: 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53   *cert..= X509_S
1cc0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72  TORE_CTX_get_cur
1cd0: 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a  rent_cert(ctx);.
1ce0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
1cf0: 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53  Ptr.= (State*)SS
1d00: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73  L_get_app_data(s
1d10: 73 6c 29 3b 0a 20 20 20 20 69 6e 74 20 64 65 70  sl);.    int dep
1d20: 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  th..= X509_STORE
1d30: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64  _CTX_get_error_d
1d40: 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69  epth(ctx);.    i
1d50: 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53  nt err..= X509_S
1d60: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
1d70: 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70  or(ctx);..    dp
1d80: 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25  rintf("Verify: %
1d90: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66  d", ok);..    if
1da0: 20 28 21 6f 6b 29 20 7b 0a 09 65 72 72 53 74 72   (!ok) {..errStr
1db0: 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 76   = (char*)X509_v
1dc0: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72  erify_cert_error
1dd0: 5f 73 74 72 69 6e 67 28 65 72 72 29 3b 0a 20 20  _string(err);.  
1de0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 65 72 72 53    } else {..errS
1df0: 74 72 20 3d 20 28 63 68 61 72 20 2a 29 30 3b 0a  tr = (char *)0;.
1e00: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
1e10: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
1e20: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
1e30: 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74  ULL) {..if (stat
1e40: 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53  ePtr->vflags & S
1e50: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49  SL_VERIFY_FAIL_I
1e60: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20  F_NO_PEER_CERT) 
1e70: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b  {..    return ok
1e80: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
1e90: 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20   return 1;..}.  
1ea0: 20 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d    }.    cmdPtr =
1eb0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1ec0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
1ed0: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  back);..    Tcl_
1ee0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1ef0: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e  ment( statePtr->
1f00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
1f10: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1f20: 69 6e 67 4f 62 6a 28 20 22 76 65 72 69 66 79 22  ingObj( "verify"
1f30: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c  , -1));..    Tcl
1f40: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1f50: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d  ement( statePtr-
1f60: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
1f70: 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74   ..    Tcl_NewSt
1f80: 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 74  ringObj( Tcl_Get
1f90: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
1fa0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
1fb0: 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73   );..    Tcl_Lis
1fc0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1fd0: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  t( statePtr->int
1fe0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
1ff0: 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28    Tcl_NewIntObj(
2000: 20 64 65 70 74 68 29 20 29 3b 0a 0a 20 20 20 20   depth) );..    
2010: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2020: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50  dElement( stateP
2030: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
2040: 74 72 2c 0a 09 20 20 20 20 54 6c 73 5f 4e 65 77  tr,..    Tls_New
2050: 58 35 30 39 4f 62 6a 28 20 73 74 61 74 65 50 74  X509Obj( statePt
2060: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 65 72 74 29  r->interp, cert)
2070: 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73   );..    Tcl_Lis
2080: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2090: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  t( statePtr->int
20a0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
20b0: 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28    Tcl_NewIntObj(
20c0: 20 6f 6b 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c   ok) );..    Tcl
20d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
20e0: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d  ement( statePtr-
20f0: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
2100: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
2110: 69 6e 67 4f 62 6a 28 20 65 72 72 53 74 72 20 3f  ingObj( errStr ?
2120: 20 65 72 72 53 74 72 20 3a 20 22 22 2c 20 2d 31   errStr : "", -1
2130: 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  ) );..    Tcl_Pr
2140: 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44  eserve( (ClientD
2150: 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69  ata) statePtr->i
2160: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
2170: 50 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e  Preserve( (Clien
2180: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
2190: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  ;..    statePtr-
21a0: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
21b0: 4c 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20 20  L_CALLBACK;..   
21c0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
21d0: 74 28 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  t( cmdPtr);.    
21e0: 69 66 20 28 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  if (Tcl_EvalObjE
21f0: 78 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  x(statePtr->inte
2200: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f  rp, cmdPtr, TCL_
2210: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 21 3d 20  EVAL_GLOBAL) != 
2220: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 49 74  TCL_OK) {../* It
2230: 20 67 6f 74 20 61 6e 20 65 72 72 6f 72 20 2d 20   got an error - 
2240: 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 69  reject the certi
2250: 66 69 63 61 74 65 2e 09 09 2a 2f 0a 09 54 63 6c  ficate...*/..Tcl
2260: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
2270: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ( statePtr->inte
2280: 72 70 29 3b 0a 09 6f 6b 20 3d 20 30 3b 0a 20 20  rp);..ok = 0;.  
2290: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 75    } else {..resu
22a0: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
22b0: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
22c0: 69 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e 67  interp);..string
22d0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
22e0: 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c 20  FromObj(result, 
22f0: 26 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 6e  &length);../* An
2300: 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c 65   empty result le
2310: 61 76 65 73 20 76 65 72 69 66 69 63 61 74 69 6f  aves verificatio
2320: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a  n unchanged..*/.
2330: 09 69 66 20 28 73 74 72 69 6e 67 20 21 3d 20 4e  .if (string != N
2340: 55 4c 4c 20 26 26 20 6c 65 6e 67 74 68 20 3e 20  ULL && length > 
2350: 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28 54 63  0) {..    if (Tc
2360: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
2370: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2380: 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21  , result, &ok) !
2390: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 54 63  = TCL_OK) {...Tc
23a0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
23b0: 72 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  r(statePtr->inte
23c0: 72 70 29 3b 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09  rp);...ok = 0;..
23d0: 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20      }..}.    }. 
23e0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
23f0: 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a 20  unt( cmdPtr);.. 
2400: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
2410: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f  gs &= ~(TLS_TCL_
2420: 43 41 4c 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 20  CALLBACK);..    
2430: 54 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 43 6c  Tcl_Release( (Cl
2440: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
2450: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c  tr);.    Tcl_Rel
2460: 65 61 73 65 28 20 28 43 6c 69 65 6e 74 44 61 74  ease( (ClientDat
2470: 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  a) statePtr->int
2480: 65 72 70 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  erp);..    retur
2490: 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66  n(ok);./* By def
24a0: 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69  ault, leave veri
24b0: 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  fication unchang
24c0: 65 64 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  ed..*/.}.../*. *
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2510: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72  ---. *. * Tls_Er
2520: 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  ror --. *. *.Cal
2530: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ls callback with
2540: 20 24 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20   $fd and $msg - 
2550: 73 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  so the callback 
2560: 63 61 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68  can decide. *.wh
2570: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72  at to do with er
2580: 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  rors.. *. * Side
2590: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
25a0: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
25b0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
25c0: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
25d0: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
25e0: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
25f0: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
2600: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
2610: 6e 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *------------
2620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2650: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
2660: 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65  .Tls_Error(State
2670: 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72   *statePtr, char
2680: 20 2a 6d 73 67 29 0a 7b 0a 20 20 20 20 54 63 6c   *msg).{.    Tcl
2690: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 0a 20  _Obj *cmdPtr;.. 
26a0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
26b0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6d  ed");..    if (m
26c0: 73 67 20 26 26 20 2a 6d 73 67 29 20 7b 0a 09 54  sg && *msg) {..T
26d0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
26e0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
26f0: 2c 20 22 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63  , "SSL", msg, (c
2700: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20  har *)NULL);.   
2710: 20 7d 20 65 6c 73 65 20 7b 0a 09 6d 73 67 20 3d   } else {..msg =
2720: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
2730: 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a  omObj(Tcl_GetObj
2740: 52 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  Result(statePtr-
2750: 3e 69 6e 74 65 72 70 29 2c 20 4e 55 4c 4c 29 3b  >interp), NULL);
2760: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65  .    }.    state
2770: 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a  Ptr->err = msg;.
2780: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
2790: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
27a0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
27b0: 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49  ..char buf[BUFSI
27c0: 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 28 62 75 66  Z];..sprintf(buf
27d0: 2c 20 22 53 53 4c 20 63 68 61 6e 6e 65 6c 20 5c  , "SSL channel \
27e0: 22 25 73 5c 22 3a 20 65 72 72 6f 72 3a 20 25 73  "%s\": error: %s
27f0: 22 2c 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 43  ",..    Tcl_GetC
2800: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
2810: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 6d 73 67 29  Ptr->self), msg)
2820: 3b 0a 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ;..Tcl_SetResult
2830: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ( statePtr->inte
2840: 72 70 2c 20 62 75 66 2c 20 54 43 4c 5f 56 4f 4c  rp, buf, TCL_VOL
2850: 41 54 49 4c 45 29 3b 0a 09 54 63 6c 5f 42 61 63  ATILE);..Tcl_Bac
2860: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 20 73 74  kgroundError( st
2870: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b  atePtr->interp);
2880: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ..return;.    }.
2890: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
28a0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
28b0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
28c0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
28d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
28e0: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
28f0: 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 20 20  p, cmdPtr, ..   
2900: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2910: 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b  j("error", -1));
2920: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
2930: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73  jAppendElement(s
2940: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
2950: 20 63 6d 64 50 74 72 2c 20 0a 09 20 20 20 20 54   cmdPtr, ..    T
2960: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2970: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
2980: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
2990: 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54  f), -1));..    T
29a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
29b0: 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72  Element(statePtr
29c0: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
29d0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
29e0: 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29  ringObj(msg, -1)
29f0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
2a00: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
2a10: 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ) statePtr->inte
2a20: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
2a30: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
2a40: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
2a50: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
2a60: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
2a70: 20 69 66 20 28 54 63 6c 5f 45 76 61 6c 4f 62 6a   if (Tcl_EvalObj
2a80: 45 78 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  Ex(statePtr->int
2a90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c  erp, cmdPtr, TCL
2aa0: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 21 3d  _EVAL_GLOBAL) !=
2ab0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f   TCL_OK) {..Tcl_
2ac0: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
2ad0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2ae0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
2af0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
2b00: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  dPtr);..    Tcl_
2b10: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
2b20: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
2b30: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
2b40: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
2b50: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a  tePtr->interp);.
2b60: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
2bb0: 20 2a 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62   * PasswordCallb
2bc0: 61 63 6b 20 2d 2d 20 0a 20 2a 0a 20 2a 09 43 61  ack -- . *. *.Ca
2bd0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73  lled when a pass
2be0: 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 74  word is needed t
2bf0: 6f 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64  o unpack RSA and
2c00: 20 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76   PEM keys.. *.Ev
2c10: 61 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61  als any bound pa
2c20: 73 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e  ssword script an
2c30: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65  d returns the re
2c40: 73 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70  sult as. *.the p
2c50: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a  assword string..
2c60: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ca0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 66  -----. */.#ifdef
2cb0: 20 50 52 45 5f 4f 50 45 4e 53 53 4c 5f 30 5f 39   PRE_OPENSSL_0_9
2cc0: 5f 34 0a 2f 2a 0a 20 2a 20 4e 6f 20 77 61 79 20  _4./*. * No way 
2cd0: 74 6f 20 68 61 6e 64 6c 65 20 75 73 65 72 2d 64  to handle user-d
2ce0: 61 74 61 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  ata therefore no
2cf0: 20 77 61 79 20 77 69 74 68 6f 75 74 20 61 20 67   way without a g
2d00: 6c 6f 62 61 6c 0a 20 2a 20 76 61 72 69 61 62 6c  lobal. * variabl
2d10: 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  e to access the 
2d20: 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 2e  Tcl interpreter.
2d30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50  .*/.static int.P
2d40: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28  asswordCallback(
2d50: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73  char *buf, int s
2d60: 69 7a 65 2c 20 69 6e 74 20 76 65 72 69 66 79 29  ize, int verify)
2d70: 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .{.    return -1
2d80: 3b 0a 20 20 20 20 09 62 75 66 20 3d 20 62 75 66  ;.    .buf = buf
2d90: 3b 0a 09 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a  ;..size = size;.
2da0: 09 76 65 72 69 66 79 20 3d 20 76 65 72 69 66 79  .verify = verify
2db0: 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74 61 74 69 63  ;.}.#else.static
2dc0: 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c   int.PasswordCal
2dd0: 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c  lback(char *buf,
2de0: 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76   int size, int v
2df0: 65 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61  erify, void *uda
2e00: 74 61 29 0a 7b 0a 20 20 20 20 53 74 61 74 65 20  ta).{.    State 
2e10: 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61  *statePtr.= (Sta
2e20: 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20  te *) udata;.   
2e30: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2e40: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
2e50: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
2e60: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
2e70: 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 0a 20 20   int result;..  
2e80: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
2e90: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
2ea0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
2eb0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20   == NULL) {..if 
2ec0: 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65  (Tcl_EvalEx(inte
2ed0: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f  rp, "tls::passwo
2ee0: 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41  rd", -1, TCL_EVA
2ef0: 4c 5f 47 4c 4f 42 41 4c 29 0a 09 09 3d 3d 20 54  L_GLOBAL)...== T
2f00: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68  CL_OK) {..    ch
2f10: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20  ar *ret = (char 
2f20: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  *) Tcl_GetString
2f30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2f40: 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66  .    strncpy(buf
2f50: 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20  , ret, (size_t) 
2f60: 73 69 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75  size);..    retu
2f70: 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72  rn (int)strlen(r
2f80: 65 74 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  et);..} else {..
2f90: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09      return -1;..
2fa0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64  }.    }..    cmd
2fb0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
2fc0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
2fd0: 3e 70 61 73 73 77 6f 72 64 29 3b 0a 0a 20 20 20  >password);..   
2fe0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
2ff0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
3000: 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  Ptr->interp);.  
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 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ePtr);..    Tcl_
3040: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
3050: 50 74 72 29 3b 0a 20 20 20 20 72 65 73 75 6c 74  Ptr);.    result
3060: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
3070: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3080: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
3090: 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c  );.    if (resul
30a0: 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  t != TCL_OK) {..
30b0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
30c0: 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 69 6e  ror(statePtr->in
30d0: 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  terp);.    }.   
30e0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
30f0: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20  t(cmdPtr);..    
3100: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
3110: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
3120: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  r);.    Tcl_Rele
3130: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ase((ClientData)
3140: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
3150: 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73  p);..    if (res
3160: 75 6c 74 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ult == TCL_OK) {
3170: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63  ..char *ret = (c
3180: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74  har *) Tcl_GetSt
3190: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
31a0: 70 29 3b 0a 09 73 74 72 6e 63 70 79 28 62 75 66  p);..strncpy(buf
31b0: 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20  , ret, (size_t) 
31c0: 73 69 7a 65 29 3b 0a 09 72 65 74 75 72 6e 20 28  size);..return (
31d0: 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b  int)strlen(ret);
31e0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
31f0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
3200: 20 20 20 20 09 76 65 72 69 66 79 20 3d 20 76 65      .verify = ve
3210: 72 69 66 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c  rify;.}.#endif..
3220: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
3270: 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d  CiphersObjCmd --
3280: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
3290: 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68  ciphers. *. *.Th
32a0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
32b0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
32c0: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70  ss the "tls::cip
32d0: 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  hers" command. *
32e0: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62  .to list availab
32f0: 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65  le ciphers, base
3300: 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20  d upon protocol 
3310: 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20  selected.. *. * 
3320: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
3330: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
3340: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  t list.. *. * Si
3350: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63  de effects:. *.c
3360: 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65  onstructs and de
3370: 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65  stroys SSL conte
3380: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d  xt (CTX). *. *--
3390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33d0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
33e0: 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 63  .CiphersObjCmd(c
33f0: 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72  lientData, inter
3400: 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20  p, objc, objv). 
3410: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c     ClientData cl
3420: 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74  ientData;./* Not
3430: 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63   used. */.    Tc
3440: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3450: 3b 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a  ;.    int objc;.
3460: 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e      Tcl_Obj.*CON
3470: 53 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20  ST objv[];.{.   
3480: 20 73 74 61 74 69 63 20 43 4f 4e 53 54 38 34 20   static CONST84 
3490: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b  char *protocols[
34a0: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 09 22  ] = {.."ssl2",."
34b0: 73 73 6c 33 22 2c 09 22 74 6c 73 31 22 2c 09 22  ssl3",."tls1",."
34c0: 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32  tls1.1", "tls1.2
34d0: 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c  ", "tls1.3", NUL
34e0: 4c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 65 6e 75  L.    };.    enu
34f0: 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 09 54 4c  m protocol {..TL
3500: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33  S_SSL2, TLS_SSL3
3510: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f  , TLS_TLS1, TLS_
3520: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31  TLS1_1, TLS_TLS1
3530: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20  _2, TLS_TLS1_3, 
3540: 54 4c 53 5f 4e 4f 4e 45 0a 20 20 20 20 7d 3b 0a  TLS_NONE.    };.
3550: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
3560: 50 74 72 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  Ptr;.    SSL_CTX
3570: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ctx = NULL;.  
3580: 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c    SSL *ssl = NUL
3590: 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  L;.    STACK_OF(
35a0: 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b  SSL_CIPHER) *sk;
35b0: 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62  .    char *cp, b
35c0: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20  uf[BUFSIZ];.    
35d0: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f  int index, verbo
35e0: 73 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72  se = 0;..    dpr
35f0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
3600: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
3610: 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 29 20 7b  2 || objc > 3) {
3620: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
3630: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
3640: 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76  jv, "protocol ?v
3650: 65 72 62 6f 73 65 3f 22 29 3b 0a 09 72 65 74 75  erbose?");..retu
3660: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3670: 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f    }.    if (Tcl_
3680: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
3690: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d   interp, objv[1]
36a0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72  , protocols, "pr
36b0: 6f 74 6f 63 6f 6c 22 2c 20 30 2c 0a 09 26 69 6e  otocol", 0,..&in
36c0: 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  dex) != TCL_OK) 
36d0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
36e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
36f0: 66 20 28 6f 62 6a 63 20 3e 20 32 20 26 26 20 54  f (objc > 2 && T
3700: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
3710: 6d 4f 62 6a 28 20 69 6e 74 65 72 70 2c 20 6f 62  mObj( interp, ob
3720: 6a 76 5b 32 5d 2c 0a 09 26 76 65 72 62 6f 73 65  jv[2],..&verbose
3730: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
3740: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3750: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
3760: 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63  ch ((enum protoc
3770: 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 20 20 20 20  ol)index) {.    
3780: 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23  case TLS_SSL2:.#
3790: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  if defined(NO_SS
37a0: 4c 32 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  L2)...Tcl_Append
37b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
37c0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
37d0: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
37e0: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
37f0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 63 74 78 20  OR;.#else...ctx 
3800: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53  = SSL_CTX_new(SS
3810: 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62  Lv2_method()); b
3820: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  reak;.#endif.   
3830: 20 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a   case TLS_SSL3:.
3840: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53  #if defined(NO_S
3850: 53 4c 33 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e  SL3)...Tcl_Appen
3860: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3870: 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75  "protocol not su
3880: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
3890: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
38a0: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 63 74 78  ROR;.#else...ctx
38b0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53   = SSL_CTX_new(S
38c0: 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 29 3b 20  SLv3_method()); 
38d0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20  break;.#endif.  
38e0: 20 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a    case TLS_TLS1:
38f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
3900: 54 4c 53 31 29 0a 09 09 54 63 6c 5f 41 70 70 65  TLS1)...Tcl_Appe
3910: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3920: 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73   "protocol not s
3930: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
3940: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
3950: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 63 74  RROR;.#else...ct
3960: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28  x = SSL_CTX_new(
3970: 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 29 3b  TLSv1_method());
3980: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20   break;.#endif. 
3990: 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31     case TLS_TLS1
39a0: 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  _1:.#if defined(
39b0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 09 54 63 6c  NO_TLS1_1)...Tcl
39c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
39d0: 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20  terp, "protocol 
39e0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
39f0: 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20  NULL);...return 
3a00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
3a10: 0a 09 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58  ...ctx = SSL_CTX
3a20: 5f 6e 65 77 28 54 4c 53 76 31 5f 31 5f 6d 65 74  _new(TLSv1_1_met
3a30: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23  hod()); break;.#
3a40: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
3a50: 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64  LS_TLS1_2:.#if d
3a60: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
3a70: 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  )...Tcl_AppendRe
3a80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72  sult(interp, "pr
3a90: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
3aa0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09  rted", NULL);...
3ab0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3ac0: 3b 0a 23 65 6c 73 65 0a 09 09 63 74 78 20 3d 20  ;.#else...ctx = 
3ad0: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76  SSL_CTX_new(TLSv
3ae0: 31 5f 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62  1_2_method()); b
3af0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  reak;.#endif.   
3b00: 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33   case TLS_TLS1_3
3b10: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
3b20: 5f 54 4c 53 31 5f 33 29 0a 09 09 54 63 6c 5f 41  _TLS1_3)...Tcl_A
3b30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3b40: 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f  rp, "protocol no
3b50: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
3b60: 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  LL);...return TC
3b70: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
3b80: 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e  .ctx = SSL_CTX_n
3b90: 65 77 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29  ew(TLS_method())
3ba0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
3bb0: 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43 54 58           SSL_CTX
3bc0: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
3bd0: 65 72 73 69 6f 6e 20 28 63 74 78 2c 20 54 4c 53  ersion (ctx, TLS
3be0: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20  1_3_VERSION);.  
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 53                SS
3c00: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72  L_CTX_set_max_pr
3c10: 6f 74 6f 5f 76 65 72 73 69 6f 6e 20 28 63 74 78  oto_version (ctx
3c20: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
3c30: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65  );.#endif.    de
3c40: 66 61 75 6c 74 3a 0a 09 09 62 72 65 61 6b 3b 0a  fault:...break;.
3c50: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 74      }.    if (ct
3c60: 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  x == NULL) {..Tc
3c70: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3c80: 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c  nterp, REASON(),
3c90: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
3ca0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
3cb0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 73  OR;.    }.    ss
3cc0: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29  l = SSL_new(ctx)
3cd0: 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d  ;.    if (ssl ==
3ce0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
3cf0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3d00: 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  p, REASON(), (ch
3d10: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
3d20: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
3d30: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
3d40: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 62  OR;.    }.    ob
3d50: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
3d60: 73 74 4f 62 6a 28 20 30 2c 20 4e 55 4c 4c 29 3b  stObj( 0, NULL);
3d70: 0a 0a 20 20 20 20 69 66 20 28 21 76 65 72 62 6f  ..    if (!verbo
3d80: 73 65 29 20 7b 0a 09 66 6f 72 20 28 69 6e 64 65  se) {..for (inde
3d90: 78 20 3d 20 30 3b 20 3b 20 69 6e 64 65 78 2b 2b  x = 0; ; index++
3da0: 29 20 7b 0a 09 20 20 20 20 63 70 20 3d 20 28 63  ) {..    cp = (c
3db0: 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70  har*)SSL_get_cip
3dc0: 68 65 72 5f 6c 69 73 74 28 20 73 73 6c 2c 20 69  her_list( ssl, i
3dd0: 6e 64 65 78 29 3b 0a 09 20 20 20 20 69 66 20 28  ndex);..    if (
3de0: 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61  cp == NULL) brea
3df0: 6b 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74  k;..    Tcl_List
3e00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3e10: 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  ( interp, objPtr
3e20: 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ,...Tcl_NewStrin
3e30: 67 4f 62 6a 28 20 63 70 2c 20 2d 31 29 20 29 3b  gObj( cp, -1) );
3e40: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..}.    } else {
3e50: 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63  ..sk = SSL_get_c
3e60: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 0a 09 66  iphers(ssl);...f
3e70: 6f 72 20 28 69 6e 64 65 78 20 3d 20 30 3b 20 69  or (index = 0; i
3e80: 6e 64 65 78 20 3c 20 73 6b 5f 53 53 4c 5f 43 49  ndex < sk_SSL_CI
3e90: 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 6e  PHER_num(sk); in
3ea0: 64 65 78 2b 2b 29 20 7b 0a 09 20 20 20 20 72 65  dex++) {..    re
3eb0: 67 69 73 74 65 72 20 73 69 7a 65 5f 74 20 69 3b  gister size_t i;
3ec0: 0a 09 20 20 20 20 53 53 4c 5f 43 49 50 48 45 52  ..    SSL_CIPHER
3ed0: 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 20 73 6b  _description( sk
3ee0: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75  _SSL_CIPHER_valu
3ef0: 65 28 20 73 6b 2c 20 69 6e 64 65 78 29 2c 0a 09  e( sk, index),..
3f00: 09 09 09 20 20 20 20 62 75 66 2c 20 73 69 7a 65  ...    buf, size
3f10: 6f 66 28 62 75 66 29 29 3b 0a 09 20 20 20 20 66  of(buf));..    f
3f20: 6f 72 20 28 69 20 3d 20 73 74 72 6c 65 6e 28 62  or (i = strlen(b
3f30: 75 66 29 20 2d 20 31 3b 20 69 20 3b 20 69 2d 2d  uf) - 1; i ; i--
3f40: 29 20 7b 0a 09 09 69 66 20 28 62 75 66 5b 69 5d  ) {...if (buf[i]
3f50: 20 3d 3d 20 27 20 27 20 7c 7c 20 62 75 66 5b 69   == ' ' || buf[i
3f60: 5d 20 3d 3d 20 27 5c 6e 27 20 7c 7c 0a 09 09 20  ] == '\n' ||... 
3f70: 20 20 20 62 75 66 5b 69 5d 20 3d 3d 20 27 5c 72     buf[i] == '\r
3f80: 27 20 7c 7c 20 62 75 66 5b 69 5d 20 3d 3d 20 27  ' || buf[i] == '
3f90: 5c 74 27 29 20 7b 0a 09 09 20 20 20 20 62 75 66  \t') {...    buf
3fa0: 5b 69 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 7d 20  [i] = '\0';...} 
3fb0: 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 62 72 65  else {...    bre
3fc0: 61 6b 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09  ak;...}..    }..
3fd0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3fe0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e  ppendElement( in
3ff0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09  terp, objPtr,...
4000: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4010: 28 20 62 75 66 2c 20 2d 31 29 20 29 3b 0a 09 7d  ( buf, -1) );..}
4020: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66  .    }.    SSL_f
4030: 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53  ree(ssl);.    SS
4040: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
4050: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
4060: 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20  Result( interp, 
4070: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
4080: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
4090: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
40a0: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a  ientData;.}.../*
40b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e  ------. *. * Han
4100: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a  dshakeObjCmd --.
4110: 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61   *. *.This comma
4120: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 65  nd is used to ve
4130: 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68 65  rify whether the
4140: 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f   handshake is co
4150: 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74  mplete. *.or not
4160: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
4170: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
4180: 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61  cl result. 1 mea
4190: 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d  ns handshake com
41a0: 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70  plete, 0 means p
41b0: 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69  ending.. *. * Si
41c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
41d0: 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67  ay force SSL neg
41e0: 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65  otiation to take
41f0: 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d   place.. *. *---
4200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4240: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
4250: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
4260: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
4270: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
4280: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
4290: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43  objc, Tcl_Obj *C
42a0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b 0a 09  ONST objv[]) {..
42b0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
42c0: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
42d0: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
42e0: 6f 6e 2e 20 2a 2f 0a 09 53 74 61 74 65 20 2a 73  on. */..State *s
42f0: 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69  tatePtr;../* cli
4300: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73  ent state for ss
4310: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 09 43 4f 4e  l socket */..CON
4320: 53 54 20 63 68 61 72 20 2a 65 72 72 53 74 72 20  ST char *errStr 
4330: 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74 20 72 65 74  = NULL;..int ret
4340: 20 3d 20 31 3b 0a 09 69 6e 74 20 65 72 72 20 3d   = 1;..int err =
4350: 20 30 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43   0;...dprintf("C
4360: 61 6c 6c 65 64 22 29 3b 0a 0a 09 69 66 20 28 6f  alled");...if (o
4370: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 09 54 63  bjc != 2) {...Tc
4380: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
4390: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
43a0: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 09 72 65  "channel");...re
43b0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
43c0: 0a 09 7d 0a 0a 09 63 68 61 6e 20 3d 20 54 63 6c  ..}...chan = Tcl
43d0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
43e0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
43f0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
4400: 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a  , NULL), NULL);.
4410: 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63  .if (chan == (Tc
4420: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
4430: 20 7b 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f   {...return(TCL_
4440: 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a  ERROR);..}.../*.
4450: 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f  . * Make sure to
4460: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
4470: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a  topmost channel.
4480: 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c  . */..chan = Tcl
4490: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
44a0: 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47  han);..if (Tcl_G
44b0: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
44c0: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
44d0: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 09 54 63  elType()) {...Tc
44e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
44f0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
4500: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
4510: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
4520: 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c  ), "\": not a TL
4530: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
4540: 29 3b 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f  );...return(TCL_
4550: 45 52 52 4f 52 29 3b 0a 09 7d 0a 09 73 74 61 74  ERROR);..}..stat
4560: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
4570: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
4580: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
4590: 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c  ;...dprintf("Cal
45a0: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72  ling Tls_WaitFor
45b0: 43 6f 6e 6e 65 63 74 22 29 3b 0a 09 72 65 74 20  Connect");..ret 
45c0: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  = Tls_WaitForCon
45d0: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26  nect(statePtr, &
45e0: 65 72 72 2c 20 31 29 3b 0a 09 64 70 72 69 6e 74  err, 1);..dprint
45f0: 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  f("Tls_WaitForCo
4600: 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20  nnect returned: 
4610: 25 69 22 2c 20 72 65 74 29 3b 0a 0a 09 69 66 20  %i", ret);...if 
4620: 28 0a 09 20 20 20 20 72 65 74 20 3c 20 30 20 26  (..    ret < 0 &
4630: 26 20 5c 0a 09 20 20 20 20 28 28 73 74 61 74 65  & \..    ((state
4640: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
4650: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 65  _TCL_ASYNC) && e
4660: 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 0a 09 29  rr == EAGAIN)..)
4670: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 41 73   {...dprintf("As
4680: 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72 20  ync set and err 
4690: 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 09 72 65  = EAGAIN");...re
46a0: 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 69  t = 0;..} else i
46b0: 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  f (ret < 0) {...
46c0: 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 74  errStr = statePt
46d0: 72 2d 3e 65 72 72 3b 0a 09 09 54 63 6c 5f 52 65  r->err;...Tcl_Re
46e0: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
46f0: 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6e  );...Tcl_SetErrn
4700: 6f 28 65 72 72 29 3b 0a 0a 09 09 69 66 20 28 21  o(err);....if (!
4710: 65 72 72 53 74 72 20 7c 7c 20 2a 65 72 72 53 74  errStr || *errSt
4720: 72 20 3d 3d 20 30 29 20 7b 0a 09 09 09 65 72 72  r == 0) {....err
4730: 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45  Str = Tcl_PosixE
4740: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 09  rror(interp);...
4750: 7d 0a 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  }....Tcl_AppendR
4760: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68  esult(interp, "h
4770: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a  andshake failed:
4780: 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61   ", errStr, (cha
4790: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 64 70  r *) NULL);...dp
47a0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
47b0: 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20   TCL_ERROR with 
47c0: 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64  handshake failed
47d0: 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a  : %s", errStr);.
47e0: 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
47f0: 4f 52 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  OR);..} else {..
4800: 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b  .if (err != 0) {
4810: 0a 09 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74  ....dprintf("Got
4820: 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61   an error with a
4830: 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73   completed hands
4840: 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c  hake: err = %i",
4850: 20 65 72 72 29 3b 0a 09 09 7d 0a 0a 09 09 72 65   err);...}....re
4860: 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 64 70 72 69  t = 1;..}...dpri
4870: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54  ntf("Returning T
4880: 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20  CL_OK with data 
4890: 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 09  \"%i\"", ret);..
48a0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
48b0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
48c0: 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 09 72  IntObj(ret));..r
48d0: 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 0a  eturn(TCL_OK);..
48e0: 20 20 20 20 09 63 6c 69 65 6e 74 44 61 74 61 20      .clientData 
48f0: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a  = clientData;.}.
4900: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20  ---------. *. * 
4950: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a  ImportObjCmd --.
4960: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
4970: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
4980: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
4990: 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a  ssl" command. *.
49a0: 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61   *.The ssl comma
49b0: 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76  nd pushes SSL ov
49c0: 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e  er a (newly conn
49d0: 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65  ected) tcp socke
49e0: 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  t. *. * Results:
49f0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
4a00: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
4a10: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
4a20: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65  *.May modify the
4a30: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20   behavior of an 
4a40: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  IO channel.. *. 
4a50: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a70: 2d 2d 2d 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 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
4aa0: 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d   int.ImportObjCm
4ab0: 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e  d(clientData, in
4ac0: 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76  terp, objc, objv
4ad0: 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61  ).    ClientData
4ae0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20   clientData;./* 
4af0: 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20  Not used. */.   
4b00: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4b10: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f 62 6a  erp;.    int obj
4b20: 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  c;.    Tcl_Obj *
4b30: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a  CONST objv[];.{.
4b40: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
4b50: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68  chan;../* The ch
4b60: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
4b70: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53  ode on. */.    S
4b80: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09  tate *statePtr;.
4b90: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65  ./* client state
4ba0: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20   for ssl socket 
4bb0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  */.    SSL_CTX *
4bc0: 63 74 78 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx.= NULL;.    
4bd0: 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09  Tcl_Obj *script.
4be0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
4bf0: 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 3d 20  Obj *password.= 
4c00: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53  NULL;.    Tcl_DS
4c10: 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e  tring upperChann
4c20: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75  elTranslation, u
4c30: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
4c40: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ing, upperChanne
4c50: 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72  lEncoding, upper
4c60: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a  ChannelEOFChar;.
4c70: 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 6e      int idx, len
4c80: 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09  ;.    int flags.
4c90: 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b  .= TLS_TCL_INIT;
4ca0: 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 09  .    int server.
4cb0: 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e  .= 0;./* is conn
4cc0: 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20  ection incoming 
4cd0: 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a  or outgoing? */.
4ce0: 20 20 20 20 63 68 61 72 20 2a 6b 65 79 09 09 3d      char *key..=
4cf0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
4d00: 2a 63 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20  *cert..= NULL;. 
4d10: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73     char *ciphers
4d20: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61  .= NULL;.    cha
4d30: 72 20 2a 43 41 66 69 6c 65 09 3d 20 4e 55 4c 4c  r *CAfile.= NULL
4d40: 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 64 69  ;.    char *CAdi
4d50: 72 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  r..= NULL;.    c
4d60: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 3d 20  har *DHparams.= 
4d70: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
4d80: 6d 6f 64 65 6c 09 09 3d 20 4e 55 4c 4c 3b 0a 23  model..= NULL;.#
4d90: 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e  ifndef OPENSSL_N
4da0: 4f 5f 54 4c 53 45 58 54 0a 20 20 20 20 63 68 61  O_TLSEXT.    cha
4db0: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 3d 20  r *servername.= 
4dc0: 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d  NULL;./* hostnam
4dd0: 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d  e for Server Nam
4de0: 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a  e Indication */.
4df0: 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 74 20 73  #endif.    int s
4e00: 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20  sl2 = 0, ssl3 = 
4e10: 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20  0;.    int tls1 
4e20: 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c  = 1, tls1_1 = 1,
4e30: 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73   tls1_2 = 1, tls
4e40: 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  1_3 = 1;.    int
4e50: 20 70 72 6f 74 6f 20 3d 20 30 3b 0a 20 20 20 20   proto = 0;.    
4e60: 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20  int verify = 0, 
4e70: 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71  require = 0, req
4e80: 75 65 73 74 20 3d 20 31 3b 0a 0a 20 20 20 20 64  uest = 1;..    d
4e90: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
4ea0: 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  ;..#if defined(N
4eb0: 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e  O_TLS1) && defin
4ec0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  ed(NO_TLS1_1) &&
4ed0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
4ee0: 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  _2) && defined(N
4ef0: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
4f00: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  ned(NO_SSL2).   
4f10: 20 73 73 6c 32 20 3d 20 31 3b 0a 23 65 6e 64 69   ssl2 = 1;.#endi
4f20: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
4f30: 5f 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e 65  _TLS1) && define
4f40: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
4f50: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
4f60: 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f  2) && defined(NO
4f70: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e  _SSL2) && !defin
4f80: 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20  ed(NO_SSL3).    
4f90: 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64 69 66  ssl3 = 1;.#endif
4fa0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
4fb0: 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d  TLS1).    tls1 =
4fc0: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
4fd0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
4fe0: 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30  ).    tls1_1 = 0
4ff0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
5000: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 0a  ined(NO_TLS1_2).
5010: 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a      tls1_2 = 0;.
5020: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
5030: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  ed(NO_TLS1_3).  
5040: 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65    tls1_3 = 0;.#e
5050: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62  ndif..    if (ob
5060: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
5070: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
5080: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
5090: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22  annel ?options?"
50a0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
50b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
50c0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
50d0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
50e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
50f0: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c  Obj(objv[1], NUL
5100: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
5110: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
5120: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
5130: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
5140: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
5150: 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75  *.     * Make su
5160: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
5170: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
5180: 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20  nnel.     */.   
5190: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
51a0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
51b0: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d  ..    for (idx =
51c0: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20   2; idx < objc; 
51d0: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a  idx++) {..char *
51e0: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  opt = Tcl_GetStr
51f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
5200: 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69  idx], NULL);...i
5210: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27  f (opt[0] != '-'
5220: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  )..    break;...
5230: 4f 50 54 53 54 52 28 20 22 2d 63 61 64 69 72 22  OPTSTR( "-cadir"
5240: 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54  , CAdir);..OPTST
5250: 52 28 20 22 2d 63 61 66 69 6c 65 22 2c 20 43 41  R( "-cafile", CA
5260: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 20  file);..OPTSTR( 
5270: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72  "-certfile", cer
5280: 74 29 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d 63  t);..OPTSTR( "-c
5290: 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29  ipher", ciphers)
52a0: 3b 0a 09 4f 50 54 4f 42 4a 28 20 22 2d 63 6f 6d  ;..OPTOBJ( "-com
52b0: 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a  mand", script);.
52c0: 09 4f 50 54 53 54 52 28 20 22 2d 64 68 70 61 72  .OPTSTR( "-dhpar
52d0: 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b  ams", DHparams);
52e0: 0a 09 4f 50 54 53 54 52 28 20 22 2d 6b 65 79 66  ..OPTSTR( "-keyf
52f0: 69 6c 65 22 2c 20 6b 65 79 29 3b 0a 09 4f 50 54  ile", key);..OPT
5300: 53 54 52 28 20 22 2d 6d 6f 64 65 6c 22 2c 20 6d  STR( "-model", m
5310: 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 20  odel);..OPTOBJ( 
5320: 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73  "-password", pas
5330: 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c  sword);..OPTBOOL
5340: 28 20 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65  ( "-require", re
5350: 71 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c  quire);..OPTBOOL
5360: 28 20 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65  ( "-request", re
5370: 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c  quest);..OPTBOOL
5380: 28 20 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72  ( "-server", ser
5390: 76 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 4f 50  ver);.#ifndef OP
53a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 0a  ENSSL_NO_TLSEXT.
53b0: 20 20 20 20 20 20 20 20 4f 50 54 53 54 52 28 20          OPTSTR( 
53c0: 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73  "-servername", s
53d0: 65 72 76 65 72 6e 61 6d 65 29 3b 0a 23 65 6e 64  ervername);.#end
53e0: 69 66 0a 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 2d  if...OPTBOOL( "-
53f0: 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f  ssl2", ssl2);..O
5400: 50 54 42 4f 4f 4c 28 20 22 2d 73 73 6c 33 22 2c  PTBOOL( "-ssl3",
5410: 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c   ssl3);..OPTBOOL
5420: 28 20 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29  ( "-tls1", tls1)
5430: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 74 6c  ;..OPTBOOL( "-tl
5440: 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a  s1.1", tls1_1);.
5450: 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 74 6c 73 31  .OPTBOOL( "-tls1
5460: 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f  .2", tls1_2);..O
5470: 50 54 42 4f 4f 4c 28 20 22 2d 74 6c 73 31 2e 33  PTBOOL( "-tls1.3
5480: 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 0a 09 4f 50  ", tls1_3);...OP
5490: 54 42 41 44 28 20 22 6f 70 74 69 6f 6e 22 2c 20  TBAD( "option", 
54a0: 22 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65  "-cadir, -cafile
54b0: 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69  , -certfile, -ci
54c0: 70 68 65 72 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20  pher, -command, 
54d0: 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 66  -dhparams, -keyf
54e0: 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61  ile, -model, -pa
54f0: 73 73 77 6f 72 64 2c 20 2d 72 65 71 75 69 72 65  ssword, -require
5500: 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 73 65 72  , -request, -ser
5510: 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65  ver, -servername
5520: 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20  , -ssl2, -ssl3, 
5530: 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20  -tls1, -tls1.1, 
5540: 2d 74 6c 73 31 2e 32 2c 20 6f 72 20 74 6c 73 31  -tls1.2, or tls1
5550: 2e 33 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54  .3");...return T
5560: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5570: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 29      if (request)
5580: 09 20 20 20 20 76 65 72 69 66 79 20 7c 3d 20 53  .    verify |= S
5590: 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54  SL_VERIFY_CLIENT
55a0: 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49  _ONCE | SSL_VERI
55b0: 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20  FY_PEER;.    if 
55c0: 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75  (request && requ
55d0: 69 72 65 29 20 76 65 72 69 66 79 20 7c 3d 20 53  ire) verify |= S
55e0: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49  SL_VERIFY_FAIL_I
55f0: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a  F_NO_PEER_CERT;.
5600: 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d      if (verify =
5610: 3d 20 30 29 09 76 65 72 69 66 79 20 3d 20 53 53  = 0).verify = SS
5620: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a  L_VERIFY_NONE;..
5630: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73      proto |= (ss
5640: 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  l2 ? TLS_PROTO_S
5650: 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  SL2 : 0);.    pr
5660: 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54  oto |= (ssl3 ? T
5670: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20  LS_PROTO_SSL3 : 
5680: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
5690: 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f   (tls1 ? TLS_PRO
56a0: 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20  TO_TLS1 : 0);.  
56b0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
56c0: 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _1 ? TLS_PROTO_T
56d0: 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20  LS1_1 : 0);.    
56e0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32  proto |= (tls1_2
56f0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
5700: 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  1_2 : 0);.    pr
5710: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f  oto |= (tls1_3 ?
5720: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
5730: 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  3 : 0);..    /* 
5740: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  reset to NULL if
5750: 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72   blank string pr
5760: 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66  ovided */.    if
5770: 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74   (cert && !*cert
5780: 29 09 09 63 65 72 74 09 20 3d 20 4e 55 4c 4c 3b  )..cert. = NULL;
5790: 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20  .    if (key && 
57a0: 21 2a 6b 65 79 29 09 09 6b 65 79 09 20 3d 20 4e  !*key)..key. = N
57b0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70  ULL;.    if (cip
57c0: 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72  hers && !*cipher
57d0: 73 29 09 63 69 70 68 65 72 73 09 20 3d 20 4e 55  s).ciphers. = NU
57e0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69  LL;.    if (CAfi
57f0: 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09  le && !*CAfile).
5800: 43 41 66 69 6c 65 09 20 3d 20 4e 55 4c 4c 3b 0a  CAfile. = NULL;.
5810: 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26      if (CAdir &&
5820: 20 21 2a 43 41 64 69 72 29 09 43 41 64 69 72 09   !*CAdir).CAdir.
5830: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
5840: 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44  (DHparams && !*D
5850: 48 70 61 72 61 6d 73 29 09 44 48 70 61 72 61 6d  Hparams).DHparam
5860: 73 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f  s = NULL;..    /
5870: 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20  * new SSL state 
5880: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 09  */.    statePtr.
5890: 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61  .= (State *) cka
58a0: 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20  lloc((unsigned) 
58b0: 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a  sizeof(State));.
58c0: 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65      memset(state
58d0: 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  Ptr, 0, sizeof(S
58e0: 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61  tate));..    sta
58f0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66  tePtr->flags.= f
5900: 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50  lags;.    stateP
5910: 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74  tr->interp.= int
5920: 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74  erp;.    statePt
5930: 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69  r->vflags.= veri
5940: 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  fy;.    statePtr
5950: 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20  ->err.= "";..   
5960: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72   /* allocate scr
5970: 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  ipt */.    if (s
5980: 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29  cript) {..(void)
5990: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
59a0: 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c  omObj(script, &l
59b0: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b  en);..if (len) {
59c0: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
59d0: 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70  callback = scrip
59e0: 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  t;..    Tcl_Incr
59f0: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
5a00: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d  r->callback);..}
5a10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61  .    }..    /* a
5a20: 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64  llocate password
5a30: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73   */.    if (pass
5a40: 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20  word) {..(void) 
5a50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
5a60: 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26  mObj(password, &
5a70: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20  len);..if (len) 
5a80: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  {..    statePtr-
5a90: 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73  >password = pass
5aa0: 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49  word;..    Tcl_I
5ab0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ncrRefCount(stat
5ac0: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b  ePtr->password);
5ad0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ..}.    }..    i
5ae0: 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c  f (model != NULL
5af0: 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09  ) {..int mode;..
5b00: 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65  /* Get the "mode
5b10: 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63  l" context */..c
5b20: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
5b30: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64  nnel(interp, mod
5b40: 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20  el, &mode);..if 
5b50: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
5b60: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
5b70: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
5b80: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
5b90: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
5ba0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20  _ERROR;..}..    
5bb0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 20      /*.         
5bc0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
5bd0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
5be0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20  pmost channel.  
5bf0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
5c00: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
5c10: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
5c20: 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68  ;..if (Tcl_GetCh
5c30: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
5c40: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
5c50: 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  pe()) {..    Tcl
5c60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5c70: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
5c80: 65 6c 20 5c 22 22 2c 0a 09 09 20 20 20 20 54 63  el \"",...    Tc
5c90: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
5ca0: 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74  (chan), "\": not
5cb0: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
5cc0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73   NULL);..    Tls
5cd0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
5ce0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
5cf0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5d00: 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61  ..}..ctx = ((Sta
5d10: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  te *)Tcl_GetChan
5d20: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
5d30: 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20  chan))->ctx;.   
5d40: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28   } else {..if ((
5d50: 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73  ctx = CTX_Init(s
5d60: 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c  tatePtr, server,
5d70: 20 70 72 6f 74 6f 2c 20 6b 65 79 2c 20 63 65 72   proto, key, cer
5d80: 74 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c 65  t, CAdir, CAfile
5d90: 2c 20 63 69 70 68 65 72 73 2c 0a 09 09 44 48 70  , ciphers,...DHp
5da0: 61 72 61 6d 73 29 29 20 3d 3d 20 28 53 53 4c 5f  arams)) == (SSL_
5db0: 43 54 58 2a 29 30 29 20 7b 0a 09 20 20 20 20 54  CTX*)0) {..    T
5dc0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
5dd0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
5de0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5df0: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  R;..}.    }..   
5e00: 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d   statePtr->ctx =
5e10: 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20   ctx;..    /*.  
5e20: 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20     * We need to 
5e30: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
5e40: 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73  he channel works
5e50: 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20   in binary (for 
5e60: 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79  the.     * encry
5e70: 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74  ption not to get
5e80: 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20   goofed up)..   
5e90: 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74    * We only want
5ea0: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62   to adjust the b
5eb0: 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d  uffering in pre-
5ec0: 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65  v2 channels, whe
5ed0: 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63  re.     * each c
5ee0: 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74  hannel in the st
5ef0: 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69  ack maintained i
5f00: 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a  ts own buffers..
5f10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f       */.    Tcl_
5f20: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
5f30: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
5f40: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44  tion);.    Tcl_D
5f50: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
5f60: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
5f70: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
5f80: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
5f90: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
5fa0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
5fb0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  t(&upperChannelE
5fc0: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63  ncoding);.    Tc
5fd0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
5fe0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
5ff0: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70   "-eofchar", &up
6000: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
6010: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  r);.    Tcl_GetC
6020: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
6030: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63  erp, chan, "-enc
6040: 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68  oding", &upperCh
6050: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a  annelEncoding);.
6060: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
6070: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
6080: 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61   chan, "-transla
6090: 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61  tion", &upperCha
60a0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
60b0: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
60c0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
60d0: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b  p, chan, "-block
60e0: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ing", &upperChan
60f0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20  nelBlocking);.  
6100: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
6110: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
6120: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  han, "-translati
6130: 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a  on", "binary");.
6140: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
6150: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
6160: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e   chan, "-blockin
6170: 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20  g", "true");.   
6180: 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d   dprintf("Consum
6190: 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20  ing Tcl channel 
61a0: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  %s", Tcl_GetChan
61b0: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a  nelName(chan));.
61c0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65      statePtr->se
61d0: 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68  lf = Tcl_StackCh
61e0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c  annel(interp, Tl
61f0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c  s_ChannelType(),
6200: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74   (ClientData) st
6210: 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 41  atePtr, (TCL_REA
6220: 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54  DABLE | TCL_WRIT
6230: 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20  ABLE), chan);.  
6240: 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 74    dprintf("Creat
6250: 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64  ed channel named
6260: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   %s", Tcl_GetCha
6270: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
6280: 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69  r->self));.    i
6290: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  f (statePtr->sel
62a0: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  f == (Tcl_Channe
62b0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09  l) NULL) {../*..
62c0: 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c   * No use of Tcl
62d0: 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20  _EventuallyFree 
62e0: 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69  because no possi
62f0: 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65  ble Tcl_Preserve
6300: 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65  ... */..Tls_Free
6310: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
6320: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tr);..return TCL
6330: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
6340: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
6350: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
6360: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
6370: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20  "-translation", 
6380: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
6390: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
63a0: 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20  anslation));.   
63b0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
63c0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
63d0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
63e0: 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44  encoding", Tcl_D
63f0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
6400: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
6410: 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  g));.    Tcl_Set
6420: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
6430: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
6440: 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22  self, "-eofchar"
6450: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
6460: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
6470: 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54  EOFChar));.    T
6480: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
6490: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
64a0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c  ePtr->self, "-bl
64b0: 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74  ocking", Tcl_DSt
64c0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
64d0: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
64e0: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
64f0: 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61  * SSL Initializa
6500: 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  tion.     */..  
6510: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20    statePtr->ssl 
6520: 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50  = SSL_new(stateP
6530: 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66  tr->ctx);.    if
6540: 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c   (!statePtr->ssl
6550: 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72  ) {../* SSL libr
6560: 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63  ary error */..Tc
6570: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6580: 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74  nterp, "couldn't
6590: 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73   construct ssl s
65a0: 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f  ession: ", REASO
65b0: 4e 28 29 2c 0a 09 09 28 63 68 61 72 20 2a 29 20  N(),...(char *) 
65c0: 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65  NULL);..Tls_Free
65d0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
65e0: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tr);..return TCL
65f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 23  _ERROR;.    }..#
6600: 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e  ifndef OPENSSL_N
6610: 4f 5f 54 4c 53 45 58 54 0a 20 20 20 20 69 66 20  O_TLSEXT.    if 
6620: 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 20  (servername) {. 
6630: 20 20 20 20 20 20 20 69 66 20 28 21 53 53 4c 5f         if (!SSL_
6640: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f  set_tlsext_host_
6650: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  name(statePtr->s
6660: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20  sl, servername) 
6670: 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 20 20  && require) {.  
6680: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70            Tcl_Ap
6690: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
66a0: 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53 20  p, "setting TLS 
66b0: 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e 73  host name extens
66c0: 69 6f 6e 20 66 61 69 6c 65 64 22 2c 0a 20 20 20  ion failed",.   
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
66e0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  ar *) NULL);.   
66f0: 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65           Tls_Fre
6700: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
6710: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ptr);.          
6720: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6730: 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
6740: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
6750: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61  /*.     * SSL Ca
6760: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a  llbacks.     */.
6770: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70  .    SSL_set_app
6780: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e  _data(statePtr->
6790: 73 73 6c 2c 20 28 56 4f 49 44 20 2a 29 73 74 61  ssl, (VOID *)sta
67a0: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74  tePtr);./* point
67b0: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a   back to us */..
67c0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69      SSL_set_veri
67d0: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  fy(statePtr->ssl
67e0: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79  , verify, Verify
67f0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20  Callback);..    
6800: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 69 6e 66 6f  SSL_CTX_set_info
6810: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
6820: 74 72 2d 3e 63 74 78 2c 20 49 6e 66 6f 43 61 6c  tr->ctx, InfoCal
6830: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20  lback);..    /* 
6840: 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e  Create Tcl_Chann
6850: 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a  el BIO Handler *
6860: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
6870: 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f  p_bio.= BIO_new_
6880: 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49  tcl(statePtr, BI
6890: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20  O_NOCLOSE);.    
68a0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20  statePtr->bio.= 
68b0: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73  BIO_new(BIO_f_ss
68c0: 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  l());..    if (s
68d0: 65 72 76 65 72 29 20 7b 0a 09 73 74 61 74 65 50  erver) {..stateP
68e0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
68f0: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53  _TCL_SERVER;..SS
6900: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61  L_set_accept_sta
6910: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
6920: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
6930: 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74  .SSL_set_connect
6940: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d  _state(statePtr-
6950: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >ssl);.    }.   
6960: 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61   SSL_set_bio(sta
6970: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74  tePtr->ssl, stat
6980: 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61  ePtr->p_bio, sta
6990: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20  tePtr->p_bio);. 
69a0: 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73     BIO_set_ssl(s
69b0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74  tatePtr->bio, st
69c0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f  atePtr->ssl, BIO
69d0: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20  _NOCLOSE);..    
69e0: 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66  /*.     * End of
69f0: 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a   SSL Init.     *
6a00: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  /.    dprintf("R
6a10: 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63  eturning %s", Tc
6a20: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
6a30: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
6a40: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  );.    Tcl_SetRe
6a50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
6a60: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61  ar *) Tcl_GetCha
6a70: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
6a80: 72 2d 3e 73 65 6c 66 29 2c 0a 09 20 20 20 20 54  r->self),..    T
6a90: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
6aa0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
6ab0: 0a 20 20 20 20 09 63 6c 69 65 6e 74 44 61 74 61  .    .clientData
6ac0: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
6ad0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
6b20: 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64  * UnimportObjCmd
6b30: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
6b40: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
6b50: 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ked to remove th
6b60: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
6b70: 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20  l filter.. *. * 
6b80: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
6b90: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
6ba0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
6bb0: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f  fects:. *.May mo
6bc0: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  dify the behavio
6bd0: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e  r of an IO chann
6be0: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
6c30: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69  ..static int.Uni
6c40: 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 63 6c 69 65  mportObjCmd(clie
6c50: 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20  ntData, interp, 
6c60: 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20  objc, objv).    
6c70: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
6c80: 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73  tData;./* Not us
6c90: 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  ed. */.    Tcl_I
6ca0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
6cb0: 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20     int objc;.   
6cc0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
6cd0: 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63  objv[];.{.    Tc
6ce0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09  l_Channel chan;.
6cf0: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20  ./* The channel 
6d00: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e  to set a mode on
6d10: 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74  . */..    dprint
6d20: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
6d30: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29    if (objc != 2)
6d40: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
6d50: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
6d60: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29  objv, "channel")
6d70: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
6d80: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
6d90: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
6da0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
6db0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
6dc0: 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  [1]), NULL);.   
6dd0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
6de0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
6df0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
6e00: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
6e10: 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20   /*.     * Make 
6e20: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
6e30: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
6e40: 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20  hannel.     */. 
6e50: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
6e60: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
6e70: 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  );..    if (Tcl_
6e80: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
6e90: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
6ea0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
6eb0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6ec0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
6ed0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
6ee0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
6ef0: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
6f00: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  TLS channel", NU
6f10: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
6f20: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
6f30: 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61     if (Tcl_Unsta
6f40: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  ckChannel(interp
6f50: 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45  , chan) == TCL_E
6f60: 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20  RROR) {..return 
6f70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6f80: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
6f90: 5f 4f 4b 3b 0a 20 20 20 20 09 63 6c 69 65 6e 74  _OK;.    .client
6fa0: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
6fb0: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  a;.}.../*. *----
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7000: 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d   *. * CTX_Init -
7010: 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53  - construct a SS
7020: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20  L_CTX instance. 
7030: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
7040: 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58  .A valid SSL_CTX
7050: 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c   instance or NUL
7060: 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  L.. *. * Side ef
7070: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72  fects:. *.constr
7080: 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74  ucts SSL context
7090: 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d   (CTX). *. *----
70a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
70e0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f   */..static SSL_
70f0: 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 73  CTX *.CTX_Init(s
7100: 74 61 74 65 50 74 72 2c 20 69 73 53 65 72 76 65  tatePtr, isServe
7110: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 2c 20 63  r, proto, key, c
7120: 65 72 74 2c 20 43 41 64 69 72 2c 20 43 41 66 69  ert, CAdir, CAfi
7130: 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 44 48 70  le, ciphers, DHp
7140: 61 72 61 6d 73 29 0a 20 20 20 20 53 74 61 74 65  arams).    State
7150: 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20   *statePtr;.    
7160: 69 6e 74 20 69 73 53 65 72 76 65 72 3b 0a 20 20  int isServer;.  
7170: 20 20 69 6e 74 20 70 72 6f 74 6f 3b 0a 20 20 20    int proto;.   
7180: 20 63 68 61 72 20 2a 6b 65 79 3b 0a 20 20 20 20   char *key;.    
7190: 63 68 61 72 20 2a 63 65 72 74 3b 0a 20 20 20 20  char *cert;.    
71a0: 63 68 61 72 20 2a 43 41 64 69 72 3b 0a 20 20 20  char *CAdir;.   
71b0: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 3b 0a 20   char *CAfile;. 
71c0: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73     char *ciphers
71d0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61  ;.    char *DHpa
71e0: 72 61 6d 73 3b 0a 7b 0a 20 20 20 20 54 63 6c 5f  rams;.{.    Tcl_
71f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
7200: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
7210: 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  p;.    SSL_CTX *
7220: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
7230: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a  Tcl_DString ds;.
7240: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
7250: 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66  ds1;.    int off
7260: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
7270: 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68  SSL_METHOD *meth
7280: 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  od;..    dprintf
7290: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
72a0: 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09   if (!proto) {..
72b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
72c0: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c  (interp, "no val
72d0: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  id protocol sele
72e0: 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  cted", NULL);..r
72f0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
7300: 29 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  )0;.    }..    /
7310: 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e  * create SSL con
7320: 74 65 78 74 20 2a 2f 0a 23 69 66 20 64 65 66 69  text */.#if defi
7330: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  ned(NO_SSL2).   
7340: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
7350: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
7360: 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  L2)) {..Tcl_Appe
7370: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7380: 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73   "protocol not s
7390: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
73a0: 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43  ;..return (SSL_C
73b0: 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65  TX *)0;.    }.#e
73c0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
73d0: 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66  (NO_SSL3).    if
73e0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
73f0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29   TLS_PROTO_SSL3)
7400: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
7410: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70  esult(interp, "p
7420: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
7430: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
7440: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20  return (SSL_CTX 
7450: 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  *)0;.    }.#endi
7460: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
7470: 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45  _TLS1).    if (E
7480: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
7490: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b  S_PROTO_TLS1)) {
74a0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
74b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74  lt(interp, "prot
74c0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
74d0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
74e0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30  urn (SSL_CTX *)0
74f0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
7500: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
7510: 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e  S1_1).    if (EN
7520: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
7530: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20  _PROTO_TLS1_1)) 
7540: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
7550: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f  ult(interp, "pro
7560: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
7570: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ted", NULL);..re
7580: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29  turn (SSL_CTX *)
7590: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  0;.    }.#endif.
75a0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
75b0: 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45  LS1_2).    if (E
75c0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
75d0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29  S_PROTO_TLS1_2))
75e0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
75f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72  sult(interp, "pr
7600: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
7610: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
7620: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
7630: 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  )0;.    }.#endif
7640: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
7650: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28  TLS1_3).    if (
7660: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
7670: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
7680: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
7690: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70  esult(interp, "p
76a0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
76b0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
76c0: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20  return (SSL_CTX 
76d0: 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  *)0;.    }.#endi
76e0: 66 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70  f..    switch (p
76f0: 72 6f 74 6f 29 20 7b 0a 23 69 66 20 21 64 65 66  roto) {.#if !def
7700: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 20  ined(NO_SSL2).  
7710: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
7720: 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d  _SSL2:..method =
7730: 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64 20 28 29   SSLv2_method ()
7740: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
7750: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
7760: 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20  _SSL3).    case 
7770: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a  TLS_PROTO_SSL3:.
7780: 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f  .method = SSLv3_
7790: 6d 65 74 68 6f 64 20 28 29 3b 0a 09 62 72 65 61  method ();..brea
77a0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
77b0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 0a  efined(NO_TLS1).
77c0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
77d0: 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64  TO_TLS1:..method
77e0: 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 20   = TLSv1_method 
77f0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
7800: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
7810: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 63  NO_TLS1_1).    c
7820: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
7830: 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  S1_1:..method = 
7840: 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 20 28  TLSv1_1_method (
7850: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
7860: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
7870: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 63 61  O_TLS1_2).    ca
7880: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
7890: 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54  1_2:..method = T
78a0: 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 20 28 29  LSv1_2_method ()
78b0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
78c0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
78d0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73  _TLS1_3).    cas
78e0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
78f0: 5f 33 3a 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20  _3:.        /*. 
7900: 20 20 20 20 20 20 20 20 2a 20 54 68 65 20 76 65          * The ve
7910: 72 73 69 6f 6e 20 72 61 6e 67 65 20 69 73 20 63  rsion range is c
7920: 6f 6e 73 74 72 61 69 6e 65 64 20 62 65 6c 6f 77  onstrained below
7930: 2c 0a 20 20 20 20 20 20 20 20 20 2a 20 61 66 74  ,.         * aft
7940: 65 72 20 74 68 65 20 63 6f 6e 74 65 78 74 20 69  er the context i
7950: 73 20 63 72 65 61 74 65 64 2e 20 20 55 73 65 20  s created.  Use 
7960: 74 68 65 0a 20 20 20 20 20 20 20 20 20 2a 20 67  the.         * g
7970: 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 68 65  eneric method he
7980: 72 65 2e 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a  re..         */.
7990: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65  .method = TLS_me
79a0: 74 68 6f 64 20 28 29 3b 0a 09 62 72 65 61 6b 3b  thod ();..break;
79b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
79c0: 75 6c 74 3a 0a 23 69 66 64 65 66 20 48 41 56 45  ult:.#ifdef HAVE
79d0: 5f 54 4c 53 5f 4d 45 54 48 4f 44 0a 20 20 20 20  _TLS_METHOD.    
79e0: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53      method = TLS
79f0: 5f 6d 65 74 68 6f 64 20 28 29 3b 0a 23 65 6c 73  _method ();.#els
7a00: 65 0a 20 20 20 20 20 20 20 20 6d 65 74 68 6f 64  e.        method
7a10: 20 3d 20 53 53 4c 76 32 33 5f 6d 65 74 68 6f 64   = SSLv23_method
7a20: 20 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20   ();.#endif.#if 
7a30: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32  !defined(NO_SSL2
7a40: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
7a50: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
7a60: 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20  OTO_SSL2)   ? 0 
7a70: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76  : SSL_OP_NO_SSLv
7a80: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  2);.#endif.#if !
7a90: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
7aa0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
7ab0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
7ac0: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a  TO_SSL3)   ? 0 :
7ad0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33   SSL_OP_NO_SSLv3
7ae0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
7af0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 0a  efined(NO_TLS1).
7b00: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
7b10: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
7b20: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20  O_TLS1)   ? 0 : 
7b30: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29  SSL_OP_NO_TLSv1)
7b40: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
7b50: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
7b60: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
7b70: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
7b80: 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a  TO_TLS1_1) ? 0 :
7b90: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
7ba0: 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  _1);.#endif.#if 
7bb0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
7bc0: 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _2)..off |= (ENA
7bd0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
7be0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20  PROTO_TLS1_2) ? 
7bf0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
7c00: 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23  Sv1_2);.#endif.#
7c10: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
7c20: 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28  LS1_3)..off |= (
7c30: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
7c40: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
7c50: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
7c60: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69  _TLSv1_3);.#endi
7c70: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  f..break;.    }.
7c80: 20 20 20 20 0a 20 20 20 20 63 74 78 20 3d 20 53      .    ctx = S
7c90: 53 4c 5f 43 54 58 5f 6e 65 77 20 28 6d 65 74 68  SL_CTX_new (meth
7ca0: 6f 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 63  od);..    if (!c
7cb0: 74 78 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  tx) {.        re
7cc0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20  turn(NULL);.    
7cd0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
7ce0: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69  NO_TLS1_3).    i
7cf0: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f  f (proto == TLS_
7d00: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a  PROTO_TLS1_3) {.
7d10: 20 20 20 20 20 20 20 20 53 53 4c 5f 43 54 58 5f          SSL_CTX_
7d20: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65  set_min_proto_ve
7d30: 72 73 69 6f 6e 20 28 63 74 78 2c 20 54 4c 53 31  rsion (ctx, TLS1
7d40: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20  _3_VERSION);.   
7d50: 20 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74       SSL_CTX_set
7d60: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
7d70: 6f 6e 20 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  on (ctx, TLS1_3_
7d80: 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a  VERSION);.    }.
7d90: 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20  #endif.    .    
7da0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f  SSL_CTX_set_app_
7db0: 64 61 74 61 28 20 63 74 78 2c 20 28 56 4f 49 44  data( ctx, (VOID
7dc0: 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65  *)interp);./* re
7dd0: 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72  member the inter
7de0: 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53  preter */.    SS
7df0: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
7e00: 73 28 20 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41  s( ctx, SSL_OP_A
7e10: 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20  LL);./* all SSL 
7e20: 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20  bug workarounds 
7e30: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
7e40: 65 74 5f 6f 70 74 69 6f 6e 73 28 20 63 74 78 2c  et_options( ctx,
7e50: 20 6f 66 66 29 3b 09 2f 2a 20 61 6c 6c 20 53 53   off);./* all SS
7e60: 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64  L bug workaround
7e70: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  s */.    SSL_CTX
7e80: 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f  _sess_set_cache_
7e90: 73 69 7a 65 28 20 63 74 78 2c 20 31 32 38 29 3b  size( ctx, 128);
7ea0: 0a 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72  ..    if (cipher
7eb0: 73 20 21 3d 20 4e 55 4c 4c 29 0a 09 53 53 4c 5f  s != NULL)..SSL_
7ec0: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c  CTX_set_cipher_l
7ed0: 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73  ist(ctx, ciphers
7ee0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73  );..    /* set s
7ef0: 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f  ome callbacks */
7f00: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
7f10: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f  _default_passwd_
7f20: 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64  cb(ctx, Password
7f30: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 23 69 66 6e  Callback);..#ifn
7f40: 64 65 66 20 42 53 41 46 45 0a 20 20 20 20 53 53  def BSAFE.    SS
7f50: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
7f60: 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72  t_passwd_cb_user
7f70: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20  data(ctx, (void 
7f80: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23 65 6e  *)statePtr);.#en
7f90: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64  dif..    /* read
7fa0: 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61   a Diffie-Hellma
7fb0: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c  n parameters fil
7fc0: 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75  e, or use the bu
7fd0: 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69  ilt-in one */.#i
7fe0: 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  fdef OPENSSL_NO_
7ff0: 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72  DH.    if (DHpar
8000: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ams != NULL) {..
8010: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8020: 28 69 6e 74 65 72 70 2c 0a 09 20 20 20 20 22 44  (interp,..    "D
8030: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70  H parameter supp
8040: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ort not availabl
8050: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
8060: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
8070: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
8080: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20  (SSL_CTX *)0;.  
8090: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a    }.#else.    {.
80a0: 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48  .DH* dh;..if (DH
80b0: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20  params != NULL) 
80c0: 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b  {..    BIO *bio;
80d0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
80e0: 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20  gInit(&ds);..   
80f0: 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66   bio = BIO_new_f
8100: 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73  ile(F2N(DHparams
8110: 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20  , &ds), "r");.. 
8120: 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09     if (!bio) {..
8130: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
8140: 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70  (&ds);...Tcl_App
8150: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8160: 2c 0a 09 09 20 20 20 20 22 43 6f 75 6c 64 20 6e  ,...    "Could n
8170: 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d  ot find DH param
8180: 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68  eters file", (ch
8190: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
81a0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
81b0: 3b 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f  ;...return (SSL_
81c0: 43 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a  CTX *)0;..    }.
81d0: 09 20 20 20 20 0a 09 20 20 20 20 64 68 20 3d 20  .    ..    dh = 
81e0: 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70  PEM_read_bio_DHp
81f0: 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c  arams(bio, NULL,
8200: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20   NULL, NULL);.. 
8210: 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29     BIO_free(bio)
8220: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ;..    Tcl_DStri
8230: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
8240: 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54    if (!dh) {...T
8250: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8260: 69 6e 74 65 72 70 2c 0a 09 09 20 20 20 20 22 43  interp,...    "C
8270: 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48  ould not read DH
8280: 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d   parameters from
8290: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29   file", (char *)
82a0: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
82b0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
82c0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
82d0: 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c  )0;..    }..} el
82e0: 73 65 20 7b 0a 09 20 20 20 20 64 68 20 3d 20 67  se {..    dh = g
82f0: 65 74 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a 09  et_dhParams();..
8300: 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74  }..SSL_CTX_set_t
8310: 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a  mp_dh(ctx, dh);.
8320: 09 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 20  .DH_free(dh);.  
8330: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
8340: 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69  /* set our certi
8350: 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 69 66  ficate */.    if
8360: 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20   (cert != NULL) 
8370: 7b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  {..Tcl_DStringIn
8380: 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53  it(&ds);...if (S
8390: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69  SL_CTX_use_certi
83a0: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c  ficate_file(ctx,
83b0: 20 46 32 4e 28 20 63 65 72 74 2c 20 26 64 73 29   F2N( cert, &ds)
83c0: 2c 0a 09 09 09 09 09 53 53 4c 5f 46 49 4c 45 54  ,......SSL_FILET
83d0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
83e0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
83f0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
8400: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8410: 74 28 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 20  t(interp,....   
8420: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74    "unable to set
8430: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c   certificate fil
8440: 65 20 22 2c 20 63 65 72 74 2c 20 22 3a 20 22 2c  e ", cert, ": ",
8450: 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28  ....     REASON(
8460: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
8470: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
8480: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20  free(ctx);..    
8490: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20  return (SSL_CTX 
84a0: 2a 29 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 67 65 74  *)0;..}.../* get
84b0: 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 79   the private key
84c0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
84d0: 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74   this certificat
84e0: 65 20 2a 2f 0a 09 69 66 20 28 6b 65 79 20 3d 3d  e */..if (key ==
84f0: 20 4e 55 4c 4c 29 20 6b 65 79 3d 63 65 72 74 3b   NULL) key=cert;
8500: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ...if (SSL_CTX_u
8510: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69  se_PrivateKey_fi
8520: 6c 65 28 63 74 78 2c 20 46 32 4e 28 20 6b 65 79  le(ctx, F2N( key
8530: 2c 20 26 64 73 29 2c 0a 09 09 09 09 09 53 53 4c  , &ds),......SSL
8540: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
8550: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
8560: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
8570: 3b 0a 09 20 20 20 20 2f 2a 20 66 6c 75 73 68 20  ;..    /* flush 
8580: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77  the passphrase w
8590: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65  hich might be le
85a0: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ft in the result
85b0: 20 2a 2f 0a 09 20 20 20 20 54 63 6c 5f 53 65 74   */..    Tcl_Set
85c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e  Result(interp, N
85d0: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ULL, TCL_STATIC)
85e0: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ;..    Tcl_Appen
85f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a  dResult(interp,.
8600: 09 09 09 20 20 20 20 20 22 75 6e 61 62 6c 65 20  ...     "unable 
8610: 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65  to set public ke
8620: 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 2c 20 22  y file ", key, "
8630: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53   ",....     REAS
8640: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
8650: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
8660: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
8670: 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43     return (SSL_C
8680: 54 58 20 2a 29 30 3b 0a 09 7d 0a 09 54 63 6c 5f  TX *)0;..}..Tcl_
8690: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
86a0: 3b 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f  ;../* Now we kno
86b0: 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64  w that a key and
86c0: 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20   cert have been 
86d0: 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20  set against.. * 
86e0: 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  the SSL context 
86f0: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58  */..if (!SSL_CTX
8700: 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b  _check_private_k
8710: 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20  ey(ctx)) {..    
8720: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8730: 28 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20  (interp,....    
8740: 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f   "private key do
8750: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
8760: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62   certificate pub
8770: 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20  lic key",....   
8780: 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29    (char *) NULL)
8790: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
87a0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
87b0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
87c0: 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  )0;..}.    } els
87d0: 65 20 7b 0a 09 63 65 72 74 20 3d 20 28 63 68 61  e {..cert = (cha
87e0: 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61  r*)X509_get_defa
87f0: 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b  ult_cert_file();
8800: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ...if (SSL_CTX_u
8810: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66  se_certificate_f
8820: 69 6c 65 28 63 74 78 2c 20 63 65 72 74 2c 0a 09  ile(ctx, cert,..
8830: 09 09 09 09 53 53 4c 5f 46 49 4c 45 54 59 50 45  ....SSL_FILETYPE
8840: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69  _PEM) <= 0) {.#i
8850: 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  f 0..    Tcl_DSt
8860: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
8870: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8880: 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09 09 09  sult(interp,....
8890: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
88a0: 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74  use default cert
88b0: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20  ificate file ", 
88c0: 63 65 72 74 2c 20 22 3a 20 22 2c 0a 09 09 09 20  cert, ": ",.... 
88d0: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63      REASON(), (c
88e0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
88f0: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
8900: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
8910: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a  n (SSL_CTX *)0;.
8920: 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a  #endif..}.    }.
8930: 09 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
8940: 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20  gInit(&ds);.    
8950: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
8960: 26 64 73 31 29 3b 0a 20 20 20 20 69 66 20 28 21  &ds1);.    if (!
8970: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72  SSL_CTX_load_ver
8980: 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74  ify_locations(ct
8990: 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26  x, F2N(CAfile, &
89a0: 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20  ds), F2N(CAdir, 
89b0: 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f  &ds1)) ||..!SSL_
89c0: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
89d0: 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78  verify_paths(ctx
89e0: 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f  )) {.#if 0..Tcl_
89f0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
8a00: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ;..Tcl_DStringFr
8a10: 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f  ee(&ds1);../* Do
8a20: 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61  n't currently ca
8a30: 72 65 20 69 66 20 74 68 69 73 20 66 61 69 6c 73  re if this fails
8a40: 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52   */..Tcl_AppendR
8a50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
8a60: 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69 66  SL default verif
8a70: 79 20 70 61 74 68 73 3a 20 22 2c 0a 09 09 52 45  y paths: ",...RE
8a80: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
8a90: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58   NULL);..SSL_CTX
8aa0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
8ab0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30  urn (SSL_CTX *)0
8ac0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
8ad0: 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73      /* https://s
8ae0: 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70  ourceforge.net/p
8af0: 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f  /tls/bugs/57/ */
8b00: 0a 20 20 20 20 69 66 20 28 20 43 41 66 69 6c 65  .    if ( CAfile
8b10: 20 21 3d 20 4e 55 4c 4c 20 29 20 7b 0a 20 20 20   != NULL ) {.   
8b20: 20 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35       STACK_OF(X5
8b30: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61  09_NAME) *certNa
8b40: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63  mes = SSL_load_c
8b50: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 20 46  lient_CA_file( F
8b60: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 20  2N(CAfile, &ds) 
8b70: 29 3b 0a 09 69 66 20 28 20 63 65 72 74 4e 61 6d  );..if ( certNam
8b80: 65 73 20 21 3d 20 4e 55 4c 4c 20 29 20 7b 20 0a  es != NULL ) { .
8b90: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
8ba0: 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28  _client_CA_list(
8bb0: 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 20 29  ctx, certNames )
8bc0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
8bd0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
8be0: 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  &ds);.    Tcl_DS
8bf0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b  tringFree(&ds1);
8c00: 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b  .    return ctx;
8c10: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
8c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8c60: 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64  . * StatusObjCmd
8c70: 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69   -- return certi
8c80: 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65  ficate for conne
8c90: 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a  cted peer.. *. *
8ca0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
8cb0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
8cc0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
8cd0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
8ce0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
8cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
8d30: 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f  atic int.StatusO
8d40: 62 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61  bjCmd(clientData
8d50: 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20  , interp, objc, 
8d60: 6f 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74  objv).    Client
8d70: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b  Data clientData;
8d80: 09 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f  ./* Not used. */
8d90: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
8da0: 2a 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74  *interp;.    int
8db0: 20 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f   objc;.    Tcl_O
8dc0: 62 6a 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj.*CONST objv[]
8dd0: 3b 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ;.{.    State *s
8de0: 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30  tatePtr;.    X50
8df0: 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c  9 *peer;.    Tcl
8e00: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20  _Obj *objPtr;.  
8e10: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
8e20: 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68  an;.    char *ch
8e30: 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68  annelName, *ciph
8e40: 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64  ers;.    int mod
8e50: 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  e;..    dprintf(
8e60: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
8e70: 73 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a  switch (objc) {.
8e80: 09 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63 68  .case 2:..    ch
8e90: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f  annelName = Tcl_
8ea0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8eb0: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b  (objv[1], NULL);
8ec0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
8ed0: 61 73 65 20 33 3a 0a 09 20 20 20 20 69 66 20 28  ase 3:..    if (
8ee0: 21 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 74  !strcmp (Tcl_Get
8ef0: 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29  String (objv[1])
8f00: 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09  , "-local")) {..
8f10: 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54  .channelName = T
8f20: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
8f30: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c  Obj(objv[2], NUL
8f40: 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  L);...break;..  
8f50: 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65    }..    /* else
8f60: 20 66 61 6c 6c 2e 2e 2e 20 2a 2f 0a 09 64 65 66   fall... */..def
8f70: 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57  ault:..    Tcl_W
8f80: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8f90: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d  rp, 1, objv, "?-
8fa0: 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29  local? channel")
8fb0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
8fc0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
8fd0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
8fe0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
8ff0: 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26  , channelName, &
9000: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63  mode);.    if (c
9010: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
9020: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
9030: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9040: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20      }.    /*.   
9050: 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f    * Make sure to
9060: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
9070: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a  topmost channel.
9080: 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e       */.    chan
9090: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
90a0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
90b0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
90c0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
90d0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
90e0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
90f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9100: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
9110: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
9120: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
9130: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
9140: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  nel", NULL);..re
9150: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9160: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
9170: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54  tr = (State *) T
9180: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
9190: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b  tanceData(chan);
91a0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
91b0: 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53   2) {..peer = SS
91c0: 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69  L_get_peer_certi
91d0: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d  ficate(statePtr-
91e0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  >ssl);.    } els
91f0: 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f  e {..peer = SSL_
9200: 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28  get_certificate(
9210: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
9220: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 65      }.    if (pe
9230: 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20  er) {..objPtr = 
9240: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69  Tls_NewX509Obj(i
9250: 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69  nterp, peer);..i
9260: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 20  f (objc == 2) { 
9270: 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b  X509_free(peer);
9280: 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
9290: 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65  .objPtr = Tcl_Ne
92a0: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
92b0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  );.    }..    Tc
92c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
92d0: 6c 65 6d 65 6e 74 20 28 69 6e 74 65 72 70 2c 20  lement (interp, 
92e0: 6f 62 6a 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  objPtr,..    Tcl
92f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 20 28 22  _NewStringObj ("
9300: 73 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20  sbits", -1));.  
9310: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
9320: 65 6e 64 45 6c 65 6d 65 6e 74 20 28 69 6e 74 65  endElement (inte
9330: 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 20 20 20  rp, objPtr,..   
9340: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 20 28   Tcl_NewIntObj (
9350: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62  SSL_get_cipher_b
9360: 69 74 73 20 28 73 74 61 74 65 50 74 72 2d 3e 73  its (statePtr->s
9370: 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20  sl, NULL)));..  
9380: 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61    ciphers = (cha
9390: 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65  r*)SSL_get_ciphe
93a0: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  r(statePtr->ssl)
93b0: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72  ;.    if (cipher
93c0: 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 73 74 72  s != NULL && str
93d0: 63 6d 70 28 63 69 70 68 65 72 73 2c 20 22 28 4e  cmp(ciphers, "(N
93e0: 4f 4e 45 29 22 29 21 3d 30 29 20 7b 0a 09 54 63  ONE)")!=0) {..Tc
93f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
9400: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
9410: 62 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77  bjPtr,...Tcl_New
9420: 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65  StringObj("ciphe
9430: 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  r", -1));..Tcl_L
9440: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
9450: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
9460: 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72  tr,...Tcl_NewStr
9470: 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63  ingObj(SSL_get_c
9480: 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ipher(statePtr->
9490: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ssl), -1));.    
94a0: 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  }.    Tcl_SetObj
94b0: 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20  Result( interp, 
94c0: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
94d0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
94e0: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
94f0: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a  ientData;.}.../*
9500: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
9510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9540: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72  ------. *. * Ver
9550: 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  sionObjCmd -- re
9560: 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72  turn version str
9570: 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c  ing from OpenSSL
9580: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
9590: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
95a0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
95b0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
95c0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
95d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
95e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
95f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9610: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
9620: 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 63 6c  VersionObjCmd(cl
9630: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70  ientData, interp
9640: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20  , objc, objv).  
9650: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
9660: 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20  entData;./* Not 
9670: 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  used. */.    Tcl
9680: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
9690: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20  .    int objc;. 
96a0: 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e 53     Tcl_Obj.*CONS
96b0: 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20  T objv[];.{.    
96c0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
96d0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
96e0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62  alled");..    ob
96f0: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74  jPtr = Tcl_NewSt
9700: 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f  ringObj(OPENSSL_
9710: 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31  VERSION_TEXT, -1
9720: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  );..    Tcl_SetO
9730: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
9740: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
9750: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
9760: 20 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63   .clientData = c
9770: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 09  lientData;.    .
9780: 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 20 20 20  objc = objc;.   
9790: 20 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d   .objv = objv;.}
97a0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
97b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
97f0: 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20  * MiscObjCmd -- 
9800: 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a  misc commands. *
9810: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
9820: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
9830: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
9840: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
9850: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
9860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
98a0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63  .static int.Misc
98b0: 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 74  ObjCmd(clientDat
98c0: 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c  a, interp, objc,
98d0: 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e   objv).    Clien
98e0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
98f0: 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a  ;./* Not used. *
9900: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  /.    Tcl_Interp
9910: 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e   *interp;.    in
9920: 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f  t objc;.    Tcl_
9930: 4f 62 6a 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj.*CONST objv[
9940: 5d 3b 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20  ];.{.    static 
9950: 43 4f 4e 53 54 38 34 20 63 68 61 72 20 2a 63 6f  CONST84 char *co
9960: 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72  mmands [] = { "r
9970: 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20  eq", NULL };.   
9980: 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20   enum command { 
9990: 43 5f 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d  C_REQ, C_DUMMY }
99a0: 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 3b 0a 0a  ;.    int cmd;..
99b0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
99c0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
99d0: 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
99e0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
99f0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
9a00: 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73  subcommand ?args
9a10: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
9a20: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9a30: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64    if (Tcl_GetInd
9a40: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
9a50: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61  , objv[1], comma
9a60: 6e 64 73 2c 0a 09 20 20 20 20 22 63 6f 6d 6d 61  nds,..    "comma
9a70: 6e 64 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20  nd", 0,&cmd) != 
9a80: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
9a90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9aa0: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28   }..    switch (
9ab0: 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63  (enum command) c
9ac0: 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45  md) {..case C_RE
9ad0: 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b  Q: {..    EVP_PK
9ae0: 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09  EY *pkey=NULL;..
9af0: 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e      X509 *cert=N
9b00: 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e  ULL;..    X509_N
9b10: 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a  AME *name=NULL;.
9b20: 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c  .    Tcl_Obj **l
9b30: 69 73 74 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c  istv;..    int l
9b40: 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49  istc,i;...    BI
9b50: 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20  O *out=NULL;... 
9b60: 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c     char *k_C="",
9b70: 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22  *k_ST="",*k_L=""
9b80: 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22  ,*k_O="",*k_OU="
9b90: 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d  ",*k_CN="",*k_Em
9ba0: 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61  ail="";..    cha
9bb0: 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75  r *keyout,*pemou
9bc0: 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74  t,*str;..    int
9bd0: 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d   keysize,serial=
9be0: 30 2c 64 61 79 73 3d 33 36 35 3b 0a 09 20 20 20  0,days=365;..   
9bf0: 20 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63   ..    if ((objc
9c00: 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29  <5) || (objc>6))
9c10: 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75   {...Tcl_WrongNu
9c20: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
9c30: 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20   objv, "keysize 
9c40: 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65  keyfile certfile
9c50: 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74   ?info?");...ret
9c60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
9c70: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
9c80: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
9c90: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
9ca0: 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20  ], &keysize) != 
9cb0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75  TCL_OK) {...retu
9cc0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
9cd0: 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74     }..    keyout
9ce0: 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  =Tcl_GetString(o
9cf0: 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65  bjv[3]);..    pe
9d00: 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69  mout=Tcl_GetStri
9d10: 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 09 20  ng(objv[4]);... 
9d20: 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20     if (objc>=6) 
9d30: 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74  {...if (Tcl_List
9d40: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69  ObjGetElements(i
9d50: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a  nterp, objv[5],.
9d60: 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74  ...&listc, &list
9d70: 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  v) != TCL_OK) {.
9d80: 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
9d90: 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69  _ERROR;...}....i
9da0: 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20  f ((listc%2) != 
9db0: 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  0) {...    Tcl_S
9dc0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
9dd0: 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73  "Information lis
9de0: 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e  t must have even
9df0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
9e00: 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ents",NULL);... 
9e10: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9e20: 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28  ROR;...}...for (
9e30: 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b  i=0; i<listc; i+
9e40: 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d  =2) {...    str=
9e50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
9e60: 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69  stv[i]);...    i
9e70: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64  f (strcmp(str,"d
9e80: 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69  ays")==0) {....i
9e90: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
9ea0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74  mObj(interp,list
9eb0: 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54  v[i+1],&days)!=T
9ec0: 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65  CL_OK)....    re
9ed0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9ee0: 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
9ef0: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72  (strcmp(str,"ser
9f00: 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69  ial")==0) {....i
9f10: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
9f20: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74  mObj(interp,list
9f30: 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21  v[i+1],&serial)!
9f40: 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20  =TCL_OK)....    
9f50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9f60: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
9f70: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73  f (strcmp(str,"s
9f80: 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09  erial")==0) {...
9f90: 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46  .if (Tcl_GetIntF
9fa0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69  romObj(interp,li
9fb0: 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c  stv[i+1],&serial
9fc0: 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20  )!=TCL_OK)....  
9fd0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9fe0: 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  OR;...    } else
9ff0: 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
a000: 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "C")==0) {....k_
a010: 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  C=Tcl_GetString(
a020: 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
a030: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
a040: 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d  rcmp(str,"ST")==
a050: 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c  0) {....k_ST=Tcl
a060: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
a070: 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
a080: 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
a090: 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09  str,"L")==0) {..
a0a0: 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72  ..k_L=Tcl_GetStr
a0b0: 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
a0c0: 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
a0d0: 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22   (strcmp(str,"O"
a0e0: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54  )==0) {....k_O=T
a0f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
a100: 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
a110: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
a120: 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20  p(str,"OU")==0) 
a130: 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65  {....k_OU=Tcl_Ge
a140: 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
a150: 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
a160: 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
a170: 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09  ,"CN")==0) {....
a180: 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69  k_CN=Tcl_GetStri
a190: 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
a1a0: 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
a1b0: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61  (strcmp(str,"Ema
a1c0: 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  il")==0) {....k_
a1d0: 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72  Email=Tcl_GetStr
a1e0: 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
a1f0: 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ...    } else {.
a200: 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
a210: 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e  (interp,"Unknown
a220: 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c   parameter",NULL
a230: 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c  );....return TCL
a240: 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a  _ERROR;...    }.
a250: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ..}..    }..    
a260: 69 66 20 28 28 70 6b 65 79 20 3d 20 45 56 50 5f  if ((pkey = EVP_
a270: 50 4b 45 59 5f 6e 65 77 28 29 29 20 21 3d 20 4e  PKEY_new()) != N
a280: 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 21 45 56  ULL) {...if (!EV
a290: 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53  P_PKEY_assign_RS
a2a0: 41 28 70 6b 65 79 2c 0a 09 09 09 52 53 41 5f 67  A(pkey,....RSA_g
a2b0: 65 6e 65 72 61 74 65 5f 6b 65 79 28 6b 65 79 73  enerate_key(keys
a2c0: 69 7a 65 2c 20 30 78 31 30 30 30 31 2c 20 4e 55  ize, 0x10001, NU
a2d0: 4c 4c 2c 20 4e 55 4c 4c 29 29 29 20 7b 0a 09 09  LL, NULL))) {...
a2e0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
a2f0: 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
a300: 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61  generating priva
a310: 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09  te key",NULL);..
a320: 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72  .    EVP_PKEY_fr
a330: 65 65 28 70 6b 65 79 29 3b 0a 09 09 20 20 20 20  ee(pkey);...    
a340: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a350: 3b 0a 09 09 7d 0a 09 09 6f 75 74 3d 42 49 4f 5f  ;...}...out=BIO_
a360: 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29  new(BIO_s_file()
a370: 29 3b 0a 09 09 42 49 4f 5f 77 72 69 74 65 5f 66  );...BIO_write_f
a380: 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f  ilename(out,keyo
a390: 75 74 29 3b 0a 09 09 50 45 4d 5f 77 72 69 74 65  ut);...PEM_write
a3a0: 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28  _bio_PrivateKey(
a3b0: 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55  out,pkey,NULL,NU
a3c0: 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b  LL,0,NULL,NULL);
a3d0: 0a 09 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28  ...BIO_free_all(
a3e0: 6f 75 74 29 3b 0a 0a 09 09 69 66 20 28 28 63 65  out);....if ((ce
a3f0: 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d  rt=X509_new())==
a400: 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63  NULL) {...    Tc
a410: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
a420: 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61  rp,"Error genera
a430: 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ting certificate
a440: 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b   request",NULL);
a450: 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
a460: 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 20 20  free(pkey);...  
a470: 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52    return(TCL_ERR
a480: 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  OR);...}....X509
a490: 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72  _set_version(cer
a4a0: 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54  t,2);...ASN1_INT
a4b0: 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65  EGER_set(X509_ge
a4c0: 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63  t_serialNumber(c
a4d0: 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09  ert),serial);...
a4e0: 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
a4f0: 58 35 30 39 5f 67 65 74 5f 6e 6f 74 42 65 66 6f  X509_get_notBefo
a500: 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58  re(cert),0);...X
a510: 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58  509_gmtime_adj(X
a520: 35 30 39 5f 67 65 74 5f 6e 6f 74 41 66 74 65 72  509_get_notAfter
a530: 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a  (cert),(long)60*
a540: 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58  60*24*days);...X
a550: 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63  509_set_pubkey(c
a560: 65 72 74 2c 70 6b 65 79 29 3b 0a 09 09 0a 09 09  ert,pkey);......
a570: 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75  name=X509_get_su
a580: 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29  bject_name(cert)
a590: 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  ;....X509_NAME_a
a5a0: 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
a5b0: 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49  name,"C", MBSTRI
a5c0: 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65  NG_ASC, (unsigne
a5d0: 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d  d char *) k_C, -
a5e0: 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
a5f0: 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
a600: 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54  _by_txt(name,"ST
a610: 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
a620: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
a630: 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c  *) k_ST, -1, -1,
a640: 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
a650: 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
a660: 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54  t(name,"L", MBST
a670: 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67  RING_ASC, (unsig
a680: 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c  ned char *) k_L,
a690: 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
a6a0: 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
a6b0: 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
a6c0: 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  O", MBSTRING_ASC
a6d0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
a6e0: 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c   *) k_O, -1, -1,
a6f0: 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
a700: 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
a710: 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53  t(name,"OU", MBS
a720: 54 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69  TRING_ASC, (unsi
a730: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f  gned char *) k_O
a740: 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  U, -1, -1, 0);..
a750: 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
a760: 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
a770: 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f  ,"CN", MBSTRING_
a780: 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ASC, (unsigned c
a790: 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c  har *) k_CN, -1,
a7a0: 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
a7b0: 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
a7c0: 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69  y_txt(name,"Emai
a7d0: 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  l", MBSTRING_ASC
a7e0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
a7f0: 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c   *) k_Email, -1,
a800: 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39   -1, 0);....X509
a810: 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d  _set_subject_nam
a820: 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09  e(cert,name);...
a830: 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28  .if (!X509_sign(
a840: 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 6d 64  cert,pkey,EVP_md
a850: 35 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35  5())) {...    X5
a860: 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09  09_free(cert);..
a870: 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72  .    EVP_PKEY_fr
a880: 65 65 28 70 6b 65 79 29 3b 0a 09 09 20 20 20 20  ee(pkey);...    
a890: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
a8a0: 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e  terp,"Error sign
a8b0: 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22  ing certificate"
a8c0: 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65  ,NULL);...    re
a8d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a8e0: 09 09 7d 0a 0a 09 09 6f 75 74 3d 42 49 4f 5f 6e  ..}....out=BIO_n
a8f0: 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29  ew(BIO_s_file())
a900: 3b 0a 09 09 42 49 4f 5f 77 72 69 74 65 5f 66 69  ;...BIO_write_fi
a910: 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75  lename(out,pemou
a920: 74 29 3b 0a 0a 09 09 50 45 4d 5f 77 72 69 74 65  t);....PEM_write
a930: 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65  _bio_X509(out,ce
a940: 72 74 29 3b 0a 09 09 42 49 4f 5f 66 72 65 65 5f  rt);...BIO_free_
a950: 61 6c 6c 28 6f 75 74 29 3b 0a 0a 09 09 58 35 30  all(out);....X50
a960: 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09  9_free(cert);...
a970: 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
a980: 65 79 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  ey);..    } else
a990: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75   {...Tcl_SetResu
a9a0: 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
a9b0: 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76   generating priv
a9c0: 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a  ate key",NULL);.
a9d0: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
a9e0: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62  OR;..    }..}..b
a9f0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
aa00: 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t:..break;.    }
aa10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
aa20: 4f 4b 3b 0a 20 20 20 20 09 63 6c 69 65 6e 74 44  OK;.    .clientD
aa30: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
aa40: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
aa50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aa80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
aa90: 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d  *. * Tls_Free --
aaa0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
aab0: 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20  edure cleans up 
aac0: 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65  when a SSL socke
aad0: 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a  t based channel.
aae0: 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64   *.is closed and
aaf0: 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
ab00: 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77  ount falls below
ab10: 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73   1. *. * Results
ab20: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.none. *. * 
ab30: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
ab40: 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73  .Frees all the s
ab50: 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  tate. *. *------
ab60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
aba0: 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28  /.void.Tls_Free(
abb0: 20 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 20   char *blockPtr 
abc0: 29 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ).{.    State *s
abd0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
abe0: 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20   *)blockPtr;..  
abf0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
ac00: 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c  d");..    Tls_Cl
ac10: 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20  ean(statePtr);. 
ac20: 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50     ckfree(blockP
ac30: 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  tr);.}.../*. *--
ac40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac80: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61  -. *. * Tls_Clea
ac90: 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  n --. *. *.This 
aca0: 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
acb0: 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
acc0: 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
acd0: 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
ace0: 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
acf0: 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
ad00: 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68  elow 1.  This sh
ad10: 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65  ould. *.be calle
ad20: 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20  d synchronously 
ad30: 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63  by the CloseProc
ad40: 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09  , not in the. *.
ad50: 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63  EventuallyFree c
ad60: 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52  allback.. *. * R
ad70: 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  esults:. *.none.
ad80: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
ad90: 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c  ts:. *.Frees all
ada0: 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a   the state. *. *
adb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
add0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ade0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adf0: 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73  ---. */.void Tls
ae00: 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74  _Clean(State *st
ae10: 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70  atePtr) {.    dp
ae20: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
ae30: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
ae40: 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68  we're assuming h
ae50: 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73  ere that we're s
ae60: 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20  ingle-threaded. 
ae70: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73      */.    if (s
ae80: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21  tatePtr->timer !
ae90: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
aea0: 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  n) NULL) {..Tcl_
aeb0: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c  DeleteTimerHandl
aec0: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  er(statePtr->tim
aed0: 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  er);..statePtr->
aee0: 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20  timer = NULL;.  
aef0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
af00: 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f  tePtr->bio) {../
af10: 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c  * This will call
af20: 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42   SSL_shutdown. B
af30: 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64  ug 1414045 */..d
af40: 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65  printf("BIO_free
af50: 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65  _all(%p)", state
af60: 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f  Ptr->bio);..BIO_
af70: 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74  free_all(statePt
af80: 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50  r->bio);..stateP
af90: 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a  tr->bio = NULL;.
afa0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
afb0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09  atePtr->ssl) {..
afc0: 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65  dprintf("SSL_fre
afd0: 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72  e(%p)", statePtr
afe0: 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65  ->ssl);..SSL_fre
aff0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
b000: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ;..statePtr->ssl
b010: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
b020: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
b030: 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58  >ctx) {..SSL_CTX
b040: 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  _free(statePtr->
b050: 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ctx);..statePtr-
b060: 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  >ctx = NULL;.   
b070: 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
b080: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b  Ptr->callback) {
b090: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
b0a0: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  nt(statePtr->cal
b0b0: 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74  lback);..statePt
b0c0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55  r->callback = NU
b0d0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
b0e0: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73   (statePtr->pass
b0f0: 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63  word) {..Tcl_Dec
b100: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
b110: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09  tr->password);..
b120: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
b130: 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  rd = NULL;.    }
b140: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  ..    dprintf("R
b150: 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a  eturning");.}...
b160: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
b170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
b1b0: 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  ls_Init --. *. *
b1c0: 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61  .This is a packa
b1d0: 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ge initializatio
b1e0: 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69  n procedure, whi
b1f0: 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09  ch is called. *.
b200: 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73  by Tcl when this
b210: 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62   package is to b
b220: 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e  e added to an in
b230: 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a  terpreter.. *. *
b240: 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63   Results:  Ssl c
b250: 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f  onfigured and lo
b260: 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20  aded. *. * Side 
b270: 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65  effects:. *. cre
b280: 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d  ate the ssl comm
b290: 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 73 65 20  and, initialise 
b2a0: 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20  ssl context. *. 
b2b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
b2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2f0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 20 54 6c  ----. */..int Tl
b300: 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
b310: 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 09 63 6f  p *interp) {..co
b320: 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49  nst char tlsTclI
b330: 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a  nitScript[] = {.
b340: 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63  #include "tls.tc
b350: 6c 2e 68 22 0a 20 20 20 20 20 20 20 20 20 20 20  l.h".           
b360: 20 30 78 30 30 0a 09 7d 3b 0a 0a 20 20 20 20 20   0x00..};..     
b370: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
b380: 65 64 22 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 57  ed");.../*.. * W
b390: 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 54  e only support T
b3a0: 63 6c 20 38 2e 34 20 6f 72 20 6e 65 77 65 72 0a  cl 8.4 or newer.
b3b0: 09 20 2a 2f 0a 09 69 66 20 28 0a 23 69 66 64 65  . */..if (.#ifde
b3c0: 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a  f USE_TCL_STUBS.
b3d0: 09 20 20 20 20 54 63 6c 5f 49 6e 69 74 53 74 75  .    Tcl_InitStu
b3e0: 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22  bs(interp, "8.4"
b3f0: 2c 20 30 29 0a 23 65 6c 73 65 0a 09 20 20 20 20  , 0).#else..    
b400: 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69  Tcl_PkgRequire(i
b410: 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 38  nterp, "Tcl", "8
b420: 2e 34 22 2c 20 30 29 0a 23 65 6e 64 69 66 0a 09  .4", 0).#endif..
b430: 20 20 20 20 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a       == NULL) {.
b440: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
b450: 4f 52 3b 0a 09 7d 0a 0a 09 69 66 20 28 54 6c 73  OR;..}...if (Tls
b460: 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43  LibInit(0) != TC
b470: 4c 5f 4f 4b 29 20 7b 0a 09 09 54 63 6c 5f 41 70  L_OK) {...Tcl_Ap
b480: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b490: 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e  p, "could not in
b4a0: 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62  itialize SSL lib
b4b0: 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09  rary", NULL);...
b4c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b4d0: 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 43 72 65 61 74  ;..}...Tcl_Creat
b4e0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
b4f0: 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72  rp, "tls::cipher
b500: 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d  s", CiphersObjCm
b510: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
b520: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
b530: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
b540: 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f  .Tcl_CreateObjCo
b550: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
b560: 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20  ls::handshake", 
b570: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c  HandshakeObjCmd,
b580: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
b590: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
b5a0: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54  roc *) NULL);..T
b5b0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
b5c0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
b5d0: 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72  ::import", Impor
b5e0: 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tObjCmd, (Client
b5f0: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
b600: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
b610: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74  ULL);..Tcl_Creat
b620: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
b630: 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f  rp, "tls::unimpo
b640: 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a  rt", UnimportObj
b650: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
b660: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
b670: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
b680: 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  ;..Tcl_CreateObj
b690: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
b6a0: 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53  "tls::status", S
b6b0: 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  tatusObjCmd, (Cl
b6c0: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
b6d0: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
b6e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43  *) NULL);..Tcl_C
b6f0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
b700: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65  interp, "tls::ve
b710: 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f  rsion", VersionO
b720: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
b730: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
b740: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
b750: 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f  L);..Tcl_CreateO
b760: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
b770: 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d  , "tls::misc", M
b780: 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  iscObjCmd, (Clie
b790: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
b7a0: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
b7b0: 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 69 6e   NULL);...if (in
b7c0: 74 65 72 70 29 20 7b 0a 09 09 54 63 6c 5f 45 76  terp) {...Tcl_Ev
b7d0: 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63  al(interp, tlsTc
b7e0: 6c 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 09 7d  lInitScript);..}
b7f0: 0a 0a 09 72 65 74 75 72 6e 28 54 63 6c 5f 50 6b  ...return(Tcl_Pk
b800: 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
b810: 20 22 74 6c 73 22 2c 20 50 41 43 4b 41 47 45 5f   "tls", PACKAGE_
b820: 56 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a  VERSION));.}../*
b830: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
b840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
b870: 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d  .Tls_SafeInit --
b880: 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *.---------
b890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b8b0: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e  -------*. *.Stan
b8c0: 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72  dard procedure r
b8d0: 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64  equired by 'load
b8e0: 27 2e 20 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a  '. . *.Initializ
b8f0: 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f  es this extensio
b900: 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74  n for a safe int
b910: 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d  erpreter.. *.---
b920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b930: 2d 2d 2d 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 2a 0a 20  -------------*. 
b950: 2a 0a 20 2a 09 53 69 64 65 65 66 66 65 63 74 73  *. *.Sideeffects
b960: 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73  :. *..As of 'Tls
b970: 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73  _Init'. *. *.Res
b980: 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64  ult:. *..A stand
b990: 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f  ard Tcl error co
b9a0: 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  de.. *. *-------
b9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
b9e0: 0a 20 2a 2f 0a 0a 69 6e 74 20 54 6c 73 5f 53 61  . */..int Tls_Sa
b9f0: 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
ba00: 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 09 64 70  p *interp) {..dp
ba10: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
ba20: 0a 09 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69  ..return(Tls_Ini
ba30: 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f  t(interp));.}../
ba40: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
ba50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
ba80: 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a  *.TlsLibInit --.
ba90: 20 2a 0a 20 2a 09 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 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69  ------*. *.Initi
bad0: 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61  alizes SSL libra
bae0: 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c  ry once per appl
baf0: 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d  ication. *.-----
bb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
bb30: 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a   *.Side effects:
bb40: 0a 20 2a 09 09 69 6e 69 74 69 6c 69 7a 65 73 20  . *..initilizes 
bb50: 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20  SSL library. *. 
bb60: 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f  *.Result:. *..no
bb70: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
bb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
bbb0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54   */.static int T
bbc0: 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e  lsLibInit(int un
bbd0: 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 73  initialize) {..s
bbe0: 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61  tatic int initia
bbf0: 6c 69 7a 65 64 20 3d 20 30 3b 0a 09 69 6e 74 20  lized = 0;..int 
bc00: 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b  status = TCL_OK;
bc10: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
bc20: 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
bc30: 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
bc40: 45 41 44 53 29 0a 09 73 69 7a 65 5f 74 20 6e 75  EADS)..size_t nu
bc50: 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a  m_locks;.#endif.
bc60: 0a 09 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69  ..if (uninitiali
bc70: 7a 65 29 20 7b 0a 09 09 69 66 20 28 21 69 6e 69  ze) {...if (!ini
bc80: 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 09 64  tialized) {....d
bc90: 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
bca0: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62   uninitialize, b
bcb0: 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  ut we are not in
bcc0: 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 09  itialized");....
bcd0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b  .return(TCL_OK);
bce0: 0a 09 09 7d 0a 0a 09 09 64 70 72 69 6e 74 66 28  ...}....dprintf(
bcf0: 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74  "Asked to uninit
bd00: 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64  ialize");..#if d
bd10: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54  efined(OPENSSL_T
bd20: 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e  HREADS) && defin
bd30: 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a  ed(TCL_THREADS).
bd40: 09 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28  ..Tcl_MutexLock(
bd50: 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 09 43 52  &init_mx);....CR
bd60: 59 50 54 4f 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67  YPTO_set_locking
bd70: 5f 63 61 6c 6c 62 61 63 6b 28 4e 55 4c 4c 29 3b  _callback(NULL);
bd80: 0a 09 09 43 52 59 50 54 4f 5f 73 65 74 5f 69 64  ...CRYPTO_set_id
bd90: 5f 63 61 6c 6c 62 61 63 6b 28 4e 55 4c 4c 29 3b  _callback(NULL);
bda0: 0a 0a 09 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b  ....if (locks) {
bdb0: 0a 09 09 09 66 72 65 65 28 6c 6f 63 6b 73 29 3b  ....free(locks);
bdc0: 0a 09 09 09 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c  ....locks = NULL
bdd0: 3b 0a 09 09 09 6c 6f 63 6b 73 43 6f 75 6e 74 20  ;....locksCount 
bde0: 3d 20 30 3b 0a 09 09 7d 0a 23 65 6e 64 69 66 0a  = 0;...}.#endif.
bdf0: 09 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  ..initialized = 
be00: 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  0;..#if defined(
be10: 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
be20: 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
be30: 54 48 52 45 41 44 53 29 0a 09 09 54 63 6c 5f 4d  THREADS)...Tcl_M
be40: 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74  utexUnlock(&init
be50: 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09  _mx);.#endif....
be60: 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a  return(TCL_OK);.
be70: 09 7d 0a 0a 09 69 66 20 28 69 6e 69 74 69 61 6c  .}...if (initial
be80: 69 7a 65 64 29 20 7b 0a 09 09 64 70 72 69 6e 74  ized) {...dprint
be90: 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75  f("Called, but u
bea0: 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75  sing cached valu
beb0: 65 22 29 3b 0a 09 09 72 65 74 75 72 6e 28 73 74  e");...return(st
bec0: 61 74 75 73 29 3b 0a 09 7d 0a 0a 09 64 70 72 69  atus);..}...dpri
bed0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
bee0: 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
bef0: 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
bf00: 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
bf10: 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c  ADS)..Tcl_MutexL
bf20: 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23  ock(&init_mx);.#
bf30: 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a  endif..initializ
bf40: 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66  ed = 1;..#if def
bf50: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
bf60: 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
bf70: 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 6e  (TCL_THREADS)..n
bf80: 75 6d 5f 6c 6f 63 6b 73 20 3d 20 43 52 59 50 54  um_locks = CRYPT
bf90: 4f 5f 6e 75 6d 5f 6c 6f 63 6b 73 28 29 3b 0a 09  O_num_locks();..
bfa0: 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 6e 75 6d  locksCount = num
bfb0: 5f 6c 6f 63 6b 73 3b 0a 09 6c 6f 63 6b 73 20 3d  _locks;..locks =
bfc0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
bfd0: 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63  locks) * num_loc
bfe0: 6b 73 29 3b 0a 09 6d 65 6d 73 65 74 28 6c 6f 63  ks);..memset(loc
bff0: 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c  ks, 0, sizeof(*l
c000: 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b  ocks) * num_lock
c010: 73 29 3b 0a 0a 09 43 52 59 50 54 4f 5f 73 65 74  s);...CRYPTO_set
c020: 5f 6c 6f 63 6b 69 6e 67 5f 63 61 6c 6c 62 61 63  _locking_callbac
c030: 6b 28 43 72 79 70 74 6f 54 68 72 65 61 64 4c 6f  k(CryptoThreadLo
c040: 63 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 43 52  ckCallback);..CR
c050: 59 50 54 4f 5f 73 65 74 5f 69 64 5f 63 61 6c 6c  YPTO_set_id_call
c060: 62 61 63 6b 28 43 72 79 70 74 6f 54 68 72 65 61  back(CryptoThrea
c070: 64 49 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65  dIdCallback);.#e
c080: 6e 64 69 66 0a 0a 09 69 66 20 28 53 53 4c 5f 6c  ndif...if (SSL_l
c090: 69 62 72 61 72 79 5f 69 6e 69 74 28 29 20 21 3d  ibrary_init() !=
c0a0: 20 31 29 20 7b 0a 09 09 73 74 61 74 75 73 20 3d   1) {...status =
c0b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 67 6f   TCL_ERROR;...go
c0c0: 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 0a 09 53 53  to done;..}...SS
c0d0: 4c 5f 6c 6f 61 64 5f 65 72 72 6f 72 5f 73 74 72  L_load_error_str
c0e0: 69 6e 67 73 28 29 3b 0a 09 45 52 52 5f 6c 6f 61  ings();..ERR_loa
c0f0: 64 5f 63 72 79 70 74 6f 5f 73 74 72 69 6e 67 73  d_crypto_strings
c100: 28 29 3b 0a 0a 09 42 49 4f 5f 6e 65 77 5f 74 63  ();...BIO_new_tc
c110: 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66  l(NULL, 0);..#if
c120: 20 30 0a 09 2f 2a 0a 09 20 2a 20 58 58 58 3a 54   0../*.. * XXX:T
c130: 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73  ODO: Remove this
c140: 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63   code and replac
c150: 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63  e it with a chec
c160: 6b 0a 09 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68  k.. * for enough
c170: 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20   entropy and do 
c180: 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74  not try to creat
c190: 65 20 6f 75 72 20 6f 77 6e 0a 09 20 2a 20 74 65  e our own.. * te
c1a0: 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 09  rrible entropy..
c1b0: 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   */.    /*.     
c1c0: 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f  * Seed the rando
c1d0: 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74  m number generat
c1e0: 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69  or in the SSL li
c1f0: 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73  brary,.     * us
c200: 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65  ing the do/while
c210: 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75   construct becau
c220: 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f  se of the bug no
c230: 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a  te in the.     *
c240: 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20   OpenSSL FAQ at 
c250: 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73  http://www.opens
c260: 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66  sl.org/support/f
c270: 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20  aq.html#USER1.  
c280: 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20     *.     * The 
c290: 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62  crux of the prob
c2a0: 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61  lem is that Sola
c2b0: 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68  ris 7 does not h
c2c0: 61 76 65 20 61 20 0a 20 20 20 20 20 2a 20 2f 64  ave a .     * /d
c2d0: 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65  ev/random or /de
c2e0: 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65  v/urandom device
c2f0: 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61   so it cannot ga
c300: 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20  ther enough.    
c310: 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20   * entropy from 
c320: 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20  the RAND_seed() 
c330: 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c  when TLS initial
c340: 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73  izes and refuses
c350: 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75  .     * to go fu
c360: 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76  rther. Earlier v
c370: 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53  ersions of OpenS
c380: 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65  SL carried on re
c390: 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a  gardless..     *
c3a0: 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73  /.    srand((uns
c3b0: 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28  igned int) time(
c3c0: 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29  (time_t *) NULL)
c3d0: 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72  );.    do {..for
c3e0: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b   (i = 0; i < 16;
c3f0: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64   i++) {..    rnd
c400: 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28  _seed[i] = 1 + (
c410: 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72  char) (255.0 * r
c420: 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b  and()/(RAND_MAX+
c430: 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f  1.0));..}..RAND_
c440: 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73  seed(rnd_seed, s
c450: 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29  izeof(rnd_seed))
c460: 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52  ;.    } while (R
c470: 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20  AND_status() != 
c480: 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 64 6f 6e 65  1);.#endif..done
c490: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  :.#if defined(OP
c4a0: 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
c4b0: 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
c4c0: 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65  READS)..Tcl_Mute
c4d0: 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78  xUnlock(&init_mx
c4e0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75  );.#endif...retu
c4f0: 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a        rn(status);.}.