Hex Artifact Content

Artifact 9b5d593b5290f105db124899c57a56f80e1ce57c:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 20  tarfish Systems 
00d0: 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 6b 61 20  . *. * TLS (aka 
00e0: 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 2d 20 63  SSL) Channel - c
00f0: 61 6e 20 62 65 20 6c 61 79 65 72 65 64 20 6f 6e  an be layered on
0100: 20 61 6e 79 20 62 69 2d 64 69 72 65 63 74 69 6f   any bi-directio
0110: 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 61 6e 6e  nal. * Tcl_Chann
0120: 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 75 69 72  el (Note: Requir
0130: 65 73 20 54 72 66 20 43 6f 72 65 20 50 61 74 63  es Trf Core Patc
0140: 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 20 77 61  h). *. * This wa
0150: 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f 73 74 29  s built (almost)
0160: 20 66 72 6f 6d 20 73 63 72 61 74 63 68 20 62 61   from scratch ba
0170: 73 65 64 20 75 70 6f 6e 20 6f 62 73 65 72 76 61  sed upon observa
0180: 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 65 6e 53  tion of. * OpenS
0190: 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a 20 2a 20  SL 0.9.2B. *. * 
01a0: 41 64 64 69 74 69 6f 6e 20 63 72 65 64 69 74 20  Addition credit 
01b0: 69 73 20 64 75 65 20 66 6f 72 20 41 6e 64 72 65  is due for Andre
01c0: 61 73 20 4b 75 70 72 69 65 73 20 28 61 2e 6b 75  as Kupries (a.ku
01d0: 70 72 69 65 73 40 77 65 73 74 65 6e 64 2e 63 6f  pries@westend.co
01e0: 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 6f 76 69  m), for. * provi
01f0: 64 69 6e 67 20 74 68 65 20 54 63 6c 5f 52 65 70  ding the Tcl_Rep
0200: 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d 65 63 68  laceChannel mech
0210: 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 6b 69 6e  anism and workin
0220: 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 68 20 6d  g closely with m
0230: 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e 63 65 20  e. * to enhance 
0240: 69 74 20 74 6f 20 73 75 70 70 6f 72 74 20 66 75  it to support fu
0250: 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 73 65 6d  ll fileevent sem
0260: 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a 20 41 6c  antics.. *. * Al
0270: 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 62 79 20  so work done by 
0280: 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 6f 70 6c  the follow peopl
0290: 65 20 70 72 6f 76 69 64 65 64 20 74 68 65 20 69  e provided the i
02a0: 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 74 68 69  mpetus to do thi
02b0: 73 20 22 72 69 67 68 74 22 3a 0a 20 2a 09 74 63  s "right":. *.tc
02c0: 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d 63 43 6f  lSSL (Colin McCo
02d0: 72 6d 61 63 6b 2c 20 53 68 61 72 65 64 20 54 65  rmack, Shared Te
02e0: 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 53 53 4c  chnology). *.SSL
02f0: 74 63 6c 20 28 50 65 74 65 72 20 41 6e 74 6d 61  tcl (Peter Antma
0300: 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c  n). *. */..#incl
0310: 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23  ude "tlsInt.h".#
0320: 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f 70 74 73  include "tclOpts
0330: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h".#include <st
0340: 64 6c 69 62 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 45  dlib.h>../*. * E
0350: 78 74 65 72 6e 61 6c 20 66 75 6e 63 74 69 6f 6e  xternal function
0360: 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72  s. */../*. * For
0370: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
0380: 73 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46  s. */..#define F
0390: 32 4e 28 20 6b 65 79 2c 20 64 73 70 29 20 5c 0a  2N( key, dsp) \.
03a0: 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c  .(((key) == NULL
03b0: 29 20 3f 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  ) ? (char *) NUL
03c0: 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f 54 72 61 6e  L : \...Tcl_Tran
03d0: 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e  slateFileName(in
03e0: 74 65 72 70 2c 20 28 6b 65 79 29 2c 20 28 64 73  terp, (key), (ds
03f0: 70 29 29 29 0a 23 64 65 66 69 6e 65 20 52 45 41  p))).#define REA
0400: 53 4f 4e 28 29 09 45 52 52 5f 72 65 61 73 6f 6e  SON().ERR_reason
0410: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52  _error_string(ER
0420: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 0a 0a  R_get_error())..
0430: 73 74 61 74 69 63 20 76 6f 69 64 09 49 6e 66 6f  static void.Info
0440: 43 61 6c 6c 62 61 63 6b 20 5f 41 4e 53 49 5f 41  Callback _ANSI_A
0450: 52 47 53 5f 20 28 28 43 4f 4e 53 54 20 53 53 4c  RGS_ ((CONST SSL
0460: 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 65   *ssl, int where
0470: 2c 20 69 6e 74 20 72 65 74 29 29 3b 0a 0a 73 74  , int ret));..st
0480: 61 74 69 63 20 69 6e 74 09 43 69 70 68 65 72 73  atic int.Ciphers
0490: 4f 62 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47  ObjCmd _ANSI_ARG
04a0: 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20  S_ ((ClientData 
04b0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 54  clientData,....T
04c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
04d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
04e0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
04f0: 5b 5d 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e  []));..static in
0500: 74 09 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d  t.HandshakeObjCm
0510: 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28  d _ANSI_ARGS_ ((
0520: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
0530: 74 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e  tData,....Tcl_In
0540: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
0550: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
0560: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b  *CONST objv[]));
0570: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 49 6d 70  ..static int.Imp
0580: 6f 72 74 4f 62 6a 43 6d 64 20 5f 41 4e 53 49 5f  ortObjCmd _ANSI_
0590: 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61  ARGS_ ((ClientDa
05a0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09  ta clientData,..
05b0: 09 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  ..Tcl_Interp *in
05c0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
05d0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
05e0: 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 61 74 69 63  bjv[]));..static
05f0: 20 69 6e 74 09 53 74 61 74 75 73 4f 62 6a 43 6d   int.StatusObjCm
0600: 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28  d _ANSI_ARGS_ ((
0610: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
0620: 74 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e  tData,....Tcl_In
0630: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
0640: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
0650: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b  *CONST objv[]));
0660: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 56 65 72  ..static int.Ver
0670: 73 69 6f 6e 4f 62 6a 43 6d 64 20 5f 41 4e 53 49  sionObjCmd _ANSI
0680: 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44  _ARGS_ ((ClientD
0690: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  ata clientData,.
06a0: 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ...Tcl_Interp *i
06b0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
06c0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
06d0: 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 61 74 69  objv[]));..stati
06e0: 63 20 69 6e 74 09 4d 69 73 63 4f 62 6a 43 6d 64  c int.MiscObjCmd
06f0: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43   _ANSI_ARGS_ ((C
0700: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
0710: 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e 74  Data,....Tcl_Int
0720: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
0730: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
0740: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a  CONST objv[]));.
0750: 0a 73 74 61 74 69 63 20 69 6e 74 09 55 6e 69 6d  .static int.Unim
0760: 70 6f 72 74 4f 62 6a 43 6d 64 20 5f 41 4e 53 49  portObjCmd _ANSI
0770: 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44  _ARGS_ ((ClientD
0780: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  ata clientData,.
0790: 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ...Tcl_Interp *i
07a0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
07b0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
07c0: 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 61 74 69  objv[]));..stati
07d0: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49  c SSL_CTX *CTX_I
07e0: 6e 69 74 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28  nit _ANSI_ARGS_(
07f0: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  (State *statePtr
0800: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61  , int proto, cha
0810: 72 20 2a 6b 65 79 2c 0a 09 09 09 63 68 61 72 20  r *key,....char 
0820: 2a 63 65 72 74 2c 20 63 68 61 72 20 2a 43 41 64  *cert, char *CAd
0830: 69 72 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65  ir, char *CAfile
0840: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  , char *ciphers,
0850: 0a 09 09 09 63 68 61 72 20 2a 44 48 70 61 72 61  ....char *DHpara
0860: 6d 73 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e  ms));..static in
0870: 74 09 54 6c 73 4c 69 62 49 6e 69 74 20 5f 41 4e  t.TlsLibInit _AN
0880: 53 49 5f 41 52 47 53 5f 20 28 28 76 6f 69 64 29  SI_ARGS_ ((void)
0890: 29 20 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53  ) ;..#define TLS
08a0: 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30 78 30  _PROTO_SSL2..0x0
08b0: 31 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52  1.#define TLS_PR
08c0: 4f 54 4f 5f 53 53 4c 33 09 09 30 78 30 32 0a 23  OTO_SSL3..0x02.#
08d0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
08e0: 5f 54 4c 53 31 09 09 30 78 30 34 0a 23 64 65 66  _TLS1..0x04.#def
08f0: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ine TLS_PROTO_TL
0900: 53 31 5f 31 09 30 78 30 38 0a 23 64 65 66 69 6e  S1_1.0x08.#defin
0910: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
0920: 5f 32 09 30 78 31 30 0a 23 64 65 66 69 6e 65 20  _2.0x10.#define 
0930: 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61  ENABLED(flag, ma
0940: 73 6b 29 09 28 28 28 66 6c 61 67 29 20 26 20 28  sk).(((flag) & (
0950: 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29  mask)) == (mask)
0960: 29 0a 0a 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20  )../*. * Static 
0970: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 0a  data structures.
0980: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45   */..#ifndef OPE
0990: 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c  NSSL_NO_DH.#incl
09a0: 75 64 65 20 22 64 68 5f 70 61 72 61 6d 73 2e 68  ude "dh_params.h
09b0: 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ".#endif../*. * 
09c0: 44 65 66 69 6e 65 64 20 69 6e 20 54 6c 73 5f 49  Defined in Tls_I
09d0: 6e 69 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  nit to determine
09e0: 20 77 68 61 74 20 6b 69 6e 64 20 6f 66 20 63 68   what kind of ch
09f0: 61 6e 6e 65 6c 73 20 77 65 20 61 72 65 20 75 73  annels we are us
0a00: 69 6e 67 0a 20 2a 20 28 6f 6c 64 2d 73 74 79 6c  ing. * (old-styl
0a10: 65 20 38 2e 32 2e 30 2d 38 2e 33 2e 31 20 6f 72  e 8.2.0-8.3.1 or
0a20: 20 6e 65 77 2d 73 74 79 6c 65 20 38 2e 33 2e 32   new-style 8.3.2
0a30: 2b 29 2e 0a 20 2a 2f 0a 69 6e 74 20 63 68 61 6e  +).. */.int chan
0a40: 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d  nelTypeVersion =
0a50: 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TLS_CHANNEL_VER
0a60: 53 49 4f 4e 5f 32 3b 0a 0a 2f 2a 0a 20 2a 20 57  SION_2;../*. * W
0a70: 65 20 6c 6f 73 65 20 74 68 65 20 74 63 6c 20 70  e lose the tcl p
0a80: 61 73 73 77 6f 72 64 20 63 61 6c 6c 62 61 63 6b  assword callback
0a90: 20 77 68 65 6e 20 77 65 20 75 73 65 20 74 68 65   when we use the
0aa0: 20 52 53 41 20 42 53 41 46 45 20 53 53 4c 2d 43   RSA BSAFE SSL-C
0ab0: 20 31 2e 31 2e 32 0a 20 2a 20 6c 69 62 72 61 72   1.1.2. * librar
0ac0: 69 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74  ies instead of t
0ad0: 68 65 20 63 75 72 72 65 6e 74 20 4f 70 65 6e 53  he current OpenS
0ae0: 53 4c 20 6c 69 62 72 61 72 69 65 73 2e 0a 20 2a  SL libraries.. *
0af0: 2f 0a 0a 23 69 66 64 65 66 20 42 53 41 46 45 0a  /..#ifdef BSAFE.
0b00: 23 64 65 66 69 6e 65 20 50 52 45 5f 4f 50 45 4e  #define PRE_OPEN
0b10: 53 53 4c 5f 30 5f 39 5f 34 20 31 0a 23 65 6e 64  SSL_0_9_4 1.#end
0b20: 69 66 0a 0a 2f 2a 0a 20 2a 20 50 72 65 20 4f 70  if../*. * Pre Op
0b30: 65 6e 53 53 4c 20 30 2e 39 2e 34 20 43 6f 6d 70  enSSL 0.9.4 Comp
0b40: 61 74 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  at. */..#ifndef 
0b50: 53 54 41 43 4b 5f 4f 46 0a 23 64 65 66 69 6e 65  STACK_OF.#define
0b60: 20 53 54 41 43 4b 5f 4f 46 28 78 29 09 09 09 53   STACK_OF(x)...S
0b70: 54 41 43 4b 0a 23 64 65 66 69 6e 65 20 73 6b 5f  TACK.#define sk_
0b80: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73  SSL_CIPHER_num(s
0b90: 6b 29 09 09 73 6b 5f 6e 75 6d 28 28 73 6b 29 29  k)..sk_num((sk))
0ba0: 0a 23 64 65 66 69 6e 65 20 73 6b 5f 53 53 4c 5f  .#define sk_SSL_
0bb0: 43 49 50 48 45 52 5f 76 61 6c 75 65 28 20 73 6b  CIPHER_value( sk
0bc0: 2c 20 69 6e 64 65 78 29 09 28 53 53 4c 5f 43 49  , index).(SSL_CI
0bd0: 50 48 45 52 2a 29 73 6b 5f 76 61 6c 75 65 28 28  PHER*)sk_value((
0be0: 73 6b 29 2c 20 28 69 6e 64 65 78 29 29 0a 23 65  sk), (index)).#e
0bf0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65  ndif../*. * Thre
0c00: 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 65  ad-Safe TLS Code
0c10: 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c  . */..#ifdef TCL
0c20: 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e 65  _THREADS.#define
0c30: 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 5f   OPENSSL_THREAD_
0c40: 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 65  DEFINES.#include
0c50: 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73   <openssl/openss
0c60: 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 66  lconf.h>..#ifdef
0c70: 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53   OPENSSL_THREADS
0c80: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73  .#include <opens
0c90: 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 0a 2f 2a  sl/crypto.h>../*
0ca0: 0a 20 2a 20 54 68 72 65 61 64 65 64 20 6f 70 65  . * Threaded ope
0cb0: 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  ration requires 
0cc0: 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c 62 61 63 6b  locking callback
0cd0: 73 0a 20 2a 20 42 61 73 65 64 20 66 72 6f 6d 20  s. * Based from 
0ce0: 2f 63 72 79 70 74 6f 2f 63 72 79 70 74 6c 69 62  /crypto/cryptlib
0cf0: 2e 63 20 6f 66 20 4f 70 65 6e 53 53 4c 20 61 6e  .c of OpenSSL an
0d00: 64 20 4e 53 4f 70 65 6e 53 53 4c 2e 0a 20 2a 2f  d NSOpenSSL.. */
0d10: 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74  ..static Tcl_Mut
0d20: 65 78 20 6c 6f 63 6b 73 5b 43 52 59 50 54 4f 5f  ex locks[CRYPTO_
0d30: 4e 55 4d 5f 4c 4f 43 4b 53 5d 3b 0a 73 74 61 74  NUM_LOCKS];.stat
0d40: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 69 6e 69  ic Tcl_Mutex ini
0d50: 74 5f 6d 78 3b 0a 0a 73 74 61 74 69 63 20 76 6f  t_mx;..static vo
0d60: 69 64 20 20 20 20 20 20 20 20 20 20 43 72 79 70  id          Cryp
0d70: 74 6f 54 68 72 65 61 64 4c 6f 63 6b 43 61 6c 6c  toThreadLockCall
0d80: 62 61 63 6b 20 28 69 6e 74 20 6d 6f 64 65 2c 20  back (int mode, 
0d90: 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61  int n, const cha
0da0: 72 20 2a 66 69 6c 65 2c 20 69 6e 74 20 6c 69 6e  r *file, int lin
0db0: 65 29 3b 0a 73 74 61 74 69 63 20 75 6e 73 69 67  e);.static unsig
0dc0: 6e 65 64 20 6c 6f 6e 67 20 43 72 79 70 74 6f 54  ned long CryptoT
0dd0: 68 72 65 61 64 49 64 43 61 6c 6c 62 61 63 6b 20  hreadIdCallback 
0de0: 20 20 28 76 6f 69 64 29 3b 0a 0a 73 74 61 74 69    (void);..stati
0df0: 63 20 76 6f 69 64 0a 43 72 79 70 74 6f 54 68 72  c void.CryptoThr
0e00: 65 61 64 4c 6f 63 6b 43 61 6c 6c 62 61 63 6b 28  eadLockCallback(
0e10: 69 6e 74 20 6d 6f 64 65 2c 20 69 6e 74 20 6e 2c  int mode, int n,
0e20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
0e30: 65 2c 20 69 6e 74 20 6c 69 6e 65 29 0a 7b 0a 20  e, int line).{. 
0e40: 20 20 20 69 66 20 28 6d 6f 64 65 20 26 20 43 52     if (mode & CR
0e50: 59 50 54 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  YPTO_LOCK) {.   
0e60: 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63      Tcl_MutexLoc
0e70: 6b 28 26 6c 6f 63 6b 73 5b 6e 5d 29 3b 0a 20 20  k(&locks[n]);.  
0e80: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
0e90: 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63    Tcl_MutexUnloc
0ea0: 6b 28 26 6c 6f 63 6b 73 5b 6e 5d 29 3b 0a 20 20  k(&locks[n]);.  
0eb0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e    }.}..static un
0ec0: 73 69 67 6e 65 64 20 6c 6f 6e 67 0a 43 72 79 70  signed long.Cryp
0ed0: 74 6f 54 68 72 65 61 64 49 64 43 61 6c 6c 62 61  toThreadIdCallba
0ee0: 63 6b 28 76 6f 69 64 29 0a 7b 0a 20 20 20 20 72  ck(void).{.    r
0ef0: 65 74 75 72 6e 20 28 75 6e 73 69 67 6e 65 64 20  eturn (unsigned 
0f00: 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 43 75 72  long) Tcl_GetCur
0f10: 72 65 6e 74 54 68 72 65 61 64 28 29 3b 0a 7d 0a  rentThread();.}.
0f20: 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 53  #endif /* OPENSS
0f30: 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 6e  L_THREADS */.#en
0f40: 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 41  dif /* TCL_THREA
0f50: 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  DS */..../*. *--
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c  -. *. * InfoCall
0fb0: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 6d 6f  back --. *. *.mo
0fc0: 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65  nitors SSL conne
0fd0: 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a  ction process. *
0fe0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
0ff0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
1000: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
1010: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
1020: 65 66 69 6e 65 64 29 0a 20 2a 2d 2d 2d 2d 2d 2d  efined). *------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1070: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e  /.static void.In
1080: 66 6f 43 61 6c 6c 62 61 63 6b 28 43 4f 4e 53 54  foCallback(CONST
1090: 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77   SSL *ssl, int w
10a0: 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 0a 7b  here, int ret).{
10b0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
10c0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53  ePtr = (State*)S
10d0: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_get_app_data(
10e0: 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20  (SSL *)ssl);.   
10f0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
1100: 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 6a 6f  ;.    char *majo
1110: 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b 0a  r; char *minor;.
1120: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
1130: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
1140: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09  Tcl_Obj*)NULL)..
1150: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 63 6d 64  return;..    cmd
1160: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
1170: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
1180: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 23 69 66  >callback);..#if
1190: 20 30 0a 20 20 20 20 69 66 20 28 77 68 65 72 65   0.    if (where
11a0: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29   & SSL_CB_ALERT)
11b0: 20 7b 0a 09 73 65 76 20 3d 20 53 53 4c 5f 61 6c   {..sev = SSL_al
11c0: 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f  ert_type_string_
11d0: 6c 6f 6e 67 28 72 65 74 29 3b 0a 09 69 66 20 28  long(ret);..if (
11e0: 73 74 72 63 6d 70 28 20 73 65 76 2c 20 22 66 61  strcmp( sev, "fa
11f0: 74 61 6c 22 29 3d 3d 30 29 20 7b 09 2f 2a 20 4d  tal")==0) {./* M
1200: 61 70 20 74 6f 20 65 72 72 6f 72 20 2a 2f 0a 09  ap to error */..
1210: 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74      Tls_Error(st
1220: 61 74 65 50 74 72 2c 20 53 53 4c 5f 45 52 52 4f  atePtr, SSL_ERRO
1230: 52 28 73 73 6c 2c 20 30 29 29 3b 0a 09 20 20 20  R(ssl, 0));..   
1240: 20 72 65 74 75 72 6e 3b 0a 09 7d 0a 20 20 20 20   return;..}.    
1250: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20  }.#endif.    if 
1260: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1270: 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54 29  HANDSHAKE_START)
1280: 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e   {..major = "han
1290: 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20  dshake";..minor 
12a0: 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20 7d  = "start";.    }
12b0: 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20   else if (where 
12c0: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
12d0: 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f  KE_DONE) {..majo
12e0: 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b  r = "handshake";
12f0: 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22  ..minor = "done"
1300: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
1310: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1320: 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72  CB_ALERT)..major
1330: 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73   = "alert";..els
1340: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
1350: 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61  L_ST_CONNECT).ma
1360: 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b  jor = "connect";
1370: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1380: 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50 54   & SSL_ST_ACCEPT
1390: 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65  )..major = "acce
13a0: 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d  pt";..else.....m
13b0: 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  ajor = "unknown"
13c0: 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26 20  ;...if (where & 
13d0: 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d 69  SSL_CB_READ)..mi
13e0: 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09 65  nor = "read";..e
13f0: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
1400: 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09 6d  SSL_CB_WRITE)..m
1410: 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b 0a  inor = "write";.
1420: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
1430: 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09  & SSL_CB_LOOP)..
1440: 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a  minor = "loop";.
1450: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
1460: 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09 09  & SSL_CB_EXIT)..
1470: 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a  minor = "exit";.
1480: 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72 20  .else.....minor 
1490: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20  = "unknown";.   
14a0: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74   }..    Tcl_List
14b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
14c0: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ( statePtr->inte
14d0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 20  rp, cmdPtr, ..  
14e0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
14f0: 62 6a 28 20 22 69 6e 66 6f 22 2c 20 2d 31 29 29  bj( "info", -1))
1500: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
1510: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1520: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
1530: 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 20 20  p, cmdPtr, ..   
1540: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1550: 6a 28 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  j( Tcl_GetChanne
1560: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
1570: 73 65 6c 66 29 2c 20 2d 31 29 20 29 3b 0a 0a 20  self), -1) );.. 
1580: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1590: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61  pendElement( sta
15a0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63  tePtr->interp, c
15b0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
15c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 6d 61  NewStringObj( ma
15d0: 6a 6f 72 2c 20 2d 31 29 20 29 3b 0a 0a 20 20 20  jor, -1) );..   
15e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
15f0: 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65  ndElement( state
1600: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64  Ptr->interp, cmd
1610: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
1620: 77 53 74 72 69 6e 67 4f 62 6a 28 20 6d 69 6e 6f  wStringObj( mino
1630: 72 2c 20 2d 31 29 20 29 3b 0a 0a 20 20 20 20 69  r, -1) );..    i
1640: 66 20 28 77 68 65 72 65 20 26 20 28 53 53 4c 5f  f (where & (SSL_
1650: 43 42 5f 4c 4f 4f 50 7c 53 53 4c 5f 43 42 5f 45  CB_LOOP|SSL_CB_E
1660: 58 49 54 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73  XIT)) {..Tcl_Lis
1670: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1680: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  t( statePtr->int
1690: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
16a0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
16b0: 62 6a 28 20 53 53 4c 5f 73 74 61 74 65 5f 73 74  bj( SSL_state_st
16c0: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20  ring_long(ssl), 
16d0: 2d 31 29 20 29 3b 0a 20 20 20 20 7d 20 65 6c 73  -1) );.    } els
16e0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
16f0: 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 43  L_CB_ALERT) {..C
1700: 4f 4e 53 54 20 63 68 61 72 20 2a 63 70 20 3d 20  ONST char *cp = 
1710: 28 63 68 61 72 20 2a 29 20 53 53 4c 5f 61 6c 65  (char *) SSL_ale
1720: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c  rt_desc_string_l
1730: 6f 6e 67 28 72 65 74 29 3b 0a 0a 09 54 63 6c 5f  ong(ret);...Tcl_
1740: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1750: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e  ment( statePtr->
1760: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
1770: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
1780: 6e 67 4f 62 6a 28 20 63 70 2c 20 2d 31 29 20 29  ngObj( cp, -1) )
1790: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
17a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
17b0: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50  dElement( stateP
17c0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
17d0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
17e0: 53 74 72 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 73  StringObj( SSL_s
17f0: 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67  tate_string_long
1800: 28 73 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20  (ssl), -1) );.  
1810: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 50 72 65 73    }.    Tcl_Pres
1820: 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74  erve( (ClientDat
1830: 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  a) statePtr->int
1840: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72  erp);.    Tcl_Pr
1850: 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44  eserve( (ClientD
1860: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
1870: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
1880: 43 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a  Count( cmdPtr);.
1890: 20 20 20 20 28 76 6f 69 64 29 20 54 63 6c 5f 45      (void) Tcl_E
18a0: 76 61 6c 4f 62 6a 45 78 28 73 74 61 74 65 50 74  valObjEx(statePt
18b0: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  r->interp, cmdPt
18c0: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  r, TCL_EVAL_GLOB
18d0: 41 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  AL);.    Tcl_Dec
18e0: 72 52 65 66 43 6f 75 6e 74 28 20 63 6d 64 50 74  rRefCount( cmdPt
18f0: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c  r);..    Tcl_Rel
1900: 65 61 73 65 28 20 28 43 6c 69 65 6e 74 44 61 74  ease( (ClientDat
1910: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20  a) statePtr);.  
1920: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20 28    Tcl_Release( (
1930: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
1940: 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 0a  ePtr->interp);..
1950: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
1960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
19a0: 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63   * VerifyCallbac
19b0: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74  k --. *. *.Monit
19c0: 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 63  ors SSL certific
19d0: 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 70  ate validation p
19e0: 72 6f 63 65 73 73 2e 0a 20 2a 09 54 68 69 73 20  rocess.. *.This 
19f0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
1a00: 65 72 20 61 20 63 65 72 74 69 66 69 63 61 74 65  er a certificate
1a10: 20 69 73 20 69 6e 73 70 65 63 74 65 64 0a 20 2a   is inspected. *
1a20: 09 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61  .or decided inva
1a30: 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  lid.. *. * Resul
1a40: 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 63  ts:. *.A callbac
1a50: 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 73  k bound to the s
1a60: 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72 6e  ocket may return
1a70: 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 20   one of:. *.    
1a80: 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66  0...- the certif
1a90: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20  icate is deemed 
1aa0: 69 6e 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 31  invalid. *.    1
1ab0: 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 69  ...- the certifi
1ac0: 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 76  cate is deemed v
1ad0: 61 6c 69 64 0a 20 2a 09 20 20 20 20 65 6d 70 74  alid. *.    empt
1ae0: 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68  y string.- no ch
1af0: 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 63  ange to certific
1b00: 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20  ate validation. 
1b10: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
1b20: 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69  s:. *.The err fi
1b30: 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  eld of the curre
1b40: 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53  ntly operative S
1b50: 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20  tate is set. *. 
1b60: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73   to a string des
1b70: 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20  cribing the SSL 
1b80: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c  negotiation fail
1b90: 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d 2d  ure reason. *---
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1be0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
1bf0: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69  VerifyCallback(i
1c00: 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52  nt ok, X509_STOR
1c10: 45 5f 43 54 58 20 2a 63 74 78 29 0a 7b 0a 20 20  E_CTX *ctx).{.  
1c20: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
1c30: 72 2c 20 2a 72 65 73 75 6c 74 3b 0a 20 20 20 20  r, *result;.    
1c40: 63 68 61 72 20 2a 65 72 72 53 74 72 2c 20 2a 73  char *errStr, *s
1c50: 74 72 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20 6c  tring;.    int l
1c60: 65 6e 67 74 68 3b 0a 20 20 20 20 53 53 4c 20 20  ength;.    SSL  
1c70: 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58   *ssl..= (SSL*)X
1c80: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
1c90: 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 29 3b  t_app_data(ctx);
1ca0: 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74  .    X509  *cert
1cb0: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43  ..= X509_STORE_C
1cc0: 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  TX_get_current_c
1cd0: 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74  ert(ctx);.    St
1ce0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20  ate *statePtr.= 
1cf0: 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f  (State*)SSL_get_
1d00: 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20  app_data(ssl);. 
1d10: 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20     int depth..= 
1d20: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
1d30: 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63  et_error_depth(c
1d40: 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72  tx);.    int err
1d50: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43  ..= X509_STORE_C
1d60: 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78  TX_get_error(ctx
1d70: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
1d80: 22 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b  "Verify: %d", ok
1d90: 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 6f 6b 29  );..    if (!ok)
1da0: 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 68   {..errStr = (ch
1db0: 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f  ar*)X509_verify_
1dc0: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e  cert_error_strin
1dd0: 67 28 65 72 72 29 3b 0a 20 20 20 20 7d 20 65 6c  g(err);.    } el
1de0: 73 65 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 28  se {..errStr = (
1df0: 63 68 61 72 20 2a 29 30 3b 0a 20 20 20 20 7d 0a  char *)0;.    }.
1e00: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
1e10: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
1e20: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
1e30: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
1e40: 76 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52  vflags & SSL_VER
1e50: 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
1e60: 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20  EER_CERT) {..   
1e70: 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65   return ok;..} e
1e80: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72  lse {..    retur
1e90: 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20  n 1;..}.    }.  
1ea0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
1eb0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
1ec0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
1ed0: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
1ee0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20  jAppendElement( 
1ef0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1f00: 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 20 20 20  , cmdPtr, ..    
1f10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1f20: 28 20 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29  ( "verify", -1))
1f30: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
1f40: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1f50: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
1f60: 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 20 20  p, cmdPtr, ..   
1f70: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1f80: 6a 28 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  j( Tcl_GetChanne
1f90: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
1fa0: 73 65 6c 66 29 2c 20 2d 31 29 20 29 3b 0a 0a 20  self), -1) );.. 
1fb0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1fc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61  pendElement( sta
1fd0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63  tePtr->interp, c
1fe0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
1ff0: 4e 65 77 49 6e 74 4f 62 6a 28 20 64 65 70 74 68  NewIntObj( depth
2000: 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69  ) );..    Tcl_Li
2010: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2020: 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  nt( statePtr->in
2030: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
2040: 20 20 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62     Tls_NewX509Ob
2050: 6a 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  j( statePtr->int
2060: 65 72 70 2c 20 63 65 72 74 29 20 29 3b 0a 0a 20  erp, cert) );.. 
2070: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2080: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61  pendElement( sta
2090: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63  tePtr->interp, c
20a0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
20b0: 4e 65 77 49 6e 74 4f 62 6a 28 20 6f 6b 29 20 29  NewIntObj( ok) )
20c0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
20d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
20e0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
20f0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
2100: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2110: 28 20 65 72 72 53 74 72 20 3f 20 65 72 72 53 74  ( errStr ? errSt
2120: 72 20 3a 20 22 22 2c 20 2d 31 29 20 29 3b 0a 0a  r : "", -1) );..
2130: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
2140: 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  ( (ClientData) s
2150: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29  tatePtr->interp)
2160: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ;.    Tcl_Preser
2170: 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29  ve( (ClientData)
2180: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20   statePtr);..   
2190: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73   statePtr->flags
21a0: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c   |= TLS_TCL_CALL
21b0: 42 41 43 4b 3b 0a 0a 20 20 20 20 54 63 6c 5f 49  BACK;..    Tcl_I
21c0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d 64  ncrRefCount( cmd
21d0: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 54 63  Ptr);.    if (Tc
21e0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 73 74 61 74  l_EvalObjEx(stat
21f0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d  ePtr->interp, cm
2200: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  dPtr, TCL_EVAL_G
2210: 4c 4f 42 41 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b  LOBAL) != TCL_OK
2220: 29 20 7b 0a 09 2f 2a 20 49 74 20 67 6f 74 20 61  ) {../* It got a
2230: 6e 20 65 72 72 6f 72 20 2d 20 72 65 6a 65 63 74  n error - reject
2240: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
2250: 2e 09 09 2a 2f 0a 09 54 63 6c 5f 42 61 63 6b 67  ...*/..Tcl_Backg
2260: 72 6f 75 6e 64 45 72 72 6f 72 28 20 73 74 61 74  roundError( stat
2270: 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 09  ePtr->interp);..
2280: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c  ok = 0;.    } el
2290: 73 65 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54  se {..result = T
22a0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
22b0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
22c0: 29 3b 0a 09 73 74 72 69 6e 67 20 3d 20 54 63 6c  );..string = Tcl
22d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
22e0: 6a 28 72 65 73 75 6c 74 2c 20 26 6c 65 6e 67 74  j(result, &lengt
22f0: 68 29 3b 0a 09 2f 2a 20 41 6e 20 65 6d 70 74 79  h);../* An empty
2300: 20 72 65 73 75 6c 74 20 6c 65 61 76 65 73 20 76   result leaves v
2310: 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68  erification unch
2320: 61 6e 67 65 64 2e 09 2a 2f 0a 09 69 66 20 28 73  anged..*/..if (s
2330: 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 20 26 26  tring != NULL &&
2340: 20 6c 65 6e 67 74 68 20 3e 20 30 29 20 7b 0a 09   length > 0) {..
2350: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49      if (Tcl_GetI
2360: 6e 74 46 72 6f 6d 4f 62 6a 28 73 74 61 74 65 50  ntFromObj(stateP
2370: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 72 65 73 75  tr->interp, resu
2380: 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c 5f  lt, &ok) != TCL_
2390: 4f 4b 29 20 7b 0a 09 09 54 63 6c 5f 42 61 63 6b  OK) {...Tcl_Back
23a0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 73 74 61 74  groundError(stat
23b0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 09  ePtr->interp);..
23c0: 09 6f 6b 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a  .ok = 0;..    }.
23d0: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  .}.    }.    Tcl
23e0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 20 63  _DecrRefCount( c
23f0: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 73 74 61  mdPtr);..    sta
2400: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20  tePtr->flags &= 
2410: 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41  ~(TLS_TCL_CALLBA
2420: 43 4b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65  CK);..    Tcl_Re
2430: 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74 44 61  lease( (ClientDa
2440: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20  ta) statePtr);. 
2450: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20     Tcl_Release( 
2460: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
2470: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a  tePtr->interp);.
2480: 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b  .    return(ok);
2490: 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20  ./* By default, 
24a0: 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69  leave verificati
24b0: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f  on unchanged..*/
24c0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2510: 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d  . * Tls_Error --
2520: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  . *. *.Calls cal
2530: 6c 62 61 63 6b 20 77 69 74 68 20 24 66 64 20 61  lback with $fd a
2540: 6e 64 20 24 6d 73 67 20 2d 20 73 6f 20 74 68 65  nd $msg - so the
2550: 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65   callback can de
2560: 63 69 64 65 0a 20 2a 09 77 68 61 74 20 74 6f 20  cide. *.what to 
2570: 64 6f 20 77 69 74 68 20 65 72 72 6f 72 73 2e 0a  do with errors..
2580: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2590: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66  ts:. *.The err f
25a0: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
25b0: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20  ently operative 
25c0: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09  State is set. *.
25d0: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65    to a string de
25e0: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c  scribing the SSL
25f0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69   negotiation fai
2600: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d  lure reason. *--
2610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2650: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45  -. */.void.Tls_E
2660: 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74  rror(State *stat
2670: 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29  ePtr, char *msg)
2680: 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .{.    Tcl_Obj *
2690: 63 6d 64 50 74 72 3b 0a 0a 20 20 20 20 69 66 20  cmdPtr;..    if 
26a0: 28 6d 73 67 20 26 26 20 2a 6d 73 67 29 20 7b 0a  (msg && *msg) {.
26b0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
26c0: 65 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  e(statePtr->inte
26d0: 72 70 2c 20 22 53 53 4c 22 2c 20 6d 73 67 2c 20  rp, "SSL", msg, 
26e0: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20  (char *)NULL);. 
26f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6d 73 67     } else {..msg
2700: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
2710: 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f  FromObj(Tcl_GetO
2720: 62 6a 52 65 73 75 6c 74 28 73 74 61 74 65 50 74  bjResult(statePt
2730: 72 2d 3e 69 6e 74 65 72 70 29 2c 20 4e 55 4c 4c  r->interp), NULL
2740: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
2750: 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67  tePtr->err = msg
2760: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
2770: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d  Ptr->callback ==
2780: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
2790: 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46   {..char buf[BUF
27a0: 53 49 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 28 62  SIZ];..sprintf(b
27b0: 75 66 2c 20 22 53 53 4c 20 63 68 61 6e 6e 65 6c  uf, "SSL channel
27c0: 20 5c 22 25 73 5c 22 3a 20 65 72 72 6f 72 3a 20   \"%s\": error: 
27d0: 25 73 22 2c 0a 09 20 20 20 20 54 63 6c 5f 47 65  %s",..    Tcl_Ge
27e0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
27f0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 6d 73  tePtr->self), ms
2800: 67 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65 73 75  g);..Tcl_SetResu
2810: 6c 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  lt( statePtr->in
2820: 74 65 72 70 2c 20 62 75 66 2c 20 54 43 4c 5f 56  terp, buf, TCL_V
2830: 4f 4c 41 54 49 4c 45 29 3b 0a 09 54 63 6c 5f 42  OLATILE);..Tcl_B
2840: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 20  ackgroundError( 
2850: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2860: 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20  );..return;.    
2870: 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  }.    cmdPtr = T
2880: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
2890: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
28a0: 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69  ck);..    Tcl_Li
28b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
28c0: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  nt(statePtr->int
28d0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20  erp, cmdPtr, .. 
28e0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
28f0: 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 29  Obj("error", -1)
2900: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
2910: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2920: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
2930: 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 20 20  p, cmdPtr, ..   
2940: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2950: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
2960: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
2970: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  elf), -1));..   
2980: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2990: 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50  ndElement(stateP
29a0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
29b0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
29c0: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d  StringObj(msg, -
29d0: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  1));..    Tcl_Pr
29e0: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
29f0: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  ta) statePtr->in
2a00: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50  terp);.    Tcl_P
2a10: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
2a20: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
2a30: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
2a40: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
2a50: 20 20 20 69 66 20 28 54 63 6c 5f 45 76 61 6c 4f     if (Tcl_EvalO
2a60: 62 6a 45 78 28 73 74 61 74 65 50 74 72 2d 3e 69  bjEx(statePtr->i
2a70: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2a80: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20  CL_EVAL_GLOBAL) 
2a90: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63  != TCL_OK) {..Tc
2aa0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
2ab0: 72 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  r(statePtr->inte
2ac0: 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  rp);.    }.    T
2ad0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2ae0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63  cmdPtr);..    Tc
2af0: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
2b00: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
2b10: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ;.    Tcl_Releas
2b20: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
2b30: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29  tatePtr->interp)
2b40: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2b90: 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 43 61 6c  *. * PasswordCal
2ba0: 6c 62 61 63 6b 20 2d 2d 20 0a 20 2a 0a 20 2a 09  lback -- . *. *.
2bb0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61  Called when a pa
2bc0: 73 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64  ssword is needed
2bd0: 20 74 6f 20 75 6e 70 61 63 6b 20 52 53 41 20 61   to unpack RSA a
2be0: 6e 64 20 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09  nd PEM keys.. *.
2bf0: 45 76 61 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20  Evals any bound 
2c00: 70 61 73 73 77 6f 72 64 20 73 63 72 69 70 74 20  password script 
2c10: 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20  and returns the 
2c20: 72 65 73 75 6c 74 20 61 73 0a 20 2a 09 74 68 65  result as. *.the
2c30: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
2c40: 2e 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *------------
2c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64  -------. */.#ifd
2c90: 65 66 20 50 52 45 5f 4f 50 45 4e 53 53 4c 5f 30  ef PRE_OPENSSL_0
2ca0: 5f 39 5f 34 0a 2f 2a 0a 20 2a 20 4e 6f 20 77 61  _9_4./*. * No wa
2cb0: 79 20 74 6f 20 68 61 6e 64 6c 65 20 75 73 65 72  y to handle user
2cc0: 2d 64 61 74 61 20 74 68 65 72 65 66 6f 72 65 20  -data therefore 
2cd0: 6e 6f 20 77 61 79 20 77 69 74 68 6f 75 74 20 61  no way without a
2ce0: 20 67 6c 6f 62 61 6c 0a 20 2a 20 76 61 72 69 61   global. * varia
2cf0: 62 6c 65 20 74 6f 20 61 63 63 65 73 73 20 74 68  ble to access th
2d00: 65 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65  e Tcl interprete
2d10: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2d20: 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63  .PasswordCallbac
2d30: 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74  k(char *buf, int
2d40: 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 72 69 66   size, int verif
2d50: 79 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y).{.    return 
2d60: 2d 31 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74 61 74  -1;.}.#else.stat
2d70: 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43  ic int.PasswordC
2d80: 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75  allback(char *bu
2d90: 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74  f, int size, int
2da0: 20 76 65 72 69 66 79 2c 20 76 6f 69 64 20 2a 75   verify, void *u
2db0: 64 61 74 61 29 0a 7b 0a 20 20 20 20 53 74 61 74  data).{.    Stat
2dc0: 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53  e *statePtr.= (S
2dd0: 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20  tate *) udata;. 
2de0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
2df0: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
2e00: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
2e10: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
2e20: 20 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 0a     int result;..
2e30: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
2e40: 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55  ->password == NU
2e50: 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45  LL) {..if (Tcl_E
2e60: 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74  valEx(interp, "t
2e70: 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d  ls::password", -
2e80: 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  1, TCL_EVAL_GLOB
2e90: 41 4c 29 0a 09 09 3d 3d 20 54 43 4c 5f 4f 4b 29  AL)...== TCL_OK)
2ea0: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65   {..    char *re
2eb0: 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c  t = (char *) Tcl
2ec0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
2ed0: 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73  (interp);..    s
2ee0: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
2ef0: 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b   (size_t) size);
2f00: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e  ..    return (in
2f10: 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09  t)strlen(ret);..
2f20: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65  } else {..    re
2f30: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20  turn -1;..}.    
2f40: 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  }..    cmdPtr = 
2f50: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
2f60: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
2f70: 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50  ord);..    Tcl_P
2f80: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
2f90: 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69  ata) statePtr->i
2fa0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
2fb0: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
2fc0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
2fd0: 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
2fe0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2ff0: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c      result = Tcl
3000: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
3010: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45  p, cmdPtr, TCL_E
3020: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20  VAL_GLOBAL);.   
3030: 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54   if (result != T
3040: 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 42 61  CL_OK) {..Tcl_Ba
3050: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 73 74  ckgroundError(st
3060: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b  atePtr->interp);
3070: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
3080: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
3090: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65  tr);..    Tcl_Re
30a0: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
30b0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20  a) statePtr);.  
30c0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
30d0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
30e0: 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 0a 20  Ptr->interp);.. 
30f0: 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 3d 3d     if (result ==
3100: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72   TCL_OK) {..char
3110: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29   *ret = (char *)
3120: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
3130: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 73  sult(interp);..s
3140: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
3150: 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b   (size_t) size);
3160: 0a 09 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74  ..return (int)st
3170: 72 6c 65 6e 28 72 65 74 29 3b 0a 20 20 20 20 7d  rlen(ret);.    }
3180: 20 65 6c 73 65 20 7b 0a 09 72 65 74 75 72 6e 20   else {..return 
3190: 2d 31 3b 0a 20 20 20 20 7d 0a 7d 0a 23 65 6e 64  -1;.    }.}.#end
31a0: 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  if.../*. *------
31b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
31f0: 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d  . * CiphersObjCm
3200: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61  d -- list availa
3210: 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20  ble ciphers. *. 
3220: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
3230: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70   is invoked to p
3240: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a  rocess the "tls:
3250: 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e  :ciphers" comman
3260: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61  d. *.to list ava
3270: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20  ilable ciphers, 
3280: 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f  based upon proto
3290: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a  col selected.. *
32a0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
32b0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
32c0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20  esult list.. *. 
32d0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
32e0: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e   *.constructs an
32f0: 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63  d destroys SSL c
3300: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a  ontext (CTX). *.
3310: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3350: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
3360: 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43   int.CiphersObjC
3370: 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 69  md(clientData, i
3380: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
3390: 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74  v).    ClientDat
33a0: 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a  a clientData;./*
33b0: 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20   Not used. */.  
33c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
33d0: 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f 62  terp;.    int ob
33e0: 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09  jc;.    Tcl_Obj.
33f0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a 7b  *CONST objv[];.{
3400: 0a 20 20 20 20 73 74 61 74 69 63 20 43 4f 4e 53  .    static CONS
3410: 54 38 34 20 63 68 61 72 20 2a 70 72 6f 74 6f 63  T84 char *protoc
3420: 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32  ols[] = {.."ssl2
3430: 22 2c 09 22 73 73 6c 33 22 2c 09 22 74 6c 73 31  ",."ssl3",."tls1
3440: 22 2c 09 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c  ",."tls1.1", "tl
3450: 73 31 2e 32 22 2c 20 4e 55 4c 4c 0a 20 20 20 20  s1.2", NULL.    
3460: 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 70 72 6f 74  };.    enum prot
3470: 6f 63 6f 6c 20 7b 0a 09 54 4c 53 5f 53 53 4c 32  ocol {..TLS_SSL2
3480: 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f  , TLS_SSL3, TLS_
3490: 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31  TLS1, TLS_TLS1_1
34a0: 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c  , TLS_TLS1_2, TL
34b0: 53 5f 4e 4f 4e 45 0a 20 20 20 20 7d 3b 0a 20 20  S_NONE.    };.  
34c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
34d0: 72 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  r;.    SSL_CTX *
34e0: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
34f0: 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b  SSL *ssl = NULL;
3500: 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53  .    STACK_OF(SS
3510: 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20  L_CIPHER) *sk;. 
3520: 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66     char *cp, buf
3530: 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e  [BUFSIZ];.    in
3540: 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65  t index, verbose
3550: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 6f   = 0;..    if (o
3560: 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20  bjc < 2 || objc 
3570: 3e 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  > 3) {..Tcl_Wron
3580: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
3590: 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f   1, objv, "proto
35a0: 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 22 29 3b  col ?verbose?");
35b0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
35c0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
35d0: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
35e0: 6f 6d 4f 62 6a 28 20 69 6e 74 65 72 70 2c 20 6f  omObj( interp, o
35f0: 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c  bjv[1], protocol
3600: 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30  s, "protocol", 0
3610: 2c 0a 09 26 69 6e 64 65 78 29 20 21 3d 20 54 43  ,..&index) != TC
3620: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
3630: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
3640: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3e 20  .    if (objc > 
3650: 32 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  2 && Tcl_GetBool
3660: 65 61 6e 46 72 6f 6d 4f 62 6a 28 20 69 6e 74 65  eanFromObj( inte
3670: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 0a 09 26 76  rp, objv[2],..&v
3680: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f  erbose) != TCL_O
3690: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
36a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
36b0: 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20    switch ((enum 
36c0: 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20  protocol)index) 
36d0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 53  {.    case TLS_S
36e0: 53 4c 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  SL2:.#if defined
36f0: 28 4e 4f 5f 53 53 4c 32 29 0a 09 09 54 63 6c 5f  (NO_SSL2)...Tcl_
3700: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
3710: 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e  erp, "protocol n
3720: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
3730: 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  ULL);...return T
3740: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
3750: 09 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f  ..ctx = SSL_CTX_
3760: 6e 65 77 28 53 53 4c 76 32 5f 6d 65 74 68 6f 64  new(SSLv2_method
3770: 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  ()); break;.#end
3780: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  if.    case TLS_
3790: 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65  SSL3:.#if define
37a0: 64 28 4e 4f 5f 53 53 4c 33 29 0a 09 09 54 63 6c  d(NO_SSL3)...Tcl
37b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
37c0: 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20  terp, "protocol 
37d0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
37e0: 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20  NULL);...return 
37f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
3800: 0a 09 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58  ...ctx = SSL_CTX
3810: 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f  _new(SSLv3_metho
3820: 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  d()); break;.#en
3830: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53  dif.    case TLS
3840: 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e  _TLS1:.#if defin
3850: 65 64 28 4e 4f 5f 54 4c 53 31 29 0a 09 09 54 63  ed(NO_TLS1)...Tc
3860: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3870: 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c  nterp, "protocol
3880: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
3890: 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e   NULL);...return
38a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
38b0: 65 0a 09 09 63 74 78 20 3d 20 53 53 4c 5f 43 54  e...ctx = SSL_CT
38c0: 58 5f 6e 65 77 28 54 4c 53 76 31 5f 6d 65 74 68  X_new(TLSv1_meth
38d0: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65  od()); break;.#e
38e0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c  ndif.    case TL
38f0: 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65  S_TLS1_1:.#if de
3900: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
3910: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
3920: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f  ult(interp, "pro
3930: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
3940: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72  ted", NULL);...r
3950: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3960: 0a 23 65 6c 73 65 0a 09 09 63 74 78 20 3d 20 53  .#else...ctx = S
3970: 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31  SL_CTX_new(TLSv1
3980: 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72  _1_method()); br
3990: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
39a0: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a  case TLS_TLS1_2:
39b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
39c0: 54 4c 53 31 5f 32 29 0a 09 09 54 63 6c 5f 41 70  TLS1_2)...Tcl_Ap
39d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
39e0: 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  p, "protocol not
39f0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
3a00: 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  L);...return TCL
3a10: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09  _ERROR;.#else...
3a20: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
3a30: 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64  w(TLSv1_2_method
3a40: 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  ()); break;.#end
3a50: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  if.    default:.
3a60: 09 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ..break;.    }. 
3a70: 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55     if (ctx == NU
3a80: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
3a90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3aa0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
3ab0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
3ac0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
3ad0: 20 7d 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c   }.    ssl = SSL
3ae0: 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69  _new(ctx);.    i
3af0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20  f (ssl == NULL) 
3b00: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
3b10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53  ult(interp, REAS
3b20: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
3b30: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
3b40: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
3b50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
3b60: 20 7d 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20   }.    objPtr = 
3b70: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 20  Tcl_NewListObj( 
3b80: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69  0, NULL);..    i
3b90: 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09  f (!verbose) {..
3ba0: 66 6f 72 20 28 69 6e 64 65 78 20 3d 20 30 3b 20  for (index = 0; 
3bb0: 3b 20 69 6e 64 65 78 2b 2b 29 20 7b 0a 09 20 20  ; index++) {..  
3bc0: 20 20 63 70 20 3d 20 28 63 68 61 72 2a 29 53 53    cp = (char*)SS
3bd0: 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 6c 69 73  L_get_cipher_lis
3be0: 74 28 20 73 73 6c 2c 20 69 6e 64 65 78 29 3b 0a  t( ssl, index);.
3bf0: 09 20 20 20 20 69 66 20 28 63 70 20 3d 3d 20 4e  .    if (cp == N
3c00: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 20 20 20  ULL) break;..   
3c10: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3c20: 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e 74 65 72  ndElement( inter
3c30: 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 54 63 6c  p, objPtr,...Tcl
3c40: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 63  _NewStringObj( c
3c50: 70 2c 20 2d 31 29 20 29 3b 0a 09 7d 0a 20 20 20  p, -1) );..}.   
3c60: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20   } else {..sk = 
3c70: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28  SSL_get_ciphers(
3c80: 73 73 6c 29 3b 0a 0a 09 66 6f 72 20 28 69 6e 64  ssl);...for (ind
3c90: 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20 3c 20  ex = 0; index < 
3ca0: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75  sk_SSL_CIPHER_nu
3cb0: 6d 28 73 6b 29 3b 20 69 6e 64 65 78 2b 2b 29 20  m(sk); index++) 
3cc0: 7b 0a 09 20 20 20 20 72 65 67 69 73 74 65 72 20  {..    register 
3cd0: 73 69 7a 65 5f 74 20 69 3b 0a 09 20 20 20 20 53  size_t i;..    S
3ce0: 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69  SL_CIPHER_descri
3cf0: 70 74 69 6f 6e 28 20 73 6b 5f 53 53 4c 5f 43 49  ption( sk_SSL_CI
3d00: 50 48 45 52 5f 76 61 6c 75 65 28 20 73 6b 2c 20  PHER_value( sk, 
3d10: 69 6e 64 65 78 29 2c 0a 09 09 09 09 20 20 20 20  index),.....    
3d20: 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  buf, sizeof(buf)
3d30: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 20 3d  );..    for (i =
3d40: 20 73 74 72 6c 65 6e 28 62 75 66 29 20 2d 20 31   strlen(buf) - 1
3d50: 3b 20 69 20 3b 20 69 2d 2d 29 20 7b 0a 09 09 69  ; i ; i--) {...i
3d60: 66 20 28 62 75 66 5b 69 5d 20 3d 3d 20 27 20 27  f (buf[i] == ' '
3d70: 20 7c 7c 20 62 75 66 5b 69 5d 20 3d 3d 20 27 5c   || buf[i] == '\
3d80: 6e 27 20 7c 7c 0a 09 09 20 20 20 20 62 75 66 5b  n' ||...    buf[
3d90: 69 5d 20 3d 3d 20 27 5c 72 27 20 7c 7c 20 62 75  i] == '\r' || bu
3da0: 66 5b 69 5d 20 3d 3d 20 27 5c 74 27 29 20 7b 0a  f[i] == '\t') {.
3db0: 09 09 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 27  ..    buf[i] = '
3dc0: 5c 30 27 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  \0';...} else {.
3dd0: 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d  ..    break;...}
3de0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
3df0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3e00: 65 6d 65 6e 74 28 20 69 6e 74 65 72 70 2c 20 6f  ement( interp, o
3e10: 62 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77  bjPtr,...Tcl_New
3e20: 53 74 72 69 6e 67 4f 62 6a 28 20 62 75 66 2c 20  StringObj( buf, 
3e30: 2d 31 29 20 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  -1) );..}.    }.
3e40: 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c      SSL_free(ssl
3e50: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  );.    SSL_CTX_f
3e60: 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54  ree(ctx);..    T
3e70: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
3e80: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29   interp, objPtr)
3e90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3ea0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ef0: 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b  -. *. * Handshak
3f00: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  eObjCmd --. *. *
3f10: 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73  .This command is
3f20: 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20   used to verify 
3f30: 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64  whether the hand
3f40: 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74  shake is complet
3f50: 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a  e. *.or not.. *.
3f60: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
3f70: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
3f80: 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61  sult. 1 means ha
3f90: 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65  ndshake complete
3fa0: 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e  , 0 means pendin
3fb0: 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  g.. *. * Side ef
3fc0: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f  fects:. *.May fo
3fd0: 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74  rce SSL negotiat
3fe0: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63  ion to take plac
3ff0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
4040: 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 61 6e 64  .static int.Hand
4050: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 63 6c 69 65  shakeObjCmd(clie
4060: 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20  ntData, interp, 
4070: 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20  objc, objv).    
4080: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
4090: 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73  tData;./* Not us
40a0: 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  ed. */.    Tcl_I
40b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
40c0: 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20     int objc;.   
40d0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
40e0: 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63  objv[];.{.    Tc
40f0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09  l_Channel chan;.
4100: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20  ./* The channel 
4110: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e  to set a mode on
4120: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a  . */.    State *
4130: 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c  statePtr;../* cl
4140: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73  ient state for s
4150: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20  sl socket */.   
4160: 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 0a 20   int ret = 1;.. 
4170: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
4180: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
4190: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
41a0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
41b0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
41c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
41d0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
41e0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
41f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
4200: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c  Obj(objv[1], NUL
4210: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
4220: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
4230: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
4240: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
4250: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
4260: 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72   (channelTypeVer
4270: 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e  sion == TLS_CHAN
4280: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 20 7b  NEL_VERSION_2) {
4290: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75  ../*.. * Make su
42a0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
42b0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
42c0: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20  nnel.. */..chan 
42d0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
42e0: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 7d  nel(chan);.    }
42f0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
4300: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
4310: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
4320: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
4330: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
4340: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
4350: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
4360: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
4370: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53  .."\": not a TLS
4380: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29   channel", NULL)
4390: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
43a0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
43b0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
43c0: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
43d0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
43e0: 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 53  an);..    if (!S
43f0: 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73  SL_is_init_finis
4400: 68 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  hed(statePtr->ss
4410: 6c 29 29 20 7b 0a 09 69 6e 74 20 65 72 72 20 3d  l)) {..int err =
4420: 20 30 3b 0a 09 72 65 74 20 3d 20 54 6c 73 5f 57   0;..ret = Tls_W
4430: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74  aitForConnect(st
4440: 61 74 65 50 74 72 2c 20 26 65 72 72 29 3b 0a 09  atePtr, &err);..
4450: 69 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66  if ((statePtr->f
4460: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41  lags & TLS_TCL_A
4470: 53 59 4e 43 29 20 26 26 20 65 72 72 20 3d 3d 20  SYNC) && err == 
4480: 45 41 47 41 49 4e 29 20 7b 0a 20 20 20 20 20 20  EAGAIN) {.      
4490: 20 20 20 20 20 20 64 70 72 69 6e 74 66 28 22 41        dprintf("A
44a0: 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72  sync set and err
44b0: 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20   = EAGAIN");..  
44c0: 20 20 72 65 74 20 3d 20 30 3b 0a 09 7d 0a 09 69    ret = 0;..}..i
44d0: 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 20  f (ret < 0) {.. 
44e0: 20 20 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 65     CONST char *e
44f0: 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72  rrStr = statePtr
4500: 2d 3e 65 72 72 3b 0a 09 20 20 20 20 54 63 6c 5f  ->err;..    Tcl_
4510: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
4520: 72 70 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  rp);..    Tcl_Se
4530: 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 20  tErrno(err);... 
4540: 20 20 20 69 66 20 28 21 65 72 72 53 74 72 20 7c     if (!errStr |
4550: 7c 20 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 20  | *errStr == 0) 
4560: 7b 0a 09 09 65 72 72 53 74 72 20 3d 20 54 63 6c  {...errStr = Tcl
4570: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65  _PosixError(inte
4580: 72 70 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  rp);..    }...  
4590: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
45a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64  lt(interp, "hand
45b0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c  shake failed: ",
45c0: 20 65 72 72 53 74 72 2c 0a 09 09 20 20 20 20 28   errStr,...    (
45d0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
45e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
45f0: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
4600: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
4610: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
4620: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29  _NewIntObj(ret))
4630: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
4640: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
4650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4690: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62  -. *. * ImportOb
46a0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
46b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
46c0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
46d0: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d  ss the "ssl" com
46e0: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73  mand. *. *.The s
46f0: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65  sl command pushe
4700: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65  s SSL over a (ne
4710: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74  wly connected) t
4720: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20  cp socket. *. * 
4730: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
4740: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
4750: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
4760: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f  fects:. *.May mo
4770: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  dify the behavio
4780: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e  r of an IO chann
4790: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
47e0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70  ..static int.Imp
47f0: 6f 72 74 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74  ortObjCmd(client
4800: 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62  Data, interp, ob
4810: 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c  jc, objv).    Cl
4820: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
4830: 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64  ata;./* Not used
4840: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74  . */.    Tcl_Int
4850: 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20  erp *interp;.   
4860: 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54   int objc;.    T
4870: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
4880: 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63 6c 5f  jv[];.{.    Tcl_
4890: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
48a0: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
48b0: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
48c0: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
48d0: 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65  atePtr;../* clie
48e0: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
48f0: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53   socket */.    S
4900: 53 4c 5f 43 54 58 20 2a 63 74 78 09 3d 20 4e 55  SL_CTX *ctx.= NU
4910: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
4920: 2a 73 63 72 69 70 74 09 3d 20 4e 55 4c 4c 3b 0a  *script.= NULL;.
4930: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73      Tcl_Obj *pas
4940: 73 77 6f 72 64 09 3d 20 4e 55 4c 4c 3b 0a 20 20  sword.= NULL;.  
4950: 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a    int idx, len;.
4960: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 3d      int flags..=
4970: 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20   TLS_TCL_INIT;. 
4980: 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 3d     int server..=
4990: 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63   0;./* is connec
49a0: 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72  tion incoming or
49b0: 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20   outgoing? */.  
49c0: 20 20 63 68 61 72 20 2a 6b 65 79 09 09 3d 20 4e    char *key..= N
49d0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  ULL;.    char *c
49e0: 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ert..= NULL;.   
49f0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 3d   char *ciphers.=
4a00: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
4a10: 2a 43 41 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a  *CAfile.= NULL;.
4a20: 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 09      char *CAdir.
4a30: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61  .= NULL;.    cha
4a40: 72 20 2a 44 48 70 61 72 61 6d 73 09 3d 20 4e 55  r *DHparams.= NU
4a50: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f  LL;.    char *mo
4a60: 64 65 6c 09 09 3d 20 4e 55 4c 4c 3b 0a 23 69 66  del..= NULL;.#if
4a70: 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ndef OPENSSL_NO_
4a80: 54 4c 53 45 58 54 0a 20 20 20 20 63 68 61 72 20  TLSEXT.    char 
4a90: 2a 73 65 72 76 65 72 6e 61 6d 65 09 3d 20 4e 55  *servername.= NU
4aa0: 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20  LL;./* hostname 
4ab0: 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20  for Server Name 
4ac0: 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 23 65  Indication */.#e
4ad0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
4ae0: 28 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 6e  (NO_SSL2).    in
4af0: 74 20 73 73 6c 32 20 3d 20 30 3b 0a 23 65 6c 73  t ssl2 = 0;.#els
4b00: 65 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d  e.    int ssl2 =
4b10: 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   1;.#endif.#if d
4b20: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a  efined(NO_SSL3).
4b30: 20 20 20 20 69 6e 74 20 73 73 6c 33 20 3d 20 30      int ssl3 = 0
4b40: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e 74 20  ;.#else.    int 
4b50: 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64 69 66  ssl3 = 1;.#endif
4b60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
4b70: 54 4c 53 31 29 0a 20 20 20 20 69 6e 74 20 74 6c  TLS1).    int tl
4b80: 73 31 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20  s1 = 0;.#else.  
4b90: 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 3b 0a    int tls1 = 1;.
4ba0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
4bb0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20  ed(NO_TLS1_1).  
4bc0: 20 20 69 6e 74 20 74 6c 73 31 5f 31 20 3d 20 30    int tls1_1 = 0
4bd0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e 74 20  ;.#else.    int 
4be0: 74 6c 73 31 5f 31 20 3d 20 31 3b 0a 23 65 6e 64  tls1_1 = 1;.#end
4bf0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
4c00: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 6e  O_TLS1_2).    in
4c10: 74 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65  t tls1_2 = 0;.#e
4c20: 6c 73 65 0a 20 20 20 20 69 6e 74 20 74 6c 73 31  lse.    int tls1
4c30: 5f 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  _2 = 1;.#endif. 
4c40: 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30     int proto = 0
4c50: 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79  ;.    int verify
4c60: 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20   = 0, require = 
4c70: 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 3b 0a  0, request = 1;.
4c80: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
4c90: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
4ca0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
4cb0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
4cc0: 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72   ?options?");..r
4cd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4ce0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
4cf0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
4d00: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
4d10: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
4d20: 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e  bjv[1], NULL), N
4d30: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68  ULL);.    if (ch
4d40: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
4d50: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
4d60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4d70: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 68 61     }.    if (cha
4d80: 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 20  nnelTypeVersion 
4d90: 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56  == TLS_CHANNEL_V
4da0: 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 2f 2a 0a  ERSION_2) {../*.
4db0: 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f  . * Make sure to
4dc0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
4dd0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a  topmost channel.
4de0: 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c  . */..chan = Tcl
4df0: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
4e00: 68 61 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  han);.    }..   
4e10: 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69   for (idx = 2; i
4e20: 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b  dx < objc; idx++
4e30: 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d  ) {..char *opt =
4e40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
4e50: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c  omObj(objv[idx],
4e60: 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70   NULL);...if (op
4e70: 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20  t[0] != '-')..  
4e80: 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 53 54    break;...OPTST
4e90: 52 28 20 22 2d 63 61 64 69 72 22 2c 20 43 41 64  R( "-cadir", CAd
4ea0: 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d  ir);..OPTSTR( "-
4eb0: 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29  cafile", CAfile)
4ec0: 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d 63 65 72  ;..OPTSTR( "-cer
4ed0: 74 66 69 6c 65 22 2c 20 63 65 72 74 29 3b 0a 09  tfile", cert);..
4ee0: 4f 50 54 53 54 52 28 20 22 2d 63 69 70 68 65 72  OPTSTR( "-cipher
4ef0: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50  ", ciphers);..OP
4f00: 54 4f 42 4a 28 20 22 2d 63 6f 6d 6d 61 6e 64 22  TOBJ( "-command"
4f10: 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53  , script);..OPTS
4f20: 54 52 28 20 22 2d 64 68 70 61 72 61 6d 73 22 2c  TR( "-dhparams",
4f30: 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54   DHparams);..OPT
4f40: 53 54 52 28 20 22 2d 6b 65 79 66 69 6c 65 22 2c  STR( "-keyfile",
4f50: 20 6b 65 79 29 3b 0a 09 4f 50 54 53 54 52 28 20   key);..OPTSTR( 
4f60: 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29  "-model", model)
4f70: 3b 0a 09 4f 50 54 4f 42 4a 28 20 22 2d 70 61 73  ;..OPTOBJ( "-pas
4f80: 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64  sword", password
4f90: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 72  );..OPTBOOL( "-r
4fa0: 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65  equire", require
4fb0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 72  );..OPTBOOL( "-r
4fc0: 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 74  equest", request
4fd0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 73  );..OPTBOOL( "-s
4fe0: 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b  erver", server);
4ff0: 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c  .#ifndef OPENSSL
5000: 5f 4e 4f 5f 54 4c 53 45 58 54 0a 20 20 20 20 20  _NO_TLSEXT.     
5010: 20 20 20 4f 50 54 53 54 52 28 20 22 2d 73 65 72     OPTSTR( "-ser
5020: 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72  vername", server
5030: 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  name);.#endif...
5040: 4f 50 54 42 4f 4f 4c 28 20 22 2d 73 73 6c 32 22  OPTBOOL( "-ssl2"
5050: 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f  , ssl2);..OPTBOO
5060: 4c 28 20 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33  L( "-ssl3", ssl3
5070: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 74  );..OPTBOOL( "-t
5080: 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50  ls1", tls1);..OP
5090: 54 42 4f 4f 4c 28 20 22 2d 74 6c 73 31 2e 31 22  TBOOL( "-tls1.1"
50a0: 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42  , tls1_1);..OPTB
50b0: 4f 4f 4c 28 20 22 2d 74 6c 73 31 2e 32 22 2c 20  OOL( "-tls1.2", 
50c0: 74 6c 73 31 5f 32 29 3b 0a 0a 09 4f 50 54 42 41  tls1_2);...OPTBA
50d0: 44 28 20 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 63  D( "option", "-c
50e0: 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d  adir, -cafile, -
50f0: 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65  certfile, -ciphe
5100: 72 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68  r, -command, -dh
5110: 70 61 72 61 6d 73 2c 20 2d 6b 65 79 66 69 6c 65  params, -keyfile
5120: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77  , -model, -passw
5130: 6f 72 64 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d  ord, -require, -
5140: 72 65 71 75 65 73 74 2c 20 2d 73 65 72 76 65 72  request, -server
5150: 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d  , -servername, -
5160: 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c  ssl2, -ssl3, -tl
5170: 73 31 2c 20 2d 74 6c 73 31 2e 31 20 6f 72 20 2d  s1, -tls1.1 or -
5180: 74 6c 73 31 2e 32 22 29 3b 0a 0a 09 72 65 74 75  tls1.2");...retu
5190: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
51a0: 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75    }.    if (requ
51b0: 65 73 74 29 09 20 20 20 20 76 65 72 69 66 79 20  est).    verify 
51c0: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c  |= SSL_VERIFY_CL
51d0: 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f  IENT_ONCE | SSL_
51e0: 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20  VERIFY_PEER;.   
51f0: 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20   if (request && 
5200: 72 65 71 75 69 72 65 29 20 76 65 72 69 66 79 20  require) verify 
5210: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41  |= SSL_VERIFY_FA
5220: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45  IL_IF_NO_PEER_CE
5230: 52 54 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69  RT;.    if (veri
5240: 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66 79 20  fy == 0).verify 
5250: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e  = SSL_VERIFY_NON
5260: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  E;..    proto |=
5270: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f   (ssl2 ? TLS_PRO
5280: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20  TO_SSL2 : 0);.  
5290: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33    proto |= (ssl3
52a0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c   ? TLS_PROTO_SSL
52b0: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  3 : 0);.    prot
52c0: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53  o |= (tls1 ? TLS
52d0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29  _PROTO_TLS1 : 0)
52e0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
52f0: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f  tls1_1 ? TLS_PRO
5300: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a  TO_TLS1_1 : 0);.
5310: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
5320: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_2 ? TLS_PROTO
5330: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 0a 20  _TLS1_2 : 0);.. 
5340: 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e     /* reset to N
5350: 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72  ULL if blank str
5360: 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a  ing provided */.
5370: 20 20 20 20 69 66 20 28 63 65 72 74 20 26 26 20      if (cert && 
5380: 21 2a 63 65 72 74 29 09 09 63 65 72 74 09 20 3d  !*cert)..cert. =
5390: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b   NULL;.    if (k
53a0: 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 6b 65  ey && !*key)..ke
53b0: 79 09 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  y. = NULL;.    i
53c0: 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a  f (ciphers && !*
53d0: 63 69 70 68 65 72 73 29 09 63 69 70 68 65 72 73  ciphers).ciphers
53e0: 09 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66  . = NULL;.    if
53f0: 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41   (CAfile && !*CA
5400: 66 69 6c 65 29 09 43 41 66 69 6c 65 09 20 3d 20  file).CAfile. = 
5410: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41  NULL;.    if (CA
5420: 64 69 72 20 26 26 20 21 2a 43 41 64 69 72 29 09  dir && !*CAdir).
5430: 43 41 64 69 72 09 20 3d 20 4e 55 4c 4c 3b 0a 20  CAdir. = NULL;. 
5440: 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20     if (DHparams 
5450: 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 44  && !*DHparams).D
5460: 48 70 61 72 61 6d 73 20 3d 20 4e 55 4c 4c 3b 0a  Hparams = NULL;.
5470: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20  .    /* new SSL 
5480: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61  state */.    sta
5490: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20  tePtr..= (State 
54a0: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69  *) ckalloc((unsi
54b0: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61  gned) sizeof(Sta
54c0: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  te));.    memset
54d0: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69  (statePtr, 0, si
54e0: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20  zeof(State));.. 
54f0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
5500: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs.= flags;.    
5510: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
5520: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73  .= interp;.    s
5530: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09  tatePtr->vflags.
5540: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74  = verify;.    st
5550: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22  atePtr->err.= ""
5560: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  ;..    /* alloca
5570: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20  te script */.   
5580: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09   if (script) {..
5590: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
55a0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69  ringFromObj(scri
55b0: 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  pt, &len);..if (
55c0: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
55d0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
55e0: 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63   script;..    Tc
55f0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
5600: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
5610: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  k);..}.    }..  
5620: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61    /* allocate pa
5630: 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66  ssword */.    if
5640: 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28   (password) {..(
5650: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72  void) Tcl_GetStr
5660: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77  ingFromObj(passw
5670: 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ord, &len);..if 
5680: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
5690: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
56a0: 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20  = password;..   
56b0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
56c0: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
56d0: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  word);..}.    }.
56e0: 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21  .    if (model !
56f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d  = NULL) {..int m
5700: 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65  ode;../* Get the
5710: 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74   "model" context
5720: 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f   */..chan = Tcl_
5730: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
5740: 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29  p, model, &mode)
5750: 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28  ;..if (chan == (
5760: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
5770: 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72  L) {..    Tls_Fr
5780: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
5790: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
57a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
57b0: 0a 09 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 70  ..if (channelTyp
57c0: 65 56 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f  eVersion == TLS_
57d0: 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f  CHANNEL_VERSION_
57e0: 32 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20  2) {..    /*..  
57f0: 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74     * Make sure t
5800: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
5810: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
5820: 0a 09 20 20 20 20 20 2a 2f 0a 09 20 20 20 20 63  ..     */..    c
5830: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
5840: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09  Channel(chan);..
5850: 7d 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68  }..if (Tcl_GetCh
5860: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
5870: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
5880: 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  pe()) {..    Tcl
5890: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
58a0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
58b0: 65 6c 20 5c 22 22 2c 0a 09 09 20 20 20 20 54 63  el \"",...    Tc
58c0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
58d0: 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74  (chan), "\": not
58e0: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
58f0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73   NULL);..    Tls
5900: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
5910: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
5920: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5930: 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61  ..}..ctx = ((Sta
5940: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  te *)Tcl_GetChan
5950: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
5960: 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20  chan))->ctx;.   
5970: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28   } else {..if ((
5980: 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73  ctx = CTX_Init(s
5990: 74 61 74 65 50 74 72 2c 20 70 72 6f 74 6f 2c 20  tatePtr, proto, 
59a0: 6b 65 79 2c 20 63 65 72 74 2c 20 43 41 64 69 72  key, cert, CAdir
59b0: 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72  , CAfile, cipher
59c0: 73 2c 0a 09 09 44 48 70 61 72 61 6d 73 29 29 20  s,...DHparams)) 
59d0: 3d 3d 20 28 53 53 4c 5f 43 54 58 2a 29 30 29 20  == (SSL_CTX*)0) 
59e0: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  {..    Tls_Free(
59f0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
5a00: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
5a10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20  TCL_ERROR;..}.  
5a20: 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74    }..    statePt
5a30: 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20  r->ctx = ctx;.. 
5a40: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20     /*.     * We 
5a50: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
5a60: 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e  e that the chann
5a70: 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61  el works in bina
5a80: 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20  ry (for the.    
5a90: 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f   * encryption no
5aa0: 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20  t to get goofed 
5ab0: 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f  up)..     * We o
5ac0: 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75  nly want to adju
5ad0: 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e 67  st the buffering
5ae0: 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e   in pre-v2 chann
5af0: 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20  els, where.     
5b00: 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69  * each channel i
5b10: 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e  n the stack main
5b20: 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62  tained its own b
5b30: 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a  uffers..     */.
5b40: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
5b50: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
5b60: 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61   chan, "-transla
5b70: 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29  tion", "binary")
5b80: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65  ;.    if (channe
5b90: 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20  lTypeVersion == 
5ba0: 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53  TLS_CHANNEL_VERS
5bb0: 49 4f 4e 5f 31 29 20 7b 0a 09 54 63 6c 5f 53 65  ION_1) {..Tcl_Se
5bc0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
5bd0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62  nterp, chan, "-b
5be0: 75 66 66 65 72 69 6e 67 22 2c 20 22 6e 6f 6e 65  uffering", "none
5bf0: 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ");.    }..    i
5c00: 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65  f (channelTypeVe
5c10: 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41  rsion == TLS_CHA
5c20: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 20  NNEL_VERSION_2) 
5c30: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  {..statePtr->sel
5c40: 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61  f = Tcl_StackCha
5c50: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73  nnel(interp, Tls
5c60: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 0a  _ChannelType(),.
5c70: 09 09 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  ..(ClientData) s
5c80: 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 45  tatePtr, (TCL_RE
5c90: 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49  ADABLE | TCL_WRI
5ca0: 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20  TABLE), chan);. 
5cb0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61     } else {..sta
5cc0: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 63 68  tePtr->self = ch
5cd0: 61 6e 3b 0a 09 54 63 6c 5f 53 74 61 63 6b 43 68  an;..Tcl_StackCh
5ce0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c  annel(interp, Tl
5cf0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c  s_ChannelType(),
5d00: 0a 09 09 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ...(ClientData) 
5d10: 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52  statePtr, (TCL_R
5d20: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52  EADABLE | TCL_WR
5d30: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a  ITABLE), chan);.
5d40: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
5d50: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
5d60: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
5d70: 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f  LL) {../*.. * No
5d80: 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e   use of Tcl_Even
5d90: 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75  tuallyFree becau
5da0: 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54  se no possible T
5db0: 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a  cl_Preserve... *
5dc0: 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61  /..Tls_Free((cha
5dd0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
5de0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
5df0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
5e00: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74  .     * SSL Init
5e10: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  ialization.     
5e20: 2a 2f 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72  */..    statePtr
5e30: 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28  ->ssl = SSL_new(
5e40: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
5e50: 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74      if (!statePt
5e60: 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53  r->ssl) {../* SS
5e70: 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20  L library error 
5e80: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  */..Tcl_AppendRe
5e90: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
5ea0: 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74  uldn't construct
5eb0: 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c   ssl session: ",
5ec0: 20 52 45 41 53 4f 4e 28 29 2c 0a 09 09 28 63 68   REASON(),...(ch
5ed0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c  ar *) NULL);..Tl
5ee0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
5ef0: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
5f00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5f10: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45    }..#ifndef OPE
5f20: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 0a 20  NSSL_NO_TLSEXT. 
5f30: 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d     if (servernam
5f40: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  e) {.        if 
5f50: 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74  (!SSL_set_tlsext
5f60: 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65  _host_name(state
5f70: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72  Ptr->ssl, server
5f80: 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65  name) && require
5f90: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
5fa0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5fb0: 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e  (interp, "settin
5fc0: 67 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20  g TLS host name 
5fd0: 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64  extension failed
5fe0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
5ff0: 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c     (char *) NULL
6000: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
6010: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
6020: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20   statePtr);.    
6030: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
6040: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
6050: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
6060: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
6070: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20  SSL Callbacks.  
6080: 20 20 20 2a 2f 0a 0a 20 20 20 20 53 53 4c 5f 73     */..    SSL_s
6090: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74  et_app_data(stat
60a0: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 56 4f 49 44  ePtr->ssl, (VOID
60b0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a   *)statePtr);./*
60c0: 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75   point back to u
60d0: 73 20 2a 2f 0a 0a 20 20 20 20 53 53 4c 5f 73 65  s */..    SSL_se
60e0: 74 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74  t_verify(statePt
60f0: 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20  r->ssl, verify, 
6100: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b  VerifyCallback);
6110: 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
6120: 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28  t_info_callback(
6130: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 49  statePtr->ctx, I
6140: 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20  nfoCallback);.. 
6150: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c     /* Create Tcl
6160: 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e  _Channel BIO Han
6170: 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74  dler */.    stat
6180: 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49  ePtr->p_bio.= BI
6190: 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50  O_new_tcl(stateP
61a0: 74 72 2c 20 42 49 4f 5f 43 4c 4f 53 45 29 3b 0a  tr, BIO_CLOSE);.
61b0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69      statePtr->bi
61c0: 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  o.= BIO_new(BIO_
61d0: 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69  f_ssl());..    i
61e0: 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 73 74  f (server) {..st
61f0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
6200: 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b   TLS_TCL_SERVER;
6210: 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74  ..SSL_set_accept
6220: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d  _state(statePtr-
6230: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  >ssl);.    } els
6240: 65 20 7b 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e  e {..SSL_set_con
6250: 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65  nect_state(state
6260: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
6270: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f  .    SSL_set_bio
6280: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
6290: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c  statePtr->p_bio,
62a0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
62b0: 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73  );.    BIO_set_s
62c0: 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  sl(statePtr->bio
62d0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  , statePtr->ssl,
62e0: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a   BIO_NOCLOSE);..
62f0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e      /*.     * En
6300: 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20  d of SSL Init.  
6310: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65     */.    Tcl_Se
6320: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
6330: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
6340: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
6350: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 0a 09 20 20  ePtr->self),..  
6360: 20 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b    TCL_VOLATILE);
6370: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
6380: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
6390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63d0: 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f  . *. * UnimportO
63e0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
63f0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
6400: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f   invoked to remo
6410: 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  ve the topmost c
6420: 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20  hannel filter.. 
6430: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
6440: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
6450: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
6460: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
6470: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65  ay modify the be
6480: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20  havior of an IO 
6490: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64e0: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  -. */..static in
64f0: 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64  t.UnimportObjCmd
6500: 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74  (clientData, int
6510: 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29  erp, objc, objv)
6520: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
6530: 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e  clientData;./* N
6540: 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20  ot used. */.    
6550: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6560: 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63  rp;.    int objc
6570: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  ;.    Tcl_Obj *C
6580: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20  ONST objv[];.{. 
6590: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
65a0: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61  han;../* The cha
65b0: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f  nnel to set a mo
65c0: 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 69  de on. */..    i
65d0: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
65e0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
65f0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
6600: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
6610: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6620: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61  ;.    }..    cha
6630: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
6640: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
6650: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
6660: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
6670: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
6680: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
6690: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
66a0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
66b0: 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72   (channelTypeVer
66c0: 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e  sion == TLS_CHAN
66d0: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 20 7b  NEL_VERSION_2) {
66e0: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75  ../*.. * Make su
66f0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
6700: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
6710: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20  nnel.. */..chan 
6720: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
6730: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 7d  nel(chan);.    }
6740: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ..    if (Tcl_Ge
6750: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
6760: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
6770: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f  lType()) {..Tcl_
6780: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6790: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
67a0: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
67b0: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
67c0: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c  ..."\": not a TL
67d0: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
67e0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
67f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
6800: 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b   if (Tcl_Unstack
6810: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
6820: 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52  chan) == TCL_ERR
6830: 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OR) {..return TC
6840: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
6850: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
6860: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
6870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
68b0: 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d   *. * CTX_Init -
68c0: 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53  - construct a SS
68d0: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20  L_CTX instance. 
68e0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
68f0: 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58  .A valid SSL_CTX
6900: 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c   instance or NUL
6910: 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  L.. *. * Side ef
6920: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72  fects:. *.constr
6930: 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74  ucts SSL context
6940: 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d   (CTX). *. *----
6950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6990: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f   */..static SSL_
69a0: 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 73  CTX *.CTX_Init(s
69b0: 74 61 74 65 50 74 72 2c 20 70 72 6f 74 6f 2c 20  tatePtr, proto, 
69c0: 6b 65 79 2c 20 63 65 72 74 2c 20 43 41 64 69 72  key, cert, CAdir
69d0: 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72  , CAfile, cipher
69e0: 73 2c 20 44 48 70 61 72 61 6d 73 29 0a 20 20 20  s, DHparams).   
69f0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
6a00: 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 3b  ;.    int proto;
6a10: 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 3b 0a  .    char *key;.
6a20: 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 3b 0a      char *cert;.
6a30: 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 3b      char *CAdir;
6a40: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c  .    char *CAfil
6a50: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70  e;.    char *cip
6a60: 68 65 72 73 3b 0a 20 20 20 20 63 68 61 72 20 2a  hers;.    char *
6a70: 44 48 70 61 72 61 6d 73 3b 0a 7b 0a 20 20 20 20  DHparams;.{.    
6a80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6a90: 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp = statePtr->i
6aa0: 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43  nterp;.    SSL_C
6ab0: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
6ac0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
6ad0: 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  ds;.    Tcl_DStr
6ae0: 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74  ing ds1;.    int
6af0: 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 63 6f   off = 0;.    co
6b00: 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a  nst SSL_METHOD *
6b10: 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 69 66 20  method;..    if 
6b20: 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f  (!proto) {..Tcl_
6b30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6b40: 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70  erp, "no valid p
6b50: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
6b60: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
6b70: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a  n (SSL_CTX *)0;.
6b80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72      }..    /* cr
6b90: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74  eate SSL context
6ba0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
6bb0: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20  NO_SSL2).    if 
6bc0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
6bd0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29  TLS_PROTO_SSL2))
6be0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
6bf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72  sult(interp, "pr
6c00: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
6c10: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
6c20: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
6c30: 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  )0;.    }.#endif
6c40: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
6c50: 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e  SSL3).    if (EN
6c60: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
6c70: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a  _PROTO_SSL3)) {.
6c80: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
6c90: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f  t(interp, "proto
6ca0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
6cb0: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  d", NULL);..retu
6cc0: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b  rn (SSL_CTX *)0;
6cd0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
6ce0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
6cf0: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  1).    if (ENABL
6d00: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
6d10: 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63  OTO_TLS1)) {..Tc
6d20: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6d30: 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c  nterp, "protocol
6d40: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
6d50: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
6d60: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20  (SSL_CTX *)0;.  
6d70: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
6d80: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
6d90: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
6da0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
6db0: 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54  TO_TLS1_1)) {..T
6dc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6dd0: 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f  interp, "protoco
6de0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
6df0: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
6e00: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20   (SSL_CTX *)0;. 
6e10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
6e20: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
6e30: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  2).    if (ENABL
6e40: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
6e50: 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09  OTO_TLS1_2)) {..
6e60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6e70: 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63  (interp, "protoc
6e80: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
6e90: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
6ea0: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a  n (SSL_CTX *)0;.
6eb0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
6ec0: 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29    switch (proto)
6ed0: 20 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28   {.#if !defined(
6ee0: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73  NO_SSL2).    cas
6ef0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  e TLS_PROTO_SSL2
6f00: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76  :..method = SSLv
6f10: 32 5f 6d 65 74 68 6f 64 20 28 29 3b 0a 09 62 72  2_method ();..br
6f20: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
6f30: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
6f40: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
6f50: 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68  ROTO_SSL3:..meth
6f60: 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f  od = SSLv3_metho
6f70: 64 20 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  d ();..break;.#e
6f80: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
6f90: 64 28 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 63  d(NO_TLS1).    c
6fa0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
6fb0: 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c  S1:..method = TL
6fc0: 53 76 31 5f 6d 65 74 68 6f 64 20 28 29 3b 0a 09  Sv1_method ();..
6fd0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
6fe0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
6ff0: 53 31 5f 31 29 0a 20 20 20 20 63 61 73 65 20 54  S1_1).    case T
7000: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a  LS_PROTO_TLS1_1:
7010: 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31  ..method = TLSv1
7020: 5f 31 5f 6d 65 74 68 6f 64 20 28 29 3b 0a 09 62  _1_method ();..b
7030: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
7040: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
7050: 31 5f 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c  1_2).    case TL
7060: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a  S_PROTO_TLS1_2:.
7070: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f  .method = TLSv1_
7080: 32 5f 6d 65 74 68 6f 64 20 28 29 3b 0a 09 62 72  2_method ();..br
7090: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
70a0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
70b0: 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 33   method = SSLv23
70c0: 5f 6d 65 74 68 6f 64 20 28 29 3b 0a 23 69 66 20  _method ();.#if 
70d0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32  !defined(NO_SSL2
70e0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
70f0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
7100: 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20  OTO_SSL2)   ? 0 
7110: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76  : SSL_OP_NO_SSLv
7120: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  2);.#endif.#if !
7130: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
7140: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
7150: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
7160: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a  TO_SSL3)   ? 0 :
7170: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33   SSL_OP_NO_SSLv3
7180: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
7190: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 0a  efined(NO_TLS1).
71a0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
71b0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
71c0: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20  O_TLS1)   ? 0 : 
71d0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29  SSL_OP_NO_TLSv1)
71e0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
71f0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
7200: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
7210: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
7220: 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a  TO_TLS1_1) ? 0 :
7230: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
7240: 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  _1);.#endif.#if 
7250: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
7260: 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _2)..off |= (ENA
7270: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
7280: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20  PROTO_TLS1_2) ? 
7290: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
72a0: 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 09  Sv1_2);.#endif..
72b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
72c0: 20 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f   .    ctx = SSL_
72d0: 43 54 58 5f 6e 65 77 20 28 6d 65 74 68 6f 64 29  CTX_new (method)
72e0: 3b 0a 20 20 20 20 0a 20 20 20 20 53 53 4c 5f 43  ;.    .    SSL_C
72f0: 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28  TX_set_app_data(
7300: 20 63 74 78 2c 20 28 56 4f 49 44 2a 29 69 6e 74   ctx, (VOID*)int
7310: 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65  erp);./* remembe
7320: 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  r the interprete
7330: 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  r */.    SSL_CTX
7340: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 20 63 74  _set_options( ct
7350: 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09  x, SSL_OP_ALL);.
7360: 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77  /* all SSL bug w
7370: 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20  orkarounds */.  
7380: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70    SSL_CTX_set_op
7390: 74 69 6f 6e 73 28 20 63 74 78 2c 20 6f 66 66 29  tions( ctx, off)
73a0: 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67  ;./* all SSL bug
73b0: 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a   workarounds */.
73c0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73      SSL_CTX_sess
73d0: 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28  _set_cache_size(
73e0: 20 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20   ctx, 128);..   
73f0: 20 69 66 20 28 63 69 70 68 65 72 73 20 21 3d 20   if (ciphers != 
7400: 4e 55 4c 4c 29 0a 09 53 53 4c 5f 43 54 58 5f 73  NULL)..SSL_CTX_s
7410: 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63  et_cipher_list(c
7420: 74 78 2c 20 63 69 70 68 65 72 73 29 3b 0a 0a 20  tx, ciphers);.. 
7430: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63     /* set some c
7440: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20  allbacks */.    
7450: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
7460: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74  ult_passwd_cb(ct
7470: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  x, PasswordCallb
7480: 61 63 6b 29 3b 0a 0a 23 69 66 6e 64 65 66 20 42  ack);..#ifndef B
7490: 53 41 46 45 0a 20 20 20 20 53 53 4c 5f 43 54 58  SAFE.    SSL_CTX
74a0: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73  _set_default_pas
74b0: 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28  swd_cb_userdata(
74c0: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
74d0: 74 65 50 74 72 29 3b 0a 23 65 6e 64 69 66 0a 0a  tePtr);.#endif..
74e0: 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69      /* read a Di
74f0: 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72  ffie-Hellman par
7500: 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72  ameters file, or
7510: 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69   use the built-i
7520: 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20  n one */.#ifdef 
7530: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20  OPENSSL_NO_DH.  
7540: 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 21    if (DHparams !
7550: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
7560: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7570: 72 70 2c 0a 09 20 20 20 20 22 44 48 20 70 61 72  rp,..    "DH par
7580: 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e  ameter support n
7590: 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28  ot available", (
75a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
75b0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
75c0: 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f  );..return (SSL_
75d0: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23  CTX *)0;.    }.#
75e0: 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20  else.    {..DH* 
75f0: 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d  dh;..if (DHparam
7600: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  s != NULL) {..  
7610: 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20    BIO *bio;..   
7620: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
7630: 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20  (&ds);..    bio 
7640: 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46  = BIO_new_file(F
7650: 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73  2N(DHparams, &ds
7660: 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66  ), "r");..    if
7670: 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f   (!bio) {...Tcl_
7680: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
7690: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
76a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09 09 20  sult(interp,... 
76b0: 20 20 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69     "Could not fi
76c0: 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73  nd DH parameters
76d0: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29   file", (char *)
76e0: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
76f0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
7700: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
7710: 29 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  )0;..    }..    
7720: 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72  ..    dh = PEM_r
7730: 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73  ead_bio_DHparams
7740: 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  (bio, NULL, NULL
7750: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49  , NULL);..    BI
7760: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20  O_free(bio);..  
7770: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
7780: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20  e(&ds);..    if 
7790: 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70  (!dh) {...Tcl_Ap
77a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
77b0: 70 2c 0a 09 09 20 20 20 20 22 43 6f 75 6c 64 20  p,...    "Could 
77c0: 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61  not read DH para
77d0: 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65  meters from file
77e0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
77f0: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
7800: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
7810: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09   (SSL_CTX *)0;..
7820: 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a      }..} else {.
7830: 09 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68  .    dh = get_dh
7840: 32 30 34 38 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f  2048();..}..SSL_
7850: 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63  CTX_set_tmp_dh(c
7860: 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65  tx, dh);..DH_fre
7870: 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  e(dh);.    }.#en
7880: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20  dif..    /* set 
7890: 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20  our certificate 
78a0: 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20  */.    if (cert 
78b0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  != NULL) {..Tcl_
78c0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
78d0: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f  ;...if (SSL_CTX_
78e0: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f  use_certificate_
78f0: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 20 63  file(ctx, F2N( c
7900: 65 72 74 2c 20 26 64 73 29 2c 0a 09 09 09 09 09  ert, &ds),......
7910: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
7920: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) <= 0) {..    T
7930: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
7940: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70  ds);..    Tcl_Ap
7950: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7960: 70 2c 0a 09 09 09 20 20 20 20 20 22 75 6e 61 62  p,....     "unab
7970: 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66  le to set certif
7980: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65  icate file ", ce
7990: 72 74 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20  rt, ": ",....   
79a0: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61    REASON(), (cha
79b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
79c0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
79d0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
79e0: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d  (SSL_CTX *)0;..}
79f0: 0a 0a 09 2f 2a 20 67 65 74 20 74 68 65 20 70 72  .../* get the pr
7a00: 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69  ivate key associ
7a10: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63  ated with this c
7a20: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 69  ertificate */..i
7a30: 66 20 28 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20  f (key == NULL) 
7a40: 6b 65 79 3d 63 65 72 74 3b 0a 0a 09 69 66 20 28  key=cert;...if (
7a50: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76  SSL_CTX_use_Priv
7a60: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c  ateKey_file(ctx,
7a70: 20 46 32 4e 28 20 6b 65 79 2c 20 26 64 73 29 2c   F2N( key, &ds),
7a80: 0a 09 09 09 09 09 53 53 4c 5f 46 49 4c 45 54 59  ......SSL_FILETY
7a90: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a  PE_PEM) <= 0) {.
7aa0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
7ab0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20  Free(&ds);..    
7ac0: 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73  /* flush the pas
7ad0: 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69  sphrase which mi
7ae0: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74  ght be left in t
7af0: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 20 20  he result */..  
7b00: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
7b10: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43  interp, NULL, TC
7b20: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 20 20 20 20  L_STATIC);..    
7b30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7b40: 28 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20  (interp,....    
7b50: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
7b60: 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20  public key file 
7b70: 22 2c 20 6b 65 79 2c 20 22 20 22 2c 0a 09 09 09  ", key, " ",....
7b80: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28       REASON(), (
7b90: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
7ba0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
7bb0: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
7bc0: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b  rn (SSL_CTX *)0;
7bd0: 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  ..}..Tcl_DString
7be0: 46 72 65 65 28 26 64 73 29 3b 0a 09 2f 2a 20 4e  Free(&ds);../* N
7bf0: 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ow we know that 
7c00: 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68  a key and cert h
7c10: 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61  ave been set aga
7c20: 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c  inst.. * the SSL
7c30: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20   context */..if 
7c40: 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f  (!SSL_CTX_check_
7c50: 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29  private_key(ctx)
7c60: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
7c70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7c80: 2c 0a 09 09 09 20 20 20 20 20 22 70 72 69 76 61  ,....     "priva
7c90: 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  te key does not 
7ca0: 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66  match the certif
7cb0: 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79  icate public key
7cc0: 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72  ",....     (char
7cd0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
7ce0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
7cf0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28  );..    return (
7d00: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a  SSL_CTX *)0;..}.
7d10: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65      } else {..ce
7d20: 72 74 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39  rt = (char*)X509
7d30: 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72  _get_default_cer
7d40: 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28  t_file();...if (
7d50: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74  SSL_CTX_use_cert
7d60: 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78  ificate_file(ctx
7d70: 2c 20 63 65 72 74 2c 0a 09 09 09 09 09 53 53 4c  , cert,......SSL
7d80: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
7d90: 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20  = 0) {.#if 0..  
7da0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
7db0: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c  e(&ds);..    Tcl
7dc0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7dd0: 74 65 72 70 2c 0a 09 09 09 20 20 20 20 20 22 75  terp,....     "u
7de0: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66  nable to use def
7df0: 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65  ault certificate
7e00: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 2c 20 22   file ", cert, "
7e10: 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41  : ",....     REA
7e20: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
7e30: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
7e40: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
7e50: 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f      return (SSL_
7e60: 43 54 58 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a  CTX *)0;.#endif.
7e70: 09 7d 0a 20 20 20 20 7d 0a 09 0a 20 20 20 20 54  .}.    }...    T
7e80: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
7e90: 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ds);.    Tcl_DSt
7ea0: 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a  ringInit(&ds1);.
7eb0: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
7ec0: 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63  _load_verify_loc
7ed0: 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28  ations(ctx, F2N(
7ee0: 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32  CAfile, &ds), F2
7ef0: 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 29 20  N(CAdir, &ds1)) 
7f00: 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65 74  ||..!SSL_CTX_set
7f10: 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f  _default_verify_
7f20: 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 23 69  paths(ctx)) {.#i
7f30: 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  f 0..Tcl_DString
7f40: 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f  Free(&ds);..Tcl_
7f50: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31  DStringFree(&ds1
7f60: 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72  );../* Don't cur
7f70: 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66 20 74  rently care if t
7f80: 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63  his fails */..Tc
7f90: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7fa0: 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65 66 61  nterp, "SSL defa
7fb0: 75 6c 74 20 76 65 72 69 66 79 20 70 61 74 68 73  ult verify paths
7fc0: 3a 20 22 2c 0a 09 09 52 45 41 53 4f 4e 28 29 2c  : ",...REASON(),
7fd0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
7fe0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
7ff0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53  tx);..return (SS
8000: 4c 5f 43 54 58 20 2a 29 30 3b 0a 23 65 6e 64 69  L_CTX *)0;.#endi
8010: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
8020: 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f  https://sourcefo
8030: 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75  rge.net/p/tls/bu
8040: 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 69 66  gs/57/ */.    if
8050: 20 28 20 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c   ( CAfile != NUL
8060: 4c 20 29 20 7b 0a 20 20 20 20 20 20 20 20 53 54  L ) {.        ST
8070: 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
8080: 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53  ) *certNames = S
8090: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43  SL_load_client_C
80a0: 41 5f 66 69 6c 65 28 20 46 32 4e 28 43 41 66 69  A_file( F2N(CAfi
80b0: 6c 65 2c 20 26 64 73 29 20 29 3b 0a 09 69 66 20  le, &ds) );..if 
80c0: 28 20 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e  ( certNames != N
80d0: 55 4c 4c 20 29 20 7b 20 0a 09 20 20 20 20 53 53  ULL ) { ..    SS
80e0: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74  L_CTX_set_client
80f0: 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65  _CA_list(ctx, ce
8100: 72 74 4e 61 6d 65 73 20 29 3b 0a 09 7d 0a 20 20  rtNames );..}.  
8110: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
8120: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20  ringFree(&ds);. 
8130: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
8140: 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65  ee(&ds1);.    re
8150: 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a  turn ctx;.}.../*
8160: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81a0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61  ------. *. * Sta
81b0: 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74  tusObjCmd -- ret
81c0: 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20  urn certificate 
81d0: 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65  for connected pe
81e0: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  er.. *. * Result
81f0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
8200: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
8210: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
8220: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8270: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
8280: 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 63  t.StatusObjCmd(c
8290: 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72  lientData, inter
82a0: 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20  p, objc, objv). 
82b0: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c     ClientData cl
82c0: 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74  ientData;./* Not
82d0: 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63   used. */.    Tc
82e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
82f0: 3b 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a  ;.    int objc;.
8300: 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e      Tcl_Obj.*CON
8310: 53 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20  ST objv[];.{.   
8320: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
8330: 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72  ;.    X509 *peer
8340: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  ;.    Tcl_Obj *o
8350: 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43  bjPtr;.    Tcl_C
8360: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20  hannel chan;.   
8370: 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61   char *channelNa
8380: 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20  me, *ciphers;.  
8390: 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 0a 20 20 20    int mode;..   
83a0: 20 73 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b   switch (objc) {
83b0: 0a 09 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63  ..case 2:..    c
83c0: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c  hannelName = Tcl
83d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
83e0: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29  j(objv[1], NULL)
83f0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  ;..    break;...
8400: 63 61 73 65 20 33 3a 0a 09 20 20 20 20 69 66 20  case 3:..    if 
8410: 28 21 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 65  (!strcmp (Tcl_Ge
8420: 74 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d  tString (objv[1]
8430: 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a  ), "-local")) {.
8440: 09 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20  ..channelName = 
8450: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
8460: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55  mObj(objv[2], NU
8470: 4c 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  LL);...break;.. 
8480: 20 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73     }..    /* els
8490: 65 20 66 61 6c 6c 2e 2e 2e 20 2a 2f 0a 09 64 65  e fall... */..de
84a0: 66 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c 5f  fault:..    Tcl_
84b0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
84c0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
84d0: 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22  -local? channel"
84e0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
84f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8500: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
8510: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
8520: 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20  p, channelName, 
8530: 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28  &mode);.    if (
8540: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
8550: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
8560: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8570: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63  .    }.    if (c
8580: 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f  hannelTypeVersio
8590: 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e 45 4c  n == TLS_CHANNEL
85a0: 5f 56 45 52 53 49 4f 4e 5f 32 29 20 7b 0a 09 2f  _VERSION_2) {../
85b0: 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20  *.. * Make sure 
85c0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
85d0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
85e0: 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54  l.. */..chan = T
85f0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
8600: 28 63 68 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  (chan);.    }.  
8610: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
8620: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
8630: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
8640: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
8650: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8660: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
8670: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
8680: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
8690: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
86a0: 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09  annel", NULL);..
86b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
86c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74  ;.    }.    stat
86d0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
86e0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49   Tcl_GetChannelI
86f0: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
8700: 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  );.    if (objc 
8710: 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20  == 2) {..peer = 
8720: 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72  SSL_get_peer_cer
8730: 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74  tificate(statePt
8740: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65  r->ssl);.    } e
8750: 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53  lse {..peer = SS
8760: 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 74  L_get_certificat
8770: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
8780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
8790: 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20  peer) {..objPtr 
87a0: 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a  = Tls_NewX509Obj
87b0: 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a  (interp, peer);.
87c0: 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20  .if (objc == 2) 
87d0: 7b 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72  { X509_free(peer
87e0: 29 3b 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ); }.    } else 
87f0: 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f  {..objPtr = Tcl_
8800: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
8810: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LL);.    }..    
8820: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
8830: 64 45 6c 65 6d 65 6e 74 20 28 69 6e 74 65 72 70  dElement (interp
8840: 2c 20 6f 62 6a 50 74 72 2c 0a 09 20 20 20 20 54  , objPtr,..    T
8850: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 20  cl_NewStringObj 
8860: 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a  ("sbits", -1));.
8870: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8880: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 20 28 69 6e  ppendElement (in
8890: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 20  terp, objPtr,.. 
88a0: 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a     Tcl_NewIntObj
88b0: 20 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72   (SSL_get_cipher
88c0: 5f 62 69 74 73 20 28 73 74 61 74 65 50 74 72 2d  _bits (statePtr-
88d0: 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a  >ssl, NULL)));..
88e0: 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 63      ciphers = (c
88f0: 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70  har*)SSL_get_cip
8900: 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73  her(statePtr->ss
8910: 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68  l);.    if (ciph
8920: 65 72 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 73  ers != NULL && s
8930: 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c 20 22  trcmp(ciphers, "
8940: 28 4e 4f 4e 45 29 22 29 21 3d 30 29 20 7b 0a 09  (NONE)")!=0) {..
8950: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
8960: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
8970: 20 6f 62 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e   objPtr,...Tcl_N
8980: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70  ewStringObj("cip
8990: 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  her", -1));..Tcl
89a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
89b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
89c0: 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53  jPtr,...Tcl_NewS
89d0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74  tringObj(SSL_get
89e0: 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72  _cipher(statePtr
89f0: 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20  ->ssl), -1));.  
8a00: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f    }.    Tcl_SetO
8a10: 62 6a 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  bjResult( interp
8a20: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
8a30: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
8a40: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
8a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
8a90: 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d   VersionObjCmd -
8aa0: 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e  - return version
8ab0: 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65   string from Ope
8ac0: 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nSSL.. *. * Resu
8ad0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
8ae0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
8af0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
8b00: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
8b10: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
8b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b50: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
8b60: 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  int.VersionObjCm
8b70: 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e  d(clientData, in
8b80: 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76  terp, objc, objv
8b90: 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61  ).    ClientData
8ba0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20   clientData;./* 
8bb0: 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20  Not used. */.   
8bc0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8bd0: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f 62 6a  erp;.    int obj
8be0: 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a  c;.    Tcl_Obj.*
8bf0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a  CONST objv[];.{.
8c00: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
8c10: 50 74 72 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72  Ptr;..    objPtr
8c20: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
8c30: 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53  Obj(OPENSSL_VERS
8c40: 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 0a  ION_TEXT, -1);..
8c50: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
8c60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
8c70: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
8c80: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
8c90: 20 2a 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 2d 2d  ----------------
8cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cd0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63  -----. *. * Misc
8ce0: 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63  ObjCmd -- misc c
8cf0: 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65  ommands. *. * Re
8d00: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
8d10: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
8d20: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
8d30: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
8d40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
8d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d80: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
8d90: 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64  c int.MiscObjCmd
8da0: 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74  (clientData, int
8db0: 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29  erp, objc, objv)
8dc0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
8dd0: 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20 4e  clientData;./* N
8de0: 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20  ot used. */.    
8df0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8e00: 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63  rp;.    int objc
8e10: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 43  ;.    Tcl_Obj.*C
8e20: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20  ONST objv[];.{. 
8e30: 20 20 20 73 74 61 74 69 63 20 43 4f 4e 53 54 38     static CONST8
8e40: 34 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73  4 char *commands
8e50: 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 4e   [] = { "req", N
8e60: 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20  ULL };.    enum 
8e70: 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c  command { C_REQ,
8e80: 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20   C_DUMMY };.    
8e90: 69 6e 74 20 63 6d 64 3b 0a 0a 20 20 20 20 69 66  int cmd;..    if
8ea0: 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54   (objc < 2) {..T
8eb0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
8ec0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
8ed0: 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72   "subcommand ?ar
8ee0: 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  gs?");..return T
8ef0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8f00: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49      if (Tcl_GetI
8f10: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
8f20: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d  rp, objv[1], com
8f30: 6d 61 6e 64 73 2c 0a 09 20 20 20 20 22 63 6f 6d  mands,..    "com
8f40: 6d 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29 20 21  mand", 0,&cmd) !
8f50: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
8f60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8f70: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68     }..    switch
8f80: 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29   ((enum command)
8f90: 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f   cmd) {..case C_
8fa0: 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f  REQ: {..    EVP_
8fb0: 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b  PKEY *pkey=NULL;
8fc0: 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74  ..    X509 *cert
8fd0: 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39  =NULL;..    X509
8fe0: 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c  _NAME *name=NULL
8ff0: 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  ;..    Tcl_Obj *
9000: 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 69 6e 74  *listv;..    int
9010: 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20   listc,i;...    
9020: 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a  BIO *out=NULL;..
9030: 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22  .    char *k_C="
9040: 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d  ",*k_ST="",*k_L=
9050: 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55  "",*k_O="",*k_OU
9060: 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f  ="",*k_CN="",*k_
9070: 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63  Email="";..    c
9080: 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d  har *keyout,*pem
9090: 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69  out,*str;..    i
90a0: 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61  nt keysize,seria
90b0: 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 09 20  l=0,days=365;.. 
90c0: 20 20 20 0a 09 20 20 20 20 69 66 20 28 28 6f 62     ..    if ((ob
90d0: 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36  jc<5) || (objc>6
90e0: 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67  )) {...Tcl_Wrong
90f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
9100: 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a  2, objv, "keysiz
9110: 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69  e keyfile certfi
9120: 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72  le ?info?");...r
9130: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9140: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
9150: 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
9160: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
9170: 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21  [2], &keysize) !
9180: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65  = TCL_OK) {...re
9190: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
91a0: 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f  .    }..    keyo
91b0: 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
91c0: 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20  (objv[3]);..    
91d0: 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74  pemout=Tcl_GetSt
91e0: 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a  ring(objv[4]);..
91f0: 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36  .    if (objc>=6
9200: 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69  ) {...if (Tcl_Li
9210: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
9220: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d  (interp, objv[5]
9230: 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69  ,....&listc, &li
9240: 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  stv) != TCL_OK) 
9250: 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  {...    return T
9260: 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09  CL_ERROR;...}...
9270: 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 21  .if ((listc%2) !
9280: 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c  = 0) {...    Tcl
9290: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
92a0: 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c  p,"Information l
92b0: 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 76  ist must have ev
92c0: 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  en number of arg
92d0: 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09  uments",NULL);..
92e0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
92f0: 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72  ERROR;...}...for
9300: 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20   (i=0; i<listc; 
9310: 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74  i+=2) {...    st
9320: 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  r=Tcl_GetString(
9330: 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20  listv[i]);...   
9340: 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
9350: 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09  "days")==0) {...
9360: 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46  .if (Tcl_GetIntF
9370: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69  romObj(interp,li
9380: 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21  stv[i+1],&days)!
9390: 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20  =TCL_OK)....    
93a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
93b0: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
93c0: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73  f (strcmp(str,"s
93d0: 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09  erial")==0) {...
93e0: 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46  .if (Tcl_GetIntF
93f0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69  romObj(interp,li
9400: 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c  stv[i+1],&serial
9410: 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20  )!=TCL_OK)....  
9420: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9430: 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  OR;...    } else
9440: 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
9450: 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a  "serial")==0) {.
9460: 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  ...if (Tcl_GetIn
9470: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
9480: 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69  listv[i+1],&seri
9490: 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09  al)!=TCL_OK)....
94a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
94b0: 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c  RROR;...    } el
94c0: 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
94d0: 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09  r,"C")==0) {....
94e0: 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  k_C=Tcl_GetStrin
94f0: 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
9500: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
9510: 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29  strcmp(str,"ST")
9520: 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54  ==0) {....k_ST=T
9530: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
9540: 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
9550: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
9560: 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b  p(str,"L")==0) {
9570: 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53  ....k_L=Tcl_GetS
9580: 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
9590: 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
95a0: 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
95b0: 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f  O")==0) {....k_O
95c0: 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
95d0: 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
95e0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
95f0: 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30  cmp(str,"OU")==0
9600: 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f  ) {....k_OU=Tcl_
9610: 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
9620: 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
9630: 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
9640: 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09  tr,"CN")==0) {..
9650: 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74  ..k_CN=Tcl_GetSt
9660: 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
9670: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
9680: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45  f (strcmp(str,"E
9690: 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09  mail")==0) {....
96a0: 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53  k_Email=Tcl_GetS
96b0: 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
96c0: 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
96d0: 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75  {....Tcl_SetResu
96e0: 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f  lt(interp,"Unkno
96f0: 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55  wn parameter",NU
9700: 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54  LL);....return T
9710: 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
9720: 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20  }...}..    }..  
9730: 20 20 69 66 20 28 28 70 6b 65 79 20 3d 20 45 56    if ((pkey = EV
9740: 50 5f 50 4b 45 59 5f 6e 65 77 28 29 29 20 21 3d  P_PKEY_new()) !=
9750: 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 21   NULL) {...if (!
9760: 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f  EVP_PKEY_assign_
9770: 52 53 41 28 70 6b 65 79 2c 0a 09 09 09 52 53 41  RSA(pkey,....RSA
9780: 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 28 6b 65  _generate_key(ke
9790: 79 73 69 7a 65 2c 20 30 78 31 30 30 30 31 2c 20  ysize, 0x10001, 
97a0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 29 20 7b 0a  NULL, NULL))) {.
97b0: 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
97c0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
97d0: 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69  r generating pri
97e0: 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b  vate key",NULL);
97f0: 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
9800: 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 20 20  free(pkey);...  
9810: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9820: 4f 52 3b 0a 09 09 7d 0a 09 09 6f 75 74 3d 42 49  OR;...}...out=BI
9830: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65  O_new(BIO_s_file
9840: 28 29 29 3b 0a 09 09 42 49 4f 5f 77 72 69 74 65  ());...BIO_write
9850: 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65  _filename(out,ke
9860: 79 6f 75 74 29 3b 0a 09 09 50 45 4d 5f 77 72 69  yout);...PEM_wri
9870: 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65  te_bio_PrivateKe
9880: 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c  y(out,pkey,NULL,
9890: 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c  NULL,0,NULL,NULL
98a0: 29 3b 0a 09 09 42 49 4f 5f 66 72 65 65 5f 61 6c  );...BIO_free_al
98b0: 6c 28 6f 75 74 29 3b 0a 0a 09 09 69 66 20 28 28  l(out);....if ((
98c0: 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29  cert=X509_new())
98d0: 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20  ==NULL) {...    
98e0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
98f0: 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65  terp,"Error gene
9900: 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61  rating certifica
9910: 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c  te request",NULL
9920: 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45  );...    EVP_PKE
9930: 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09  Y_free(pkey);...
9940: 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45      return(TCL_E
9950: 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35  RROR);...}....X5
9960: 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63  09_set_version(c
9970: 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49  ert,2);...ASN1_I
9980: 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f  NTEGER_set(X509_
9990: 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72  get_serialNumber
99a0: 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a  (cert),serial);.
99b0: 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64  ..X509_gmtime_ad
99c0: 6a 28 58 35 30 39 5f 67 65 74 5f 6e 6f 74 42 65  j(X509_get_notBe
99d0: 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09  fore(cert),0);..
99e0: 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a  .X509_gmtime_adj
99f0: 28 58 35 30 39 5f 67 65 74 5f 6e 6f 74 41 66 74  (X509_get_notAft
9a00: 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36  er(cert),(long)6
9a10: 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09  0*60*24*days);..
9a20: 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79  .X509_set_pubkey
9a30: 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 09 09 0a  (cert,pkey);....
9a40: 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f  ..name=X509_get_
9a50: 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72  subject_name(cer
9a60: 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45  t);....X509_NAME
9a70: 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
9a80: 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54  t(name,"C", MBST
9a90: 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67  RING_ASC, (unsig
9aa0: 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c  ned char *) k_C,
9ab0: 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
9ac0: 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
9ad0: 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
9ae0: 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  ST", MBSTRING_AS
9af0: 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  C, (unsigned cha
9b00: 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d  r *) k_ST, -1, -
9b10: 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
9b20: 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
9b30: 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42  txt(name,"L", MB
9b40: 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73  STRING_ASC, (uns
9b50: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
9b60: 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  L, -1, -1, 0);..
9b70: 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
9b80: 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
9b90: 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"O", MBSTRING_A
9ba0: 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  SC, (unsigned ch
9bb0: 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d  ar *) k_O, -1, -
9bc0: 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
9bd0: 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
9be0: 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d  txt(name,"OU", M
9bf0: 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e  BSTRING_ASC, (un
9c00: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
9c10: 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _OU, -1, -1, 0);
9c20: 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
9c30: 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
9c40: 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e  me,"CN", MBSTRIN
9c50: 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64  G_ASC, (unsigned
9c60: 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d   char *) k_CN, -
9c70: 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
9c80: 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
9c90: 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d  _by_txt(name,"Em
9ca0: 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ail", MBSTRING_A
9cb0: 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  SC, (unsigned ch
9cc0: 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d  ar *) k_Email, -
9cd0: 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35  1, -1, 0);....X5
9ce0: 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e  09_set_subject_n
9cf0: 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a  ame(cert,name);.
9d00: 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67  ...if (!X509_sig
9d10: 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f  n(cert,pkey,EVP_
9d20: 6d 64 35 28 29 29 29 20 7b 0a 09 09 20 20 20 20  md5())) {...    
9d30: 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
9d40: 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
9d50: 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 20 20  free(pkey);...  
9d60: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
9d70: 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69  interp,"Error si
9d80: 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  gning certificat
9d90: 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  e",NULL);...    
9da0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9db0: 3b 0a 09 09 7d 0a 0a 09 09 6f 75 74 3d 42 49 4f  ;...}....out=BIO
9dc0: 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
9dd0: 29 29 3b 0a 09 09 42 49 4f 5f 77 72 69 74 65 5f  ));...BIO_write_
9de0: 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d  filename(out,pem
9df0: 6f 75 74 29 3b 0a 0a 09 09 50 45 4d 5f 77 72 69  out);....PEM_wri
9e00: 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c  te_bio_X509(out,
9e10: 63 65 72 74 29 3b 0a 09 09 42 49 4f 5f 66 72 65  cert);...BIO_fre
9e20: 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 0a 09 09 58  e_all(out);....X
9e30: 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
9e40: 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28  ..EVP_PKEY_free(
9e50: 70 6b 65 79 29 3b 0a 09 20 20 20 20 7d 20 65 6c  pkey);..    } el
9e60: 73 65 20 7b 0a 09 09 54 63 6c 5f 53 65 74 52 65  se {...Tcl_SetRe
9e70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
9e80: 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72  or generating pr
9e90: 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29  ivate key",NULL)
9ea0: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
9eb0: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  RROR;..    }..}.
9ec0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61  .break;.    defa
9ed0: 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ult:..break;.   
9ee0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
9ef0: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
9f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f40: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65  --. *. * Tls_Fre
9f50: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  e --. *. *.This 
9f60: 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
9f70: 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
9f80: 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
9f90: 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
9fa0: 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
9fb0: 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
9fc0: 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73  elow 1. *. * Res
9fd0: 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
9fe0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
9ff0: 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
a000: 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
a010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a050: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46  -. */.void.Tls_F
a060: 72 65 65 28 20 63 68 61 72 20 2a 62 6c 6f 63 6b  ree( char *block
a070: 50 74 72 20 29 0a 7b 0a 20 20 20 20 53 74 61 74  Ptr ).{.    Stat
a080: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
a090: 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b  tate *)blockPtr;
a0a0: 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28  ..    Tls_Clean(
a0b0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63  statePtr);.    c
a0c0: 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b  kfree(blockPtr);
a0d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
a0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
a120: 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d  . * Tls_Clean --
a130: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
a140: 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20  edure cleans up 
a150: 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65  when a SSL socke
a160: 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a  t based channel.
a170: 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64   *.is closed and
a180: 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
a190: 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77  ount falls below
a1a0: 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64   1.  This should
a1b0: 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79  . *.be called sy
a1c0: 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74  nchronously by t
a1d0: 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f  he CloseProc, no
a1e0: 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e  t in the. *.Even
a1f0: 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62  tuallyFree callb
a200: 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ack.. *. * Resul
a210: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20  ts:. *.none. *. 
a220: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
a230: 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65   *.Frees all the
a240: 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d   state. *. *----
a250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
a290: 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 43 6c 65   */.void.Tls_Cle
a2a0: 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  an(State *stateP
a2b0: 74 72 29 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  tr).{.    /*.   
a2c0: 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69    * we're assumi
a2d0: 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27  ng here that we'
a2e0: 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64  re single-thread
a2f0: 65 64 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  ed.     */..    
a300: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69  if (statePtr->ti
a310: 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65  mer != (Tcl_Time
a320: 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a  rToken) NULL) {.
a330: 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72  .Tcl_DeleteTimer
a340: 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72  Handler(statePtr
a350: 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65  ->timer);..state
a360: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c  Ptr->timer = NUL
a370: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
a380: 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29   (statePtr->bio)
a390: 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c   {../* This will
a3a0: 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f   call SSL_shutdo
a3b0: 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20  wn. Bug 1414045 
a3c0: 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f  */..dprintf("BIO
a3d0: 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20  _free_all(%p)", 
a3e0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
a3f0: 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74  .BIO_free_all(st
a400: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73  atePtr->bio);..s
a410: 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e  tatePtr->bio = N
a420: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
a430: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  f (statePtr->ssl
a440: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53  ) {..dprintf("SS
a450: 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61  L_free(%p)", sta
a460: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53  tePtr->ssl);..SS
a470: 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  L_free(statePtr-
a480: 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72  >ssl);..statePtr
a490: 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ->ssl = NULL;.  
a4a0: 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
a4b0: 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53  ePtr->ctx) {..SS
a4c0: 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65  L_CTX_free(state
a4d0: 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74  Ptr->ctx);..stat
a4e0: 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c  ePtr->ctx = NULL
a4f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
a500: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
a510: 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  ck) {..Tcl_DecrR
a520: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
a530: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74  ->callback);..st
a540: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
a550: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
a560: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
a570: 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63  >password) {..Tc
a580: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
a590: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
a5a0: 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  d);..statePtr->p
a5b0: 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a  assword = NULL;.
a5c0: 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d      }.}.../*. *-
a5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a610: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69  --. *. * Tls_Ini
a620: 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  t --. *. *.This 
a630: 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69  is a package ini
a640: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
a650: 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20  edure, which is 
a660: 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c  called. *.by Tcl
a670: 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61   when this packa
a680: 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65  ge is to be adde
a690: 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65  d to an interpre
a6a0: 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ter.. *. * Resul
a6b0: 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75  ts:  Ssl configu
a6c0: 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20  red and loaded. 
a6d0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
a6e0: 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68  s:. *. create th
a6f0: 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69  e ssl command, i
a700: 6e 69 74 69 61 6c 69 73 65 20 73 73 6c 20 63 6f  nitialise ssl co
a710: 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ntext. *. *-----
a720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
a760: 2a 2f 0a 0a 69 6e 74 0a 54 6c 73 5f 49 6e 69 74  */..int.Tls_Init
a770: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
a780: 65 72 70 29 09 09 2f 2a 20 49 6e 74 65 72 70 72  erp)../* Interpr
a790: 65 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  eter in which th
a7a0: 65 20 70 61 63 6b 61 67 65 20 69 73 0a 09 09 09  e package is....
a7b0: 09 09 20 2a 20 74 6f 20 62 65 20 6d 61 64 65 20  .. * to be made 
a7c0: 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 7b 0a  available. */.{.
a7d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74      const char t
a7e0: 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b  lsTclInitScript[
a7f0: 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22  ] = {.#include "
a800: 74 6c 73 2e 74 63 6c 2e 68 22 0a 20 20 20 20 7d  tls.tcl.h".    }
a810: 3b 0a 0a 20 20 20 20 69 6e 74 20 6d 61 6a 6f 72  ;..    int major
a820: 2c 20 6d 69 6e 6f 72 2c 20 70 61 74 63 68 6c 65  , minor, patchle
a830: 76 65 6c 2c 20 72 65 6c 65 61 73 65 3b 0a 0a 20  vel, release;.. 
a840: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65     /*.     * The
a850: 20 6f 72 69 67 69 6e 61 6c 20 38 2e 32 2e 30 20   original 8.2.0 
a860: 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20  stacked channel 
a870: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 28  implementation (
a880: 61 6e 64 20 74 68 65 20 70 61 74 63 68 0a 20 20  and the patch.  
a890: 20 20 20 2a 20 74 68 61 74 20 70 72 65 63 65 64     * that preced
a8a0: 65 64 20 69 74 29 20 68 61 64 20 70 72 6f 62 6c  ed it) had probl
a8b0: 65 6d 73 20 77 69 74 68 20 73 63 61 6c 61 62 69  ems with scalabi
a8c0: 6c 69 74 79 20 61 6e 64 20 72 6f 62 75 73 74 6e  lity and robustn
a8d0: 65 73 73 2e 0a 20 20 20 20 20 2a 20 54 68 65 73  ess..     * Thes
a8e0: 65 20 77 65 72 65 20 61 64 64 72 65 73 73 20 69  e were address i
a8f0: 6e 20 38 2e 33 2e 32 20 2f 20 38 2e 34 61 32 2c  n 8.3.2 / 8.4a2,
a900: 20 73 6f 20 77 65 20 6e 6f 77 20 72 65 71 75 69   so we now requi
a910: 72 65 20 74 68 61 74 20 61 73 20 61 0a 20 20 20  re that as a.   
a920: 20 20 2a 20 6d 69 6e 69 6d 75 6d 20 66 6f 72 20    * minimum for 
a930: 54 4c 53 20 31 2e 34 2b 2e 20 20 57 65 20 6f 6e  TLS 1.4+.  We on
a940: 6c 79 20 73 75 70 70 6f 72 74 20 38 2e 32 2b 20  ly support 8.2+ 
a950: 6e 6f 77 20 28 38 2e 33 2e 32 2b 20 70 72 65 66  now (8.3.2+ pref
a960: 65 72 72 65 64 29 2e 0a 20 20 20 20 20 2a 2f 0a  erred)..     */.
a970: 20 20 20 20 69 66 20 28 0a 23 69 66 64 65 66 20      if (.#ifdef 
a980: 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 09 54  USE_TCL_STUBS..T
a990: 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74  cl_InitStubs(int
a9a0: 65 72 70 2c 20 22 38 2e 32 22 2c 20 30 29 0a 23  erp, "8.2", 0).#
a9b0: 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 67 52 65 71  else..Tcl_PkgReq
a9c0: 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63  uire(interp, "Tc
a9d0: 6c 22 2c 20 22 38 2e 32 22 2c 20 30 29 0a 23 65  l", "8.2", 0).#e
a9e0: 6e 64 69 66 0a 09 3d 3d 20 4e 55 4c 4c 29 20 7b  ndif..== NULL) {
a9f0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
aa00: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
aa10: 2a 0a 20 20 20 20 20 2a 20 47 65 74 20 74 68 65  *.     * Get the
aa20: 20 76 65 72 73 69 6f 6e 20 73 6f 20 77 65 20 63   version so we c
aa30: 61 6e 20 72 75 6e 74 69 6d 65 20 73 77 69 74 63  an runtime switc
aa40: 68 20 6f 6e 20 61 76 61 69 6c 61 62 6c 65 20 66  h on available f
aa50: 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 20 20  unctionality..  
aa60: 20 20 20 2a 20 54 4c 53 20 73 68 6f 75 6c 64 20     * TLS should 
aa70: 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 62 65 20 75  really only be u
aa80: 73 65 64 20 69 6e 20 38 2e 33 2e 32 2b 2c 20 62  sed in 8.3.2+, b
aa90: 75 74 20 74 68 65 20 6f 74 68 65 72 20 77 6f 72  ut the other wor
aaa0: 6b 73 20 66 6f 72 0a 20 20 20 20 20 2a 20 73 6f  ks for.     * so
aab0: 6d 65 20 6c 69 6d 69 74 65 64 20 66 75 6e 63 74  me limited funct
aac0: 69 6f 6e 61 6c 69 74 79 2c 20 73 6f 20 61 6e 20  ionality, so an 
aad0: 61 74 74 65 6d 70 74 20 61 74 20 73 75 70 70 6f  attempt at suppo
aae0: 72 74 20 69 73 20 6d 61 64 65 2e 0a 20 20 20 20  rt is made..    
aaf0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 47 65 74 56   */.    Tcl_GetV
ab00: 65 72 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26  ersion(&major, &
ab10: 6d 69 6e 6f 72 2c 20 26 70 61 74 63 68 6c 65 76  minor, &patchlev
ab20: 65 6c 2c 20 26 72 65 6c 65 61 73 65 29 3b 0a 20  el, &release);. 
ab30: 20 20 20 69 66 20 28 28 6d 61 6a 6f 72 20 3e 20     if ((major > 
ab40: 38 29 20 7c 7c 20 28 28 6d 61 6a 6f 72 20 3d 3d  8) || ((major ==
ab50: 20 38 29 20 26 26 20 28 28 6d 69 6e 6f 72 20 3e   8) && ((minor >
ab60: 20 33 29 20 7c 7c 20 28 28 6d 69 6e 6f 72 20 3d   3) || ((minor =
ab70: 3d 20 33 29 20 26 26 0a 09 20 20 20 20 28 72 65  = 3) &&..    (re
ab80: 6c 65 61 73 65 20 3d 3d 20 54 43 4c 5f 46 49 4e  lease == TCL_FIN
ab90: 41 4c 5f 52 45 4c 45 41 53 45 29 20 26 26 20 28  AL_RELEASE) && (
aba0: 70 61 74 63 68 6c 65 76 65 6c 20 3e 3d 20 32 29  patchlevel >= 2)
abb0: 29 29 29 29 20 7b 0a 09 2f 2a 20 38 2e 33 2e 32  )))) {../* 8.3.2
abc0: 2b 20 2a 2f 0a 09 63 68 61 6e 6e 65 6c 54 79 70  + */..channelTyp
abd0: 65 56 65 72 73 69 6f 6e 20 3d 20 54 4c 53 5f 43  eVersion = TLS_C
abe0: 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32  HANNEL_VERSION_2
abf0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
ac00: 2f 2a 20 38 2e 32 2e 30 20 2d 20 38 2e 33 2e 31  /* 8.2.0 - 8.3.1
ac10: 20 2a 2f 0a 09 63 68 61 6e 6e 65 6c 54 79 70 65   */..channelType
ac20: 56 65 72 73 69 6f 6e 20 3d 20 54 4c 53 5f 43 48  Version = TLS_CH
ac30: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 31 3b  ANNEL_VERSION_1;
ac40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
ac50: 54 6c 73 4c 69 62 49 6e 69 74 28 29 20 21 3d 20  TlsLibInit() != 
ac60: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41  TCL_OK) {..Tcl_A
ac70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ac80: 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69  rp, "could not i
ac90: 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69  nitialize SSL li
aca0: 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09  brary", NULL);..
acb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
acc0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
acd0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
ace0: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
acf0: 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 72  ciphers", Cipher
ad00: 73 4f 62 6a 43 6d 64 2c 0a 09 20 20 20 20 28 43  sObjCmd,..    (C
ad10: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
ad20: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
ad30: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20   *) NULL);..    
ad40: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
ad50: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
ad60: 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48  s::handshake", H
ad70: 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 0a  andshakeObjCmd,.
ad80: 09 20 20 20 20 28 43 6c 69 65 6e 74 44 61 74 61  .    (ClientData
ad90: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
ada0: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
adb0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ;..    Tcl_Creat
adc0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
add0: 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74  rp, "tls::import
ade0: 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c  ", ImportObjCmd,
adf0: 0a 09 20 20 20 20 28 43 6c 69 65 6e 74 44 61 74  ..    (ClientDat
ae00: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
ae10: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
ae20: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  );..    Tcl_Crea
ae30: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
ae40: 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70  erp, "tls::unimp
ae50: 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62  ort", UnimportOb
ae60: 6a 43 6d 64 2c 0a 09 20 20 20 20 28 43 6c 69 65  jCmd,..    (Clie
ae70: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
ae80: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
ae90: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c   NULL);..    Tcl
aea0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
aeb0: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
aec0: 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f  status", StatusO
aed0: 62 6a 43 6d 64 2c 0a 09 20 20 20 20 28 43 6c 69  bjCmd,..    (Cli
aee0: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
aef0: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
af00: 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63  ) NULL);..    Tc
af10: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
af20: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
af30: 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69  :version", Versi
af40: 6f 6e 4f 62 6a 43 6d 64 2c 0a 09 20 20 20 20 28  onObjCmd,..    (
af50: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
af60: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
af70: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  c *) NULL);..   
af80: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
af90: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
afa0: 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f  ls::misc", MiscO
afb0: 62 6a 43 6d 64 2c 0a 09 20 20 20 20 28 43 6c 69  bjCmd,..    (Cli
afc0: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
afd0: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
afe0: 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66  ) NULL);..    if
aff0: 20 28 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20   (interp) {.    
b000: 20 20 20 20 54 63 6c 5f 45 76 61 6c 28 69 6e 74      Tcl_Eval(int
b010: 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53  erp, tlsTclInitS
b020: 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  cript);.    }.. 
b030: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b     return Tcl_Pk
b040: 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
b050: 20 22 74 6c 73 22 2c 20 50 41 43 4b 41 47 45 5f   "tls", PACKAGE_
b060: 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0c 0a 2f 2a  VERSION);.}.../*
b070: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
b080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
b0b0: 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d  .Tls_SafeInit --
b0c0: 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *.---------
b0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b0f0: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e  -------*. *.Stan
b100: 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72  dard procedure r
b110: 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64  equired by 'load
b120: 27 2e 20 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a  '. . *.Initializ
b130: 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f  es this extensio
b140: 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74  n for a safe int
b150: 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d  erpreter.. *.---
b160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
b190: 2a 0a 20 2a 09 53 69 64 65 65 66 66 65 63 74 73  *. *.Sideeffects
b1a0: 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73  :. *..As of 'Tls
b1b0: 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73  _Init'. *. *.Res
b1c0: 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64  ult:. *..A stand
b1d0: 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f  ard Tcl error co
b1e0: 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  de.. *. *-------
b1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
b220: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6c 73 5f 53 61  . */..int.Tls_Sa
b230: 66 65 49 6e 69 74 20 28 54 63 6c 5f 49 6e 74 65  feInit (Tcl_Inte
b240: 72 70 2a 20 69 6e 74 65 72 70 29 0a 7b 0a 20 20  rp* interp).{.  
b250: 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 49 6e 69    return Tls_Ini
b260: 74 20 28 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 0c  t (interp);.}...
b270: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
b280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
b2b0: 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d  . *.TlsLibInit -
b2c0: 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d  -. *. *.--------
b2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69  --------*. *.Ini
b300: 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62  tializes SSL lib
b310: 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70  rary once per ap
b320: 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d  plication. *.---
b330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
b360: 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74  *. *.Side effect
b370: 73 3a 0a 20 2a 09 09 69 6e 69 74 69 6c 69 7a 65  s:. *..initilize
b380: 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a  s SSL library. *
b390: 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
b3a0: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
b3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3e0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  *. */.static int
b3f0: 20 54 6c 73 4c 69 62 49 6e 69 74 20 28 76 6f 69   TlsLibInit (voi
b400: 64 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  d) {.    static 
b410: 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  int initialized 
b420: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  = 0;.    int i;.
b430: 20 20 20 20 63 68 61 72 20 72 6e 64 5f 73 65 65      char rnd_see
b440: 64 5b 31 36 5d 20 3d 20 22 47 72 7a 53 6c 70 6c  d[16] = "GrzSlpl
b450: 4b 71 55 64 6e 6e 7a 50 21 22 3b 09 2f 2a 20 31  KqUdnnzP!";./* 1
b460: 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  6 bytes */.    i
b470: 6e 74 20 73 74 61 74 75 73 3d 54 43 4c 5f 4f 4b  nt status=TCL_OK
b480: 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69  ;..    if (initi
b490: 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20  alized) {.      
b4a0: 20 20 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b    return status;
b4b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 69 74 69  .    }.    initi
b4c0: 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66  alized = 1;..#if
b4d0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
b4e0: 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
b4f0: 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
b500: 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d  ).    size_t num
b510: 5f 6c 6f 63 6b 73 3b 0a 0a 20 20 20 20 54 63 6c  _locks;..    Tcl
b520: 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74  _MutexLock(&init
b530: 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 20  _mx);.#endif... 
b540: 20 20 20 69 66 20 28 43 52 59 50 54 4f 5f 73 65     if (CRYPTO_se
b550: 74 5f 6d 65 6d 5f 66 75 6e 63 74 69 6f 6e 73 28  t_mem_functions(
b560: 28 76 6f 69 64 20 2a 28 2a 29 28 73 69 7a 65 5f  (void *(*)(size_
b570: 74 29 29 54 63 6c 5f 41 6c 6c 6f 63 2c 0a 09 09  t))Tcl_Alloc,...
b580: 09 09 09 20 28 76 6f 69 64 20 2a 28 2a 29 28 76  ... (void *(*)(v
b590: 6f 69 64 20 2a 2c 20 73 69 7a 65 5f 74 29 29 54  oid *, size_t))T
b5a0: 63 6c 5f 52 65 61 6c 6c 6f 63 2c 0a 09 09 09 09  cl_Realloc,.....
b5b0: 09 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 20  . (void(*)(void 
b5c0: 2a 29 29 54 63 6c 5f 46 72 65 65 29 20 3d 3d 20  *))Tcl_Free) == 
b5d0: 30 29 20 7b 0a 09 20 20 20 20 20 20 20 2f 2a 20  0) {..       /* 
b5e0: 4e 6f 74 20 75 73 69 6e 67 20 54 63 6c 27 73 20  Not using Tcl's 
b5f0: 6d 65 6d 20 66 75 6e 63 74 69 6f 6e 73 20 2e 2e  mem functions ..
b600: 2e 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 20 2a  . not critical *
b610: 2f 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 64 65  /..    }..#if de
b620: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
b630: 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
b640: 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09  d(TCL_THREADS)..
b650: 20 20 20 20 2f 2a 20 73 68 6f 75 6c 64 20 77 65      /* should we
b660: 20 63 6f 6e 73 69 64 65 72 20 61 6c 6c 6f 63 61   consider alloca
b670: 74 69 6e 67 20 6d 75 74 65 78 65 73 3f 20 2a 2f  ting mutexes? */
b680: 0a 09 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20  ..    num_locks 
b690: 3d 20 43 52 59 50 54 4f 5f 6e 75 6d 5f 6c 6f 63  = CRYPTO_num_loc
b6a0: 6b 73 28 29 3b 0a 09 20 20 20 20 69 66 20 28 6e  ks();..    if (n
b6b0: 75 6d 5f 6c 6f 63 6b 73 20 3e 20 43 52 59 50 54  um_locks > CRYPT
b6c0: 4f 5f 4e 55 4d 5f 4c 4f 43 4b 53 29 20 7b 0a 09  O_NUM_LOCKS) {..
b6d0: 09 73 74 61 74 75 73 3d 54 43 4c 5f 45 52 52 4f  .status=TCL_ERRO
b6e0: 52 3b 0a 09 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a  R;...goto done;.
b6f0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 43 52 59  .    }...    CRY
b700: 50 54 4f 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f  PTO_set_locking_
b710: 63 61 6c 6c 62 61 63 6b 28 43 72 79 70 74 6f 54  callback(CryptoT
b720: 68 72 65 61 64 4c 6f 63 6b 43 61 6c 6c 62 61 63  hreadLockCallbac
b730: 6b 29 3b 0a 09 20 20 20 20 43 52 59 50 54 4f 5f  k);..    CRYPTO_
b740: 73 65 74 5f 69 64 5f 63 61 6c 6c 62 61 63 6b 28  set_id_callback(
b750: 43 72 79 70 74 6f 54 68 72 65 61 64 49 64 43 61  CryptoThreadIdCa
b760: 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a  llback);.#endif.
b770: 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 6c 69  ..    if (SSL_li
b780: 62 72 61 72 79 5f 69 6e 69 74 28 29 20 21 3d 20  brary_init() != 
b790: 31 29 20 7b 0a 09 20 20 20 20 09 73 74 61 74 75  1) {..    .statu
b7a0: 73 3d 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 67  s=TCL_ERROR;...g
b7b0: 6f 74 6f 20 64 6f 6e 65 3b 0a 09 20 20 20 20 7d  oto done;..    }
b7c0: 0a 09 20 20 20 20 53 53 4c 5f 6c 6f 61 64 5f 65  ..    SSL_load_e
b7d0: 72 72 6f 72 5f 73 74 72 69 6e 67 73 28 29 3b 0a  rror_strings();.
b7e0: 09 20 20 20 20 45 52 52 5f 6c 6f 61 64 5f 63 72  .    ERR_load_cr
b7f0: 79 70 74 6f 5f 73 74 72 69 6e 67 73 28 29 3b 0a  ypto_strings();.
b800: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
b810: 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d   Seed the random
b820: 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
b830: 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62  r in the SSL lib
b840: 72 61 72 79 2c 0a 09 20 20 20 20 20 2a 20 75 73  rary,..     * us
b850: 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65  ing the do/while
b860: 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75   construct becau
b870: 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f  se of the bug no
b880: 74 65 20 69 6e 20 74 68 65 0a 09 20 20 20 20 20  te in the..     
b890: 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74  * OpenSSL FAQ at
b8a0: 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e   http://www.open
b8b0: 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f  ssl.org/support/
b8c0: 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 09  faq.html#USER1..
b8d0: 20 20 20 20 20 2a 0a 09 20 20 20 20 20 2a 20 54       *..     * T
b8e0: 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70  he crux of the p
b8f0: 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53  roblem is that S
b900: 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f  olaris 7 does no
b910: 74 20 68 61 76 65 20 61 20 0a 09 20 20 20 20 20  t have a ..     
b920: 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72  * /dev/random or
b930: 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65   /dev/urandom de
b940: 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f  vice so it canno
b950: 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a  t gather enough.
b960: 09 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20  .     * entropy 
b970: 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65  from the RAND_se
b980: 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e  ed() when TLS in
b990: 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65  itializes and re
b9a0: 66 75 73 65 73 0a 09 20 20 20 20 20 2a 20 74 6f  fuses..     * to
b9b0: 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72   go further. Ear
b9c0: 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lier versions of
b9d0: 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64   OpenSSL carried
b9e0: 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a   on regardless..
b9f0: 09 20 20 20 20 20 2a 2f 0a 09 20 20 20 20 73 72  .     */..    sr
ba00: 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  and((unsigned in
ba10: 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20  t) time((time_t 
ba20: 2a 29 20 4e 55 4c 4c 29 29 3b 0a 09 20 20 20 20  *) NULL));..    
ba30: 64 6f 20 7b 0a 09 09 66 6f 72 20 28 69 20 3d 20  do {...for (i = 
ba40: 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20  0; i < 16; i++) 
ba50: 7b 0a 09 09 20 20 20 20 72 6e 64 5f 73 65 65 64  {...    rnd_seed
ba60: 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29  [i] = 1 + (char)
ba70: 20 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29   (255.0 * rand()
ba80: 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29  /(RAND_MAX+1.0))
ba90: 3b 0a 09 09 7d 0a 09 09 52 41 4e 44 5f 73 65 65  ;...}...RAND_see
baa0: 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65  d(rnd_seed, size
bab0: 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 09  of(rnd_seed));..
bac0: 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e      } while (RAN
bad0: 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 29  D_status() != 1)
bae0: 3b 0a 64 6f 6e 65 3a 0a 0a 23 69 66 20 64 65 66  ;.done:..#if def
baf0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
bb00: 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
bb10: 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54  (TCL_THREADS)..T
bb20: 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26  cl_MutexUnlock(&
bb30: 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
bb40: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74 61 74  .    return stat
bb50: 75 73 3b 0a 7d 0a                                us;.}.