Hex Artifact Content

Artifact 32f77b5e4221a3a52185267c853d01590ecb27a2:


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 33 20 53  right (C) 2003 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 0a 20 2a 20 24 48 65 61 64 65 72 3a 20 2f   *. * $Header: /
00e0: 68 6f 6d 65 2f 72 6b 65 65 6e 65 2f 74 6d 70 2f  home/rkeene/tmp/
00f0: 63 76 73 32 66 6f 73 73 69 6c 2f 2e 2e 2f 74 63  cvs2fossil/../tc
0100: 6c 74 6c 73 2f 74 6c 73 2f 74 6c 73 2f 74 6c 73  ltls/tls/tls/tls
0110: 2e 63 2c 76 20 31 2e 31 35 20 32 30 30 33 2f 30  .c,v 1.15 2003/0
0120: 35 2f 31 35 20 32 30 3a 34 34 3a 34 36 20 72 61  5/15 20:44:46 ra
0130: 7a 7a 65 6c 6c 20 45 78 70 20 24 0a 20 2a 0a 20  zzell Exp $. *. 
0140: 2a 20 54 4c 53 20 28 61 6b 61 20 53 53 4c 29 20  * TLS (aka SSL) 
0150: 43 68 61 6e 6e 65 6c 20 2d 20 63 61 6e 20 62 65  Channel - can be
0160: 20 6c 61 79 65 72 65 64 20 6f 6e 20 61 6e 79 20   layered on any 
0170: 62 69 2d 64 69 72 65 63 74 69 6f 6e 61 6c 0a 20  bi-directional. 
0180: 2a 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 28 4e  * Tcl_Channel (N
0190: 6f 74 65 3a 20 52 65 71 75 69 72 65 73 20 54 72  ote: Requires Tr
01a0: 66 20 43 6f 72 65 20 50 61 74 63 68 29 0a 20 2a  f Core Patch). *
01b0: 0a 20 2a 20 54 68 69 73 20 77 61 73 20 62 75 69  . * This was bui
01c0: 6c 74 20 28 61 6c 6d 6f 73 74 29 20 66 72 6f 6d  lt (almost) from
01d0: 20 73 63 72 61 74 63 68 20 62 61 73 65 64 20 75   scratch based u
01e0: 70 6f 6e 20 6f 62 73 65 72 76 61 74 69 6f 6e 20  pon observation 
01f0: 6f 66 0a 20 2a 20 4f 70 65 6e 53 53 4c 20 30 2e  of. * OpenSSL 0.
0200: 39 2e 32 42 0a 20 2a 0a 20 2a 20 41 64 64 69 74  9.2B. *. * Addit
0210: 69 6f 6e 20 63 72 65 64 69 74 20 69 73 20 64 75  ion credit is du
0220: 65 20 66 6f 72 20 41 6e 64 72 65 61 73 20 4b 75  e for Andreas Ku
0230: 70 72 69 65 73 20 28 61 2e 6b 75 70 72 69 65 73  pries (a.kupries
0240: 40 77 65 73 74 65 6e 64 2e 63 6f 6d 29 2c 20 66  @westend.com), f
0250: 6f 72 0a 20 2a 20 70 72 6f 76 69 64 69 6e 67 20  or. * providing 
0260: 74 68 65 20 54 63 6c 5f 52 65 70 6c 61 63 65 43  the Tcl_ReplaceC
0270: 68 61 6e 6e 65 6c 20 6d 65 63 68 61 6e 69 73 6d  hannel mechanism
0280: 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 63 6c 6f   and working clo
0290: 73 65 6c 79 20 77 69 74 68 20 6d 65 0a 20 2a 20  sely with me. * 
02a0: 74 6f 20 65 6e 68 61 6e 63 65 20 69 74 20 74 6f  to enhance it to
02b0: 20 73 75 70 70 6f 72 74 20 66 75 6c 6c 20 66 69   support full fi
02c0: 6c 65 65 76 65 6e 74 20 73 65 6d 61 6e 74 69 63  leevent semantic
02d0: 73 2e 0a 20 2a 0a 20 2a 20 41 6c 73 6f 20 77 6f  s.. *. * Also wo
02e0: 72 6b 20 64 6f 6e 65 20 62 79 20 74 68 65 20 66  rk done by the f
02f0: 6f 6c 6c 6f 77 20 70 65 6f 70 6c 65 20 70 72 6f  ollow people pro
0300: 76 69 64 65 64 20 74 68 65 20 69 6d 70 65 74 75  vided the impetu
0310: 73 20 74 6f 20 64 6f 20 74 68 69 73 20 22 72 69  s to do this "ri
0320: 67 68 74 22 3a 0a 20 2a 09 74 63 6c 53 53 4c 20  ght":. *.tclSSL 
0330: 28 43 6f 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 6b  (Colin McCormack
0340: 2c 20 53 68 61 72 65 64 20 54 65 63 68 6e 6f 6c  , Shared Technol
0350: 6f 67 79 29 0a 20 2a 09 53 53 4c 74 63 6c 20 28  ogy). *.SSLtcl (
0360: 50 65 74 65 72 20 41 6e 74 6d 61 6e 29 0a 20 2a  Peter Antman). *
0370: 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22  . */..#include "
0380: 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  tlsInt.h".#inclu
0390: 64 65 20 22 74 63 6c 4f 70 74 73 2e 68 22 0a 23  de "tclOpts.h".#
03a0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
03b0: 68 3e 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72 6e  h>../*. * Extern
03c0: 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a 2f  al functions. */
03d0: 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20  ../*. * Forward 
03e0: 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f  declarations. */
03f0: 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 20 6b  ..#define F2N( k
0400: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0410: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
0420: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
0430: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
0440: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
0450: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
0460: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29  #define REASON()
0470: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f  .ERR_reason_erro
0480: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74  r_string(ERR_get
0490: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69  _error())..stati
04a0: 63 20 69 6e 74 09 43 69 70 68 65 72 73 4f 62 6a  c int.CiphersObj
04b0: 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20  Cmd _ANSI_ARGS_ 
04c0: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  ((ClientData cli
04d0: 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f  entData,....Tcl_
04e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
04f0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
0500: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29  j *CONST objv[])
0510: 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 48  );..static int.H
0520: 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 5f  andshakeObjCmd _
0530: 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69  ANSI_ARGS_ ((Cli
0540: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
0550: 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72  ta,....Tcl_Inter
0560: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
0570: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  bjc, Tcl_Obj *CO
0580: 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73  NST objv[]));..s
0590: 74 61 74 69 63 20 69 6e 74 09 49 6d 70 6f 72 74  tatic int.Import
05a0: 4f 62 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47  ObjCmd _ANSI_ARG
05b0: 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20  S_ ((ClientData 
05c0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 54  clientData,....T
05d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
05e0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
05f0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
0600: 5b 5d 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e  []));..static in
0610: 74 09 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 5f  t.StatusObjCmd _
0620: 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69  ANSI_ARGS_ ((Cli
0630: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
0640: 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72  ta,....Tcl_Inter
0650: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
0660: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  bjc, Tcl_Obj *CO
0670: 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73  NST objv[]));..s
0680: 74 61 74 69 63 20 69 6e 74 09 56 65 72 73 69 6f  tatic int.Versio
0690: 6e 4f 62 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52  nObjCmd _ANSI_AR
06a0: 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61  GS_ ((ClientData
06b0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09   clientData,....
06c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
06d0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
06e0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
06f0: 76 5b 5d 29 29 3b 0a 0a 73 74 61 74 69 63 20 53  v[]));..static S
0700: 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69 74  SL_CTX *CTX_Init
0710: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 53 74   _ANSI_ARGS_((St
0720: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69  ate *statePtr, i
0730: 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a  nt proto, char *
0740: 6b 65 79 2c 0a 09 09 09 63 68 61 72 20 2a 63 65  key,....char *ce
0750: 72 74 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c  rt, char *CAdir,
0760: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63   char *CAfile, c
0770: 68 61 72 20 2a 63 69 70 68 65 72 73 29 29 3b 0a  har *ciphers));.
0780: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
0790: 54 4f 5f 53 53 4c 32 09 30 78 30 31 0a 23 64 65  TO_SSL2.0x01.#de
07a0: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  fine TLS_PROTO_S
07b0: 53 4c 33 09 30 78 30 32 0a 23 64 65 66 69 6e 65  SL3.0x02.#define
07c0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09   TLS_PROTO_TLS1.
07d0: 30 78 30 34 0a 23 64 65 66 69 6e 65 20 45 4e 41  0x04.#define ENA
07e0: 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 73 6b 29  BLED(flag, mask)
07f0: 09 28 28 28 66 6c 61 67 29 20 26 20 28 6d 61 73  .(((flag) & (mas
0800: 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a  k)) == (mask))..
0810: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74  /*. * Static dat
0820: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f  a structures. */
0830: 0a 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 44 48 0a  ..#ifndef NO_DH.
0840: 2f 2a 20 66 72 6f 6d 20 6f 70 65 6e 73 73 6c 2f  /* from openssl/
0850: 61 70 70 73 2f 73 5f 73 65 72 76 65 72 2e 63 20  apps/s_server.c 
0860: 2a 2f 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67  */..static unsig
0870: 6e 65 64 20 63 68 61 72 20 64 68 35 31 32 5f 70  ned char dh512_p
0880: 5b 5d 3d 7b 0a 20 20 20 20 20 20 20 20 30 78 44  []={.        0xD
0890: 41 2c 30 78 35 38 2c 30 78 33 43 2c 30 78 31 36  A,0x58,0x3C,0x16
08a0: 2c 30 78 44 39 2c 30 78 38 35 2c 30 78 32 32 2c  ,0xD9,0x85,0x22,
08b0: 30 78 38 39 2c 30 78 44 30 2c 30 78 45 34 2c 30  0x89,0xD0,0xE4,0
08c0: 78 41 46 2c 30 78 37 35 2c 0a 20 20 20 20 20 20  xAF,0x75,.      
08d0: 20 20 30 78 36 46 2c 30 78 34 43 2c 30 78 43 41    0x6F,0x4C,0xCA
08e0: 2c 30 78 39 32 2c 30 78 44 44 2c 30 78 34 42 2c  ,0x92,0xDD,0x4B,
08f0: 30 78 45 35 2c 30 78 33 33 2c 30 78 42 38 2c 30  0xE5,0x33,0xB8,0
0900: 78 30 34 2c 30 78 46 42 2c 30 78 30 46 2c 0a 20  x04,0xFB,0x0F,. 
0910: 20 20 20 20 20 20 20 30 78 45 44 2c 30 78 39 34         0xED,0x94
0920: 2c 30 78 45 46 2c 30 78 39 43 2c 30 78 38 41 2c  ,0xEF,0x9C,0x8A,
0930: 30 78 34 34 2c 30 78 30 33 2c 30 78 45 44 2c 30  0x44,0x03,0xED,0
0940: 78 35 37 2c 30 78 34 36 2c 30 78 35 30 2c 30 78  x57,0x46,0x50,0x
0950: 44 33 2c 0a 20 20 20 20 20 20 20 20 30 78 36 39  D3,.        0x69
0960: 2c 30 78 39 39 2c 30 78 44 42 2c 30 78 32 39 2c  ,0x99,0xDB,0x29,
0970: 30 78 44 37 2c 30 78 37 36 2c 30 78 32 37 2c 30  0xD7,0x76,0x27,0
0980: 78 36 42 2c 30 78 41 32 2c 30 78 44 33 2c 30 78  x6B,0xA2,0xD3,0x
0990: 44 34 2c 30 78 31 32 2c 0a 20 20 20 20 20 20 20  D4,0x12,.       
09a0: 20 30 78 45 32 2c 30 78 31 38 2c 30 78 46 34 2c   0xE2,0x18,0xF4,
09b0: 30 78 44 44 2c 30 78 31 45 2c 30 78 30 38 2c 30  0xDD,0x1E,0x08,0
09c0: 78 34 43 2c 30 78 46 36 2c 30 78 44 38 2c 30 78  x4C,0xF6,0xD8,0x
09d0: 30 30 2c 30 78 33 45 2c 30 78 37 43 2c 0a 20 20  00,0x3E,0x7C,.  
09e0: 20 20 20 20 20 20 30 78 34 37 2c 30 78 37 34 2c        0x47,0x74,
09f0: 30 78 45 38 2c 30 78 33 33 2c 0a 20 20 20 20 20  0xE8,0x33,.     
0a00: 20 20 20 7d 3b 0a 73 74 61 74 69 63 20 75 6e 73     };.static uns
0a10: 69 67 6e 65 64 20 63 68 61 72 20 64 68 35 31 32  igned char dh512
0a20: 5f 67 5b 5d 3d 7b 0a 09 30 78 30 32 2c 0a 7d 3b  _g[]={..0x02,.};
0a30: 0a 0a 73 74 61 74 69 63 20 44 48 20 2a 67 65 74  ..static DH *get
0a40: 5f 64 68 35 31 32 28 29 0a 7b 0a 20 20 20 20 44  _dh512().{.    D
0a50: 48 20 2a 64 68 3d 4e 55 4c 4c 3b 0a 0a 20 20 20  H *dh=NULL;..   
0a60: 20 69 66 20 28 28 64 68 3d 44 48 5f 6e 65 77 28   if ((dh=DH_new(
0a70: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 72 65 74 75  )) == NULL) retu
0a80: 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 64  rn(NULL);..    d
0a90: 68 2d 3e 70 3d 42 4e 5f 62 69 6e 32 62 6e 28 64  h->p=BN_bin2bn(d
0aa0: 68 35 31 32 5f 70 2c 73 69 7a 65 6f 66 28 64 68  h512_p,sizeof(dh
0ab0: 35 31 32 5f 70 29 2c 4e 55 4c 4c 29 3b 0a 20 20  512_p),NULL);.  
0ac0: 20 20 64 68 2d 3e 67 3d 42 4e 5f 62 69 6e 32 62    dh->g=BN_bin2b
0ad0: 6e 28 64 68 35 31 32 5f 67 2c 73 69 7a 65 6f 66  n(dh512_g,sizeof
0ae0: 28 64 68 35 31 32 5f 67 29 2c 4e 55 4c 4c 29 3b  (dh512_g),NULL);
0af0: 0a 0a 20 20 20 20 69 66 20 28 28 64 68 2d 3e 70  ..    if ((dh->p
0b00: 20 3d 3d 20 4e 55 4c 4c 29 20 7c 7c 20 28 64 68   == NULL) || (dh
0b10: 2d 3e 67 20 3d 3d 20 4e 55 4c 4c 29 29 0a 09 72  ->g == NULL))..r
0b20: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20  eturn(NULL);.   
0b30: 20 72 65 74 75 72 6e 28 64 68 29 3b 0a 7d 0a 23   return(dh);.}.#
0b40: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 44 65 66  endif../*. * Def
0b50: 69 6e 65 64 20 69 6e 20 54 6c 73 5f 49 6e 69 74  ined in Tls_Init
0b60: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
0b70: 61 74 20 6b 69 6e 64 20 6f 66 20 63 68 61 6e 6e  at kind of chann
0b80: 65 6c 73 20 77 65 20 61 72 65 20 75 73 69 6e 67  els we are using
0b90: 0a 20 2a 20 28 6f 6c 64 2d 73 74 79 6c 65 20 38  . * (old-style 8
0ba0: 2e 32 2e 30 2d 38 2e 33 2e 31 20 6f 72 20 6e 65  .2.0-8.3.1 or ne
0bb0: 77 2d 73 74 79 6c 65 20 38 2e 33 2e 32 2b 29 2e  w-style 8.3.2+).
0bc0: 0a 20 2a 2f 0a 69 6e 74 20 63 68 61 6e 6e 65 6c  . */.int channel
0bd0: 54 79 70 65 56 65 72 73 69 6f 6e 3b 0a 0a 2f 2a  TypeVersion;../*
0be0: 0a 20 2a 20 57 65 20 6c 6f 73 65 20 74 68 65 20  . * We lose the 
0bf0: 74 63 6c 20 70 61 73 73 77 6f 72 64 20 63 61 6c  tcl password cal
0c00: 6c 62 61 63 6b 20 77 68 65 6e 20 77 65 20 75 73  lback when we us
0c10: 65 20 74 68 65 20 52 53 41 20 42 53 41 46 45 20  e the RSA BSAFE 
0c20: 53 53 4c 2d 43 20 31 2e 31 2e 32 0a 20 2a 20 6c  SSL-C 1.1.2. * l
0c30: 69 62 72 61 72 69 65 73 20 69 6e 73 74 65 61 64  ibraries instead
0c40: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
0c50: 4f 70 65 6e 53 53 4c 20 6c 69 62 72 61 72 69 65  OpenSSL librarie
0c60: 73 2e 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 42  s.. */..#ifdef B
0c70: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 50 52 45  SAFE.#define PRE
0c80: 5f 4f 50 45 4e 53 53 4c 5f 30 5f 39 5f 34 20 31  _OPENSSL_0_9_4 1
0c90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 50  .#endif../*. * P
0ca0: 65 72 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 34  er OpenSSL 0.9.4
0cb0: 20 43 6f 6d 70 61 74 0a 20 2a 2f 0a 0a 23 69 66   Compat. */..#if
0cc0: 6e 64 65 66 20 53 54 41 43 4b 5f 4f 46 0a 23 64  ndef STACK_OF.#d
0cd0: 65 66 69 6e 65 20 53 54 41 43 4b 5f 4f 46 28 78  efine STACK_OF(x
0ce0: 29 09 09 09 53 54 41 43 4b 0a 23 64 65 66 69 6e  )...STACK.#defin
0cf0: 65 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  e sk_SSL_CIPHER_
0d00: 6e 75 6d 28 73 6b 29 09 09 73 6b 5f 6e 75 6d 28  num(sk)..sk_num(
0d10: 28 73 6b 29 29 0a 23 64 65 66 69 6e 65 20 73 6b  (sk)).#define sk
0d20: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75  _SSL_CIPHER_valu
0d30: 65 28 20 73 6b 2c 20 69 6e 64 65 78 29 09 28 53  e( sk, index).(S
0d40: 53 4c 5f 43 49 50 48 45 52 2a 29 73 6b 5f 76 61  SL_CIPHER*)sk_va
0d50: 6c 75 65 28 28 73 6b 29 2c 20 28 69 6e 64 65 78  lue((sk), (index
0d60: 29 29 0a 23 65 6e 64 69 66 0a 0a 0c 0a 2f 2a 0a  )).#endif..../*.
0d70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0db0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f  -----. *. * Info
0dc0: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
0dd0: 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63  *.monitors SSL c
0de0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73  onnection proces
0df0: 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
0e00: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
0e10: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
0e20: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
0e30: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 2d 2d  if defined). *--
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e80: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  -. */.static voi
0e90: 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 53  d.InfoCallback(S
0ea0: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65  SL *ssl, int whe
0eb0: 72 65 2c 20 69 6e 74 20 72 65 74 29 0a 7b 0a 20  re, int ret).{. 
0ec0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
0ed0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
0ee0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73  _get_app_data(ss
0ef0: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  l);.    Tcl_Obj 
0f00: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61  *cmdPtr;.    cha
0f10: 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 20 2a  r *major; char *
0f20: 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 69 66 20 28  minor;..    if (
0f30: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
0f40: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  ck == (Tcl_Obj*)
0f50: 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a  NULL)..return;..
0f60: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
0f70: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
0f80: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
0f90: 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66  );..#if 0.    if
0fa0: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
0fb0: 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65 76 20 3d  _ALERT) {..sev =
0fc0: 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f   SSL_alert_type_
0fd0: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29  string_long(ret)
0fe0: 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 28 20 73  ;..if (strcmp( s
0ff0: 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d 30 29  ev, "fatal")==0)
1000: 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 72 72   {./* Map to err
1010: 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 5f 45  or */..    Tls_E
1020: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 53  rror(statePtr, S
1030: 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 30 29  SL_ERROR(ssl, 0)
1040: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 3b 0a  );..    return;.
1050: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .}.    }.#endif.
1060: 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20      if (where & 
1070: 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45  SSL_CB_HANDSHAKE
1080: 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72  _START) {..major
1090: 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a   = "handshake";.
10a0: 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22  .minor = "start"
10b0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
10c0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
10d0: 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20  HANDSHAKE_DONE) 
10e0: 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64  {..major = "hand
10f0: 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d  shake";..minor =
1100: 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65   "done";.    } e
1110: 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65  lse {..if (where
1120: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29   & SSL_CB_ALERT)
1130: 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74  ..major = "alert
1140: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
1150: 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e  re & SSL_ST_CONN
1160: 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f  ECT).major = "co
1170: 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66  nnect";..else if
1180: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54   (where & SSL_ST
1190: 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20  _ACCEPT)..major 
11a0: 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73  = "accept";..els
11b0: 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75  e.....major = "u
11c0: 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77  nknown";...if (w
11d0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45  here & SSL_CB_RE
11e0: 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65  AD)..minor = "re
11f0: 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  ad";..else if (w
1200: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52  here & SSL_CB_WR
1210: 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77  ITE)..minor = "w
1220: 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20  rite";..else if 
1230: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1240: 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22  LOOP)..minor = "
1250: 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20  loop";..else if 
1260: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1270: 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22  EXIT)..minor = "
1280: 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09  exit";..else....
1290: 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77  .minor = "unknow
12a0: 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  n";.    }..    T
12b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12c0: 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74  Element( statePt
12d0: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  r->interp, cmdPt
12e0: 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  r, ..    Tcl_New
12f0: 53 74 72 69 6e 67 4f 62 6a 28 20 22 69 6e 66 6f  StringObj( "info
1300: 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63  ", -1));..    Tc
1310: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1320: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72  lement( statePtr
1330: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
1340: 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  , ..    Tcl_NewS
1350: 74 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65  tringObj( Tcl_Ge
1360: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
1370: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
1380: 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69  ) );..    Tcl_Li
1390: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
13a0: 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  nt( statePtr->in
13b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
13c0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
13d0: 4f 62 6a 28 20 6d 61 6a 6f 72 2c 20 2d 31 29 20  Obj( major, -1) 
13e0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
13f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1400: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ( statePtr->inte
1410: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
1420: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1430: 6a 28 20 6d 69 6e 6f 72 2c 20 2d 31 29 20 29 3b  j( minor, -1) );
1440: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20  ..    if (where 
1450: 26 20 28 53 53 4c 5f 43 42 5f 4c 4f 4f 50 7c 53  & (SSL_CB_LOOP|S
1460: 53 4c 5f 43 42 5f 45 58 49 54 29 29 20 7b 0a 09  SL_CB_EXIT)) {..
1470: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1480: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50  dElement( stateP
1490: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
14a0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
14b0: 53 74 72 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 73  StringObj( SSL_s
14c0: 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67  tate_string_long
14d0: 28 73 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20  (ssl), -1) );.  
14e0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65    } else if (whe
14f0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
1500: 54 29 20 7b 0a 09 63 68 61 72 20 2a 63 70 20 3d  T) {..char *cp =
1510: 20 28 63 68 61 72 20 2a 29 20 53 53 4c 5f 61 6c   (char *) SSL_al
1520: 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f  ert_desc_string_
1530: 6c 6f 6e 67 28 72 65 74 29 3b 0a 0a 09 54 63 6c  long(ret);...Tcl
1540: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1550: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d  ement( statePtr-
1560: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
1570: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1580: 69 6e 67 4f 62 6a 28 20 63 70 2c 20 2d 31 29 20  ingObj( cp, -1) 
1590: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
15a0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
15b0: 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65  ndElement( state
15c0: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64  Ptr->interp, cmd
15d0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
15e0: 77 53 74 72 69 6e 67 4f 62 6a 28 20 53 53 4c 5f  wStringObj( SSL_
15f0: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e  state_string_lon
1600: 67 28 73 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20  g(ssl), -1) );. 
1610: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 50 72 65     }.    Tcl_Pre
1620: 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61  serve( (ClientDa
1630: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  ta) statePtr->in
1640: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50  terp);.    Tcl_P
1650: 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74  reserve( (Client
1660: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
1670: 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
1680: 66 43 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b  fCount( cmdPtr);
1690: 0a 20 20 20 20 28 76 6f 69 64 29 20 54 63 6c 5f  .    (void) Tcl_
16a0: 47 6c 6f 62 61 6c 45 76 61 6c 4f 62 6a 28 73 74  GlobalEvalObj(st
16b0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20  atePtr->interp, 
16c0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  cmdPtr);.    Tcl
16d0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 20 63  _DecrRefCount( c
16e0: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c  mdPtr);..    Tcl
16f0: 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e  _Release( (Clien
1700: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
1710: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ;.    Tcl_Releas
1720: 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  e( (ClientData) 
1730: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1740: 29 3b 0a 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  );..}.../*. *---
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1790: 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c  . *. * VerifyCal
17a0: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 6d  lback --. *. *.m
17b0: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 69  onitors SSL ceri
17c0: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f  ficate validatio
17d0: 6e 20 70 72 6f 63 65 73 73 0a 20 2a 09 54 68 69  n process. *.Thi
17e0: 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  s is called when
17f0: 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63 61  ever a certifica
1800: 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64 0a  te is inspected.
1810: 20 2a 09 20 6f 72 20 64 65 63 69 64 65 64 20 69   *. or decided i
1820: 6e 76 61 6c 69 64 0a 20 2a 0a 20 2a 20 52 65 73  nvalid. *. * Res
1830: 75 6c 74 73 3a 0a 20 2a 09 6f 6b 20 2d 20 6c 65  ults:. *.ok - le
1840: 74 20 53 53 4c 20 68 61 6e 64 6c 65 20 69 74 0a  t SSL handle it.
1850: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
1860: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66  ts:. *.The err f
1870: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
1880: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20  ently operative 
1890: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09  State is set. *.
18a0: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65    to a string de
18b0: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c  scribing the SSL
18c0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69   negotiation fai
18d0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d  lure reason. *--
18e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1920: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
1930: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28  .VerifyCallback(
1940: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f  int ok, X509_STO
1950: 52 45 5f 43 54 58 20 2a 63 74 78 29 0a 7b 0a 20  RE_CTX *ctx).{. 
1960: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
1970: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 65 72  tr;.    char *er
1980: 72 53 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20  rStr;.    SSL   
1990: 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35  *ssl..= (SSL*)X5
19a0: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
19b0: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 29 3b 0a  _app_data(ctx);.
19c0: 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09      X509  *cert.
19d0: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  .= X509_STORE_CT
19e0: 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65  X_get_current_ce
19f0: 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61  rt(ctx);.    Sta
1a00: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
1a10: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61  State*)SSL_get_a
1a20: 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20  pp_data(ssl);.  
1a30: 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58    int depth..= X
1a40: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
1a50: 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74  t_error_depth(ct
1a60: 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09  x);.    int err.
1a70: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  .= X509_STORE_CT
1a80: 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29  X_get_error(ctx)
1a90: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73  ;..    dprintf(s
1aa0: 74 64 65 72 72 2c 20 22 56 65 72 69 66 79 3a 20  tderr, "Verify: 
1ab0: 25 64 5c 6e 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20  %d\n", ok);..   
1ac0: 20 69 66 20 28 21 6f 6b 29 20 7b 0a 09 65 72 72   if (!ok) {..err
1ad0: 53 74 72 20 3d 20 28 63 68 61 72 2a 29 58 35 30  Str = (char*)X50
1ae0: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
1af0: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 3b  ror_string(err);
1b00: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 65  .    } else {..e
1b10: 72 72 53 74 72 20 3d 20 28 63 68 61 72 20 2a 29  rrStr = (char *)
1b20: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  0;.    }..    if
1b30: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
1b40: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
1b50: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73  *)NULL) {..if (s
1b60: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20  tatePtr->vflags 
1b70: 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49  & SSL_VERIFY_FAI
1b80: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52  L_IF_NO_PEER_CER
1b90: 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  T) {..    return
1ba0: 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09   ok;..} else {..
1bb0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d      return 1;..}
1bc0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 74  .    }.    cmdPt
1bd0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
1be0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
1bf0: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54  allback);..    T
1c00: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1c10: 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74  Element( statePt
1c20: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  r->interp, cmdPt
1c30: 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  r, ..    Tcl_New
1c40: 53 74 72 69 6e 67 4f 62 6a 28 20 22 76 65 72 69  StringObj( "veri
1c50: 66 79 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  fy", -1));..    
1c60: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1c70: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50  dElement( stateP
1c80: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
1c90: 74 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65  tr, ..    Tcl_Ne
1ca0: 77 53 74 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f  wStringObj( Tcl_
1cb0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
1cc0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
1cd0: 2d 31 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  -1) );..    Tcl_
1ce0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1cf0: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e  ment( statePtr->
1d00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
1d10: 09 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  .    Tcl_NewIntO
1d20: 62 6a 28 20 64 65 70 74 68 29 20 29 3b 0a 0a 20  bj( depth) );.. 
1d30: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1d40: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61  pendElement( sta
1d50: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63  tePtr->interp, c
1d60: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 6c 73 5f  mdPtr,..    Tls_
1d70: 4e 65 77 58 35 30 39 4f 62 6a 28 20 73 74 61 74  NewX509Obj( stat
1d80: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 65  ePtr->interp, ce
1d90: 72 74 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  rt) );..    Tcl_
1da0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1db0: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e  ment( statePtr->
1dc0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
1dd0: 09 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  .    Tcl_NewIntO
1de0: 62 6a 28 20 6f 6b 29 20 29 3b 0a 0a 20 20 20 20  bj( ok) );..    
1df0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1e00: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50  dElement( stateP
1e10: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
1e20: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
1e30: 53 74 72 69 6e 67 4f 62 6a 28 20 65 72 72 53 74  StringObj( errSt
1e40: 72 20 3f 20 65 72 72 53 74 72 20 3a 20 22 22 2c  r ? errStr : "",
1e50: 20 2d 31 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c   -1) );..    Tcl
1e60: 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c 69 65  _Preserve( (Clie
1e70: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
1e80: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  ->interp);.    T
1e90: 63 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c  cl_Preserve( (Cl
1ea0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
1eb0: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e  tr);..    Tcl_In
1ec0: 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d 64 50  crRefCount( cmdP
1ed0: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c  tr);.    if (Tcl
1ee0: 5f 47 6c 6f 62 61 6c 45 76 61 6c 4f 62 6a 28 73  _GlobalEvalObj(s
1ef0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
1f00: 20 63 6d 64 50 74 72 29 20 21 3d 20 54 43 4c 5f   cmdPtr) != TCL_
1f10: 4f 4b 29 20 7b 0a 09 2f 2a 20 69 74 20 67 6f 74  OK) {../* it got
1f20: 20 61 6e 20 65 72 72 6f 72 20 2d 20 72 65 6a 65   an error - reje
1f30: 63 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61  ct the certifica
1f40: 74 65 20 2a 2f 0a 09 54 63 6c 5f 42 61 63 6b 67  te */..Tcl_Backg
1f50: 72 6f 75 6e 64 45 72 72 6f 72 28 20 73 74 61 74  roundError( stat
1f60: 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 09  ePtr->interp);..
1f70: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c  ok = 0;.    } el
1f80: 73 65 20 7b 0a 09 69 66 20 28 54 63 6c 5f 47 65  se {..if (Tcl_Ge
1f90: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 20 73 74 61  tIntFromObj( sta
1fa0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 0a 09  tePtr->interp,..
1fb0: 09 20 20 20 20 54 63 6c 5f 47 65 74 4f 62 6a 52  .    Tcl_GetObjR
1fc0: 65 73 75 6c 74 28 20 73 74 61 74 65 50 74 72 2d  esult( statePtr-
1fd0: 3e 69 6e 74 65 72 70 29 2c 20 26 6f 6b 29 20 21  >interp), &ok) !
1fe0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
1ff0: 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45   Tcl_BackgroundE
2000: 72 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d 3e  rror( statePtr->
2010: 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 6f 6b  interp);..    ok
2020: 20 3d 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20   = 0;..}.    }. 
2030: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
2040: 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a 20  unt( cmdPtr);.. 
2050: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20     Tcl_Release( 
2060: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
2070: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  tePtr);.    Tcl_
2080: 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74  Release( (Client
2090: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e  Data) statePtr->
20a0: 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 72 65  interp);..    re
20b0: 74 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 6c 65 61  turn(ok);./* lea
20c0: 76 65 20 74 68 65 20 64 69 73 70 6f 73 69 74 69  ve the dispositi
20d0: 6f 6e 20 61 73 20 53 53 4c 20 73 65 74 20 69 74  on as SSL set it
20e0: 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d   */.}.../*. *---
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2130: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72  . *. * Tls_Error
2140: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20   --. *. *.Calls 
2150: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 24 66  callback with $f
2160: 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f 20  d and $msg - so 
2170: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  the callback can
2180: 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61 74 20   decide. *.what 
2190: 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72 6f 72  to do with error
21a0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
21b0: 3a 0a 20 2a 09 6f 6b 20 2d 20 6c 65 74 20 53 53  :. *.ok - let SS
21c0: 4c 20 68 61 6e 64 6c 65 20 69 74 0a 20 2a 0a 20  L handle it. *. 
21d0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
21e0: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64   *.The err field
21f0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c   of the currentl
2200: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74  y operative Stat
2210: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f  e is set. *.  to
2220: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69   a string descri
2230: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67  bing the SSL neg
2240: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  otiation failure
2250: 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d 2d 2d 2d 2d   reason. *------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
22a0: 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72  /.void.Tls_Error
22b0: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  (State *statePtr
22c0: 2c 20 63 68 61 72 20 2a 6d 73 67 29 0a 7b 0a 20  , char *msg).{. 
22d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
22e0: 74 72 3b 0a 0a 20 20 20 20 69 66 20 28 6d 73 67  tr;..    if (msg
22f0: 20 26 26 20 2a 6d 73 67 29 20 7b 0a 09 54 63 6c   && *msg) {..Tcl
2300: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 73 74  _SetErrorCode(st
2310: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20  atePtr->interp, 
2320: 22 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63 68 61  "SSL", msg, (cha
2330: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  r *)NULL);.    }
2340: 20 65 6c 73 65 20 7b 0a 09 6d 73 67 20 3d 20 54   else {..msg = T
2350: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
2360: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
2370: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 69  sult(statePtr->i
2380: 6e 74 65 72 70 29 2c 20 4e 55 4c 4c 29 3b 0a 20  nterp), NULL);. 
2390: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74     }.    statePt
23a0: 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20  r->err = msg;.. 
23b0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
23c0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
23d0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
23e0: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d  char buf[BUFSIZ]
23f0: 3b 0a 09 73 70 72 69 6e 74 66 28 62 75 66 2c 20  ;..sprintf(buf, 
2400: 22 53 53 4c 20 63 68 61 6e 6e 65 6c 20 5c 22 25  "SSL channel \"%
2410: 73 5c 22 3a 20 65 72 72 6f 72 3a 20 25 73 22 2c  s\": error: %s",
2420: 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ..    Tcl_GetCha
2430: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
2440: 72 2d 3e 73 65 6c 66 29 2c 20 6d 73 67 29 3b 0a  r->self), msg);.
2450: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 20  .Tcl_SetResult( 
2460: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2470: 2c 20 62 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54  , buf, TCL_VOLAT
2480: 49 4c 45 29 3b 0a 09 54 63 6c 5f 42 61 63 6b 67  ILE);..Tcl_Backg
2490: 72 6f 75 6e 64 45 72 72 6f 72 28 20 73 74 61 74  roundError( stat
24a0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 09  ePtr->interp);..
24b0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
24c0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
24d0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
24e0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
24f0: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
2500: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73  jAppendElement(s
2510: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
2520: 20 63 6d 64 50 74 72 2c 20 0a 09 20 20 20 20 54   cmdPtr, ..    T
2530: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2540: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 0a  "error", -1));..
2550: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2560: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61  ppendElement(sta
2570: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63  tePtr->interp, c
2580: 6d 64 50 74 72 2c 20 0a 09 20 20 20 20 54 63 6c  mdPtr, ..    Tcl
2590: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
25a0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
25b0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
25c0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c  , -1));..    Tcl
25d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
25e0: 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  ement(statePtr->
25f0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
2600: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
2610: 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b  ngObj(msg, -1));
2620: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ..    Tcl_Preser
2630: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
2640: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2650: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  );.    Tcl_Prese
2660: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  rve((ClientData)
2670: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20   statePtr);..   
2680: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
2690: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69  t(cmdPtr);.    i
26a0: 66 20 28 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61  f (Tcl_GlobalEva
26b0: 6c 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 69  lObj(statePtr->i
26c0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 29 20 21  nterp, cmdPtr) !
26d0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c  = TCL_OK) {..Tcl
26e0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
26f0: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
2700: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  p);.    }.    Tc
2710: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
2720: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c  mdPtr);..    Tcl
2730: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
2740: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
2750: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
2760: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
2770: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b  atePtr->interp);
2780: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
27d0: 0a 20 2a 20 50 61 73 73 77 6f 72 64 43 61 6c 6c  . * PasswordCall
27e0: 62 61 63 6b 20 2d 2d 20 0a 20 2a 0a 20 2a 09 43  back -- . *. *.C
27f0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73  alled when a pas
2800: 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20  sword is needed 
2810: 74 6f 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e  to unpack RSA an
2820: 64 20 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45  d PEM keys.. *.E
2830: 76 61 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70  vals any bound p
2840: 61 73 73 77 6f 72 64 20 73 63 72 69 70 74 20 61  assword script a
2850: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72  nd returns the r
2860: 65 73 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20  esult as. *.the 
2870: 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e  password string.
2880: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65  ------. */.#ifde
28d0: 66 20 50 52 45 5f 4f 50 45 4e 53 53 4c 5f 30 5f  f PRE_OPENSSL_0_
28e0: 39 5f 34 0a 2f 2a 0a 20 2a 20 4e 6f 20 77 61 79  9_4./*. * No way
28f0: 20 74 6f 20 68 61 6e 64 6c 65 20 75 73 65 72 2d   to handle user-
2900: 64 61 74 61 20 74 68 65 72 65 66 6f 72 65 20 6e  data therefore n
2910: 6f 20 77 61 79 20 77 69 74 68 6f 75 74 20 61 20  o way without a 
2920: 67 6c 6f 62 61 6c 0a 20 2a 20 76 61 72 69 61 62  global. * variab
2930: 6c 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  le to access the
2940: 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72   Tcl interpreter
2950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  ..*/.static int.
2960: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b  PasswordCallback
2970: 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20  (char *buf, int 
2980: 73 69 7a 65 2c 20 69 6e 74 20 76 65 72 69 66 79  size, int verify
2990: 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  ).{.    return -
29a0: 31 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74 61 74 69  1;.}.#else.stati
29b0: 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61  c int.PasswordCa
29c0: 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66  llback(char *buf
29d0: 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20  , int size, int 
29e0: 76 65 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64  verify, void *ud
29f0: 61 74 61 29 0a 7b 0a 20 20 20 20 53 74 61 74 65  ata).{.    State
2a00: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74   *statePtr.= (St
2a10: 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20  ate *) udata;.  
2a20: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2a30: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
2a40: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
2a50: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
2a60: 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 0a 20    int result;.. 
2a70: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
2a80: 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c  >password == NUL
2a90: 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76  L) {..if (Tcl_Ev
2aa0: 61 6c 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  al(interp, "tls:
2ab0: 3a 70 61 73 73 77 6f 72 64 22 29 20 3d 3d 20 54  :password") == T
2ac0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68  CL_OK) {..    ch
2ad0: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20  ar *ret = (char 
2ae0: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  *) Tcl_GetString
2af0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6e              strn
2b10: 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 73 69  cpy(buf, ret, si
2b20: 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  ze);..    return
2b30: 20 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d   strlen(ret);..}
2b40: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74   else {..    ret
2b50: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d  urn -1;..}.    }
2b60: 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  ..    cmdPtr = T
2b70: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
2b80: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
2b90: 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  rd);..    Tcl_Pr
2ba0: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
2bb0: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  ta) statePtr->in
2bc0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50  terp);.    Tcl_P
2bd0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
2be0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
2bf0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
2c00: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
2c10: 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f     result = Tcl_
2c20: 47 6c 6f 62 61 6c 45 76 61 6c 4f 62 6a 28 69 6e  GlobalEvalObj(in
2c30: 74 65 72 70 2c 20 63 6d 64 50 74 72 29 3b 0a 20  terp, cmdPtr);. 
2c40: 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d     if (result !=
2c50: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f   TCL_OK) {..Tcl_
2c60: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
2c70: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2c80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
2c90: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
2ca0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  dPtr);..    Tcl_
2cb0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
2cc0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
2cd0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
2ce0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
2cf0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a  tePtr->interp);.
2d00: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20  .    if (result 
2d10: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68  == TCL_OK) {..ch
2d20: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20  ar *ret = (char 
2d30: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  *) Tcl_GetString
2d40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2d50: 20 20 20 20 20 20 20 20 73 74 72 6e 63 70 79 28          strncpy(
2d60: 62 75 66 2c 20 72 65 74 2c 20 73 69 7a 65 29 3b  buf, ret, size);
2d70: 0a 09 72 65 74 75 72 6e 20 73 74 72 6c 65 6e 28  ..return strlen(
2d80: 72 65 74 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ret);.    } else
2d90: 20 7b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20   {..return -1;. 
2da0: 20 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a     }.}.#endif...
2db0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
2dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
2e00: 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20  iphersObjCmd -- 
2e10: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63  list available c
2e20: 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69  iphers. *. *.Thi
2e30: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
2e40: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
2e50: 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68  s the "tls::ciph
2e60: 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09  ers" command. *.
2e70: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c  to list availabl
2e80: 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 64  e ciphers, based
2e90: 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73   upon protocol s
2ea0: 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52  elected.. *. * R
2eb0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
2ec0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
2ed0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64   list.. *. * Sid
2ee0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f  e effects:. *.co
2ef0: 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 73  nstructs and des
2f00: 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78  troys SSL contex
2f10: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d  t (CTX). *. *---
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
2f70: 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 63 6c  CiphersObjCmd(cl
2f80: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70  ientData, interp
2f90: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20  , objc, objv).  
2fa0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
2fb0: 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20  entData;./* Not 
2fc0: 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  used. */.    Tcl
2fd0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
2fe0: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20  .    int objc;. 
2ff0: 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e 53     Tcl_Obj.*CONS
3000: 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20  T objv[];.{.    
3010: 73 74 61 74 69 63 20 43 4f 4e 53 54 20 63 68 61  static CONST cha
3020: 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d  r *protocols[] =
3030: 20 7b 0a 09 22 73 73 6c 32 22 2c 09 22 73 73 6c   {.."ssl2",."ssl
3040: 33 22 2c 09 22 74 6c 73 31 22 2c 09 4e 55 4c 4c  3",."tls1",.NULL
3050: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 65 6e 75 6d  .    };.    enum
3060: 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 09 54 4c 53   protocol {..TLS
3070: 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c  _SSL2, TLS_SSL3,
3080: 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 4e   TLS_TLS1, TLS_N
3090: 4f 4e 45 0a 20 20 20 20 7d 3b 0a 20 20 20 20 54  ONE.    };.    T
30a0: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a  cl_Obj *objPtr;.
30b0: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
30c0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c   = NULL;.    SSL
30d0: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ssl = NULL;.  
30e0: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43    STACK_OF(SSL_C
30f0: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20  IPHER) *sk;.    
3100: 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 55  char *cp, buf[BU
3110: 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69  FSIZ];.    int i
3120: 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20  ndex, verbose = 
3130: 30 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  0;..    if (objc
3140: 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33   < 2 || objc > 3
3150: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
3160: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
3170: 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c   objv, "protocol
3180: 20 3f 76 65 72 62 6f 73 65 3f 22 29 3b 0a 20 20   ?verbose?");.  
3190: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
31a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
31b0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64    if (Tcl_GetInd
31c0: 65 78 46 72 6f 6d 4f 62 6a 28 20 69 6e 74 65 72  exFromObj( inter
31d0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74  p, objv[1], prot
31e0: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c  ocols, "protocol
31f0: 22 2c 20 30 2c 0a 09 26 69 6e 64 65 78 29 20 21  ", 0,..&index) !
3200: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
3210: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3220: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6f 62 6a     }.    if (obj
3230: 63 20 3e 20 32 20 26 26 20 54 63 6c 5f 47 65 74  c > 2 && Tcl_Get
3240: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 20  BooleanFromObj( 
3250: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
3260: 0a 09 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54  ..&verbose) != T
3270: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
3280: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
3290: 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65  }.    switch ((e
32a0: 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64  num protocol)ind
32b0: 65 78 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54  ex) {.    case T
32c0: 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 64 65 66  LS_SSL2:.#if def
32d0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 09 09  ined(NO_SSL2)...
32e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
32f0: 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63  (interp, "protoc
3300: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
3310: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75  ", NULL);...retu
3320: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
3330: 6c 73 65 0a 09 09 63 74 78 20 3d 20 53 53 4c 5f  lse...ctx = SSL_
3340: 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65  CTX_new(SSLv2_me
3350: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a  thod()); break;.
3360: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
3370: 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65  TLS_SSL3:.#if de
3380: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 09  fined(NO_SSL3)..
3390: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
33a0: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f  t(interp, "proto
33b0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
33c0: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74  d", NULL);...ret
33d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
33e0: 65 6c 73 65 0a 09 09 63 74 78 20 3d 20 53 53 4c  else...ctx = SSL
33f0: 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d  _CTX_new(SSLv3_m
3400: 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b  ethod()); break;
3410: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
3420: 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64   TLS_TLS1:.#if d
3430: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 0a  efined(NO_TLS1).
3440: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
3450: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74  lt(interp, "prot
3460: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
3470: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72 65  ed", NULL);...re
3480: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3490: 23 65 6c 73 65 0a 09 09 63 74 78 20 3d 20 53 53  #else...ctx = SS
34a0: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f  L_CTX_new(TLSv1_
34b0: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b  method()); break
34c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
34d0: 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55     if (ctx == NU
34e0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
34f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3500: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
3510: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
3520: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
3530: 20 7d 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c   }.    ssl = SSL
3540: 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69  _new(ctx);.    i
3550: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20  f (ssl == NULL) 
3560: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
3570: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53  ult(interp, REAS
3580: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
3590: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
35a0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
35b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
35c0: 20 7d 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20   }.    objPtr = 
35d0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 20  Tcl_NewListObj( 
35e0: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69  0, NULL);..    i
35f0: 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09  f (!verbose) {..
3600: 66 6f 72 20 28 69 6e 64 65 78 20 3d 20 30 3b 20  for (index = 0; 
3610: 3b 20 69 6e 64 65 78 2b 2b 29 20 7b 0a 09 20 20  ; index++) {..  
3620: 20 20 63 70 20 3d 20 28 63 68 61 72 2a 29 53 53    cp = (char*)SS
3630: 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 6c 69 73  L_get_cipher_lis
3640: 74 28 20 73 73 6c 2c 20 69 6e 64 65 78 29 3b 0a  t( ssl, index);.
3650: 09 20 20 20 20 69 66 20 28 63 70 20 3d 3d 20 4e  .    if (cp == N
3660: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 20 20 20  ULL) break;..   
3670: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3680: 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e 74 65 72  ndElement( inter
3690: 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 54 63 6c  p, objPtr,...Tcl
36a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 63  _NewStringObj( c
36b0: 70 2c 20 2d 31 29 20 29 3b 0a 09 7d 0a 20 20 20  p, -1) );..}.   
36c0: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20   } else {..sk = 
36d0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28  SSL_get_ciphers(
36e0: 73 73 6c 29 3b 0a 0a 09 66 6f 72 20 28 69 6e 64  ssl);...for (ind
36f0: 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20 3c 20  ex = 0; index < 
3700: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75  sk_SSL_CIPHER_nu
3710: 6d 28 73 6b 29 3b 20 69 6e 64 65 78 2b 2b 29 20  m(sk); index++) 
3720: 7b 0a 09 20 20 20 20 72 65 67 69 73 74 65 72 20  {..    register 
3730: 69 6e 74 20 69 3b 0a 09 20 20 20 20 53 53 4c 5f  int i;..    SSL_
3740: 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69  CIPHER_descripti
3750: 6f 6e 28 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  on( sk_SSL_CIPHE
3760: 52 5f 76 61 6c 75 65 28 20 73 6b 2c 20 69 6e 64  R_value( sk, ind
3770: 65 78 29 2c 0a 09 09 09 09 20 20 20 20 62 75 66  ex),.....    buf
3780: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a  , sizeof(buf));.
3790: 09 20 20 20 20 66 6f 72 20 28 69 20 3d 20 73 74  .    for (i = st
37a0: 72 6c 65 6e 28 62 75 66 29 20 2d 20 31 3b 20 69  rlen(buf) - 1; i
37b0: 20 3b 20 69 2d 2d 29 20 7b 0a 09 09 69 66 20 28   ; i--) {...if (
37c0: 62 75 66 5b 69 5d 20 3d 3d 20 27 20 27 20 7c 7c  buf[i] == ' ' ||
37d0: 20 62 75 66 5b 69 5d 20 3d 3d 20 27 5c 6e 27 20   buf[i] == '\n' 
37e0: 7c 7c 0a 09 09 20 20 20 20 62 75 66 5b 69 5d 20  ||...    buf[i] 
37f0: 3d 3d 20 27 5c 72 27 20 7c 7c 20 62 75 66 5b 69  == '\r' || buf[i
3800: 5d 20 3d 3d 20 27 5c 74 27 29 20 7b 0a 09 09 20  ] == '\t') {... 
3810: 20 20 20 62 75 66 5b 69 5d 20 3d 20 27 5c 30 27     buf[i] = '\0'
3820: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  ;...} else {... 
3830: 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20     break;...}.. 
3840: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 4c 69     }..    Tcl_Li
3850: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3860: 6e 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50  nt( interp, objP
3870: 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72  tr,...Tcl_NewStr
3880: 69 6e 67 4f 62 6a 28 20 62 75 66 2c 20 2d 31 29  ingObj( buf, -1)
3890: 20 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20   );..}.    }.   
38a0: 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a   SSL_free(ssl);.
38b0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
38c0: 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  (ctx);..    Tcl_
38d0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 20 69 6e  SetObjResult( in
38e0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20  terp, objPtr);. 
38f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
3900: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3950: 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62  *. * HandshakeOb
3960: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
3970: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  is command is us
3980: 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65  ed to verify whe
3990: 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61  ther the handsha
39a0: 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20  ke is complete. 
39b0: 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20  *.or not.. *. * 
39c0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
39d0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
39e0: 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73  t. 1 means hands
39f0: 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30  hake complete, 0
3a00: 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a   means pending..
3a10: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3a20: 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65  ts:. *.May force
3a30: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e   SSL negotiation
3a40: 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a   to take place..
3a50: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
3aa0: 61 74 69 63 20 69 6e 74 0a 48 61 6e 64 73 68 61  atic int.Handsha
3ab0: 6b 65 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74 44  keObjCmd(clientD
3ac0: 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a  ata, interp, obj
3ad0: 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c 69  c, objv).    Cli
3ae0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
3af0: 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64 2e  ta;./* Not used.
3b00: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65   */.    Tcl_Inte
3b10: 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20 20  rp *interp;.    
3b20: 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54 63  int objc;.    Tc
3b30: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
3b40: 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63 6c 5f 43  v[];.{.    Tcl_C
3b50: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
3b60: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
3b70: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
3b80: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
3b90: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
3ba0: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
3bb0: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 69 6e  socket */.    in
3bc0: 74 20 72 65 74 20 3d 20 31 3b 0a 0a 20 20 20 20  t ret = 1;..    
3bd0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
3be0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
3bf0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
3c00: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
3c10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
3c20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
3c30: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
3c40: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
3c50: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
3c60: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
3c70: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20   NULL), NULL);. 
3c80: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
3c90: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
3ca0: 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  L) {.        ret
3cb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3cc0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 68 61     }.    if (cha
3cd0: 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20  nnelTypeVersion 
3ce0: 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56  == TLS_CHANNEL_V
3cf0: 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 2f 2a 0a  ERSION_2) {../*.
3d00: 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f  . * Make sure to
3d10: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
3d20: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a  topmost channel.
3d30: 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c  . */..chan = Tcl
3d40: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
3d50: 68 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  han);.    }.    
3d60: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
3d70: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
3d80: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
3d90: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  )) {.        Tcl
3da0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
3db0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
3dc0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
3dd0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
3de0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3df0: 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53    "\": not a TLS
3e00: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29   channel", NULL)
3e10: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3e20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
3e30: 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d  }.    statePtr =
3e40: 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65   (State *)Tcl_Ge
3e50: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
3e60: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20  Data(chan);..   
3e70: 20 69 66 20 28 21 53 53 4c 5f 69 73 5f 69 6e 69   if (!SSL_is_ini
3e80: 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61 74 65  t_finished(state
3e90: 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 69 6e  Ptr->ssl)) {..in
3ea0: 74 20 65 72 72 3b 0a 09 72 65 74 20 3d 20 54 6c  t err;..ret = Tl
3eb0: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
3ec0: 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 29  (statePtr, &err)
3ed0: 3b 0a 09 69 66 20 28 72 65 74 20 3c 20 30 29 20  ;..if (ret < 0) 
3ee0: 7b 0a 09 20 20 20 20 43 4f 4e 53 54 20 63 68 61  {..    CONST cha
3ef0: 72 20 2a 65 72 72 53 74 72 20 3d 20 73 74 61 74  r *errStr = stat
3f00: 65 50 74 72 2d 3e 65 72 72 3b 0a 09 20 20 20 20  ePtr->err;..    
3f10: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
3f20: 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 54 63  interp);..    Tc
3f30: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b  l_SetErrno(err);
3f40: 0a 0a 09 20 20 20 20 69 66 20 28 21 65 72 72 53  ...    if (!errS
3f50: 74 72 20 7c 7c 20 2a 65 72 72 53 74 72 20 3d 3d  tr || *errStr ==
3f60: 20 30 29 20 7b 0a 09 20 20 20 20 20 20 20 20 65   0) {..        e
3f70: 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69  rrStr = Tcl_Posi
3f80: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  xError(interp);.
3f90: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 54 63 6c  .    }...    Tcl
3fa0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
3fb0: 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65  terp, "handshake
3fc0: 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53   failed: ", errS
3fd0: 74 72 2c 0a 09 09 20 20 20 20 28 63 68 61 72 20  tr,...    (char 
3fe0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
3ff0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4000: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  ..}.    }..    T
4010: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
4020: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
4030: 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20  ntObj(ret));.   
4040: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
4050: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
40a0: 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20   * ImportObjCmd 
40b0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
40c0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
40d0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
40e0: 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a  e "ssl" command.
40f0: 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f   *. *.The ssl co
4100: 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c  mmand pushes SSL
4110: 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63   over a (newly c
4120: 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f  onnected) tcp so
4130: 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cket. *. * Resul
4140: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
4150: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
4160: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4170: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20  :. *.May modify 
4180: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
4190: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20  an IO channel.. 
41a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
41b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
41f0: 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62  tic int.ImportOb
4200: 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c  jCmd(clientData,
4210: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f   interp, objc, o
4220: 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44  bjv).    ClientD
4230: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09  ata clientData;.
4240: 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a  /* Not used. */.
4250: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
4260: 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20  interp;.    int 
4270: 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  objc;.    Tcl_Ob
4280: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b  j *CONST objv[];
4290: 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  .{.    Tcl_Chann
42a0: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65  el chan;../* The
42b0: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20   channel to set 
42c0: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20  a mode on. */.  
42d0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
42e0: 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74  r;../* client st
42f0: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b  ate for ssl sock
4300: 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  et */.    SSL_CT
4310: 58 20 2a 63 74 78 09 3d 20 4e 55 4c 4c 3b 0a 20  X *ctx.= NULL;. 
4320: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69     Tcl_Obj *scri
4330: 70 74 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  pt.= NULL;.    T
4340: 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64  cl_Obj *password
4350: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74  .= NULL;.    int
4360: 20 69 64 78 3b 0a 20 20 20 20 69 6e 74 20 66 6c   idx;.    int fl
4370: 61 67 73 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49  ags..= TLS_TCL_I
4380: 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72  NIT;.    int ser
4390: 76 65 72 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20  ver..= 0;./* is 
43a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d  connection incom
43b0: 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f  ing or outgoing?
43c0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65   */.    char *ke
43d0: 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  y..= NULL;.    c
43e0: 68 61 72 20 2a 63 65 72 74 09 09 3d 20 4e 55 4c  har *cert..= NUL
43f0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70  L;.    char *cip
4400: 68 65 72 73 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  hers.= NULL;.   
4410: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 3d 20   char *CAfile.= 
4420: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
4430: 43 41 64 69 72 09 09 3d 20 4e 55 4c 4c 3b 0a 20  CAdir..= NULL;. 
4440: 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09     char *model..
4450: 3d 20 4e 55 4c 4c 3b 0a 23 69 66 20 64 65 66 69  = NULL;.#if defi
4460: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  ned(NO_SSL2).   
4470: 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 3b 0a 23   int ssl2 = 0;.#
4480: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 73 73 6c  else.    int ssl
4490: 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69  2 = 1;.#endif.#i
44a0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  f defined(NO_SSL
44b0: 33 29 0a 20 20 20 20 69 6e 74 20 73 73 6c 33 20  3).    int ssl3 
44c0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  = 0;.#else.    i
44d0: 6e 74 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e  nt ssl3 = 1;.#en
44e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
44f0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69  NO_SSL2) && defi
4500: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 20  ned(NO_SSL3).   
4510: 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 3b 0a 23   int tls1 = 1;.#
4520: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 74 6c 73  else.    int tls
4530: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  1 = 0;.#endif.  
4540: 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 3b    int proto = 0;
4550: 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20  .    int verify 
4560: 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30  = 0, require = 0
4570: 2c 20 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a  , request = 1;..
4580: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32      if (objc < 2
4590: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
45a0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
45b0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20   objv, "channel 
45c0: 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 20 20 20  ?options?");.   
45d0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
45e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
45f0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
4600: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
4610: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
4620: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55  mObj(objv[1], NU
4630: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  LL), NULL);.    
4640: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
4650: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
4660: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
4670: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
4680: 7d 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65  }.    if (channe
4690: 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20  lTypeVersion == 
46a0: 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53  TLS_CHANNEL_VERS
46b0: 49 4f 4e 5f 32 29 20 7b 0a 09 2f 2a 0a 09 20 2a  ION_2) {../*.. *
46c0: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
46d0: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
46e0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a  most channel.. *
46f0: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  /..chan = Tcl_Ge
4700: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
4710: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  );.    }..    fo
4720: 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20  r (idx = 2; idx 
4730: 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b  < objc; idx++) {
4740: 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63  ..char *opt = Tc
4750: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
4760: 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55  bj(objv[idx], NU
4770: 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30  LL);...if (opt[0
4780: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62  ] != '-')..    b
4790: 72 65 61 6b 3b 0a 0a 09 4f 50 54 53 54 52 28 20  reak;...OPTSTR( 
47a0: 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29  "-cadir", CAdir)
47b0: 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d 63 61 66  ;..OPTSTR( "-caf
47c0: 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09  ile", CAfile);..
47d0: 4f 50 54 53 54 52 28 20 22 2d 63 65 72 74 66 69  OPTSTR( "-certfi
47e0: 6c 65 22 2c 20 63 65 72 74 29 3b 0a 09 4f 50 54  le", cert);..OPT
47f0: 53 54 52 28 20 22 2d 63 69 70 68 65 72 22 2c 20  STR( "-cipher", 
4800: 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 4f 42  ciphers);..OPTOB
4810: 4a 28 20 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73  J( "-command", s
4820: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28  cript);..OPTSTR(
4830: 20 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79   "-keyfile", key
4840: 29 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d 6d 6f  );..OPTSTR( "-mo
4850: 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f  del", model);..O
4860: 50 54 4f 42 4a 28 20 22 2d 70 61 73 73 77 6f 72  PTOBJ( "-passwor
4870: 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09  d", password);..
4880: 4f 50 54 42 4f 4f 4c 28 20 22 2d 72 65 71 75 69  OPTBOOL( "-requi
4890: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09  re", require);..
48a0: 4f 50 54 42 4f 4f 4c 28 20 22 2d 72 65 71 75 65  OPTBOOL( "-reque
48b0: 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09  st", request);..
48c0: 4f 50 54 42 4f 4f 4c 28 20 22 2d 73 65 72 76 65  OPTBOOL( "-serve
48d0: 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 0a 09 4f  r", server);...O
48e0: 50 54 42 4f 4f 4c 28 20 22 2d 73 73 6c 32 22 2c  PTBOOL( "-ssl2",
48f0: 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c   ssl2);..OPTBOOL
4900: 28 20 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29  ( "-ssl3", ssl3)
4910: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 74 6c  ;..OPTBOOL( "-tl
4920: 73 31 22 2c 20 74 6c 73 31 29 3b 0a 0a 09 4f 50  s1", tls1);...OP
4930: 54 42 41 44 28 20 22 6f 70 74 69 6f 6e 22 2c 20  TBAD( "option", 
4940: 22 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65  "-cadir, -cafile
4950: 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69  , -certfile, -ci
4960: 70 68 65 72 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20  pher, -command, 
4970: 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c  -keyfile, -model
4980: 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 65  , -password, -re
4990: 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 74 2c  quire, -request,
49a0: 20 2d 73 65 72 76 65 72 2c 20 2d 73 73 6c 32 2c   -server, -ssl2,
49b0: 20 2d 73 73 6c 33 2c 20 6f 72 20 2d 74 6c 73 31   -ssl3, or -tls1
49c0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c  ");...return TCL
49d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
49e0: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 20 20    if (request)  
49f0: 20 20 20 20 20 20 20 20 20 20 76 65 72 69 66 79            verify
4a00: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43   |= SSL_VERIFY_C
4a10: 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c  LIENT_ONCE | SSL
4a20: 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20  _VERIFY_PEER;.  
4a30: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26    if (request &&
4a40: 20 72 65 71 75 69 72 65 29 20 76 65 72 69 66 79   require) verify
4a50: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46   |= SSL_VERIFY_F
4a60: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
4a70: 45 52 54 3b 0a 20 20 20 20 69 66 20 28 76 65 72  ERT;.    if (ver
4a80: 69 66 79 20 3d 3d 20 30 29 20 20 20 20 20 20 20  ify == 0)       
4a90: 20 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45   verify = SSL_VE
4aa0: 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20  RIFY_NONE;..    
4ab0: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f  proto |= (ssl2 ?
4ac0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20   TLS_PROTO_SSL2 
4ad0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
4ae0: 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50  |= (ssl3 ? TLS_P
4af0: 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a  ROTO_SSL3 : 0);.
4b00: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
4b10: 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  s1 ? TLS_PROTO_T
4b20: 4c 53 31 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  LS1 : 0);..    /
4b30: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20  * reset to NULL 
4b40: 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20  if blank string 
4b50: 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20  provided */.    
4b60: 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65  if (cert && !*ce
4b70: 72 74 29 09 09 63 65 72 74 09 3d 20 4e 55 4c 4c  rt)..cert.= NULL
4b80: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26  ;.    if (key &&
4b90: 20 21 2a 6b 65 79 29 09 09 6b 65 79 09 3d 20 4e   !*key)..key.= N
4ba0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70  ULL;.    if (cip
4bb0: 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72  hers && !*cipher
4bc0: 73 29 09 63 69 70 68 65 72 73 09 3d 20 4e 55 4c  s).ciphers.= NUL
4bd0: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c  L;.    if (CAfil
4be0: 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 43  e && !*CAfile).C
4bf0: 41 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20  Afile.= NULL;.  
4c00: 20 20 69 66 20 28 43 41 64 69 72 20 26 26 20 21    if (CAdir && !
4c10: 2a 43 41 64 69 72 29 09 43 41 64 69 72 09 3d 20  *CAdir).CAdir.= 
4c20: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65  NULL;..    /* ne
4c30: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20  w SSL state */. 
4c40: 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28     statePtr..= (
4c50: 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 41 6c 6c  State *) Tcl_All
4c60: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69  oc((unsigned) si
4c70: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20  zeof(State));.  
4c80: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66    statePtr->self
4c90: 09 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  .= (Tcl_Channel)
4ca0: 4e 55 4c 4c 3b 0a 20 20 20 20 73 74 61 74 65 50  NULL;.    stateP
4cb0: 74 72 2d 3e 74 69 6d 65 72 09 3d 20 28 54 63 6c  tr->timer.= (Tcl
4cc0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c  _TimerToken)NULL
4cd0: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  ;..    statePtr-
4ce0: 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a  >flags.= flags;.
4cf0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61      statePtr->wa
4d00: 74 63 68 4d 61 73 6b 09 3d 20 30 3b 0a 20 20 20  tchMask.= 0;.   
4d10: 20 73 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65 09   statePtr->mode.
4d20: 3d 20 30 3b 0a 0a 20 20 20 20 73 74 61 74 65 50  = 0;..    stateP
4d30: 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74  tr->interp.= int
4d40: 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74  erp;.    statePt
4d50: 72 2d 3e 63 61 6c 6c 62 61 63 6b 09 3d 20 28 54  r->callback.= (T
4d60: 63 6c 5f 4f 62 6a 20 2a 29 30 3b 0a 20 20 20 20  cl_Obj *)0;.    
4d70: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
4d80: 72 64 09 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29  rd.= (Tcl_Obj *)
4d90: 30 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72  0;..    statePtr
4da0: 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66  ->vflags.= verif
4db0: 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  y;.    statePtr-
4dc0: 3e 73 73 6c 09 3d 20 28 53 53 4c 2a 29 30 3b 0a  >ssl.= (SSL*)0;.
4dd0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74      statePtr->ct
4de0: 78 09 3d 20 28 53 53 4c 5f 43 54 58 2a 29 30 3b  x.= (SSL_CTX*)0;
4df0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62  .    statePtr->b
4e00: 69 6f 09 3d 20 28 42 49 4f 2a 29 30 3b 0a 20 20  io.= (BIO*)0;.  
4e10: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69    statePtr->p_bi
4e20: 6f 09 3d 20 28 42 49 4f 2a 29 30 3b 0a 0a 20 20  o.= (BIO*)0;..  
4e30: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09    statePtr->err.
4e40: 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c  = "";..    /* al
4e50: 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f  locate script */
4e60: 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29  .    if (script)
4e70: 20 7b 0a 09 63 68 61 72 20 2a 74 6d 70 20 3d 20   {..char *tmp = 
4e80: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
4e90: 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 4e 55 4c  mObj(script, NUL
4ea0: 4c 29 3b 0a 09 69 66 20 28 74 6d 70 20 26 26 20  L);..if (tmp && 
4eb0: 2a 74 6d 70 29 20 7b 0a 09 20 20 20 20 73 74 61  *tmp) {..    sta
4ec0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
4ed0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
4ee0: 62 6a 28 73 63 72 69 70 74 29 3b 0a 09 20 20 20  bj(script);..   
4ef0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4f00: 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  t(statePtr->call
4f10: 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  back);..}.    }.
4f20: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
4f30: 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20   password */.   
4f40: 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b   if (password) {
4f50: 0a 09 63 68 61 72 20 2a 74 6d 70 20 3d 20 54 63  ..char *tmp = Tc
4f60: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
4f70: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 4e 55 4c  bj(password, NUL
4f80: 4c 29 3b 0a 09 69 66 20 28 74 6d 70 20 26 26 20  L);..if (tmp && 
4f90: 2a 74 6d 70 29 20 7b 0a 09 20 20 20 20 73 74 61  *tmp) {..    sta
4fa0: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
4fb0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
4fc0: 62 6a 28 70 61 73 73 77 6f 72 64 29 3b 0a 09 20  bj(password);.. 
4fd0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
4fe0: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61  unt(statePtr->pa
4ff0: 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20  ssword);..}.    
5000: 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c  }..    if (model
5010: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74   != NULL) {..int
5020: 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74   mode;../* Get t
5030: 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65  he "model" conte
5040: 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63  xt */..chan = Tc
5050: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
5060: 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64  erp, model, &mod
5070: 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d  e);..if (chan ==
5080: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
5090: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  ULL) {..    Tls_
50a0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
50b0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
50c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
50d0: 09 7d 0a 09 69 66 20 28 63 68 61 6e 6e 65 6c 54  .}..if (channelT
50e0: 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c  ypeVersion == TL
50f0: 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f  S_CHANNEL_VERSIO
5100: 4e 5f 32 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  N_2) {..    /*..
5110: 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65       * Make sure
5120: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
5130: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
5140: 65 6c 0a 09 20 20 20 20 20 2a 2f 0a 09 20 20 20  el..     */..   
5150: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
5160: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
5170: 0a 09 7d 0a 09 69 66 20 28 54 63 6c 5f 47 65 74  ..}..if (Tcl_Get
5180: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
5190: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
51a0: 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54  Type()) {..    T
51b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
51c0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
51d0: 6e 6e 65 6c 20 5c 22 22 2c 0a 09 09 20 20 20 20  nnel \"",...    
51e0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
51f0: 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e  me(chan), "\": n
5200: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
5210: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  ", NULL);..    T
5220: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
5230: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
5240: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5250: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53  R;..}..ctx = ((S
5260: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
5270: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
5280: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20  a(chan))->ctx;. 
5290: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
52a0: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74  ((ctx = CTX_Init
52b0: 28 73 74 61 74 65 50 74 72 2c 20 70 72 6f 74 6f  (statePtr, proto
52c0: 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 43 41 64  , key, cert, CAd
52d0: 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68  ir, CAfile, ciph
52e0: 65 72 73 29 29 0a 09 20 20 20 20 3d 3d 20 28 53  ers))..    == (S
52f0: 53 4c 5f 43 54 58 2a 29 30 29 20 7b 0a 09 20 20  SL_CTX*)0) {..  
5300: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
5310: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
5320: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5330: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
5340: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74      statePtr->ct
5350: 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a  x = ctx;..    /*
5360: 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20  .     * We need 
5370: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
5380: 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f  t the channel wo
5390: 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66  rks in binary (f
53a0: 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e  or the.     * en
53b0: 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20  cryption not to 
53c0: 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a  get goofed up)..
53d0: 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77       * We only w
53e0: 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68  ant to adjust th
53f0: 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70  e buffering in p
5400: 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20  re-v2 channels, 
5410: 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63  where.     * eac
5420: 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65  h channel in the
5430: 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65   stack maintaine
5440: 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72  d its own buffer
5450: 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54  s..     */.    T
5460: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
5470: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
5480: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
5490: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20  , "binary");.   
54a0: 20 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65   if (channelType
54b0: 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43  Version == TLS_C
54c0: 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 31  HANNEL_VERSION_1
54d0: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e  ) {..Tcl_SetChan
54e0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
54f0: 2c 20 63 68 61 6e 2c 20 22 2d 62 75 66 66 65 72  , chan, "-buffer
5500: 69 6e 67 22 2c 20 22 6e 6f 6e 65 22 29 3b 0a 20  ing", "none");. 
5510: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 63 68     }..    if (ch
5520: 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e  annelTypeVersion
5530: 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f   == TLS_CHANNEL_
5540: 56 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 73 74  VERSION_2) {..st
5550: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54  atePtr->self = T
5560: 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28  cl_StackChannel(
5570: 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e  interp, Tls_Chan
5580: 6e 65 6c 54 79 70 65 28 29 2c 0a 09 09 28 43 6c  nelType(),...(Cl
5590: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
55a0: 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c  tr, (TCL_READABL
55b0: 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45  E | TCL_WRITABLE
55c0: 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 7d 20  ), chan);.    } 
55d0: 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72  else {..statePtr
55e0: 2d 3e 73 65 6c 66 20 3d 20 63 68 61 6e 3b 0a 09  ->self = chan;..
55f0: 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c  Tcl_StackChannel
5600: 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61  (interp, Tls_Cha
5610: 6e 6e 65 6c 54 79 70 65 28 29 2c 0a 09 09 28 43  nnelType(),...(C
5620: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
5630: 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42  Ptr, (TCL_READAB
5640: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c  LE | TCL_WRITABL
5650: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 7d  E), chan);.    }
5660: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
5670: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
5680: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
5690: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20  ../*.. * No use 
56a0: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c  of Tcl_Eventuall
56b0: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f  yFree because no
56c0: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72   possible Tcl_Pr
56d0: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c  eserve... */..Tl
56e0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
56f0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20  statePtr);.     
5700: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5710: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5720: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e  /*.     * SSL In
5730: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20  itialization.   
5740: 20 20 2a 2f 0a 0a 20 20 20 20 73 74 61 74 65 50    */..    stateP
5750: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65  tr->ssl = SSL_ne
5760: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  w(statePtr->ctx)
5770: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65  ;.    if (!state
5780: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 20 20 20 20  Ptr->ssl) {.    
5790: 20 20 20 20 2f 2a 20 53 53 4c 20 6c 69 62 72 61      /* SSL libra
57a0: 72 79 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  ry error */.    
57b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
57c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
57d0: 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74  uldn't construct
57e0: 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c   ssl session: ",
57f0: 20 52 45 41 53 4f 4e 28 29 2c 0a 09 09 28 63 68   REASON(),...(ch
5800: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c  ar *) NULL);..Tl
5810: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
5820: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20  statePtr);.     
5830: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5840: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5850: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61  /*.     * SSL Ca
5860: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a  llbacks.     */.
5870: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70  .    SSL_set_app
5880: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e  _data(statePtr->
5890: 73 73 6c 2c 20 28 56 4f 49 44 20 2a 29 73 74 61  ssl, (VOID *)sta
58a0: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74  tePtr);./* point
58b0: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a   back to us */..
58c0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69      SSL_set_veri
58d0: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  fy(statePtr->ssl
58e0: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79  , verify, Verify
58f0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20  Callback);..    
5900: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 69 6e 66 6f  SSL_CTX_set_info
5910: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
5920: 74 72 2d 3e 63 74 78 2c 20 49 6e 66 6f 43 61 6c  tr->ctx, InfoCal
5930: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20  lback);..    /* 
5940: 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e  Create Tcl_Chann
5950: 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a  el BIO Handler *
5960: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
5970: 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f  p_bio.= BIO_new_
5980: 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49  tcl(statePtr, BI
5990: 4f 5f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74  O_CLOSE);.    st
59a0: 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49  atePtr->bio.= BI
59b0: 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28  O_new(BIO_f_ssl(
59c0: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72  ));..    if (ser
59d0: 76 65 72 29 20 7b 0a 09 73 74 61 74 65 50 74 72  ver) {..statePtr
59e0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
59f0: 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f  CL_SERVER;..SSL_
5a00: 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65  set_accept_state
5a10: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
5a20: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 53  .    } else {..S
5a30: 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73  SL_set_connect_s
5a40: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  tate(statePtr->s
5a50: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53  sl);.    }.    S
5a60: 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65  SL_set_bio(state
5a70: 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50  Ptr->ssl, stateP
5a80: 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65  tr->p_bio, state
5a90: 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20  Ptr->p_bio);.   
5aa0: 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61   BIO_set_ssl(sta
5ab0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74  tePtr->bio, stat
5ac0: 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 43  ePtr->ssl, BIO_C
5ad0: 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  LOSE);..    /*. 
5ae0: 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c      * End of SSL
5af0: 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20   Init.     */.  
5b00: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
5b10: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
5b20: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
5b30: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
5b40: 6c 66 29 2c 0a 09 20 20 20 20 54 43 4c 5f 56 4f  lf),..    TCL_VO
5b50: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74  LATILE);.    ret
5b60: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
5b70: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
5b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5bb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
5bc0: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74  TX_Init -- const
5bd0: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69  ruct a SSL_CTX i
5be0: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65  nstance. *. * Re
5bf0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69  sults:. *.A vali
5c00: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  d SSL_CTX instan
5c10: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20  ce or NULL.. *. 
5c20: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
5c30: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53   *.constructs SS
5c40: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a  L context (CTX).
5c50: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
5c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c90: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
5ca0: 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43  atic SSL_CTX *.C
5cb0: 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72  TX_Init(statePtr
5cc0: 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 2c 20 63 65  , proto, key, ce
5cd0: 72 74 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c  rt, CAdir, CAfil
5ce0: 65 2c 20 63 69 70 68 65 72 73 29 0a 20 20 20 20  e, ciphers).    
5cf0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
5d00: 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 3b 0a  .    int proto;.
5d10: 20 20 20 20 63 68 61 72 20 2a 6b 65 79 3b 0a 20      char *key;. 
5d20: 20 20 20 63 68 61 72 20 2a 63 65 72 74 3b 0a 20     char *cert;. 
5d30: 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 3b 0a     char *CAdir;.
5d40: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65      char *CAfile
5d50: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
5d60: 65 72 73 3b 0a 7b 0a 20 20 20 20 54 63 6c 5f 49  ers;.{.    Tcl_I
5d70: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20  nterp *interp = 
5d80: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
5d90: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63  ;.    SSL_CTX *c
5da0: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  tx = NULL;.    T
5db0: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20  cl_DString ds;. 
5dc0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
5dd0: 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20  s1;.    int off 
5de0: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 63 72 65  = 0;..    /* cre
5df0: 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  ate SSL context 
5e00: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
5e10: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66  NO_SSL2) && !def
5e20: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20  ined(NO_SSL3).  
5e30: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
5e40: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
5e50: 53 4c 32 29 20 26 26 0a 09 45 4e 41 42 4c 45 44  SL2) &&..ENABLED
5e60: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
5e70: 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 63 74 78 20  O_SSL3)) {..ctx 
5e80: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53  = SSL_CTX_new(SS
5e90: 4c 76 32 33 5f 6d 65 74 68 6f 64 28 29 29 3b 0a  Lv23_method());.
5ea0: 20 20 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69      } else.#endi
5eb0: 66 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  f.    if (ENABLE
5ec0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
5ed0: 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 23 69 66 20  TO_SSL2)) {.#if 
5ee0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
5ef0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
5f00: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74  lt(interp, "prot
5f10: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
5f20: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
5f30: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30  urn (SSL_CTX *)0
5f40: 3b 0a 23 65 6c 73 65 0a 09 63 74 78 20 3d 20 53  ;.#else..ctx = S
5f50: 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 32  SL_CTX_new(SSLv2
5f60: 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 23 65 6e 64  _method());.#end
5f70: 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  if.    } else if
5f80: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
5f90: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29   TLS_PROTO_TLS1)
5fa0: 29 20 7b 0a 09 63 74 78 20 3d 20 53 53 4c 5f 43  ) {..ctx = SSL_C
5fb0: 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 6d 65 74  TX_new(TLSv1_met
5fc0: 68 6f 64 28 29 29 3b 0a 20 20 20 20 7d 20 65 6c  hod());.    } el
5fd0: 73 65 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70  se if (ENABLED(p
5fe0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
5ff0: 53 53 4c 33 29 29 20 7b 0a 23 69 66 20 64 65 66  SSL3)) {.#if def
6000: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 09 54  ined(NO_SSL3)..T
6010: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6020: 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f  interp, "protoco
6030: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
6040: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
6050: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 23   (SSL_CTX *)0;.#
6060: 65 6c 73 65 0a 09 63 74 78 20 3d 20 53 53 4c 5f  else..ctx = SSL_
6070: 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65  CTX_new(SSLv3_me
6080: 74 68 6f 64 28 29 29 3b 0a 23 65 6e 64 69 66 0a  thod());.#endif.
6090: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
60a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
60b0: 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64  nterp, "no valid
60c0: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74   protocol select
60d0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
60e0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30  urn (SSL_CTX *)0
60f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 66 66 20  ;.    }.    off 
6100: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
6110: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
6120: 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f  1) ? 0 : SSL_OP_
6130: 4e 4f 5f 54 4c 53 76 31 29 3b 0a 20 20 20 20 6f  NO_TLSv1);.    o
6140: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
6150: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
6160: 53 53 4c 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f  SSL2) ? 0 : SSL_
6170: 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 20 20  OP_NO_SSLv2);.  
6180: 20 20 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45    off |= (ENABLE
6190: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
61a0: 54 4f 5f 53 53 4c 33 29 20 3f 20 30 20 3a 20 53  TO_SSL3) ? 0 : S
61b0: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b  SL_OP_NO_SSLv3);
61c0: 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
61d0: 74 5f 61 70 70 5f 64 61 74 61 28 20 63 74 78 2c  t_app_data( ctx,
61e0: 20 28 56 4f 49 44 2a 29 69 6e 74 65 72 70 29 3b   (VOID*)interp);
61f0: 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65  ./* remember the
6200: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a   interpreter */.
6210: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
6220: 6f 70 74 69 6f 6e 73 28 20 63 74 78 2c 20 53 53  options( ctx, SS
6230: 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c  L_OP_ALL);./* al
6240: 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72  l SSL bug workar
6250: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c  ounds */.    SSL
6260: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
6270: 28 20 63 74 78 2c 20 6f 66 66 29 3b 09 2f 2a 20  ( ctx, off);./* 
6280: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b  all SSL bug work
6290: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53  arounds */.    S
62a0: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f  SL_CTX_sess_set_
62b0: 63 61 63 68 65 5f 73 69 7a 65 28 20 63 74 78 2c  cache_size( ctx,
62c0: 20 31 32 38 29 3b 0a 0a 20 20 20 20 69 66 20 28   128);..    if (
62d0: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29  ciphers != NULL)
62e0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69  ..SSL_CTX_set_ci
62f0: 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63  pher_list(ctx, c
6300: 69 70 68 65 72 73 29 3b 0a 0a 20 20 20 20 2f 2a  iphers);..    /*
6310: 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61   set some callba
6320: 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  cks */.    SSL_C
6330: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70  TX_set_default_p
6340: 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61  asswd_cb(ctx, Pa
6350: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b  sswordCallback);
6360: 0a 0a 23 69 66 6e 64 65 66 20 42 53 41 46 45 0a  ..#ifndef BSAFE.
6370: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
6380: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63  default_passwd_c
6390: 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20  b_userdata(ctx, 
63a0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
63b0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  );.#endif..#ifnd
63c0: 65 66 20 4e 4f 5f 44 48 0a 20 20 20 20 7b 0a 09  ef NO_DH.    {..
63d0: 44 48 2a 20 64 68 20 3d 20 67 65 74 5f 64 68 35  DH* dh = get_dh5
63e0: 31 32 28 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  12();..SSL_CTX_s
63f0: 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64  et_tmp_dh(ctx, d
6400: 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29  h);..DH_free(dh)
6410: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
6420: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63      /* set our c
6430: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20  ertificate */.  
6440: 20 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55    if (cert != NU
6450: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 53 74 72 69  LL) {..Tcl_DStri
6460: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a 20 20  ngInit(&ds);..  
6470: 20 20 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54        if (SSL_CT
6480: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
6490: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  e_file(ctx, F2N(
64a0: 20 63 65 72 74 2c 20 26 64 73 29 2c 0a 09 09 09   cert, &ds),....
64b0: 09 09 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  ..SSL_FILETYPE_P
64c0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  EM) <= 0) {..   
64d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
64e0: 28 26 64 73 29 3b 0a 20 20 20 20 20 20 20 20 20  (&ds);.         
64f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
6500: 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 20  ult(interp,.    
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6520: 20 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65           "unable
6530: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63   to set certific
6540: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74  ate file ", cert
6550: 2c 20 22 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  , ": ",.        
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6570: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28       REASON(), (
6580: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  char *) NULL);. 
6590: 20 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43             SSL_C
65a0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 20 20  TX_free(ctx);.  
65b0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
65c0: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20   (SSL_CTX *)0;. 
65d0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
65e0: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69    /* get the pri
65f0: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61  vate key associa
6600: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65  ted with this ce
6610: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20  rtificate */.   
6620: 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20       if (key == 
6630: 4e 55 4c 4c 29 20 6b 65 79 3d 63 65 72 74 3b 0a  NULL) key=cert;.
6640: 0a 20 20 20 20 20 20 20 20 69 66 20 28 53 53 4c  .        if (SSL
6650: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65  _CTX_use_Private
6660: 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32  Key_file(ctx, F2
6670: 4e 28 20 6b 65 79 2c 20 26 64 73 29 2c 0a 09 09  N( key, &ds),...
6680: 09 09 09 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  ...SSL_FILETYPE_
6690: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20  PEM) <= 0) {..  
66a0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
66b0: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 2f 2a 20  e(&ds);..    /* 
66c0: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68  flush the passph
66d0: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74  rase which might
66e0: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
66f0: 72 65 73 75 6c 74 20 2a 2f 0a 09 20 20 20 20 54  result */..    T
6700: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
6710: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53  erp, NULL, TCL_S
6720: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
6730: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
6740: 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20  sult(interp,.   
6750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6760: 20 20 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c            "unabl
6770: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20  e to set public 
6780: 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 2c  key file ", key,
6790: 20 22 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20   " ",.          
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67b0: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68     REASON(), (ch
67c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  ar *) NULL);.   
67d0: 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43 54 58           SSL_CTX
67e0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 20 20 20 20  _free(ctx);.    
67f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28          return (
6800: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20  SSL_CTX *)0;.   
6810: 20 20 20 20 20 7d 0a 09 54 63 6c 5f 44 53 74 72       }..Tcl_DStr
6820: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20  ingFree(&ds);.  
6830: 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20        /* Now we 
6840: 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20  know that a key 
6850: 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65  and cert have be
6860: 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 20  en set against. 
6870: 20 20 20 20 20 20 20 20 2a 20 74 68 65 20 53 53          * the SS
6880: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20  L context */.   
6890: 20 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54       if (!SSL_CT
68a0: 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f  X_check_private_
68b0: 6b 65 79 28 63 74 78 29 29 20 7b 0a 20 20 20 20  key(ctx)) {.    
68c0: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
68d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
68e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
6900: 72 69 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20  rivate key does 
6910: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 63 65  not match the ce
6920: 72 74 69 66 69 63 61 74 65 20 70 75 62 6c 69 63  rtificate public
6930: 20 6b 65 79 22 2c 0a 20 20 20 20 20 20 20 20 20   key",.         
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c      (char *) NUL
6960: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  L);.            
6970: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
6980: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
6990: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
69a0: 29 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  )0;.        }.  
69b0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
69c0: 20 20 20 63 65 72 74 20 3d 20 28 63 68 61 72 2a     cert = (char*
69d0: 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c  )X509_get_defaul
69e0: 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a  t_cert_file();..
69f0: 20 20 20 20 20 20 20 20 69 66 20 28 53 53 4c 5f          if (SSL_
6a00: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
6a10: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65  ate_file(ctx, ce
6a20: 72 74 2c 0a 09 09 09 09 09 53 53 4c 5f 46 49 4c  rt,......SSL_FIL
6a30: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29  ETYPE_PEM) <= 0)
6a40: 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63   {.#if 0..    Tc
6a50: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
6a60: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
6a70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6a80: 28 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 20  (interp,.       
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6aa0: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
6ab0: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72   use default cer
6ac0: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c  tificate file ",
6ad0: 20 63 65 72 74 2c 20 22 3a 20 22 2c 0a 20 20 20   cert, ": ",.   
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6af0: 20 20 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e            REASON
6b00: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
6b10: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  L);.            
6b20: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
6b30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
6b40: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
6b50: 29 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  )0;.#endif.     
6b60: 20 20 20 7d 0a 20 20 20 20 7d 0a 09 0a 20 20 20     }.    }...   
6b70: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
6b80: 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44  (&ds);.    Tcl_D
6b90: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29  StringInit(&ds1)
6ba0: 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  ;.    if (!SSL_C
6bb0: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c  TX_load_verify_l
6bc0: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32  ocations(ctx, F2
6bd0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20  N(CAfile, &ds), 
6be0: 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29  F2N(CAdir, &ds1)
6bf0: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 21 53 53  ) ||.        !SS
6c00: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
6c10: 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63  t_verify_paths(c
6c20: 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63  tx)) {.#if 0..Tc
6c30: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
6c40: 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  s);..Tcl_DString
6c50: 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20  Free(&ds1);../* 
6c60: 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20  Don't currently 
6c70: 63 61 72 65 20 69 66 20 74 68 69 73 20 66 61 69  care if this fai
6c80: 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e  ls */..Tcl_Appen
6c90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
6ca0: 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72  "SSL default ver
6cb0: 69 66 79 20 70 61 74 68 73 3a 20 22 2c 0a 09 09  ify paths: ",...
6cc0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
6cd0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43  *) NULL);..SSL_C
6ce0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72  TX_free(ctx);..r
6cf0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
6d00: 29 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  )0;.#endif.    }
6d10: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
6d20: 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28  _client_CA_list(
6d30: 63 74 78 2c 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c  ctx, SSL_load_cl
6d40: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 20 46 32  ient_CA_file( F2
6d50: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 20 29  N(CAfile, &ds) )
6d60: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  );..    Tcl_DStr
6d70: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20  ingFree(&ds);.  
6d80: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
6d90: 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74  e(&ds1);.    ret
6da0: 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn ctx;.}.../*.
6db0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6df0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74  -----. *. * Stat
6e00: 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  usObjCmd -- retu
6e10: 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66  rn certificate f
6e20: 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65  or connected pee
6e30: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  r.. *. * Results
6e40: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
6e50: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
6e60: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
6e70: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ec0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
6ed0: 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 63 6c  .StatusObjCmd(cl
6ee0: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70  ientData, interp
6ef0: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20  , objc, objv).  
6f00: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
6f10: 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20  entData;./* Not 
6f20: 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  used. */.    Tcl
6f30: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
6f40: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20  .    int objc;. 
6f50: 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e 53     Tcl_Obj.*CONS
6f60: 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20  T objv[];.{.    
6f70: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
6f80: 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b  .    X509 *peer;
6f90: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
6fa0: 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68  jPtr;.    Tcl_Ch
6fb0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20  annel chan;.    
6fc0: 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d  char *channelNam
6fd0: 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20  e, *ciphers;.   
6fe0: 20 69 6e 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20   int mode;..    
6ff0: 73 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a  switch (objc) {.
7000: 09 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63 68  .case 2:..    ch
7010: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f  annelName = Tcl_
7020: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
7030: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b  (objv[1], NULL);
7040: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
7050: 61 73 65 20 33 3a 0a 09 20 20 20 20 69 66 20 28  ase 3:..    if (
7060: 21 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 74  !strcmp (Tcl_Get
7070: 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29  String (objv[1])
7080: 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09  , "-local")) {..
7090: 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54  .channelName = T
70a0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
70b0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c  Obj(objv[2], NUL
70c0: 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  L);...break;..  
70d0: 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65    }..    /* else
70e0: 20 66 61 6c 6c 2e 2e 2e 20 2a 2f 0a 09 64 65 66   fall... */..def
70f0: 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57  ault:..    Tcl_W
7100: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
7110: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d  rp, 1, objv, "?-
7120: 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29  local? channel")
7130: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
7140: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
7150: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
7160: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
7170: 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26  , channelName, &
7180: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63  mode);.    if (c
7190: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
71a0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
71b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
71c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 68      }.    if (ch
71d0: 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e  annelTypeVersion
71e0: 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f   == TLS_CHANNEL_
71f0: 56 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 2f 2a  VERSION_2) {../*
7200: 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  .. * Make sure t
7210: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
7220: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
7230: 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63  .. */..chan = Tc
7240: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
7250: 63 68 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  chan);.    }.   
7260: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
7270: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
7280: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
7290: 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 54 63  ()) {.        Tc
72a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
72b0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
72c0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
72d0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
72e0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
72f0: 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c     "\": not a TL
7300: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
7310: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
7320: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7330: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 09   }.    statePtr.
7340: 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f  = (State *) Tcl_
7350: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
7360: 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20  ceData(chan);.  
7370: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29    if (objc == 2)
7380: 0a 09 70 65 65 72 09 3d 20 53 53 4c 5f 67 65 74  ..peer.= SSL_get
7390: 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74  _peer_certificat
73a0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
73b0: 3b 0a 20 20 20 20 65 6c 73 65 0a 09 70 65 65 72  ;.    else..peer
73c0: 09 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69  .= SSL_get_certi
73d0: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d  ficate(statePtr-
73e0: 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 70  >ssl);.    if (p
73f0: 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d  eer) {..objPtr =
7400: 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28   Tls_NewX509Obj(
7410: 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 20  interp, peer);. 
7420: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a     } else {..obj
7430: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
7440: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20  tObj(0, NULL);. 
7450: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 4c 69     }..    Tcl_Li
7460: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
7470: 6e 74 20 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  nt (interp, objP
7480: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
7490: 53 74 72 69 6e 67 4f 62 6a 20 28 22 73 62 69 74  StringObj ("sbit
74a0: 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  s", -1));.    Tc
74b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
74c0: 6c 65 6d 65 6e 74 20 28 69 6e 74 65 72 70 2c 20  lement (interp, 
74d0: 6f 62 6a 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  objPtr,..    Tcl
74e0: 5f 4e 65 77 49 6e 74 4f 62 6a 20 28 53 53 4c 5f  _NewIntObj (SSL_
74f0: 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 20  get_cipher_bits 
7500: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
7510: 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63 69  NULL)));..    ci
7520: 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53  phers = (char*)S
7530: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74  SL_get_cipher(st
7540: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
7550: 20 20 69 66 20 28 63 69 70 68 65 72 73 20 21 3d    if (ciphers !=
7560: 20 4e 55 4c 4c 20 26 26 20 73 74 72 63 6d 70 28   NULL && strcmp(
7570: 63 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e 45 29  ciphers, "(NONE)
7580: 22 29 21 3d 30 29 20 7b 0a 09 54 63 6c 5f 4c 69  ")!=0) {..Tcl_Li
7590: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
75a0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
75b0: 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69  r,...Tcl_NewStri
75c0: 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22 2c 20  ngObj("cipher", 
75d0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
75e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
75f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a  interp, objPtr,.
7600: 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
7610: 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65  bj(SSL_get_ciphe
7620: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  r(statePtr->ssl)
7630: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20  , -1));.    }.  
7640: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
7650: 6c 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50  lt( interp, objP
7660: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
7670: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
7680: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
7690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76c0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69  ----. *. * Versi
76d0: 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  onObjCmd -- retu
76e0: 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e  rn version strin
76f0: 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a  g from OpenSSL..
7700: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
7710: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
7720: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
7730: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
7740: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
7750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65  */.static int.Ve
77a0: 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 63 6c 69 65  rsionObjCmd(clie
77b0: 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20  ntData, interp, 
77c0: 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20  objc, objv).    
77d0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
77e0: 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73  tData;./* Not us
77f0: 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  ed. */.    Tcl_I
7800: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
7810: 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20     int objc;.   
7820: 20 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e 53 54 20   Tcl_Obj.*CONST 
7830: 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63  objv[];.{.    Tc
7840: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a  l_Obj *objPtr;..
7850: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
7860: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50  _NewStringObj(OP
7870: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45  ENSSL_VERSION_TE
7880: 58 54 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63  XT, -1);..    Tc
7890: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
78a0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
78b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
78c0: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7910: 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d   *. * Tls_Free -
7920: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
7930: 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70  cedure cleans up
7940: 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b   when a SSL sock
7950: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c  et based channel
7960: 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e  . *.is closed an
7970: 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  d its reference 
7980: 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f  count falls belo
7990: 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  w 1. *. * Result
79a0: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.none. *. *
79b0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
79c0: 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20  *.Frees all the 
79d0: 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  state. *. *-----
79e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7a20: 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65  */.void.Tls_Free
7a30: 28 20 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72  ( char *blockPtr
7a40: 20 29 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a   ).{.    State *
7a50: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
7a60: 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20  e *)blockPtr;.. 
7a70: 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61     Tls_Clean(sta
7a80: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  tePtr);.    Tcl_
7a90: 46 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a  Free(blockPtr);.
7aa0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
7ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
7af0: 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a   * Tls_Clean --.
7b00: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
7b10: 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77  dure cleans up w
7b20: 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74  hen a SSL socket
7b30: 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20   based channel. 
7b40: 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  *.is closed and 
7b50: 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
7b60: 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20  unt falls below 
7b70: 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a  1.  This should.
7b80: 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e   *.be called syn
7b90: 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68  chronously by th
7ba0: 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74  e CloseProc, not
7bb0: 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74   in the. *.Event
7bc0: 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61  uallyFree callba
7bd0: 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ck.. *. * Result
7be0: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.none. *. *
7bf0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
7c00: 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20  *.Frees all the 
7c10: 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  state. *. *-----
7c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7c60: 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 43 6c 65 61  */.void.Tls_Clea
7c70: 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  n(State *statePt
7c80: 72 29 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r).{.    /*.    
7c90: 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e   * we're assumin
7ca0: 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72  g here that we'r
7cb0: 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  e single-threade
7cc0: 64 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  d.     */..    i
7cd0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
7ce0: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
7cf0: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09  Token) NULL) {..
7d00: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48  Tcl_DeleteTimerH
7d10: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d  andler(statePtr-
7d20: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50  >timer);..stateP
7d30: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c  tr->timer = NULL
7d40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
7d50: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20  (statePtr->ssl) 
7d60: 7b 0a 09 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28  {..SSL_shutdown(
7d70: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
7d80: 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50  .SSL_free(stateP
7d90: 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65  tr->ssl);..state
7da0: 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b  Ptr->ssl = NULL;
7db0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
7dc0: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a  tatePtr->ctx) {.
7dd0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74  .SSL_CTX_free(st
7de0: 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73  atePtr->ctx);..s
7df0: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e  tatePtr->ctx = N
7e00: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
7e10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
7e20: 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65  lback) {..Tcl_De
7e30: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
7e40: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
7e50: 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  .statePtr->callb
7e60: 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ack = NULL;.    
7e70: 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
7e80: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a  tr->password) {.
7e90: 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
7ea0: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
7eb0: 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72  word);..statePtr
7ec0: 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c  ->password = NUL
7ed0: 4c 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a  L;.    }.}.../*.
7ee0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f20: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
7f30: 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Init --. *. *.Th
7f40: 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20  is is a package 
7f50: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70  initialization p
7f60: 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20  rocedure, which 
7f70: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20  is called. *.by 
7f80: 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61  Tcl when this pa
7f90: 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61  ckage is to be a
7fa0: 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72  dded to an inter
7fb0: 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  preter.. *. * Re
7fc0: 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66  sults:  Ssl conf
7fd0: 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65  igured and loade
7fe0: 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  d. *. * Side eff
7ff0: 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65  ects:. *. create
8000: 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64   the ssl command
8010: 2c 20 69 6e 69 74 69 61 6c 69 73 65 20 73 73 6c  , initialise ssl
8020: 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d   context. *. *--
8030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8070: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6c 73 5f 49  -. */..int.Tls_I
8080: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
8090: 69 6e 74 65 72 70 29 09 09 2f 2a 20 49 6e 74 65  interp)../* Inte
80a0: 72 70 72 65 74 65 72 20 69 6e 20 77 68 69 63 68  rpreter in which
80b0: 20 74 68 65 20 70 61 63 6b 61 67 65 20 69 73 0a   the package is.
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80e0: 20 20 20 20 20 20 20 20 20 2a 20 74 6f 20 62 65           * to be
80f0: 20 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65 2e   made available.
8100: 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 6d 61   */.{.    int ma
8110: 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 70 61 74 63  jor, minor, patc
8120: 68 6c 65 76 65 6c 2c 20 72 65 6c 65 61 73 65 2c  hlevel, release,
8130: 20 69 3b 0a 20 20 20 20 63 68 61 72 20 72 6e 64   i;.    char rnd
8140: 5f 73 65 65 64 5b 31 36 5d 20 3d 20 22 47 72 7a  _seed[16] = "Grz
8150: 53 6c 70 6c 4b 71 55 64 6e 6e 7a 50 21 22 3b 09  SlplKqUdnnzP!";.
8160: 2f 2a 20 31 36 20 62 79 74 65 73 20 2a 2f 0a 0a  /* 16 bytes */..
8170: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68      /*.     * Th
8180: 65 20 6f 72 69 67 69 6e 61 6c 20 38 2e 32 2e 30  e original 8.2.0
8190: 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c   stacked channel
81a0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
81b0: 28 61 6e 64 20 74 68 65 20 70 61 74 63 68 0a 20  (and the patch. 
81c0: 20 20 20 20 2a 20 74 68 61 74 20 70 72 65 63 65      * that prece
81d0: 64 65 64 20 69 74 29 20 68 61 64 20 70 72 6f 62  ded it) had prob
81e0: 6c 65 6d 73 20 77 69 74 68 20 73 63 61 6c 61 62  lems with scalab
81f0: 69 6c 69 74 79 20 61 6e 64 20 72 6f 62 75 73 74  ility and robust
8200: 6e 65 73 73 2e 0a 20 20 20 20 20 2a 20 54 68 65  ness..     * The
8210: 73 65 20 77 65 72 65 20 61 64 64 72 65 73 73 20  se were address 
8220: 69 6e 20 38 2e 33 2e 32 20 2f 20 38 2e 34 61 32  in 8.3.2 / 8.4a2
8230: 2c 20 73 6f 20 77 65 20 6e 6f 77 20 72 65 71 75  , so we now requ
8240: 69 72 65 20 74 68 61 74 20 61 73 20 61 0a 20 20  ire that as a.  
8250: 20 20 20 2a 20 6d 69 6e 69 6d 75 6d 20 66 6f 72     * minimum for
8260: 20 54 4c 53 20 31 2e 34 2b 2e 20 20 57 65 20 6f   TLS 1.4+.  We o
8270: 6e 6c 79 20 73 75 70 70 6f 72 74 20 38 2e 32 2b  nly support 8.2+
8280: 20 6e 6f 77 20 28 38 2e 33 2e 32 2b 20 70 72 65   now (8.3.2+ pre
8290: 66 65 72 72 65 64 29 2e 0a 20 20 20 20 20 2a 2f  ferred)..     */
82a0: 0a 20 20 20 20 69 66 20 28 0a 23 69 66 64 65 66  .    if (.#ifdef
82b0: 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 09   USE_TCL_STUBS..
82c0: 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
82d0: 74 65 72 70 2c 20 22 38 2e 32 22 2c 20 30 29 0a  terp, "8.2", 0).
82e0: 23 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 67 52 65  #else..Tcl_PkgRe
82f0: 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54  quire(interp, "T
8300: 63 6c 22 2c 20 22 38 2e 32 22 2c 20 30 29 0a 23  cl", "8.2", 0).#
8310: 65 6e 64 69 66 0a 09 3d 3d 20 4e 55 4c 4c 29 20  endif..== NULL) 
8320: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
8330: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8340: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
8350: 20 47 65 74 20 74 68 65 20 76 65 72 73 69 6f 6e   Get the version
8360: 20 73 6f 20 77 65 20 63 61 6e 20 72 75 6e 74 69   so we can runti
8370: 6d 65 20 73 77 69 74 63 68 20 6f 6e 20 61 76 61  me switch on ava
8380: 69 6c 61 62 6c 65 20 66 75 6e 63 74 69 6f 6e 61  ilable functiona
8390: 6c 69 74 79 2e 0a 20 20 20 20 20 2a 20 54 4c 53  lity..     * TLS
83a0: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 6f   should really o
83b0: 6e 6c 79 20 62 65 20 75 73 65 64 20 69 6e 20 38  nly be used in 8
83c0: 2e 33 2e 32 2b 2c 20 62 75 74 20 74 68 65 20 6f  .3.2+, but the o
83d0: 74 68 65 72 20 77 6f 72 6b 73 20 66 6f 72 0a 20  ther works for. 
83e0: 20 20 20 20 2a 20 73 6f 6d 65 20 6c 69 6d 69 74      * some limit
83f0: 65 64 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  ed functionality
8400: 2c 20 73 6f 20 61 6e 20 61 74 74 65 6d 70 74 20  , so an attempt 
8410: 61 74 20 73 75 70 70 6f 72 74 20 69 73 20 6d 61  at support is ma
8420: 64 65 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  de..     */.    
8430: 54 63 6c 5f 47 65 74 56 65 72 73 69 6f 6e 28 26  Tcl_GetVersion(&
8440: 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f 72 2c 20 26  major, &minor, &
8450: 70 61 74 63 68 6c 65 76 65 6c 2c 20 26 72 65 6c  patchlevel, &rel
8460: 65 61 73 65 29 3b 0a 20 20 20 20 69 66 20 28 28  ease);.    if ((
8470: 6d 61 6a 6f 72 20 3e 20 38 29 20 7c 7c 20 28 28  major > 8) || ((
8480: 6d 61 6a 6f 72 20 3d 3d 20 38 29 20 26 26 20 28  major == 8) && (
8490: 28 6d 69 6e 6f 72 20 3e 20 33 29 20 7c 7c 20 28  (minor > 3) || (
84a0: 28 6d 69 6e 6f 72 20 3d 3d 20 33 29 20 26 26 0a  (minor == 3) &&.
84b0: 09 20 20 20 20 28 72 65 6c 65 61 73 65 20 3d 3d  .    (release ==
84c0: 20 54 43 4c 5f 46 49 4e 41 4c 5f 52 45 4c 45 41   TCL_FINAL_RELEA
84d0: 53 45 29 20 26 26 20 28 70 61 74 63 68 6c 65 76  SE) && (patchlev
84e0: 65 6c 20 3e 3d 20 32 29 29 29 29 29 20 7b 0a 09  el >= 2))))) {..
84f0: 2f 2a 20 38 2e 33 2e 32 2b 20 2a 2f 0a 09 63 68  /* 8.3.2+ */..ch
8500: 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e  annelTypeVersion
8510: 20 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56   = TLS_CHANNEL_V
8520: 45 52 53 49 4f 4e 5f 32 3b 0a 20 20 20 20 7d 20  ERSION_2;.    } 
8530: 65 6c 73 65 20 7b 0a 09 2f 2a 20 38 2e 32 2e 30  else {../* 8.2.0
8540: 20 2d 20 38 2e 33 2e 31 20 2a 2f 0a 09 63 68 61   - 8.3.1 */..cha
8550: 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20  nnelTypeVersion 
8560: 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45  = TLS_CHANNEL_VE
8570: 52 53 49 4f 4e 5f 31 3b 0a 20 20 20 20 7d 0a 0a  RSION_1;.    }..
8580: 20 20 20 20 69 66 20 28 53 53 4c 5f 6c 69 62 72      if (SSL_libr
8590: 61 72 79 5f 69 6e 69 74 28 29 20 21 3d 20 31 29  ary_init() != 1)
85a0: 20 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41   {.        Tcl_A
85b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
85c0: 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69  rp, "could not i
85d0: 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69  nitialize SSL li
85e0: 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09  brary", NULL);..
85f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f  ;.    }.    SSL_
8610: 6c 6f 61 64 5f 65 72 72 6f 72 5f 73 74 72 69 6e  load_error_strin
8620: 67 73 28 29 3b 0a 20 20 20 20 45 52 52 5f 6c 6f  gs();.    ERR_lo
8630: 61 64 5f 63 72 79 70 74 6f 5f 73 74 72 69 6e 67  ad_crypto_string
8640: 73 28 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  s();..    /*.   
8650: 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e    * Seed the ran
8660: 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72  dom number gener
8670: 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20  ator in the SSL 
8680: 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20  library,.     * 
8690: 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69  using the do/whi
86a0: 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63  le construct bec
86b0: 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20  ause of the bug 
86c0: 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20  note in the.    
86d0: 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61   * OpenSSL FAQ a
86e0: 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65  t http://www.ope
86f0: 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74  nssl.org/support
8700: 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a  /faq.html#USER1.
8710: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68       *.     * Th
8720: 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72  e crux of the pr
8730: 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f  oblem is that So
8740: 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74  laris 7 does not
8750: 20 68 61 76 65 20 61 20 0a 20 20 20 20 20 2a 20   have a .     * 
8760: 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f  /dev/random or /
8770: 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69  dev/urandom devi
8780: 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20  ce so it cannot 
8790: 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20  gather enough.  
87a0: 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f     * entropy fro
87b0: 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28  m the RAND_seed(
87c0: 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69  ) when TLS initi
87d0: 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73  alizes and refus
87e0: 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20  es.     * to go 
87f0: 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72  further. Earlier
8800: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65   versions of Ope
8810: 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20  nSSL carried on 
8820: 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20  regardless..    
8830: 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75   */.    srand((u
8840: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d  nsigned int) tim
8850: 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c  e((time_t *) NUL
8860: 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66  L));.    do {..f
8870: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31  or (i = 0; i < 1
8880: 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72  6; i++) {..    r
8890: 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b  nd_seed[i] = 1 +
88a0: 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a   (char) (255.0 *
88b0: 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41   rand()/(RAND_MA
88c0: 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e  X+1.0));..}..RAN
88d0: 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c  D_seed(rnd_seed,
88e0: 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64   sizeof(rnd_seed
88f0: 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20  ));.    } while 
8900: 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21  (RAND_status() !
8910: 3d 20 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43  = 1);..    Tcl_C
8920: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
8930: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69  interp, "tls::ci
8940: 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f  phers", CiphersO
8950: 62 6a 43 6d 64 2c 0a 09 20 20 20 20 28 43 6c 69  bjCmd,..    (Cli
8960: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
8970: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
8980: 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63  ) NULL);..    Tc
8990: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
89a0: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
89b0: 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e  :handshake", Han
89c0: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 0a 09 20  dshakeObjCmd,.. 
89d0: 20 20 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20     (ClientData) 
89e0: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
89f0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
8a00: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
8a10: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
8a20: 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c  , "tls::import",
8a30: 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 0a 09   ImportObjCmd,..
8a40: 20 20 20 20 28 43 6c 69 65 6e 74 44 61 74 61 29      (ClientData)
8a50: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
8a60: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
8a70: 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
8a80: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
8a90: 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22  p, "tls::status"
8aa0: 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 0a  , StatusObjCmd,.
8ab0: 09 20 20 20 20 28 43 6c 69 65 6e 74 44 61 74 61  .    (ClientData
8ac0: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
8ad0: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
8ae0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ;..    Tcl_Creat
8af0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
8b00: 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f  rp, "tls::versio
8b10: 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  n", VersionObjCm
8b20: 64 2c 0a 09 20 20 20 20 28 43 6c 69 65 6e 74 44  d,..    (ClientD
8b30: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
8b40: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
8b50: 4c 4c 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  LL);..    return
8b60: 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28   Tcl_PkgProvide(
8b70: 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 45 2c  interp, PACKAGE,
8b80: 20 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0c 0a 2f   VERSION);.}.../
8b90: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
8bd0: 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d  *.Tls_SafeInit -
8be0: 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d  -. *. *.--------
8bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c10: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61  --------*. *.Sta
8c20: 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20  ndard procedure 
8c30: 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61  required by 'loa
8c40: 64 27 2e 20 0a 20 2a 09 49 6e 69 74 69 61 6c 69  d'. . *.Initiali
8c50: 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69  zes this extensi
8c60: 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e  on for a safe in
8c70: 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d  terpreter.. *.--
8c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
8cb0: 20 2a 0a 20 2a 09 53 69 64 65 65 66 66 65 63 74   *. *.Sideeffect
8cc0: 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c  s:. *..As of 'Tl
8cd0: 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65  s_Init'. *. *.Re
8ce0: 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e  sult:. *..A stan
8cf0: 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63  dard Tcl error c
8d00: 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ode.. *. *------
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 2d 2d 2d 2d 2d 2d 2d  ----------------
8d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d40: 2a 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6c 73 5f 53  *. */..int.Tls_S
8d50: 61 66 65 49 6e 69 74 20 28 54 63 6c 5f 49 6e 74  afeInit (Tcl_Int
8d60: 65 72 70 2a 20 69 6e 74 65 72 70 29 0a 7b 0a 20  erp* interp).{. 
8d70: 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 49 6e     return Tls_In
8d80: 69 74 20 28 69 6e 74 65 72 70 29 3b 0a 7d 0a     it (interp);.}.