Hex Artifact Content

Artifact ac73771fae7ba1ce9e88559fa4a59ee2726a95de58aa011e8da24a3e557c3153:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 0a 20 2a 20 54 4c 53 20 28 61 6b 61 20 53   *. * TLS (aka S
00e0: 53 4c 29 20 43 68 61 6e 6e 65 6c 20 2d 20 63 61  SL) Channel - ca
00f0: 6e 20 62 65 20 6c 61 79 65 72 65 64 20 6f 6e 20  n be layered on 
0100: 61 6e 79 20 62 69 2d 64 69 72 65 63 74 69 6f 6e  any bi-direction
0110: 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 61 6e 6e 65  al. * Tcl_Channe
0120: 6c 20 28 4e 6f 74 65 3a 20 52 65 71 75 69 72 65  l (Note: Require
0130: 73 20 54 72 66 20 43 6f 72 65 20 50 61 74 63 68  s Trf Core Patch
0140: 29 0a 20 2a 0a 20 2a 20 54 68 69 73 20 77 61 73  ). *. * This was
0150: 20 62 75 69 6c 74 20 28 61 6c 6d 6f 73 74 29 20   built (almost) 
0160: 66 72 6f 6d 20 73 63 72 61 74 63 68 20 62 61 73  from scratch bas
0170: 65 64 20 75 70 6f 6e 20 6f 62 73 65 72 76 61 74  ed upon observat
0180: 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70 65 6e 53 53  ion of. * OpenSS
0190: 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a 20 2a 20 41  L 0.9.2B. *. * A
01a0: 64 64 69 74 69 6f 6e 20 63 72 65 64 69 74 20 69  ddition credit i
01b0: 73 20 64 75 65 20 66 6f 72 20 41 6e 64 72 65 61  s due for Andrea
01c0: 73 20 4b 75 70 72 69 65 73 20 28 61 2e 6b 75 70  s Kupries (a.kup
01d0: 72 69 65 73 40 77 65 73 74 65 6e 64 2e 63 6f 6d  ries@westend.com
01e0: 29 2c 20 66 6f 72 0a 20 2a 20 70 72 6f 76 69 64  ), for. * provid
01f0: 69 6e 67 20 74 68 65 20 54 63 6c 5f 52 65 70 6c  ing the Tcl_Repl
0200: 61 63 65 43 68 61 6e 6e 65 6c 20 6d 65 63 68 61  aceChannel mecha
0210: 6e 69 73 6d 20 61 6e 64 20 77 6f 72 6b 69 6e 67  nism and working
0220: 20 63 6c 6f 73 65 6c 79 20 77 69 74 68 20 6d 65   closely with me
0230: 0a 20 2a 20 74 6f 20 65 6e 68 61 6e 63 65 20 69  . * to enhance i
0240: 74 20 74 6f 20 73 75 70 70 6f 72 74 20 66 75 6c  t to support ful
0250: 6c 20 66 69 6c 65 65 76 65 6e 74 20 73 65 6d 61  l fileevent sema
0260: 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a 20 41 6c 73  ntics.. *. * Als
0270: 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 62 79 20 74  o work done by t
0280: 68 65 20 66 6f 6c 6c 6f 77 20 70 65 6f 70 6c 65  he follow people
0290: 20 70 72 6f 76 69 64 65 64 20 74 68 65 20 69 6d   provided the im
02a0: 70 65 74 75 73 20 74 6f 20 64 6f 20 74 68 69 73  petus to do this
02b0: 20 22 72 69 67 68 74 22 3a 0a 20 2a 09 74 63 6c   "right":. *.tcl
02c0: 53 53 4c 20 28 43 6f 6c 69 6e 20 4d 63 43 6f 72  SSL (Colin McCor
02d0: 6d 61 63 6b 2c 20 53 68 61 72 65 64 20 54 65 63  mack, Shared Tec
02e0: 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09 53 53 4c 74  hnology). *.SSLt
02f0: 63 6c 20 28 50 65 74 65 72 20 41 6e 74 6d 61 6e  cl (Peter Antman
0300: 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75  ). *. */..#inclu
0310: 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 69  de "tlsInt.h".#i
0320: 6e 63 6c 75 64 65 20 22 74 63 6c 4f 70 74 73 2e  nclude "tclOpts.
0330: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
0340: 6c 69 62 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 45 78  lib.h>../*. * Ex
0350: 74 65 72 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73  ternal functions
0360: 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77  . */../*. * Forw
0370: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73  ard declarations
0380: 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32  . */..#define F2
0390: 4e 28 20 6b 65 79 2c 20 64 73 70 29 20 5c 0a 09  N( key, dsp) \..
03a0: 28 28 28 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c 29  (((key) == NULL)
03b0: 20 3f 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c   ? (char *) NULL
03c0: 20 3a 20 5c 0a 09 09 54 63 6c 5f 54 72 61 6e 73   : \...Tcl_Trans
03d0: 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74  lateFileName(int
03e0: 65 72 70 2c 20 28 6b 65 79 29 2c 20 28 64 73 70  erp, (key), (dsp
03f0: 29 29 29 0a 23 64 65 66 69 6e 65 20 52 45 41 53  ))).#define REAS
0400: 4f 4e 28 29 09 45 52 52 5f 72 65 61 73 6f 6e 5f  ON().ERR_reason_
0410: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52  error_string(ERR
0420: 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 0a 0a 73  _get_error())..s
0430: 74 61 74 69 63 20 76 6f 69 64 09 49 6e 66 6f 43  tatic void.InfoC
0440: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
0450: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72  L *ssl, int wher
0460: 65 2c 20 69 6e 74 20 72 65 74 29 3b 0a 0a 73 74  e, int ret);..st
0470: 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43 6d 64 50  atic Tcl_ObjCmdP
0480: 72 6f 63 20 43 69 70 68 65 72 73 4f 62 6a 43 6d  roc CiphersObjCm
0490: 64 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62  d;.static Tcl_Ob
04a0: 6a 43 6d 64 50 72 6f 63 20 48 61 6e 64 73 68 61  jCmdProc Handsha
04b0: 6b 65 4f 62 6a 43 6d 64 3b 0a 73 74 61 74 69 63  keObjCmd;.static
04c0: 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20   Tcl_ObjCmdProc 
04d0: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 3b 0a 73 74  ImportObjCmd;.st
04e0: 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43 6d 64 50  atic Tcl_ObjCmdP
04f0: 72 6f 63 20 53 74 61 74 75 73 4f 62 6a 43 6d 64  roc StatusObjCmd
0500: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a  ;.static Tcl_Obj
0510: 43 6d 64 50 72 6f 63 20 56 65 72 73 69 6f 6e 4f  CmdProc VersionO
0520: 62 6a 43 6d 64 3b 0a 73 74 61 74 69 63 20 54 63  bjCmd;.static Tc
0530: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 4d 69 73  l_ObjCmdProc Mis
0540: 63 4f 62 6a 43 6d 64 3b 0a 73 74 61 74 69 63 20  cObjCmd;.static 
0550: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 55  Tcl_ObjCmdProc U
0560: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 3b 0a 0a  nimportObjCmd;..
0570: 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a  static SSL_CTX *
0580: 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a  CTX_Init(State *
0590: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73  statePtr, int is
05a0: 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74  Server, int prot
05b0: 6f 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09  o, char *key,...
05c0: 09 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c  .char *certfile,
05d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
05e0: 6b 65 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e  key_asn1, unsign
05f0: 65 64 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73  ed char *cert_as
0600: 6e 31 2c 0a 09 09 09 69 6e 74 20 6b 65 79 5f 61  n1,....int key_a
0610: 73 6e 31 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72  sn1_len, int cer
0620: 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 61 72  t_asn1_len, char
0630: 20 2a 43 41 64 69 72 2c 20 63 68 61 72 20 2a 43   *CAdir, char *C
0640: 41 66 69 6c 65 2c 0a 20 20 20 20 20 20 63 68 61  Afile,.      cha
0650: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72  r *ciphers, char
0660: 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a 73 74   *DHparams);..st
0670: 61 74 69 63 20 69 6e 74 09 54 6c 73 4c 69 62 49  atic int.TlsLibI
0680: 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61  nit(int uninitia
0690: 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 69 6e 65 20  lize);..#define 
06a0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 09  TLS_PROTO_SSL2..
06b0: 30 78 30 31 0a 23 64 65 66 69 6e 65 20 54 4c 53  0x01.#define TLS
06c0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 09 30 78 30  _PROTO_SSL3..0x0
06d0: 32 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52  2.#define TLS_PR
06e0: 4f 54 4f 5f 54 4c 53 31 09 09 30 78 30 34 0a 23  OTO_TLS1..0x04.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0700: 5f 54 4c 53 31 5f 31 09 30 78 30 38 0a 23 64 65  _TLS1_1.0x08.#de
0710: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  fine TLS_PROTO_T
0720: 4c 53 31 5f 32 09 30 78 31 30 0a 23 64 65 66 69  LS1_2.0x10.#defi
0730: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  ne TLS_PROTO_TLS
0740: 31 5f 33 09 30 78 32 30 0a 23 64 65 66 69 6e 65  1_3.0x20.#define
0750: 20 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d   ENABLED(flag, m
0760: 61 73 6b 29 09 28 28 28 66 6c 61 67 29 20 26 20  ask).(((flag) & 
0770: 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b  (mask)) == (mask
0780: 29 29 0a 0a 2f 2a 0a 20 2a 20 53 74 61 74 69 63  ))../*. * Static
0790: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
07a0: 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4f 50  . */..#ifndef OP
07b0: 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63  ENSSL_NO_DH.#inc
07c0: 6c 75 64 65 20 22 64 68 5f 70 61 72 61 6d 73 2e  lude "dh_params.
07d0: 68 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  h".#endif../*. *
07e0: 20 57 65 20 6c 6f 73 65 20 74 68 65 20 74 63 6c   We lose the tcl
07f0: 20 70 61 73 73 77 6f 72 64 20 63 61 6c 6c 62 61   password callba
0800: 63 6b 20 77 68 65 6e 20 77 65 20 75 73 65 20 74  ck when we use t
0810: 68 65 20 52 53 41 20 42 53 41 46 45 20 53 53 4c  he RSA BSAFE SSL
0820: 2d 43 20 31 2e 31 2e 32 0a 20 2a 20 6c 69 62 72  -C 1.1.2. * libr
0830: 61 72 69 65 73 20 69 6e 73 74 65 61 64 20 6f 66  aries instead of
0840: 20 74 68 65 20 63 75 72 72 65 6e 74 20 4f 70 65   the current Ope
0850: 6e 53 53 4c 20 6c 69 62 72 61 72 69 65 73 2e 0a  nSSL libraries..
0860: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 42 53 41 46   */..#ifdef BSAF
0870: 45 0a 23 64 65 66 69 6e 65 20 50 52 45 5f 4f 50  E.#define PRE_OP
0880: 45 4e 53 53 4c 5f 30 5f 39 5f 34 20 31 0a 23 65  ENSSL_0_9_4 1.#e
0890: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 50 72 65 20  ndif../*. * Pre 
08a0: 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 34 20 43 6f  OpenSSL 0.9.4 Co
08b0: 6d 70 61 74 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65  mpat. */..#ifnde
08c0: 66 20 53 54 41 43 4b 5f 4f 46 0a 23 64 65 66 69  f STACK_OF.#defi
08d0: 6e 65 20 53 54 41 43 4b 5f 4f 46 28 78 29 09 09  ne STACK_OF(x)..
08e0: 09 53 54 41 43 4b 0a 23 64 65 66 69 6e 65 20 73  .STACK.#define s
08f0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d  k_SSL_CIPHER_num
0900: 28 73 6b 29 09 09 73 6b 5f 6e 75 6d 28 28 73 6b  (sk)..sk_num((sk
0910: 29 29 0a 23 64 65 66 69 6e 65 20 73 6b 5f 53 53  )).#define sk_SS
0920: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 20  L_CIPHER_value( 
0930: 73 6b 2c 20 69 6e 64 65 78 29 09 28 53 53 4c 5f  sk, index).(SSL_
0940: 43 49 50 48 45 52 2a 29 73 6b 5f 76 61 6c 75 65  CIPHER*)sk_value
0950: 28 28 73 6b 29 2c 20 28 69 6e 64 65 78 29 29 0a  ((sk), (index)).
0960: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
0970: 72 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f  read-Safe TLS Co
0980: 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54  de. */..#ifdef T
0990: 43 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69  CL_THREADS.#defi
09a0: 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ne OPENSSL_THREA
09b0: 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75  D_DEFINES.#inclu
09c0: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e  de <openssl/open
09d0: 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64  sslconf.h>..#ifd
09e0: 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ef OPENSSL_THREA
09f0: 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  DS.#include <ope
0a00: 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 0a  nssl/crypto.h>..
0a10: 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65 64 20 6f  /*. * Threaded o
0a20: 70 65 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  peration require
0a30: 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c 62 61  s locking callba
0a40: 63 6b 73 0a 20 2a 20 42 61 73 65 64 20 66 72 6f  cks. * Based fro
0a50: 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79 70 74 6c  m /crypto/cryptl
0a60: 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53 53 4c 20  ib.c of OpenSSL 
0a70: 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c 2e 0a 20  and NSOpenSSL.. 
0a80: 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d  */..static Tcl_M
0a90: 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d 20 4e 55  utex *locks = NU
0aa0: 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  LL;.static int l
0ab0: 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 73  ocksCount = 0;.s
0ac0: 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20  tatic Tcl_Mutex 
0ad0: 69 6e 69 74 5f 6d 78 3b 0a 0a 76 6f 69 64 20 43  init_mx;..void C
0ae0: 72 79 70 74 6f 54 68 72 65 61 64 4c 6f 63 6b 43  ryptoThreadLockC
0af0: 61 6c 6c 62 61 63 6b 28 0a 20 20 20 20 69 6e 74  allback(.    int
0b00: 20 6d 6f 64 65 2c 0a 20 20 20 20 69 6e 74 20 6e   mode,.    int n
0b10: 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44  ,.    TCL_UNUSED
0b20: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2c 0a  (const char *),.
0b30: 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 69      TCL_UNUSED(i
0b40: 6e 74 29 29 0a 7b 0a 09 69 66 20 28 6d 6f 64 65  nt)).{..if (mode
0b50: 20 26 20 43 52 59 50 54 4f 5f 4c 4f 43 4b 29 20   & CRYPTO_LOCK) 
0b60: 7b 0a 09 09 2f 2a 20 54 68 69 73 20 64 65 62 75  {.../* This debu
0b70: 67 67 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20  gging is turned 
0b80: 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 20 2d  off by default -
0b90: 2d 20 69 74 27 73 20 74 6f 6f 20 6e 6f 69 73 79  - it's too noisy
0ba0: 2e 20 2a 2f 0a 09 09 2f 2a 20 64 70 72 69 6e 74  . */.../* dprint
0bb0: 66 28 22 43 61 6c 6c 65 64 20 74 6f 20 6c 6f 63  f("Called to loc
0bc0: 6b 20 28 6e 3d 25 69 20 6f 66 20 25 69 29 22 2c  k (n=%i of %i)",
0bd0: 20 6e 2c 20 6c 6f 63 6b 73 43 6f 75 6e 74 29 3b   n, locksCount);
0be0: 20 2a 2f 0a 09 09 54 63 6c 5f 4d 75 74 65 78 4c   */...Tcl_MutexL
0bf0: 6f 63 6b 28 26 6c 6f 63 6b 73 5b 6e 5d 29 3b 0a  ock(&locks[n]);.
0c00: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 64  .} else {.../* d
0c10: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 20 74  printf("Called t
0c20: 6f 20 75 6e 6c 6f 63 6b 20 28 6e 3d 25 69 20 6f  o unlock (n=%i o
0c30: 66 20 25 69 29 22 2c 20 6e 2c 20 6c 6f 63 6b 73  f %i)", n, locks
0c40: 43 6f 75 6e 74 29 3b 20 2a 2f 0a 09 09 54 63 6c  Count); */...Tcl
0c50: 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 6c 6f  _MutexUnlock(&lo
0c60: 63 6b 73 5b 6e 5d 29 3b 0a 09 7d 0a 0a 09 2f 2a  cks[n]);..}.../*
0c70: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
0c80: 69 6e 67 22 29 3b 20 2a 2f 0a 0a 09 72 65 74 75  ing"); */...retu
0c90: 72 6e 3b 0a 7d 0a 0a 75 6e 73 69 67 6e 65 64 20  rn;.}..unsigned 
0ca0: 6c 6f 6e 67 20 43 72 79 70 74 6f 54 68 72 65 61  long CryptoThrea
0cb0: 64 49 64 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  dIdCallback(void
0cc0: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ) {..unsigned lo
0cd0: 6e 67 20 72 65 74 3b 0a 0a 09 64 70 72 69 6e 74  ng ret;...dprint
0ce0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 09 72  f("Called");...r
0cf0: 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  et = (unsigned l
0d00: 6f 6e 67 29 20 54 63 6c 5f 47 65 74 43 75 72 72  ong) Tcl_GetCurr
0d10: 65 6e 74 54 68 72 65 61 64 28 29 3b 0a 0a 09 64  entThread();...d
0d20: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
0d30: 67 20 25 6c 75 22 2c 20 72 65 74 29 3b 0a 0a 09  g %lu", ret);...
0d40: 72 65 74 75 72 6e 28 72 65 74 29 3b 0a 7d 0a 23  return(ret);.}.#
0d50: 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 53 4c  endif /* OPENSSL
0d60: 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 6e 64  _THREADS */.#end
0d70: 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 41 44  if /* TCL_THREAD
0d80: 53 20 2a 2f 0a 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  S */..../*. *---
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dd0: 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62  . *. * InfoCallb
0de0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 6d 6f 6e  ack --. *. *.mon
0df0: 69 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63  itors SSL connec
0e00: 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a  tion process. *.
0e10: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
0e20: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
0e30: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
0e40: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
0e50: 66 69 6e 65 64 29 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  fined). *-------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
0ea0: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66  .static void.Inf
0eb0: 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  oCallback(const 
0ec0: 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68  SSL *ssl, int wh
0ed0: 65 72 65 2c 20 69 6e 74 20 72 65 74 29 0a 7b 0a  ere, int ret).{.
0ee0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
0ef0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53  Ptr = (State*)SS
0f00: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28  L_get_app_data((
0f10: 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20  SSL *)ssl);.    
0f20: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
0f30: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
0f40: 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 3b 0a  *major, *minor;.
0f50: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
0f60: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
0f70: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
0f80: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
0f90: 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a  )NULL)..return;.
0fa0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
0fb0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
0fc0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
0fd0: 6b 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69  k);..#if 0.    i
0fe0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
0ff0: 42 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65 76 20  B_ALERT) {..sev 
1000: 3d 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65  = SSL_alert_type
1010: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74  _string_long(ret
1020: 29 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 28 20  );..if (strcmp( 
1030: 73 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d 30  sev, "fatal")==0
1040: 29 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 72  ) {./* Map to er
1050: 72 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 5f  ror */..    Tls_
1060: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20  Error(statePtr, 
1070: 53 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 30  SSL_ERROR(ssl, 0
1080: 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 3b  ));..    return;
1090: 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ..}.    }.#endif
10a0: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26  .    if (where &
10b0: 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b   SSL_CB_HANDSHAK
10c0: 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f  E_START) {..majo
10d0: 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b  r = "handshake";
10e0: 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 74  ..minor = "start
10f0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ";.    } else if
1100: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1110: 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29  _HANDSHAKE_DONE)
1120: 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e   {..major = "han
1130: 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20  dshake";..minor 
1140: 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20  = "done";.    } 
1150: 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 72  else {..if (wher
1160: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54  e & SSL_CB_ALERT
1170: 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72  )..major = "aler
1180: 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68  t";..else if (wh
1190: 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e  ere & SSL_ST_CON
11a0: 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63  NECT).major = "c
11b0: 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 69  onnect";..else i
11c0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53  f (where & SSL_S
11d0: 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f 72  T_ACCEPT)..major
11e0: 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 6c   = "accept";..el
11f0: 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22  se.....major = "
1200: 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28  unknown";...if (
1210: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 52  where & SSL_CB_R
1220: 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72  EAD)..minor = "r
1230: 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 28  ead";..else if (
1240: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 57  where & SSL_CB_W
1250: 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22  RITE)..minor = "
1260: 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 66  write";..else if
1270: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1280: 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20  _LOOP)..minor = 
1290: 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66  "loop";..else if
12a0: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
12b0: 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20  _EXIT)..minor = 
12c0: 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 09  "exit";..else...
12d0: 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f  ..minor = "unkno
12e0: 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  wn";.    }..    
12f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1300: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50  dElement( stateP
1310: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
1320: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
1330: 53 74 72 69 6e 67 4f 62 6a 28 20 22 69 6e 66 6f  StringObj( "info
1340: 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63  ", -1));..    Tc
1350: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1360: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72  lement( statePtr
1370: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
1380: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1390: 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 74  ringObj( Tcl_Get
13a0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
13b0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
13c0: 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73   );..    Tcl_Lis
13d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
13e0: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  t( statePtr->int
13f0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
1400: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
1410: 62 6a 28 20 6d 61 6a 6f 72 2c 20 2d 31 29 20 29  bj( major, -1) )
1420: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
1430: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1440: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
1450: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1460: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1470: 28 20 6d 69 6e 6f 72 2c 20 2d 31 29 20 29 3b 0a  ( minor, -1) );.
1480: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26  .    if (where &
1490: 20 28 53 53 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53   (SSL_CB_LOOP|SS
14a0: 4c 5f 43 42 5f 45 58 49 54 29 29 20 7b 0a 09 54  L_CB_EXIT)) {..T
14b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
14c0: 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74  Element( statePt
14d0: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  r->interp, cmdPt
14e0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
14f0: 74 72 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 73 74  tringObj( SSL_st
1500: 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28  ate_string_long(
1510: 73 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20 20  ssl), -1) );.   
1520: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72   } else if (wher
1530: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54  e & SSL_CB_ALERT
1540: 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20  ) {..const char 
1550: 2a 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20 53  *cp = (char *) S
1560: 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74  SL_alert_desc_st
1570: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a  ring_long(ret);.
1580: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
1590: 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74  endElement( stat
15a0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d  ePtr->interp, cm
15b0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
15c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 63 70 2c  ewStringObj( cp,
15d0: 20 2d 31 29 20 29 3b 0a 20 20 20 20 7d 20 65 6c   -1) );.    } el
15e0: 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  se {..Tcl_ListOb
15f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20  jAppendElement( 
1600: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1610: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1620: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1630: 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e   SSL_state_strin
1640: 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29  g_long(ssl), -1)
1650: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63   );.    }.    Tc
1660: 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c 69  l_Preserve( (Cli
1670: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
1680: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  r->interp);.    
1690: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43  Tcl_Preserve( (C
16a0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
16b0: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49  Ptr);..    Tcl_I
16c0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d 64  ncrRefCount( cmd
16d0: 50 74 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  Ptr);.    (void)
16e0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 73   Tcl_EvalObjEx(s
16f0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
1700: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41   cmdPtr, TCL_EVA
1710: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 54  L_GLOBAL);.    T
1720: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1730: 20 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54   cmdPtr);..    T
1740: 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69  cl_Release( (Cli
1750: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
1760: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  r);.    Tcl_Rele
1770: 61 73 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61  ase( (ClientData
1780: 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ) statePtr->inte
1790: 72 70 29 3b 0a 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  rp);..}.../*. *-
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17e0: 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43  --. *. * VerifyC
17f0: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
1800: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65  .Monitors SSL ce
1810: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61  rtificate valida
1820: 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 0a 20 2a  tion process.. *
1830: 09 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20  .This is called 
1840: 77 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 69  whenever a certi
1850: 66 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 63  ficate is inspec
1860: 74 65 64 0a 20 2a 09 6f 72 20 64 65 63 69 64 65  ted. *.or decide
1870: 64 20 69 6e 76 61 6c 69 64 2e 0a 20 2a 0a 20 2a  d invalid.. *. *
1880: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63   Results:. *.A c
1890: 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f  allback bound to
18a0: 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20   the socket may 
18b0: 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20  return one of:. 
18c0: 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 65 20  *.    0...- the 
18d0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64  certificate is d
18e0: 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 0a 20 2a  eemed invalid. *
18f0: 09 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 63  .    1...- the c
1900: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65  ertificate is de
1910: 65 6d 65 64 20 76 61 6c 69 64 0a 20 2a 09 20 20  emed valid. *.  
1920: 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d    empty string.-
1930: 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65   no change to ce
1940: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61  rtificate valida
1950: 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  tion. *. * Side 
1960: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
1970: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  err field of the
1980: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61   currently opera
1990: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65  tive State is se
19a0: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69  t. *.  to a stri
19b0: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
19c0: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
19d0: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e  n failure reason
19e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
19f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a20: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
1a30: 63 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c  c int.VerifyCall
1a40: 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30  back(int ok, X50
1a50: 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78  9_STORE_CTX *ctx
1a60: 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ).{.    Tcl_Obj 
1a70: 2a 63 6d 64 50 74 72 2c 20 2a 72 65 73 75 6c 74  *cmdPtr, *result
1a80: 3b 0a 20 20 20 20 63 68 61 72 20 2a 65 72 72 53  ;.    char *errS
1a90: 74 72 2c 20 2a 73 74 72 69 6e 67 3b 0a 20 20 20  tr, *string;.   
1aa0: 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 67 74 68   Tcl_Size length
1ab0: 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c  ;.    SSL   *ssl
1ac0: 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53  ..= (SSL*)X509_S
1ad0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f  TORE_CTX_get_ex_
1ae0: 64 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65  data(ctx, SSL_ge
1af0: 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53  t_ex_data_X509_S
1b00: 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b  TORE_CTX_idx());
1b10: 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74  .    X509  *cert
1b20: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43  ..= X509_STORE_C
1b30: 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  TX_get_current_c
1b40: 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74  ert(ctx);.    St
1b50: 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20  ate *statePtr.= 
1b60: 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f  (State*)SSL_get_
1b70: 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20  app_data(ssl);. 
1b80: 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20     int depth..= 
1b90: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
1ba0: 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63  et_error_depth(c
1bb0: 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72  tx);.    int err
1bc0: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43  ..= X509_STORE_C
1bd0: 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78  TX_get_error(ctx
1be0: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
1bf0: 22 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b  "Verify: %d", ok
1c00: 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 6f 6b 29  );..    if (!ok)
1c10: 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 68   {..errStr = (ch
1c20: 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f  ar*)X509_verify_
1c30: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e  cert_error_strin
1c40: 67 28 65 72 72 29 3b 0a 20 20 20 20 7d 20 65 6c  g(err);.    } el
1c50: 73 65 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 28  se {..errStr = (
1c60: 63 68 61 72 20 2a 29 30 3b 0a 20 20 20 20 7d 0a  char *)0;.    }.
1c70: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
1c80: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
1c90: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
1ca0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
1cb0: 76 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52  vflags & SSL_VER
1cc0: 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
1cd0: 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20  EER_CERT) {..   
1ce0: 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65   return ok;..} e
1cf0: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72  lse {..    retur
1d00: 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20  n 1;..}.    }.  
1d10: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
1d20: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
1d30: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
1d40: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
1d50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20  jAppendElement( 
1d60: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1d70: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1d80: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1d90: 20 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b   "verify", -1));
1da0: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
1db0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20  jAppendElement( 
1dc0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1dd0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1de0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1df0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
1e00: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
1e10: 6c 66 29 2c 20 2d 31 29 20 29 3b 0a 0a 20 20 20  lf), -1) );..   
1e20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1e30: 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65  ndElement( state
1e40: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64  Ptr->interp, cmd
1e50: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
1e60: 77 49 6e 74 4f 62 6a 28 20 64 65 70 74 68 29 20  wIntObj( depth) 
1e70: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
1e80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1e90: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ( statePtr->inte
1ea0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
1eb0: 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28   Tls_NewX509Obj(
1ec0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
1ed0: 70 2c 20 63 65 72 74 29 20 29 3b 0a 0a 20 20 20  p, cert) );..   
1ee0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1ef0: 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65  ndElement( state
1f00: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64  Ptr->interp, cmd
1f10: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
1f20: 77 49 6e 74 4f 62 6a 28 20 6f 6b 29 20 29 3b 0a  wIntObj( ok) );.
1f30: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1f40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73  AppendElement( s
1f50: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
1f60: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
1f70: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20  l_NewStringObj( 
1f80: 65 72 72 53 74 72 20 3f 20 65 72 72 53 74 72 20  errStr ? errStr 
1f90: 3a 20 22 22 2c 20 2d 31 29 20 29 3b 0a 0a 20 20  : "", -1) );..  
1fa0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 20    Tcl_Preserve( 
1fb0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
1fc0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a  tePtr->interp);.
1fd0: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
1fe0: 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  ( (ClientData) s
1ff0: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 73  tatePtr);..    s
2000: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c  tatePtr->flags |
2010: 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41  = TLS_TCL_CALLBA
2020: 43 4b 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63  CK;..    Tcl_Inc
2030: 72 52 65 66 43 6f 75 6e 74 28 20 63 6d 64 50 74  rRefCount( cmdPt
2040: 72 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  r);.    if (Tcl_
2050: 45 76 61 6c 4f 62 6a 45 78 28 73 74 61 74 65 50  EvalObjEx(stateP
2060: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
2070: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  tr, TCL_EVAL_GLO
2080: 42 41 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  BAL) != TCL_OK) 
2090: 7b 0a 09 2f 2a 20 49 74 20 67 6f 74 20 61 6e 20  {../* It got an 
20a0: 65 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74  error - reject t
20b0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 2e 09  he certificate..
20c0: 09 2a 2f 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f  .*/..Tcl_Backgro
20d0: 75 6e 64 45 72 72 6f 72 28 20 73 74 61 74 65 50  undError( stateP
20e0: 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 09 6f 6b  tr->interp);..ok
20f0: 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65   = 0;.    } else
2100: 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54 63 6c   {..result = Tcl
2110: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 73 74  _GetObjResult(st
2120: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b  atePtr->interp);
2130: 0a 09 73 74 72 69 6e 67 20 3d 20 54 63 6c 5f 47  ..string = Tcl_G
2140: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
2150: 72 65 73 75 6c 74 2c 20 26 6c 65 6e 67 74 68 29  result, &length)
2160: 3b 0a 09 2f 2a 20 41 6e 20 65 6d 70 74 79 20 72  ;../* An empty r
2170: 65 73 75 6c 74 20 6c 65 61 76 65 73 20 76 65 72  esult leaves ver
2180: 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e  ification unchan
2190: 67 65 64 2e 09 2a 2f 0a 09 69 66 20 28 73 74 72  ged..*/..if (str
21a0: 69 6e 67 20 21 3d 20 4e 55 4c 4c 20 26 26 20 6c  ing != NULL && l
21b0: 65 6e 67 74 68 20 3e 20 30 29 20 7b 0a 09 20 20  ength > 0) {..  
21c0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74    if (Tcl_GetInt
21d0: 46 72 6f 6d 4f 62 6a 28 73 74 61 74 65 50 74 72  FromObj(statePtr
21e0: 2d 3e 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  ->interp, result
21f0: 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c 5f 4f 4b  , &ok) != TCL_OK
2200: 29 20 7b 0a 09 09 54 63 6c 5f 42 61 63 6b 67 72  ) {...Tcl_Backgr
2210: 6f 75 6e 64 45 72 72 6f 72 28 73 74 61 74 65 50  oundError(stateP
2220: 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 09 09 6f  tr->interp);...o
2230: 6b 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 7d  k = 0;..    }..}
2240: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
2250: 65 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d 64  ecrRefCount( cmd
2260: 50 74 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65  Ptr);..    state
2270: 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28  Ptr->flags &= ~(
2280: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b  TLS_TCL_CALLBACK
2290: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  );..    Tcl_Rele
22a0: 61 73 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61  ase( (ClientData
22b0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  ) statePtr);.   
22c0: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 43   Tcl_Release( (C
22d0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
22e0: 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 0a 20  Ptr->interp);.. 
22f0: 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b 09 2f     return(ok);./
2300: 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65  * By default, le
2310: 61 76 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ave verification
2320: 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a 7d   unchanged..*/.}
2330: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
2380: 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20  * Tls_Error --. 
2390: 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  *. *.Calls callb
23a0: 61 63 6b 20 77 69 74 68 20 24 66 64 20 61 6e 64  ack with $fd and
23b0: 20 24 6d 73 67 20 2d 20 73 6f 20 74 68 65 20 63   $msg - so the c
23c0: 61 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 63 69  allback can deci
23d0: 64 65 0a 20 2a 09 77 68 61 74 20 74 6f 20 64 6f  de. *.what to do
23e0: 20 77 69 74 68 20 65 72 72 6f 72 73 2e 0a 20 2a   with errors.. *
23f0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
2400: 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65  :. *.The err fie
2410: 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ld of the curren
2420: 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74  tly operative St
2430: 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20  ate is set. *.  
2440: 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63  to a string desc
2450: 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e  ribing the SSL n
2460: 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75  egotiation failu
2470: 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d 2d 2d  re reason. *----
2480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
24c0: 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72   */.void.Tls_Err
24d0: 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  or(State *stateP
24e0: 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 0a 7b  tr, char *msg).{
24f0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
2500: 64 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  dPtr;..    dprin
2510: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
2520: 20 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d     if (msg && *m
2530: 73 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72  sg) {..Tcl_SetEr
2540: 72 6f 72 43 6f 64 65 28 73 74 61 74 65 50 74 72  rorCode(statePtr
2550: 2d 3e 69 6e 74 65 72 70 2c 20 22 53 53 4c 22 2c  ->interp, "SSL",
2560: 20 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e 55   msg, (char *)NU
2570: 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  LL);.    } else 
2580: 7b 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74  {..msg = Tcl_Get
2590: 53 74 72 69 6e 67 28 54 63 6c 5f 47 65 74 4f 62  String(Tcl_GetOb
25a0: 6a 52 65 73 75 6c 74 28 73 74 61 74 65 50 74 72  jResult(statePtr
25b0: 2d 3e 69 6e 74 65 72 70 29 29 3b 0a 20 20 20 20  ->interp));.    
25c0: 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  }.    statePtr->
25d0: 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20  err = msg;..    
25e0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
25f0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
2600: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 63 68 61  bj*)NULL) {..cha
2610: 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 09  r buf[BUFSIZ];..
2620: 73 70 72 69 6e 74 66 28 62 75 66 2c 20 22 53 53  sprintf(buf, "SS
2630: 4c 20 63 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22  L channel \"%s\"
2640: 3a 20 65 72 72 6f 72 3a 20 25 73 22 2c 0a 09 20  : error: %s",.. 
2650: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
2660: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
2670: 73 65 6c 66 29 2c 20 6d 73 67 29 3b 0a 09 54 63  self), msg);..Tc
2680: 6c 5f 53 65 74 52 65 73 75 6c 74 28 20 73 74 61  l_SetResult( sta
2690: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 62  tePtr->interp, b
26a0: 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  uf, TCL_VOLATILE
26b0: 29 3b 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  );..Tcl_Backgrou
26c0: 6e 64 45 72 72 6f 72 28 20 73 74 61 74 65 50 74  ndError( statePt
26d0: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 09 72 65 74  r->interp);..ret
26e0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  urn;.    }.    c
26f0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
2700: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
2710: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20  r->callback);.. 
2720: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2730: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74  pendElement(stat
2740: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d  ePtr->interp, cm
2750: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
2760: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72  ewStringObj("err
2770: 6f 72 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  or", -1));..    
2780: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2790: 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74  dElement(statePt
27a0: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  r->interp, cmdPt
27b0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
27c0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
27d0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
27e0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
27f0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
2800: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2810: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
2820: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
2830: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2840: 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  (msg, -1));..   
2850: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
2860: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
2870: 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  Ptr->interp);.  
2880: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
2890: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
28a0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ePtr);..    Tcl_
28b0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
28c0: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 54 63  Ptr);.    if (Tc
28d0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 73 74 61 74  l_EvalObjEx(stat
28e0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d  ePtr->interp, cm
28f0: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  dPtr, TCL_EVAL_G
2900: 4c 4f 42 41 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b  LOBAL) != TCL_OK
2910: 29 20 7b 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f  ) {..Tcl_Backgro
2920: 75 6e 64 45 72 72 6f 72 28 73 74 61 74 65 50 74  undError(statePt
2930: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  r->interp);.    
2940: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
2950: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2960: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
2970: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
2980: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  atePtr);.    Tcl
2990: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
29a0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e  Data) statePtr->
29b0: 69 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  interp);.}.../*.
29c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
29d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a00: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73  -----. *. * Pass
2a10: 77 6f 72 64 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a  wordCallback --.
2a20: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65   *. *.Called whe
2a30: 6e 20 61 20 70 61 73 73 77 6f 72 64 20 69 73 20  n a password is 
2a40: 6e 65 65 64 65 64 20 74 6f 20 75 6e 70 61 63 6b  needed to unpack
2a50: 20 52 53 41 20 61 6e 64 20 50 45 4d 20 6b 65 79   RSA and PEM key
2a60: 73 2e 0a 20 2a 09 45 76 61 6c 73 20 61 6e 79 20  s.. *.Evals any 
2a70: 62 6f 75 6e 64 20 70 61 73 73 77 6f 72 64 20 73  bound password s
2a80: 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 72 6e  cript and return
2a90: 73 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 0a  s the result as.
2aa0: 20 2a 09 74 68 65 20 70 61 73 73 77 6f 72 64 20   *.the password 
2ab0: 73 74 72 69 6e 67 2e 0a 20 2a 2d 2d 2d 2d 2d 2d  string.. *------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2b00: 2f 0a 23 69 66 64 65 66 20 50 52 45 5f 4f 50 45  /.#ifdef PRE_OPE
2b10: 4e 53 53 4c 5f 30 5f 39 5f 34 0a 2f 2a 0a 20 2a  NSSL_0_9_4./*. *
2b20: 20 4e 6f 20 77 61 79 20 74 6f 20 68 61 6e 64 6c   No way to handl
2b30: 65 20 75 73 65 72 2d 64 61 74 61 20 74 68 65 72  e user-data ther
2b40: 65 66 6f 72 65 20 6e 6f 20 77 61 79 20 77 69 74  efore no way wit
2b50: 68 6f 75 74 20 61 20 67 6c 6f 62 61 6c 0a 20 2a  hout a global. *
2b60: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 61 63 63   variable to acc
2b70: 65 73 73 20 74 68 65 20 54 63 6c 20 69 6e 74 65  ess the Tcl inte
2b80: 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  rpreter..*/.stat
2b90: 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43  ic int.PasswordC
2ba0: 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75  allback(char *bu
2bb0: 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74  f, int size, int
2bc0: 20 76 65 72 69 66 79 29 0a 7b 0a 20 20 20 20 72   verify).{.    r
2bd0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 09 62  eturn -1;.    .b
2be0: 75 66 20 3d 20 62 75 66 3b 0a 09 73 69 7a 65 20  uf = buf;..size 
2bf0: 3d 20 73 69 7a 65 3b 0a 09 76 65 72 69 66 79 20  = size;..verify 
2c00: 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 23 65 6c 73  = verify;.}.#els
2c10: 65 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73  e.static int.Pas
2c20: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68  swordCallback(ch
2c30: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a  ar *buf, int siz
2c40: 65 2c 20 54 43 4c 5f 55 4e 55 53 45 44 28 69 6e  e, TCL_UNUSED(in
2c50: 74 29 20 2f 2a 20 76 65 72 69 66 79 20 2a 2f 2c  t) /* verify */,
2c60: 20 76 6f 69 64 20 2a 75 64 61 74 61 29 0a 7b 0a   void *udata).{.
2c70: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
2c80: 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr.= (State *) 
2c90: 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49  udata;.    Tcl_I
2ca0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
2cb0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2cc0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
2cd0: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 72  mdPtr;.    int r
2ce0: 65 73 75 6c 74 3b 0a 0a 20 20 20 20 64 70 72 69  esult;..    dpri
2cf0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
2d00: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
2d10: 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55  ->password == NU
2d20: 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45  LL) {..if (Tcl_E
2d30: 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74  valEx(interp, "t
2d40: 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d  ls::password", -
2d50: 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  1, TCL_EVAL_GLOB
2d60: 41 4c 29 0a 09 09 3d 3d 20 54 43 4c 5f 4f 4b 29  AL)...== TCL_OK)
2d70: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65   {..    char *re
2d80: 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c  t = (char *) Tcl
2d90: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
2da0: 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73  (interp);..    s
2db0: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
2dc0: 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b   (size_t) size);
2dd0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e  ..    return (in
2de0: 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09  t)strlen(ret);..
2df0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65  } else {..    re
2e00: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20  turn -1;..}.    
2e10: 7d 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  }..    cmdPtr = 
2e20: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
2e30: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
2e40: 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50  ord);..    Tcl_P
2e50: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
2e60: 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69  ata) statePtr->i
2e70: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
2e80: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
2e90: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
2ea0: 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
2eb0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2ec0: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c      result = Tcl
2ed0: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
2ee0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45  p, cmdPtr, TCL_E
2ef0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20  VAL_GLOBAL);.   
2f00: 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54   if (result != T
2f10: 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 42 61  CL_OK) {..Tcl_Ba
2f20: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 73 74  ckgroundError(st
2f30: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b  atePtr->interp);
2f40: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
2f50: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
2f60: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65  tr);..    Tcl_Re
2f70: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
2f80: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20  a) statePtr);.  
2f90: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
2fa0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
2fb0: 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 0a 20  Ptr->interp);.. 
2fc0: 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 3d 3d     if (result ==
2fd0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72   TCL_OK) {..char
2fe0: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29   *ret = (char *)
2ff0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
3000: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 73  sult(interp);..s
3010: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
3020: 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b   (size_t) size);
3030: 0a 09 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74  ..return (int)st
3040: 72 6c 65 6e 28 72 65 74 29 3b 0a 20 20 20 20 7d  rlen(ret);.    }
3050: 20 65 6c 73 65 20 7b 0a 09 72 65 74 75 72 6e 20   else {..return 
3060: 2d 31 3b 0a 20 20 20 20 7d 0a 7d 0a 23 65 6e 64  -1;.    }.}.#end
3070: 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  if.../*. *------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
30c0: 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d  . * CiphersObjCm
30d0: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61  d -- list availa
30e0: 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20  ble ciphers. *. 
30f0: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
3100: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70   is invoked to p
3110: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a  rocess the "tls:
3120: 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e  :ciphers" comman
3130: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61  d. *.to list ava
3140: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20  ilable ciphers, 
3150: 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f  based upon proto
3160: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a  col selected.. *
3170: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
3180: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
3190: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20  esult list.. *. 
31a0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
31b0: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e   *.constructs an
31c0: 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63  d destroys SSL c
31d0: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a  ontext (CTX). *.
31e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3220: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
3230: 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43   int.CiphersObjC
3240: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  md(.    TCL_UNUS
3250: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20  ED(void *),.    
3260: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3270: 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63  rp,.    int objc
3280: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63  ,.    Tcl_Obj.*c
3290: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20  onst objv[]).{. 
32a0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
32b0: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b  char *protocols[
32c0: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 09 22  ] = {.."ssl2",."
32d0: 73 73 6c 33 22 2c 09 22 74 6c 73 31 22 2c 09 22  ssl3",."tls1",."
32e0: 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32  tls1.1", "tls1.2
32f0: 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c  ", "tls1.3", NUL
3300: 4c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 65 6e 75  L.    };.    enu
3310: 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 09 54 4c  m protocol {..TL
3320: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33  S_SSL2, TLS_SSL3
3330: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f  , TLS_TLS1, TLS_
3340: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31  TLS1_1, TLS_TLS1
3350: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20  _2, TLS_TLS1_3, 
3360: 54 4c 53 5f 4e 4f 4e 45 0a 20 20 20 20 7d 3b 0a  TLS_NONE.    };.
3370: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
3380: 50 74 72 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  Ptr;.    SSL_CTX
3390: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ctx = NULL;.  
33a0: 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c    SSL *ssl = NUL
33b0: 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  L;.    STACK_OF(
33c0: 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b  SSL_CIPHER) *sk;
33d0: 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62  .    char *cp, b
33e0: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20  uf[BUFSIZ];.    
33f0: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f  int index, verbo
3400: 73 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72  se = 0;..    dpr
3410: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
3420: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
3430: 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 29 20 7b  2 || objc > 3) {
3440: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
3450: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
3460: 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76  jv, "protocol ?v
3470: 65 72 62 6f 73 65 3f 22 29 3b 0a 09 72 65 74 75  erbose?");..retu
3480: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3490: 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f    }.    if (Tcl_
34a0: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
34b0: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d   interp, objv[1]
34c0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72  , protocols, "pr
34d0: 6f 74 6f 63 6f 6c 22 2c 20 30 2c 0a 09 26 69 6e  otocol", 0,..&in
34e0: 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  dex) != TCL_OK) 
34f0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
3500: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
3510: 66 20 28 6f 62 6a 63 20 3e 20 32 20 26 26 20 54  f (objc > 2 && T
3520: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
3530: 6d 4f 62 6a 28 20 69 6e 74 65 72 70 2c 20 6f 62  mObj( interp, ob
3540: 6a 76 5b 32 5d 2c 0a 09 26 76 65 72 62 6f 73 65  jv[2],..&verbose
3550: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
3560: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3570: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
3580: 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63  ch ((enum protoc
3590: 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 20 20 20 20  ol)index) {.    
35a0: 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23  case TLS_SSL2:.#
35b0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  if defined(NO_SS
35c0: 4c 32 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  L2)...Tcl_Append
35d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
35e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
35f0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
3600: 29 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e  )NULL);...return
3610: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
3620: 65 0a 09 09 63 74 78 20 3d 20 53 53 4c 5f 43 54  e...ctx = SSL_CT
3630: 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65 74 68  X_new(SSLv2_meth
3640: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65  od()); break;.#e
3650: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c  ndif.    case TL
3660: 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69  S_SSL3:.#if defi
3670: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 09 09 54  ned(NO_SSL3)...T
3680: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
3690: 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f  interp, "protoco
36a0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
36b0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
36c0: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
36d0: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 63 74 78  ROR;.#else...ctx
36e0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53   = SSL_CTX_new(S
36f0: 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 29 3b 20  SLv3_method()); 
3700: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20  break;.#endif.  
3710: 20 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a    case TLS_TLS1:
3720: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
3730: 54 4c 53 31 29 0a 09 09 54 63 6c 5f 41 70 70 65  TLS1)...Tcl_Appe
3740: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3750: 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73   "protocol not s
3760: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
3770: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75   *)NULL);...retu
3780: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
3790: 6c 73 65 0a 09 09 63 74 78 20 3d 20 53 53 4c 5f  lse...ctx = SSL_
37a0: 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 6d 65  CTX_new(TLSv1_me
37b0: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a  thod()); break;.
37c0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
37d0: 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20  TLS_TLS1_1:.#if 
37e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
37f0: 31 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  1)...Tcl_AppendR
3800: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70  esult(interp, "p
3810: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
3820: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
3830: 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20  NULL);...return 
3840: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
3850: 0a 09 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58  ...ctx = SSL_CTX
3860: 5f 6e 65 77 28 54 4c 53 76 31 5f 31 5f 6d 65 74  _new(TLSv1_1_met
3870: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23  hod()); break;.#
3880: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
3890: 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64  LS_TLS1_2:.#if d
38a0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
38b0: 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  )...Tcl_AppendRe
38c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72  sult(interp, "pr
38d0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
38e0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e  rted", (char *)N
38f0: 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  ULL);...return T
3900: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
3910: 09 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f  ..ctx = SSL_CTX_
3920: 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68  new(TLSv1_2_meth
3930: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65  od()); break;.#e
3940: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c  ndif.    case TL
3950: 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65  S_TLS1_3:.#if de
3960: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
3970: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
3980: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f  ult(interp, "pro
3990: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
39a0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  ted", (char *)NU
39b0: 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  LL);...return TC
39c0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
39d0: 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e  .ctx = SSL_CTX_n
39e0: 65 77 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29  ew(TLS_method())
39f0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
3a00: 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43 54 58           SSL_CTX
3a10: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
3a20: 65 72 73 69 6f 6e 20 28 63 74 78 2c 20 54 4c 53  ersion (ctx, TLS
3a30: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20  1_3_VERSION);.  
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 53                SS
3a50: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72  L_CTX_set_max_pr
3a60: 6f 74 6f 5f 76 65 72 73 69 6f 6e 20 28 63 74 78  oto_version (ctx
3a70: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
3a80: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65  );.#endif.    de
3a90: 66 61 75 6c 74 3a 0a 09 09 62 72 65 61 6b 3b 0a  fault:...break;.
3aa0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 74      }.    if (ct
3ab0: 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  x == NULL) {..Tc
3ac0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3ad0: 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c  nterp, REASON(),
3ae0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
3af0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
3b00: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 73  OR;.    }.    ss
3b10: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29  l = SSL_new(ctx)
3b20: 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d  ;.    if (ssl ==
3b30: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
3b40: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3b50: 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  p, REASON(), (ch
3b60: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
3b70: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
3b80: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
3b90: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 62  OR;.    }.    ob
3ba0: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
3bb0: 73 74 4f 62 6a 28 20 30 2c 20 4e 55 4c 4c 29 3b  stObj( 0, NULL);
3bc0: 0a 0a 20 20 20 20 69 66 20 28 21 76 65 72 62 6f  ..    if (!verbo
3bd0: 73 65 29 20 7b 0a 09 66 6f 72 20 28 69 6e 64 65  se) {..for (inde
3be0: 78 20 3d 20 30 3b 20 3b 20 69 6e 64 65 78 2b 2b  x = 0; ; index++
3bf0: 29 20 7b 0a 09 20 20 20 20 63 70 20 3d 20 28 63  ) {..    cp = (c
3c00: 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70  har*)SSL_get_cip
3c10: 68 65 72 5f 6c 69 73 74 28 20 73 73 6c 2c 20 69  her_list( ssl, i
3c20: 6e 64 65 78 29 3b 0a 09 20 20 20 20 69 66 20 28  ndex);..    if (
3c30: 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61  cp == NULL) brea
3c40: 6b 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74  k;..    Tcl_List
3c50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3c60: 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  ( interp, objPtr
3c70: 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ,...Tcl_NewStrin
3c80: 67 4f 62 6a 28 20 63 70 2c 20 2d 31 29 20 29 3b  gObj( cp, -1) );
3c90: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..}.    } else {
3ca0: 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63  ..sk = SSL_get_c
3cb0: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 0a 09 66  iphers(ssl);...f
3cc0: 6f 72 20 28 69 6e 64 65 78 20 3d 20 30 3b 20 69  or (index = 0; i
3cd0: 6e 64 65 78 20 3c 20 73 6b 5f 53 53 4c 5f 43 49  ndex < sk_SSL_CI
3ce0: 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 6e  PHER_num(sk); in
3cf0: 64 65 78 2b 2b 29 20 7b 0a 09 20 20 20 20 73 69  dex++) {..    si
3d00: 7a 65 5f 74 20 69 3b 0a 09 20 20 20 20 53 53 4c  ze_t i;..    SSL
3d10: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
3d20: 69 6f 6e 28 20 73 6b 5f 53 53 4c 5f 43 49 50 48  ion( sk_SSL_CIPH
3d30: 45 52 5f 76 61 6c 75 65 28 20 73 6b 2c 20 69 6e  ER_value( sk, in
3d40: 64 65 78 29 2c 0a 09 09 09 09 20 20 20 20 62 75  dex),.....    bu
3d50: 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b  f, sizeof(buf));
3d60: 0a 09 20 20 20 20 66 6f 72 20 28 69 20 3d 20 73  ..    for (i = s
3d70: 74 72 6c 65 6e 28 62 75 66 29 20 2d 20 31 3b 20  trlen(buf) - 1; 
3d80: 69 20 3b 20 69 2d 2d 29 20 7b 0a 09 09 69 66 20  i ; i--) {...if 
3d90: 28 62 75 66 5b 69 5d 20 3d 3d 20 27 20 27 20 7c  (buf[i] == ' ' |
3da0: 7c 20 62 75 66 5b 69 5d 20 3d 3d 20 27 5c 6e 27  | buf[i] == '\n'
3db0: 20 7c 7c 0a 09 09 20 20 20 20 62 75 66 5b 69 5d   ||...    buf[i]
3dc0: 20 3d 3d 20 27 5c 72 27 20 7c 7c 20 62 75 66 5b   == '\r' || buf[
3dd0: 69 5d 20 3d 3d 20 27 5c 74 27 29 20 7b 0a 09 09  i] == '\t') {...
3de0: 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 27 5c 30      buf[i] = '\0
3df0: 27 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ';...} else {...
3e00: 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09      break;...}..
3e10: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 4c      }..    Tcl_L
3e20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3e30: 65 6e 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a  ent( interp, obj
3e40: 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74  Ptr,...Tcl_NewSt
3e50: 72 69 6e 67 4f 62 6a 28 20 62 75 66 2c 20 2d 31  ringObj( buf, -1
3e60: 29 20 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20  ) );..}.    }.  
3e70: 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b    SSL_free(ssl);
3e80: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65  .    SSL_CTX_fre
3e90: 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c  e(ctx);..    Tcl
3ea0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 20 69  _SetObjResult( i
3eb0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
3ec0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
3ed0: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
3ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3f20: 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f   *. * HandshakeO
3f30: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
3f40: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
3f50: 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68  sed to verify wh
3f60: 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68  ether the handsh
3f70: 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a  ake is complete.
3f80: 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a   *.or not.. *. *
3f90: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
3fa0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
3fb0: 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64  lt. 1 means hand
3fc0: 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20  shake complete, 
3fd0: 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e  0 means pending.
3fe0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
3ff0: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63  cts:. *.May forc
4000: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
4010: 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e  n to take place.
4020: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
4070: 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68  tatic int Handsh
4080: 61 6b 65 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54  akeObjCmd(.    T
4090: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a  CL_UNUSED(void *
40a0: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  ),.    Tcl_Inter
40b0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69  p *interp,.    i
40c0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c  nt objc,.    Tcl
40d0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
40e0: 5b 5d 29 0a 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e  []).{..Tcl_Chann
40f0: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65  el chan;../* The
4100: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20   channel to set 
4110: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 09 53  a mode on. */..S
4120: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09  tate *statePtr;.
4130: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65  ./* client state
4140: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20   for ssl socket 
4150: 2a 2f 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a  */..const char *
4160: 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09  errStr = NULL;..
4170: 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 09 69 6e  int ret = 1;..in
4180: 74 20 65 72 72 20 3d 20 30 3b 0a 0a 09 64 70 72  t err = 0;...dpr
4190: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
41a0: 0a 09 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29  ..if (objc != 2)
41b0: 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75   {...Tcl_WrongNu
41c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
41d0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
41e0: 29 3b 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f  );...return(TCL_
41f0: 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 68 61  ERROR);..}...cha
4200: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
4210: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
4220: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
4230: 29 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 63  ), NULL);..if (c
4240: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
4250: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  nel) NULL) {...r
4260: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
4270: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61  ;..}.../*.. * Ma
4280: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
4290: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
42a0: 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09  t channel.. */..
42b0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
42c0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
42d0: 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e  .if (Tcl_GetChan
42e0: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
42f0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
4300: 28 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65  ()) {...Tcl_Appe
4310: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4320: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
4330: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
4340: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22  lName(chan), "\"
4350: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
4360: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  nel", (char *)NU
4370: 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 28 54 43  LL);...return(TC
4380: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 09 73 74  L_ERROR);..}..st
4390: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
43a0: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
43b0: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61  InstanceData(cha
43c0: 6e 29 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43  n);...dprintf("C
43d0: 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46  alling Tls_WaitF
43e0: 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 09 72 65  orConnect");..re
43f0: 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  t = Tls_WaitForC
4400: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c  onnect(statePtr,
4410: 20 26 65 72 72 2c 20 31 29 3b 0a 09 64 70 72 69   &err, 1);..dpri
4420: 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72  ntf("Tls_WaitFor
4430: 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64  Connect returned
4440: 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 09 69  : %i", ret);...i
4450: 66 20 28 0a 09 20 20 20 20 72 65 74 20 3c 20 30  f (..    ret < 0
4460: 20 26 26 20 5c 0a 09 20 20 20 20 28 28 73 74 61   && \..    ((sta
4470: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
4480: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26  LS_TCL_ASYNC) &&
4490: 20 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 0a   err == EAGAIN).
44a0: 09 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22  .) {...dprintf("
44b0: 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72  Async set and er
44c0: 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 09  r = EAGAIN");...
44d0: 72 65 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65  ret = 0;..} else
44e0: 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a   if (ret < 0) {.
44f0: 09 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65  ..errStr = state
4500: 50 74 72 2d 3e 65 72 72 3b 0a 09 09 54 63 6c 5f  Ptr->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 09 54 63 6c 5f 53 65 74 45 72  rp);...Tcl_SetEr
4530: 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 09 69 66 20  rno(err);....if 
4540: 28 21 65 72 72 53 74 72 20 7c 7c 20 2a 65 72 72  (!errStr || *err
4550: 53 74 72 20 3d 3d 20 30 29 20 7b 0a 09 09 09 65  Str == 0) {....e
4560: 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69  rrStr = Tcl_Posi
4570: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  xError(interp);.
4580: 09 09 7d 0a 0a 09 09 54 63 6c 5f 41 70 70 65 6e  ..}....Tcl_Appen
4590: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
45a0: 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65  "handshake faile
45b0: 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63  d: ", errStr, (c
45c0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
45d0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
45e0: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74  ng TCL_ERROR wit
45f0: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c  h handshake fail
4600: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29  ed: %s", errStr)
4610: 3b 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ;...return(TCL_E
4620: 52 52 4f 52 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  RROR);..} else {
4630: 0a 09 09 69 66 20 28 65 72 72 20 21 3d 20 30 29  ...if (err != 0)
4640: 20 7b 0a 09 09 09 64 70 72 69 6e 74 66 28 22 47   {....dprintf("G
4650: 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68  ot an error with
4660: 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e   a completed han
4670: 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69  dshake: err = %i
4680: 22 2c 20 65 72 72 29 3b 0a 09 09 7d 0a 0a 09 09  ", err);...}....
4690: 72 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 64 70  ret = 1;..}...dp
46a0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
46b0: 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74   TCL_OK with dat
46c0: 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b  a \"%i\"", ret);
46d0: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
46e0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
46f0: 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a  ewIntObj(ret));.
4700: 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b  .return(TCL_OK);
4710: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
4760: 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20   * ImportObjCmd 
4770: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
4780: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
4790: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
47a0: 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a  e "ssl" command.
47b0: 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f   *. *.The ssl co
47c0: 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c  mmand pushes SSL
47d0: 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63   over a (newly c
47e0: 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f  onnected) tcp so
47f0: 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cket. *. * Resul
4800: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
4810: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
4820: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4830: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20  :. *.May modify 
4840: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
4850: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20  an IO channel.. 
4860: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
48b0: 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62  tic int.ImportOb
48c0: 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e  jCmd(.    TCL_UN
48d0: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20  USED(void *),.  
48e0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
48f0: 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62  terp,.    int ob
4900: 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  jc,.    Tcl_Obj 
4910: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b  *const objv[]).{
4920: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
4930: 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63   chan;../* The c
4940: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
4950: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  mode on. */.    
4960: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
4970: 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74  ../* client stat
4980: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
4990: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20   */.    SSL_CTX 
49a0: 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d 20 4e  *ctx.        = N
49b0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
49c0: 20 2a 73 63 72 69 70 74 09 20 20 20 20 20 20 20   *script.       
49d0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c   = NULL;.    Tcl
49e0: 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 20  _Obj *password. 
49f0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
4a00: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75     Tcl_DString u
4a10: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
4a20: 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61  lation, upperCha
4a30: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70  nnelBlocking, up
4a40: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
4a50: 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  ng, upperChannel
4a60: 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74  EOFChar;.    int
4a70: 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69   idx;.    Tcl_Si
4a80: 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20  ze len;.    int 
4a90: 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 3d  flags..        =
4aa0: 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20   TLS_TCL_INIT;. 
4ab0: 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 20     int server.. 
4ac0: 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69         = 0;./* i
4ad0: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63  s connection inc
4ae0: 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e  oming or outgoin
4af0: 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  g? */.    char *
4b00: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20  keyfile.        
4b10: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
4b20: 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 20   *certfile.     
4b30: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75     = NULL;.    u
4b40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
4b50: 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  y  .= NULL;.    
4b60: 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e  Tcl_Size key_len
4b70: 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20          = 0;.   
4b80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4b90: 63 65 72 74 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  cert     = NULL;
4ba0: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 65  .    Tcl_Size ce
4bb0: 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 3d 20 30  rt_len       = 0
4bc0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
4bd0: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ers.        = NU
4be0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41  LL;.    char *CA
4bf0: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
4c00: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43  ULL;.    char *C
4c10: 41 64 69 72 09 09 20 20 20 20 20 20 20 20 3d 20  Adir..        = 
4c20: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
4c30: 44 48 70 61 72 61 6d 73 09 20 20 20 20 20 20 20  DHparams.       
4c40: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61   = NULL;.    cha
4c50: 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20  r *model..      
4c60: 20 20 3d 20 4e 55 4c 4c 3b 0a 23 69 66 6e 64 65    = NULL;.#ifnde
4c70: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  f OPENSSL_NO_TLS
4c80: 45 58 54 0a 20 20 20 20 63 68 61 72 20 2a 73 65  EXT.    char *se
4c90: 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20 20  rvername.       
4ca0: 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74   = NULL;./* host
4cb0: 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20  name for Server 
4cc0: 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20  Name Indication 
4cd0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e  */.#endif.    in
4ce0: 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33  t ssl2 = 0, ssl3
4cf0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c   = 0;.    int tl
4d00: 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d  s1 = 1, tls1_1 =
4d10: 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20   1, tls1_2 = 1, 
4d20: 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20  tls1_3 = 1;.    
4d30: 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 3b 0a 20  int proto = 0;. 
4d40: 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20     int verify = 
4d50: 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20  0, require = 0, 
4d60: 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a 20 20  request = 1;..  
4d70: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
4d80: 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  d");..#if define
4d90: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65  d(NO_TLS1) && de
4da0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
4db0: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54   && defined(NO_T
4dc0: 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65  LS1_2) && define
4dd0: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  d(NO_SSL3) && !d
4de0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a  efined(NO_SSL2).
4df0: 20 20 20 20 73 73 6c 32 20 3d 20 31 3b 0a 23 65      ssl2 = 1;.#e
4e00: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
4e10: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66  (NO_TLS1) && def
4e20: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
4e30: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
4e40: 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64  S1_2) && defined
4e50: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65  (NO_SSL2) && !de
4e60: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20  fined(NO_SSL3). 
4e70: 20 20 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e     ssl3 = 1;.#en
4e80: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
4e90: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73  NO_TLS1).    tls
4ea0: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  1 = 0;.#endif.#i
4eb0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
4ec0: 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20  1_1).    tls1_1 
4ed0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
4ee0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
4ef0: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20  2).    tls1_2 = 
4f00: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
4f10: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
4f20: 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b  .    tls1_3 = 0;
4f30: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20  .#endif..    if 
4f40: 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63  (objc < 2) {..Tc
4f50: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
4f60: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
4f70: 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e  "channel ?option
4f80: 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  s?");..return TC
4f90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
4fa0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
4fb0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
4fc0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
4fd0: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b  objv[1]), NULL);
4fe0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
4ff0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
5000: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
5010: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5020: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d  .    /*.     * M
5030: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
5040: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
5050: 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20  st channel.     
5060: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
5070: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
5080: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20  chan);..    for 
5090: 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20  (idx = 2; idx < 
50a0: 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  objc; idx++) {..
50b0: 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f  char *opt = Tcl_
50c0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
50d0: 64 78 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b  dx]);...if (opt[
50e0: 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20  0] != '-')..    
50f0: 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 53 54 52 28  break;...OPTSTR(
5100: 20 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72   "-cadir", CAdir
5110: 29 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d 63 61  );..OPTSTR( "-ca
5120: 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a  file", CAfile);.
5130: 09 4f 50 54 53 54 52 28 20 22 2d 63 65 72 74 66  .OPTSTR( "-certf
5140: 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b  ile", certfile);
5150: 0a 09 4f 50 54 53 54 52 28 20 22 2d 63 69 70 68  ..OPTSTR( "-ciph
5160: 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09  er", ciphers);..
5170: 4f 50 54 4f 42 4a 28 20 22 2d 63 6f 6d 6d 61 6e  OPTOBJ( "-comman
5180: 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50  d", script);..OP
5190: 54 53 54 52 28 20 22 2d 64 68 70 61 72 61 6d 73  TSTR( "-dhparams
51a0: 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f  ", DHparams);..O
51b0: 50 54 53 54 52 28 20 22 2d 6b 65 79 66 69 6c 65  PTSTR( "-keyfile
51c0: 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50  ", keyfile);..OP
51d0: 54 53 54 52 28 20 22 2d 6d 6f 64 65 6c 22 2c 20  TSTR( "-model", 
51e0: 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28  model);..OPTOBJ(
51f0: 20 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61   "-password", pa
5200: 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f  ssword);..OPTBOO
5210: 4c 28 20 22 2d 72 65 71 75 69 72 65 22 2c 20 72  L( "-require", r
5220: 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f  equire);..OPTBOO
5230: 4c 28 20 22 2d 72 65 71 75 65 73 74 22 2c 20 72  L( "-request", r
5240: 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f  equest);..OPTBOO
5250: 4c 28 20 22 2d 73 65 72 76 65 72 22 2c 20 73 65  L( "-server", se
5260: 72 76 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 4f  rver);.#ifndef O
5270: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54  PENSSL_NO_TLSEXT
5280: 0a 20 20 20 20 20 20 20 20 4f 50 54 53 54 52 28  .        OPTSTR(
5290: 20 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20   "-servername", 
52a0: 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 23 65 6e  servername);.#en
52b0: 64 69 66 0a 0a 09 4f 50 54 42 4f 4f 4c 28 20 22  dif...OPTBOOL( "
52c0: 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09  -ssl2", ssl2);..
52d0: 4f 50 54 42 4f 4f 4c 28 20 22 2d 73 73 6c 33 22  OPTBOOL( "-ssl3"
52e0: 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f  , ssl3);..OPTBOO
52f0: 4c 28 20 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31  L( "-tls1", tls1
5300: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 74  );..OPTBOOL( "-t
5310: 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b  ls1.1", tls1_1);
5320: 0a 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 74 6c 73  ..OPTBOOL( "-tls
5330: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09  1.2", tls1_2);..
5340: 4f 50 54 42 4f 4f 4c 28 20 22 2d 74 6c 73 31 2e  OPTBOOL( "-tls1.
5350: 33 22 2c 20 74 6c 73 31 5f 33 29 0a 09 4f 50 54  3", tls1_3)..OPT
5360: 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65  BYTE("-cert", ce
5370: 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09  rt, cert_len);..
5380: 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20  OPTBYTE("-key", 
5390: 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 0a  key, key_len);..
53a0: 09 4f 50 54 42 41 44 28 20 22 6f 70 74 69 6f 6e  .OPTBAD( "option
53b0: 22 2c 20 22 2d 63 61 64 69 72 2c 20 2d 63 61 66  ", "-cadir, -caf
53c0: 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72  ile, -cert, -cer
53d0: 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20  tfile, -cipher, 
53e0: 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72  -command, -dhpar
53f0: 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66  ams, -key, -keyf
5400: 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61  ile, -model, -pa
5410: 73 73 77 6f 72 64 2c 20 2d 72 65 71 75 69 72 65  ssword, -require
5420: 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 73 65 72  , -request, -ser
5430: 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65  ver, -servername
5440: 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20  , -ssl2, -ssl3, 
5450: 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20  -tls1, -tls1.1, 
5460: 2d 74 6c 73 31 2e 32 2c 20 6f 72 20 74 6c 73 31  -tls1.2, or tls1
5470: 2e 33 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54  .3");...return T
5480: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5490: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 29      if (request)
54a0: 09 20 20 20 20 76 65 72 69 66 79 20 7c 3d 20 53  .    verify |= S
54b0: 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54  SL_VERIFY_CLIENT
54c0: 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49  _ONCE | SSL_VERI
54d0: 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20  FY_PEER;.    if 
54e0: 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75  (request && requ
54f0: 69 72 65 29 20 76 65 72 69 66 79 20 7c 3d 20 53  ire) verify |= S
5500: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49  SL_VERIFY_FAIL_I
5510: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a  F_NO_PEER_CERT;.
5520: 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d      if (verify =
5530: 3d 20 30 29 09 76 65 72 69 66 79 20 3d 20 53 53  = 0).verify = SS
5540: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a  L_VERIFY_NONE;..
5550: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73      proto |= (ss
5560: 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  l2 ? TLS_PROTO_S
5570: 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  SL2 : 0);.    pr
5580: 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54  oto |= (ssl3 ? T
5590: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20  LS_PROTO_SSL3 : 
55a0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
55b0: 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f   (tls1 ? TLS_PRO
55c0: 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20  TO_TLS1 : 0);.  
55d0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
55e0: 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _1 ? TLS_PROTO_T
55f0: 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20  LS1_1 : 0);.    
5600: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32  proto |= (tls1_2
5610: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
5620: 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  1_2 : 0);.    pr
5630: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f  oto |= (tls1_3 ?
5640: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
5650: 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  3 : 0);..    /* 
5660: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  reset to NULL if
5670: 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72   blank string pr
5680: 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66  ovided */.    if
5690: 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74   (cert && !*cert
56a0: 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09  )..        cert.
56b0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
56c0: 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21      if (key && !
56d0: 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b  *key)..        k
56e0: 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  ey.        = NUL
56f0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66  L;.    if (certf
5700: 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c  ile && !*certfil
5710: 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66  e)         certf
5720: 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ile.= NULL;.    
5730: 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21  if (keyfile && !
5740: 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69  *keyfile)..keyfi
5750: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
5760: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  L;.    if (ciphe
5770: 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29  rs && !*ciphers)
5780: 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73  .        ciphers
5790: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
57a0: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20  .    if (CAfile 
57b0: 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20  && !*CAfile).   
57c0: 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20       CAfile.    
57d0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
57e0: 69 66 20 28 43 41 64 69 72 20 26 26 20 21 2a 43  if (CAdir && !*C
57f0: 41 64 69 72 29 09 20 20 20 20 20 20 20 20 43 41  Adir).        CA
5800: 64 69 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55  dir.        = NU
5810: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61  LL;.    if (DHpa
5820: 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61  rams && !*DHpara
5830: 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61  ms).        DHpa
5840: 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55  rams        = NU
5850: 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20  LL;..    /* new 
5860: 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  SSL state */.   
5870: 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74   statePtr..= (St
5880: 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28  ate *) ckalloc((
5890: 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66  unsigned) sizeof
58a0: 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65  (State));.    me
58b0: 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30  mset(statePtr, 0
58c0: 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  , sizeof(State))
58d0: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  ;..    statePtr-
58e0: 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a  >flags.= flags;.
58f0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e      statePtr->in
5900: 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20  terp.= interp;. 
5910: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c     statePtr->vfl
5920: 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20  ags.= verify;.  
5930: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09    statePtr->err.
5940: 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c  = "";..    /* al
5950: 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f  locate script */
5960: 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29  .    if (script)
5970: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47   {..(void) Tcl_G
5980: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
5990: 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09  script, &len);..
59a0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
59b0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
59c0: 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20  ck = script;..  
59d0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
59e0: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  nt(statePtr->cal
59f0: 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d  lback);..}.    }
5a00: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74  ..    /* allocat
5a10: 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20  e password */.  
5a20: 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20    if (password) 
5a30: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65  {..(void) Tcl_Ge
5a40: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
5a50: 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a  assword, &len);.
5a60: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20  .if (len) {..   
5a70: 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77   statePtr->passw
5a80: 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a  ord = password;.
5a90: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
5aa0: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
5ab0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20  password);..}.  
5ac0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64    }..    if (mod
5ad0: 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  el != NULL) {..i
5ae0: 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74  nt mode;../* Get
5af0: 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e   the "model" con
5b00: 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20  text */..chan = 
5b10: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
5b20: 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d  nterp, model, &m
5b30: 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20  ode);..if (chan 
5b40: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
5b50: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c   NULL) {..    Tl
5b60: 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73  s_Free((void *)s
5b70: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
5b80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5b90: 0a 09 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 0a  ..}..        /*.
5ba0: 20 20 20 20 20 20 20 20 20 2a 20 4d 61 6b 65 20           * Make 
5bb0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
5bc0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
5bd0: 68 61 6e 6e 65 6c 0a 20 20 20 20 20 20 20 20 20  hannel.         
5be0: 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 6e 20  */.        chan 
5bf0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
5c00: 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28  nel(chan);..if (
5c10: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
5c20: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
5c30: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
5c40: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
5c50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
5c60: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
5c70: 0a 09 09 20 20 20 20 54 63 6c 5f 47 65 74 43 68  ...    Tcl_GetCh
5c80: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
5c90: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20   "\": not a TLS 
5ca0: 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20  channel", (char 
5cb0: 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c  *)NULL);..    Tl
5cc0: 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73  s_Free((void *)s
5cd0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
5ce0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5cf0: 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61  ..}..ctx = ((Sta
5d00: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  te *)Tcl_GetChan
5d10: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
5d20: 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20  chan))->ctx;.   
5d30: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28   } else {..if ((
5d40: 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73  ctx = CTX_Init(s
5d50: 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c  tatePtr, server,
5d60: 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c   proto, keyfile,
5d70: 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 0a   certfile, key,.
5d80: 20 20 20 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65      cert, key_le
5d90: 6e 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64  n, cert_len, CAd
5da0: 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68  ir, CAfile, ciph
5db0: 65 72 73 2c 0a 20 20 20 20 44 48 70 61 72 61 6d  ers,.    DHparam
5dc0: 73 29 29 20 3d 3d 20 28 53 53 4c 5f 43 54 58 2a  s)) == (SSL_CTX*
5dd0: 29 30 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46  )0) {..    Tls_F
5de0: 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74  ree((void *)stat
5df0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
5e00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
5e10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74  .    }..    stat
5e20: 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b  ePtr->ctx = ctx;
5e30: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
5e40: 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  We need to make 
5e50: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 68  sure that the ch
5e60: 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62  annel works in b
5e70: 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20  inary (for the. 
5e80: 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e      * encryption
5e90: 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66   not to get goof
5ea0: 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57  ed up)..     * W
5eb0: 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61  e only want to a
5ec0: 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 72  djust the buffer
5ed0: 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68  ing in pre-v2 ch
5ee0: 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20  annels, where.  
5ef0: 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65     * each channe
5f00: 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d  l in the stack m
5f10: 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77  aintained its ow
5f20: 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20  n buffers..     
5f30: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  */.    Tcl_DStri
5f40: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
5f50: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
5f60: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
5f70: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
5f80: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20  nelBlocking);.  
5f90: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
5fa0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  t(&upperChannelE
5fb0: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
5fc0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
5fd0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
5fe0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ng);.    Tcl_Get
5ff0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
6000: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f  terp, chan, "-eo
6010: 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68  fchar", &upperCh
6020: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20  annelEOFChar);. 
6030: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
6040: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
6050: 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67  chan, "-encoding
6060: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
6070: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54  Encoding);.    T
6080: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
6090: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
60a0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
60b0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  , &upperChannelT
60c0: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20  ranslation);.   
60d0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
60e0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
60f0: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c  an, "-blocking",
6100: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c   &upperChannelBl
6110: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  ocking);.    Tcl
6120: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
6130: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
6140: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20  "-translation", 
6150: 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54  "binary");.    T
6160: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
6170: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
6180: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22  , "-blocking", "
6190: 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69  true");.    dpri
61a0: 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54  ntf("Consuming T
61b0: 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20  cl channel %s", 
61c0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
61d0: 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73  me(chan));.    s
61e0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20  tatePtr->self = 
61f0: 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c  Tcl_StackChannel
6200: 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61  (interp, Tls_Cha
6210: 6e 6e 65 6c 54 79 70 65 28 29 2c 20 73 74 61 74  nnelType(), stat
6220: 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41  ePtr, (TCL_READA
6230: 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42  BLE | TCL_WRITAB
6240: 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20  LE), chan);.    
6250: 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64  dprintf("Created
6260: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25   channel named %
6270: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  s", Tcl_GetChann
6280: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
6290: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20  >self));.    if 
62a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20  (statePtr->self 
62b0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
62c0: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a   NULL) {../*.. *
62d0: 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45   No use of Tcl_E
62e0: 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65  ventuallyFree be
62f0: 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c  cause no possibl
6300: 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a  e Tcl_Preserve..
6310: 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28  . */..Tls_Free((
6320: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
6330: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
6340: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
6350: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
6360: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
6370: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74  tePtr->self, "-t
6380: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c  ranslation", Tcl
6390: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
63a0: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
63b0: 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63  lation));.    Tc
63c0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
63d0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
63e0: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63  Ptr->self, "-enc
63f0: 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  oding", Tcl_DStr
6400: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
6410: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29  hannelEncoding))
6420: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
6430: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
6440: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
6450: 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54  f, "-eofchar", T
6460: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
6470: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
6480: 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f  Char));.    Tcl_
6490: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
64a0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
64b0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b  r->self, "-block
64c0: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ing", Tcl_DStrin
64d0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
64e0: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a  nnelBlocking));.
64f0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
6500: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f  SL Initializatio
6510: 6e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73  n.     */..    s
6520: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53  tatePtr->ssl = S
6530: 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d  SL_new(statePtr-
6540: 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21  >ctx);.    if (!
6550: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b  statePtr->ssl) {
6560: 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79  ../* SSL library
6570: 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41   error */..Tcl_A
6580: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
6590: 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f  rp, "couldn't co
65a0: 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73  nstruct ssl sess
65b0: 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  ion: ", REASON()
65c0: 2c 0a 09 09 28 63 68 61 72 20 2a 29 20 4e 55 4c  ,...(char *) NUL
65d0: 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 76  L);..Tls_Free((v
65e0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
65f0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
6600: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  OR;.    }..#ifnd
6610: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ef OPENSSL_NO_TL
6620: 53 45 58 54 0a 20 20 20 20 69 66 20 28 73 65 72  SEXT.    if (ser
6630: 76 65 72 6e 61 6d 65 29 20 7b 0a 20 20 20 20 20  vername) {.     
6640: 20 20 20 69 66 20 28 21 53 53 4c 5f 73 65 74 5f     if (!SSL_set_
6650: 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65  tlsext_host_name
6660: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
6670: 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72  servername) && r
6680: 65 71 75 69 72 65 29 20 7b 0a 20 20 20 20 20 20  equire) {.      
6690: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
66a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
66b0: 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73 74  setting TLS host
66c0: 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20   name extension 
66d0: 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20 20 20  failed",.       
66e0: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a           (char *
66f0: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  ) NULL);.       
6700: 20 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76       Tls_Free((v
6710: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
6720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
6730: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6740: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23         }.    }.#
6750: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 0a 20 20  endif..    /*.  
6760: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63     * SSL Callbac
6770: 6b 73 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  ks.     */..    
6780: 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61  SSL_set_app_data
6790: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
67a0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
67b0: 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b  );./* point back
67c0: 20 74 6f 20 75 73 20 2a 2f 0a 0a 20 20 20 20 53   to us */..    S
67d0: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74  SL_set_verify(st
67e0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72  atePtr->ssl, ver
67f0: 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62  ify, VerifyCallb
6800: 61 63 6b 29 3b 0a 0a 20 20 20 20 53 53 4c 5f 43  ack);..    SSL_C
6810: 54 58 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c  TX_set_info_call
6820: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
6830: 74 78 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  tx, InfoCallback
6840: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  );..    /* Creat
6850: 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49  e Tcl_Channel BI
6860: 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20  O Handler */.   
6870: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
6880: 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73  .= BIO_new_tcl(s
6890: 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43  tatePtr, BIO_NOC
68a0: 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65  LOSE);.    state
68b0: 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e  Ptr->bio.= BIO_n
68c0: 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b  ew(BIO_f_ssl());
68d0: 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72  ..    if (server
68e0: 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66  ) {..statePtr->f
68f0: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f  lags |= TLS_TCL_
6900: 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74  SERVER;..SSL_set
6910: 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74  _accept_state(st
6920: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
6930: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 53 53 4c 5f    } else {..SSL_
6940: 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74  set_connect_stat
6950: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
6960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f  ;.    }.    SSL_
6970: 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72  set_bio(statePtr
6980: 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d  ->ssl, statePtr-
6990: 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72  >p_bio, statePtr
69a0: 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49  ->p_bio);.    BI
69b0: 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50  O_set_ssl(stateP
69c0: 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74  tr->bio, statePt
69d0: 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c  r->ssl, BIO_NOCL
69e0: 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  OSE);..    /*.  
69f0: 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20     * End of SSL 
6a00: 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20  Init.     */.   
6a10: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
6a20: 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74  ing %s", Tcl_Get
6a30: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
6a40: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20  ePtr->self));.  
6a50: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
6a60: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
6a70: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
6a80: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
6a90: 6c 66 29 2c 0a 09 20 20 20 20 54 43 4c 5f 56 4f  lf),..    TCL_VO
6aa0: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74  LATILE);.    ret
6ab0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
6ac0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55  --------. *. * U
6b10: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d  nimportObjCmd --
6b20: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
6b30: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
6b40: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
6b50: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66  opmost channel f
6b60: 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73  ilter.. *. * Res
6b70: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
6b80: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
6b90: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
6ba0: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66  ts:. *.May modif
6bb0: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  y the behavior o
6bc0: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e  f an IO channel.
6bd0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
6c20: 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f  tatic int.Unimpo
6c30: 72 74 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43  rtObjCmd(.    TC
6c40: 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29  L_UNUSED(void *)
6c50: 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ,.    Tcl_Interp
6c60: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e   *interp,.    in
6c70: 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f  t objc,.    Tcl_
6c80: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
6c90: 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]).{.    Tcl_Cha
6ca0: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54  nnel chan;../* T
6cb0: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65  he channel to se
6cc0: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a  t a mode on. */.
6cd0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
6ce0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
6cf0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
6d00: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
6d10: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
6d20: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65   "channel");..re
6d30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6d40: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20      }..    chan 
6d50: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
6d60: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
6d70: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
6d80: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
6d90: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
6da0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
6db0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6dc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
6dd0: 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20      * Make sure 
6de0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
6df0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
6e00: 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  l.     */.    ch
6e10: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
6e20: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20  hannel(chan);.. 
6e30: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
6e40: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
6e50: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
6e60: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
6e70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6e80: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
6e90: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
6ea0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
6eb0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
6ec0: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
6ed0: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20  )NULL);..return 
6ee0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6ef0: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e  ..    if (Tcl_Un
6f00: 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  stackChannel(int
6f10: 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43  erp, chan) == TC
6f20: 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75  L_ERROR) {..retu
6f30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6f40: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
6f50: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
6f60: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fa0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49  ----. *. * CTX_I
6fb0: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74  nit -- construct
6fc0: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61   a SSL_CTX insta
6fd0: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nce. *. * Result
6fe0: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53  s:. *.A valid SS
6ff0: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f  L_CTX instance o
7000: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69  r NULL.. *. * Si
7010: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63  de effects:. *.c
7020: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f  onstructs SSL co
7030: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20  ntext (CTX). *. 
7040: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
7050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7080: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
7090: 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49   SSL_CTX *.CTX_I
70a0: 6e 69 74 28 0a 20 20 20 20 53 74 61 74 65 20 2a  nit(.    State *
70b0: 73 74 61 74 65 50 74 72 2c 0a 20 20 20 20 54 43  statePtr,.    TC
70c0: 4c 5f 55 4e 55 53 45 44 28 69 6e 74 29 20 2f 2a  L_UNUSED(int) /*
70d0: 20 69 73 53 65 72 76 65 72 20 2a 2f 2c 0a 20 20   isServer */,.  
70e0: 20 20 69 6e 74 20 70 72 6f 74 6f 2c 0a 20 20 20    int proto,.   
70f0: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 0a   char *keyfile,.
7100: 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69      char *certfi
7110: 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  le,.    unsigned
7120: 20 63 68 61 72 20 2a 6b 65 79 2c 0a 20 20 20 20   char *key,.    
7130: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
7140: 65 72 74 2c 0a 20 20 20 20 69 6e 74 20 6b 65 79  ert,.    int key
7150: 5f 6c 65 6e 2c 0a 20 20 20 20 69 6e 74 20 63 65  _len,.    int ce
7160: 72 74 5f 6c 65 6e 2c 0a 20 20 20 20 63 68 61 72  rt_len,.    char
7170: 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61   *CAdir,.    cha
7180: 72 20 2a 43 41 66 69 6c 65 2c 0a 20 20 20 20 63  r *CAfile,.    c
7190: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 0a 20 20  har *ciphers,.  
71a0: 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73    char *DHparams
71b0: 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  ).{.    Tcl_Inte
71c0: 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61  rp *interp = sta
71d0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
71e0: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20     SSL_CTX *ctx 
71f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
7200: 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20  DString ds;.    
7210: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b  Tcl_DString ds1;
7220: 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30  .    int off = 0
7230: 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70  ;.    int load_p
7240: 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20  rivate_key;.    
7250: 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44  const SSL_METHOD
7260: 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64   *method;..    d
7270: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
7280: 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74  ;..    if (!prot
7290: 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  o) {..Tcl_Append
72a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
72b0: 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f  no valid protoco
72c0: 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68  l selected", (ch
72d0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74  ar *)NULL);..ret
72e0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30  urn (SSL_CTX *)0
72f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7300: 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65  create SSL conte
7310: 78 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  xt */.#if define
7320: 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69  d(NO_SSL2).    i
7330: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
7340: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  , TLS_PROTO_SSL2
7350: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
7360: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7370: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
7380: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
7390: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20  )NULL);..return 
73a0: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20  (SSL_CTX *)0;.  
73b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
73c0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a  efined(NO_SSL3).
73d0: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
73e0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
73f0: 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41  _SSL3)) {..Tcl_A
7400: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7410: 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f  rp, "protocol no
7420: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
7430: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
7440: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29  turn (SSL_CTX *)
7450: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  0;.    }.#endif.
7460: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
7470: 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41  LS1).    if (ENA
7480: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
7490: 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09  PROTO_TLS1)) {..
74a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
74b0: 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63  (interp, "protoc
74c0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
74d0: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
74e0: 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43  ;..return (SSL_C
74f0: 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65  TX *)0;.    }.#e
7500: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
7510: 28 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20  (NO_TLS1_1).    
7520: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
7530: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
7540: 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  1_1)) {..Tcl_App
7550: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7560: 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  , "protocol not 
7570: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
7580: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
7590: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b  rn (SSL_CTX *)0;
75a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
75b0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
75c0: 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41  1_2).    if (ENA
75d0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
75e0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b  PROTO_TLS1_2)) {
75f0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
7600: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74  lt(interp, "prot
7610: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
7620: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  ed", (char *)NUL
7630: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c  L);..return (SSL
7640: 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a  _CTX *)0;.    }.
7650: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
7660: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  ed(NO_TLS1_3).  
7670: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
7680: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
7690: 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41  LS1_3)) {..Tcl_A
76a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
76b0: 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f  rp, "protocol no
76c0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
76d0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
76e0: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29  turn (SSL_CTX *)
76f0: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  0;.    }.#endif.
7700: 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f  .    switch (pro
7710: 74 6f 29 20 7b 0a 23 69 66 20 21 64 65 66 69 6e  to) {.#if !defin
7720: 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20  ed(NO_SSL2).    
7730: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  case TLS_PROTO_S
7740: 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 53  SL2:..method = S
7750: 53 4c 76 32 5f 6d 65 74 68 6f 64 20 28 29 3b 0a  SLv2_method ();.
7760: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
7770: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
7780: 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c  SL3).    case TL
7790: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d  S_PROTO_SSL3:..m
77a0: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65  ethod = SSLv3_me
77b0: 74 68 6f 64 20 28 29 3b 0a 09 62 72 65 61 6b 3b  thod ();..break;
77c0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
77d0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 0a 20 20  ined(NO_TLS1).  
77e0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
77f0: 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d  _TLS1:..method =
7800: 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 20 28 29   TLSv1_method ()
7810: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
7820: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
7830: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 63 61 73  _TLS1_1).    cas
7840: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
7850: 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c  _1:..method = TL
7860: 53 76 31 5f 31 5f 6d 65 74 68 6f 64 20 28 29 3b  Sv1_1_method ();
7870: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
7880: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
7890: 54 4c 53 31 5f 32 29 0a 20 20 20 20 63 61 73 65  TLS1_2).    case
78a0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
78b0: 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53  2:..method = TLS
78c0: 76 31 5f 32 5f 6d 65 74 68 6f 64 20 28 29 3b 0a  v1_2_method ();.
78d0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
78e0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
78f0: 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20  LS1_3).    case 
7900: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
7910: 3a 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20  :.        /*.   
7920: 20 20 20 20 20 20 2a 20 54 68 65 20 76 65 72 73        * The vers
7930: 69 6f 6e 20 72 61 6e 67 65 20 69 73 20 63 6f 6e  ion range is con
7940: 73 74 72 61 69 6e 65 64 20 62 65 6c 6f 77 2c 0a  strained below,.
7950: 20 20 20 20 20 20 20 20 20 2a 20 61 66 74 65 72           * after
7960: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 69 73 20   the context is 
7970: 63 72 65 61 74 65 64 2e 20 20 55 73 65 20 74 68  created.  Use th
7980: 65 0a 20 20 20 20 20 20 20 20 20 2a 20 67 65 6e  e.         * gen
7990: 65 72 69 63 20 6d 65 74 68 6f 64 20 68 65 72 65  eric method here
79a0: 2e 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 09 6d  ..         */..m
79b0: 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68  ethod = TLS_meth
79c0: 6f 64 20 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  od ();..break;.#
79d0: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
79e0: 74 3a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 54  t:.#ifdef HAVE_T
79f0: 4c 53 5f 4d 45 54 48 4f 44 0a 20 20 20 20 20 20  LS_METHOD.      
7a00: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d    method = TLS_m
7a10: 65 74 68 6f 64 20 28 29 3b 0a 23 65 6c 73 65 0a  ethod ();.#else.
7a20: 20 20 20 20 20 20 20 20 6d 65 74 68 6f 64 20 3d          method =
7a30: 20 53 53 4c 76 32 33 5f 6d 65 74 68 6f 64 20 28   SSLv23_method (
7a40: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
7a50: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a  efined(NO_SSL2).
7a60: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
7a70: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
7a80: 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20  O_SSL2)   ? 0 : 
7a90: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29  SSL_OP_NO_SSLv2)
7aa0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
7ab0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 09  fined(NO_SSL3)..
7ac0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
7ad0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
7ae0: 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53  _SSL3)   ? 0 : S
7af0: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b  SL_OP_NO_SSLv3);
7b00: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
7b10: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 0a 09 6f  ined(NO_TLS1)..o
7b20: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
7b30: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
7b40: 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53  TLS1)   ? 0 : SS
7b50: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a  L_OP_NO_TLSv1);.
7b60: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
7b70: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09  ned(NO_TLS1_1)..
7b80: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
7b90: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
7ba0: 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53  _TLS1_1) ? 0 : S
7bb0: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31  SL_OP_NO_TLSv1_1
7bc0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
7bd0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
7be0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
7bf0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
7c00: 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20  OTO_TLS1_2) ? 0 
7c10: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
7c20: 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  1_2);.#endif.#if
7c30: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
7c40: 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  1_3)..off |= (EN
7c50: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
7c60: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f  _PROTO_TLS1_3) ?
7c70: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54   0 : SSL_OP_NO_T
7c80: 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a  LSv1_3);.#endif.
7c90: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20  .break;.    }.. 
7ca0: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
7cb0: 5f 6e 65 77 20 28 6d 65 74 68 6f 64 29 3b 0a 0a  _new (method);..
7cc0: 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a      if (!ctx) {.
7cd0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 4e          return(N
7ce0: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  ULL);.    }..#if
7cf0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
7d00: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f  1_3).    if (pro
7d10: 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f  to == TLS_PROTO_
7d20: 54 4c 53 31 5f 33 29 20 7b 0a 20 20 20 20 20 20  TLS1_3) {.      
7d30: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69    SSL_CTX_set_mi
7d40: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 20  n_proto_version 
7d50: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
7d60: 53 49 4f 4e 29 3b 0a 20 20 20 20 20 20 20 20 53  SION);.        S
7d70: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
7d80: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 20 28 63 74  roto_version (ct
7d90: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f  x, TLS1_3_VERSIO
7da0: 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  N);.    }.#endif
7db0: 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
7dc0: 74 5f 61 70 70 5f 64 61 74 61 28 20 63 74 78 2c  t_app_data( ctx,
7dd0: 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b   (void*)interp);
7de0: 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65  ./* remember the
7df0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a   interpreter */.
7e00: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
7e10: 6f 70 74 69 6f 6e 73 28 20 63 74 78 2c 20 53 53  options( ctx, SS
7e20: 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c  L_OP_ALL);./* al
7e30: 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72  l SSL bug workar
7e40: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c  ounds */.    SSL
7e50: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
7e60: 28 20 63 74 78 2c 20 6f 66 66 29 3b 09 2f 2a 20  ( ctx, off);./* 
7e70: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b  all SSL bug work
7e80: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53  arounds */.    S
7e90: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f  SL_CTX_sess_set_
7ea0: 63 61 63 68 65 5f 73 69 7a 65 28 20 63 74 78 2c  cache_size( ctx,
7eb0: 20 31 32 38 29 3b 0a 0a 20 20 20 20 69 66 20 28   128);..    if (
7ec0: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29  ciphers != NULL)
7ed0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69  ..SSL_CTX_set_ci
7ee0: 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63  pher_list(ctx, c
7ef0: 69 70 68 65 72 73 29 3b 0a 0a 20 20 20 20 2f 2a  iphers);..    /*
7f00: 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61   set some callba
7f10: 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  cks */.    SSL_C
7f20: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70  TX_set_default_p
7f30: 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61  asswd_cb(ctx, Pa
7f40: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b  sswordCallback);
7f50: 0a 0a 23 69 66 6e 64 65 66 20 42 53 41 46 45 0a  ..#ifndef BSAFE.
7f60: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
7f70: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63  default_passwd_c
7f80: 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20  b_userdata(ctx, 
7f90: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
7fa0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  );.#endif..    /
7fb0: 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d  * read a Diffie-
7fc0: 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65  Hellman paramete
7fd0: 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20  rs file, or use 
7fe0: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65  the built-in one
7ff0: 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53   */.#ifdef OPENS
8000: 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20  SL_NO_DH.    if 
8010: 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c  (DHparams != NUL
8020: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
8030: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09  Result(interp,..
8040: 20 20 20 20 22 44 48 20 70 61 72 61 6d 65 74 65      "DH paramete
8050: 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76  r support not av
8060: 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20  ailable", (char 
8070: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43  *) NULL);..SSL_C
8080: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72  TX_free(ctx);..r
8090: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
80a0: 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  )0;.    }.#else.
80b0: 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09      {..DH* dh;..
80c0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20  if (DHparams != 
80d0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f  NULL) {..    BIO
80e0: 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f   *bio;..    Tcl_
80f0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
8100: 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f  ;..    bio = BIO
8110: 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48  _new_file(F2N(DH
8120: 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72  params, &ds), "r
8130: 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69  ");..    if (!bi
8140: 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69  o) {...Tcl_DStri
8150: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54  ngFree(&ds);...T
8160: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8170: 69 6e 74 65 72 70 2c 0a 09 09 20 20 20 20 22 43  interp,...    "C
8180: 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48  ould not find DH
8190: 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65   parameters file
81a0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
81b0: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
81c0: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
81d0: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09   (SSL_CTX *)0;..
81e0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d      }...    dh =
81f0: 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48   PEM_read_bio_DH
8200: 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c  params(bio, NULL
8210: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
8220: 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f      BIO_free(bio
8230: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  );..    Tcl_DStr
8240: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
8250: 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09     if (!dh) {...
8260: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8270: 28 69 6e 74 65 72 70 2c 0a 09 09 20 20 20 20 22  (interp,...    "
8280: 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44  Could not read D
8290: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f  H parameters fro
82a0: 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a  m file", (char *
82b0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  ) NULL);...SSL_C
82c0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
82d0: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20  return (SSL_CTX 
82e0: 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65  *)0;..    }..} e
82f0: 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 20 3d 20  lse {..    dh = 
8300: 67 65 74 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a  get_dhParams();.
8310: 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  .}..SSL_CTX_set_
8320: 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b  tmp_dh(ctx, dh);
8330: 0a 09 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 20  ..DH_free(dh);. 
8340: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
8350: 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74   /* set our cert
8360: 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c  ificate */.    l
8370: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20  oad_private_key 
8380: 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72  = 0;.    if (cer
8390: 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  tfile != NULL) {
83a0: 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b  ..load_private_k
83b0: 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53  ey = 1;...Tcl_DS
83c0: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
83d0: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
83e0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
83f0: 6c 65 28 63 74 78 2c 20 46 32 4e 28 20 63 65 72  le(ctx, F2N( cer
8400: 74 66 69 6c 65 2c 20 26 64 73 29 2c 0a 09 09 09  tfile, &ds),....
8410: 09 09 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  ..SSL_FILETYPE_P
8420: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  EM) <= 0) {..   
8430: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
8440: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
8450: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8460: 65 72 70 2c 0a 09 09 09 20 20 20 20 20 22 75 6e  erp,....     "un
8470: 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74  able to set cert
8480: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20  ificate file ", 
8490: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a  certfile, ": ",.
84a0: 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29  ...     REASON()
84b0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
84c0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
84d0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
84e0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
84f0: 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  )0;..}.    } els
8500: 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55  e if (cert != NU
8510: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
8520: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66  ate_key = 1;..if
8530: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
8540: 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63  rtificate_ASN1(c
8550: 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65  tx, cert_len, ce
8560: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  rt) <= 0) {..   
8570: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
8580: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
8590: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
85a0: 65 72 70 2c 0a 09 09 09 20 20 20 20 20 22 75 6e  erp,....     "un
85b0: 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74  able to set cert
85c0: 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 09 20  ificate: ",.... 
85d0: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63      REASON(), (c
85e0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
85f0: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
8600: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
8610: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a  n (SSL_CTX *)0;.
8620: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
8630: 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61  .certfile = (cha
8640: 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61  r*)X509_get_defa
8650: 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b  ult_cert_file();
8660: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ...if (SSL_CTX_u
8670: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66  se_certificate_f
8680: 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c  ile(ctx, certfil
8690: 65 2c 0a 09 09 09 09 09 53 53 4c 5f 46 49 4c 45  e,......SSL_FILE
86a0: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
86b0: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c  {.#if 0..    Tcl
86c0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
86d0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  );..    Tcl_Appe
86e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
86f0: 0a 09 09 09 20 20 20 20 20 22 75 6e 61 62 6c 65  ....     "unable
8700: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20   to use default 
8710: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65  certificate file
8720: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a   ", certfile, ":
8730: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53   ",....     REAS
8740: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
8750: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
8760: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
8770: 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43     return (SSL_C
8780: 54 58 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 09  TX *)0;.#endif..
8790: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
87a0: 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20  set our private 
87b0: 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c  key */.    if (l
87c0: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29  oad_private_key)
87d0: 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20   {..if (keyfile 
87e0: 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d  == NULL && key =
87f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b  = NULL) {..    k
8800: 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c  eyfile = certfil
8810: 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66  e;..}...if (keyf
8820: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
8830: 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70      /* get the p
8840: 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63  rivate key assoc
8850: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
8860: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
8870: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20      if (keyfile 
8880: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79  == NULL) {...key
8890: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b  file = certfile;
88a0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
88b0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72   (SSL_CTX_use_Pr
88c0: 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74  ivateKey_file(ct
88d0: 78 2c 20 46 32 4e 28 20 6b 65 79 66 69 6c 65 2c  x, F2N( keyfile,
88e0: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54   &ds), SSL_FILET
88f0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
8900: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
8910: 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c  ee(&ds);.../* fl
8920: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61  ush the passphra
8930: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  se which might b
8940: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65  e left in the re
8950: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65  sult */...Tcl_Se
8960: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
8970: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43  NULL, TCL_STATIC
8980: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  );...Tcl_AppendR
8990: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09 09  esult(interp,...
89a0: 09 20 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c  .         "unabl
89b0: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20  e to set public 
89c0: 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66  key file ", keyf
89d0: 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20  ile, " ",....   
89e0: 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20        REASON(), 
89f0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
8a00: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
8a10: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 53  tx);...return (S
8a20: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 20  SL_CTX *)0;..   
8a30: 20 7d 0a 0a 09 20 20 20 20 54 63 6c 5f 44 53 74   }...    Tcl_DSt
8a40: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
8a50: 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21  } else if (key !
8a60: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69  = NULL) {..    i
8a70: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50  f (SSL_CTX_use_P
8a80: 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45  rivateKey_ASN1(E
8a90: 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78  VP_PKEY_RSA, ctx
8aa0: 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c  , key,key_len) <
8ab0: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74  = 0) {...Tcl_DSt
8ac0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
8ad0: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61  ./* flush the pa
8ae0: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d  ssphrase which m
8af0: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
8b00: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09  the result */...
8b10: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
8b20: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f  terp, NULL, TCL_
8b30: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41  STATIC);...Tcl_A
8b40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8b50: 72 70 2c 0a 09 09 20 20 20 20 20 20 20 20 20 20  rp,...          
8b60: 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
8b70: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79  o set public key
8b80: 3a 20 22 2c 0a 09 09 20 20 20 20 20 20 20 20 20  : ",...         
8b90: 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29          REASON()
8ba0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
8bb0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
8bc0: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
8bd0: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20  (SSL_CTX *)0;.. 
8be0: 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20     }..}../* Now 
8bf0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b  we know that a k
8c00: 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 65  ey and cert have
8c10: 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e 73   been set agains
8c20: 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63 6f  t.. * the SSL co
8c30: 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 53  ntext */..if (!S
8c40: 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 69  SL_CTX_check_pri
8c50: 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20 7b  vate_key(ctx)) {
8c60: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
8c70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09  Result(interp,..
8c80: 09 09 20 20 20 20 20 22 70 72 69 76 61 74 65 20  ..     "private 
8c90: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
8ca0: 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61  ch the certifica
8cb0: 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a  te public key",.
8cc0: 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29  ...     (char *)
8cd0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
8ce0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
8cf0: 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c  .    return (SSL
8d00: 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20  _CTX *)0;..}.   
8d10: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 76   }..    /* Set v
8d20: 65 72 69 66 69 63 61 74 69 6f 6e 20 43 41 73 20  erification CAs 
8d30: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  */.    Tcl_DStri
8d40: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 20  ngInit(&ds);.   
8d50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
8d60: 28 26 64 73 31 29 3b 0a 20 20 20 20 69 66 20 28  (&ds1);.    if (
8d70: 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65  !SSL_CTX_load_ve
8d80: 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63  rify_locations(c
8d90: 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20  tx, F2N(CAfile, 
8da0: 26 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c  &ds), F2N(CAdir,
8db0: 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c   &ds1)) ||..!SSL
8dc0: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
8dd0: 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74  _verify_paths(ct
8de0: 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c  x)) {.#if 0..Tcl
8df0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
8e00: 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  );..Tcl_DStringF
8e10: 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44  ree(&ds1);../* D
8e20: 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63  on't currently c
8e30: 61 72 65 20 69 66 20 74 68 69 73 20 66 61 69 6c  are if this fail
8e40: 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64  s */..Tcl_Append
8e50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8e60: 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69  SSL default veri
8e70: 66 79 20 70 61 74 68 73 3a 20 22 2c 0a 09 09 52  fy paths: ",...R
8e80: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
8e90: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
8ea0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
8eb0: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29  turn (SSL_CTX *)
8ec0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  0;.#endif.    }.
8ed0: 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f  .    /* https://
8ee0: 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f  sourceforge.net/
8ef0: 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a  p/tls/bugs/57/ *
8f00: 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44  /.    /* XXX:TOD
8f10: 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20  O: Let the user 
8f20: 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65  supply values he
8f30: 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f  re instead of so
8f40: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69  mething that exi
8f50: 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sts on the files
8f60: 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20  ystem */.    if 
8f70: 28 20 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  ( CAfile != NULL
8f80: 20 29 20 7b 0a 20 20 20 20 20 20 20 20 53 54 41   ) {.        STA
8f90: 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29  CK_OF(X509_NAME)
8fa0: 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53   *certNames = SS
8fb0: 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41  L_load_client_CA
8fc0: 5f 66 69 6c 65 28 20 46 32 4e 28 43 41 66 69 6c  _file( F2N(CAfil
8fd0: 65 2c 20 26 64 73 29 20 29 3b 0a 09 69 66 20 28  e, &ds) );..if (
8fe0: 20 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55   certNames != NU
8ff0: 4c 4c 20 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  LL ) {..    SSL_
9000: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43  CTX_set_client_C
9010: 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74  A_list(ctx, cert
9020: 4e 61 6d 65 73 20 29 3b 0a 09 7d 0a 20 20 20 20  Names );..}.    
9030: 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
9040: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20  ngFree(&ds);.   
9050: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
9060: 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75  (&ds1);.    retu
9070: 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn ctx;.}.../*. 
9080: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
9090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90c0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75  ----. *. * Statu
90d0: 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  sObjCmd -- retur
90e0: 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f  n certificate fo
90f0: 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72  r connected peer
9100: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
9110: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
9120: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
9130: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
9140: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
9150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9190: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
91a0: 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 0a 20 20  StatusObjCmd(.  
91b0: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69    TCL_UNUSED(voi
91c0: 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e  d *),.    Tcl_In
91d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
91e0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20    int objc,.    
91f0: 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e 73 74 20 6f  Tcl_Obj.*const o
9200: 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 53 74 61  bjv[]).{.    Sta
9210: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20  te *statePtr;.  
9220: 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20    X509 *peer;.  
9230: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
9240: 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  r;.    Tcl_Chann
9250: 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61  el chan;.    cha
9260: 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20  r *channelName, 
9270: 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e  *ciphers;.    in
9280: 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72  t mode;..    dpr
9290: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
92a0: 0a 20 20 20 20 73 77 69 74 63 68 20 28 6f 62 6a  .    switch (obj
92b0: 63 29 20 7b 0a 09 63 61 73 65 20 32 3a 0a 09 20  c) {..case 2:.. 
92c0: 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d     channelName =
92d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
92e0: 62 6a 76 5b 31 5d 29 3b 0a 09 20 20 20 20 62 72  bjv[1]);..    br
92f0: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 33 3a 0a 09  eak;...case 3:..
9300: 20 20 20 20 69 66 20 28 21 73 74 72 63 6d 70 20      if (!strcmp 
9310: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 20 28  (Tcl_GetString (
9320: 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61  objv[1]), "-loca
9330: 6c 22 29 29 20 7b 0a 09 09 63 68 61 6e 6e 65 6c  l")) {...channel
9340: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
9350: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 09  ring(objv[2]);..
9360: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09  .break;..    }..
9370: 20 20 20 20 2f 2a 20 66 61 6c 6c 74 68 72 6f 75      /* fallthrou
9380: 67 68 20 2a 2f 0a 09 64 65 66 61 75 6c 74 3a 0a  gh */..default:.
9390: 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
93a0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
93b0: 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f   objv, "?-local?
93c0: 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20   channel");..   
93d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
93e0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68  R;.    }..    ch
93f0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
9400: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  nel(interp, chan
9410: 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b  nelName, &mode);
9420: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
9430: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
9440: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
9450: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
9460: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61      /*.     * Ma
9470: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
9480: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
9490: 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a  t channel.     *
94a0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
94b0: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
94c0: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
94d0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
94e0: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
94f0: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
9500: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9510: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
9520: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
9530: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
9540: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20  an),..."\": not 
9550: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
9560: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
9570: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9580: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74  ;.    }.    stat
9590: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
95a0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49   Tcl_GetChannelI
95b0: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
95c0: 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  );.    if (objc 
95d0: 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20  == 2) {..peer = 
95e0: 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72  SSL_get_peer_cer
95f0: 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74  tificate(statePt
9600: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65  r->ssl);.    } e
9610: 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53  lse {..peer = SS
9620: 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 74  L_get_certificat
9630: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
9640: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
9650: 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20  peer) {..objPtr 
9660: 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a  = Tls_NewX509Obj
9670: 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a  (interp, peer);.
9680: 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20  .if (objc == 2) 
9690: 7b 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72  { X509_free(peer
96a0: 29 3b 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ); }.    } else 
96b0: 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f  {..objPtr = Tcl_
96c0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
96d0: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LL);.    }..    
96e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
96f0: 64 45 6c 65 6d 65 6e 74 20 28 69 6e 74 65 72 70  dElement (interp
9700: 2c 20 6f 62 6a 50 74 72 2c 0a 09 20 20 20 20 54  , objPtr,..    T
9710: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 20  cl_NewStringObj 
9720: 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a  ("sbits", -1));.
9730: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
9740: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 20 28 69 6e  ppendElement (in
9750: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 20  terp, objPtr,.. 
9760: 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a     Tcl_NewIntObj
9770: 20 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72   (SSL_get_cipher
9780: 5f 62 69 74 73 20 28 73 74 61 74 65 50 74 72 2d  _bits (statePtr-
9790: 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a  >ssl, NULL)));..
97a0: 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 63      ciphers = (c
97b0: 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70  har*)SSL_get_cip
97c0: 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73  her(statePtr->ss
97d0: 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68  l);.    if (ciph
97e0: 65 72 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 73  ers != NULL && s
97f0: 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c 20 22  trcmp(ciphers, "
9800: 28 4e 4f 4e 45 29 22 29 21 3d 30 29 20 7b 0a 09  (NONE)")!=0) {..
9810: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
9820: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
9830: 20 6f 62 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e   objPtr,...Tcl_N
9840: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70  ewStringObj("cip
9850: 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  her", -1));..Tcl
9860: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
9870: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
9880: 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53  jPtr,...Tcl_NewS
9890: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74  tringObj(SSL_get
98a0: 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72  _cipher(statePtr
98b0: 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20  ->ssl), -1));.  
98c0: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73    }..    Tcl_Lis
98d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
98e0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
98f0: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  ,..Tcl_NewString
9900: 4f 62 6a 28 22 76 65 72 73 69 6f 6e 22 2c 20 2d  Obj("version", -
9910: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
9920: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
9930: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
9940: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  ,..Tcl_NewString
9950: 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73  Obj(SSL_get_vers
9960: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ion(statePtr->ss
9970: 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54  l), -1));..    T
9980: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
9990: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29   interp, objPtr)
99a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
99b0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
99c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a00: 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f  -. *. * VersionO
9a10: 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
9a20: 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
9a30: 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a  rom OpenSSL.. *.
9a40: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
9a50: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
9a60: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
9a70: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
9a80: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
9a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
9ad0: 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69  static int.Versi
9ae0: 6f 6e 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43  onObjCmd(.    TC
9af0: 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29  L_UNUSED(void *)
9b00: 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ,.    Tcl_Interp
9b10: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 54 43   *interp,.    TC
9b20: 4c 5f 55 4e 55 53 45 44 28 69 6e 74 29 20 2f 2a  L_UNUSED(int) /*
9b30: 20 6f 62 6a 63 20 2a 2f 2c 0a 20 20 20 20 54 43   objc */,.    TC
9b40: 4c 5f 55 4e 55 53 45 44 28 54 63 6c 5f 4f 62 6a  L_UNUSED(Tcl_Obj
9b50: 20 2a 63 6f 6e 73 74 20 2a 29 20 2f 2a 20 6f 62   *const *) /* ob
9b60: 6a 76 20 2a 2f 29 0a 7b 0a 20 20 20 20 54 63 6c  jv */).{.    Tcl
9b70: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20  _Obj *objPtr;.. 
9b80: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
9b90: 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74  ed");..    objPt
9ba0: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
9bb0: 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52  gObj(OPENSSL_VER
9bc0: 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a  SION_TEXT, -1);.
9bd0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
9be0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
9bf0: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
9c00: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
9c10: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
9c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c50: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73  ------. *. * Mis
9c60: 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20  cObjCmd -- misc 
9c70: 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52  commands. *. * R
9c80: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
9c90: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
9ca0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
9cb0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
9cc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
9cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d00: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
9d10: 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d  ic int.MiscObjCm
9d20: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
9d30: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
9d40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9d50: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  p,.    int objc,
9d60: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f  .    Tcl_Obj.*co
9d70: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20  nst objv[]).{.  
9d80: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
9d90: 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d  har *commands []
9da0: 20 3d 20 7b 20 22 72 65 71 22 2c 20 4e 55 4c 4c   = { "req", NULL
9db0: 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d   };.    enum com
9dc0: 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f  mand { C_REQ, C_
9dd0: 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74  DUMMY };.    int
9de0: 20 63 6d 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e   cmd;..    dprin
9df0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
9e00: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29     if (objc < 2)
9e10: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
9e20: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
9e30: 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e  objv, "subcomman
9e40: 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74  d ?args?");..ret
9e50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9e60: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c     }.    if (Tcl
9e70: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
9e80: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
9e90: 2c 20 63 6f 6d 6d 61 6e 64 73 2c 0a 09 20 20 20  , commands,..   
9ea0: 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63   "command", 0,&c
9eb0: 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  md) != TCL_OK) {
9ec0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
9ed0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  OR;.    }..    s
9ee0: 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d  witch ((enum com
9ef0: 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61  mand) cmd) {..ca
9f00: 73 65 20 43 5f 52 45 51 3a 20 7b 0a 09 20 20 20  se C_REQ: {..   
9f10: 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d   EVP_PKEY *pkey=
9f20: 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20  NULL;..    X509 
9f30: 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *cert=NULL;..   
9f40: 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65   X509_NAME *name
9f50: 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f  =NULL;..    Tcl_
9f60: 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20  Obj **listv;..  
9f70: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63    Tcl_Size listc
9f80: 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f  ,i;...    BIO *o
9f90: 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63  ut=NULL;...    c
9fa0: 6f 6e 73 74 20 63 68 61 72 20 2a 6b 5f 43 3d 22  onst char *k_C="
9fb0: 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d  ",*k_ST="",*k_L=
9fc0: 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55  "",*k_O="",*k_OU
9fd0: 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f  ="",*k_CN="",*k_
9fe0: 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63  Email="";..    c
9ff0: 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d  har *keyout,*pem
a000: 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69  out,*str;..    i
a010: 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61  nt keysize,seria
a020: 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 09  l=0,days=365;...
a030: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29      if ((objc<5)
a040: 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a   || (objc>6)) {.
a050: 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
a060: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
a070: 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79  jv, "keysize key
a080: 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69  file certfile ?i
a090: 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e  nfo?");...return
a0a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
a0b0: 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c   }...    if (Tcl
a0c0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
a0d0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
a0e0: 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c  &keysize) != TCL
a0f0: 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20  _OK) {...return 
a100: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
a110: 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63  }..    keyout=Tc
a120: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
a130: 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75  [3]);..    pemou
a140: 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  t=Tcl_GetString(
a150: 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 09 20 20 20 20  objv[4]);...    
a160: 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09  if (objc>=6) {..
a170: 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a  .if (Tcl_ListObj
a180: 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65  GetElements(inte
a190: 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09  rp, objv[5],....
a1a0: 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20  &listc, &listv) 
a1b0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20  != TCL_OK) {... 
a1c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a1d0: 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ROR;...}....if (
a1e0: 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20  (listc%2) != 0) 
a1f0: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52  {...    Tcl_SetR
a200: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e  esult(interp,"In
a210: 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d  formation list m
a220: 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75  ust have even nu
a230: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a240: 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  s",NULL);...    
a250: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a260: 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30  ;...}...for (i=0
a270: 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29  ; i<listc; i+=2)
a280: 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c   {...    str=Tcl
a290: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
a2a0: 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28  [i]);...    if (
a2b0: 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73  strcmp(str,"days
a2c0: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28  ")==0) {....if (
a2d0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
a2e0: 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69  j(interp,listv[i
a2f0: 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f  +1],&days)!=TCL_
a300: 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72  OK)....    retur
a310: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20  n TCL_ERROR;... 
a320: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
a330: 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c  rcmp(str,"serial
a340: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28  ")==0) {....if (
a350: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
a360: 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69  j(interp,listv[i
a370: 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43  +1],&serial)!=TC
a380: 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74  L_OK)....    ret
a390: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a3a0: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
a3b0: 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69  strcmp(str,"seri
a3c0: 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  al")==0) {....if
a3d0: 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
a3e0: 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
a3f0: 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d  [i+1],&serial)!=
a400: 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72  TCL_OK)....    r
a410: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a420: 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
a430: 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22   (strcmp(str,"C"
a440: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54  )==0) {....k_C=T
a450: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
a460: 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
a470: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
a480: 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20  p(str,"ST")==0) 
a490: 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65  {....k_ST=Tcl_Ge
a4a0: 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
a4b0: 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
a4c0: 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
a4d0: 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ,"L")==0) {....k
a4e0: 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  _L=Tcl_GetString
a4f0: 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
a500: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
a510: 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d  trcmp(str,"O")==
a520: 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f  0) {....k_O=Tcl_
a530: 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
a540: 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
a550: 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
a560: 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09  tr,"OU")==0) {..
a570: 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74  ..k_OU=Tcl_GetSt
a580: 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
a590: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
a5a0: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
a5b0: 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43  N")==0) {....k_C
a5c0: 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  N=Tcl_GetString(
a5d0: 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
a5e0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
a5f0: 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22  rcmp(str,"Email"
a600: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61  )==0) {....k_Ema
a610: 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  il=Tcl_GetString
a620: 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
a630: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09      } else {....
a640: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
a650: 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61  terp,"Unknown pa
a660: 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a  rameter",NULL);.
a670: 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
a680: 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d  ROR;...    }...}
a690: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20  ..    }..    if 
a6a0: 28 28 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45  ((pkey = EVP_PKE
a6b0: 59 5f 6e 65 77 28 29 29 20 21 3d 20 4e 55 4c 4c  Y_new()) != NULL
a6c0: 29 20 7b 0a 09 09 69 66 20 28 21 45 56 50 5f 50  ) {...if (!EVP_P
a6d0: 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70  KEY_assign_RSA(p
a6e0: 6b 65 79 2c 0a 09 09 09 52 53 41 5f 67 65 6e 65  key,....RSA_gene
a6f0: 72 61 74 65 5f 6b 65 79 28 6b 65 79 73 69 7a 65  rate_key(keysize
a700: 2c 20 30 78 31 30 30 30 31 2c 20 4e 55 4c 4c 2c  , 0x10001, NULL,
a710: 20 4e 55 4c 4c 29 29 29 20 7b 0a 09 09 20 20 20   NULL))) {...   
a720: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
a730: 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e  nterp,"Error gen
a740: 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20  erating private 
a750: 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  key",NULL);...  
a760: 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
a770: 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 72 65 74  pkey);...    ret
a780: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a790: 09 7d 0a 09 09 6f 75 74 3d 42 49 4f 5f 6e 65 77  .}...out=BIO_new
a7a0: 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a  (BIO_s_file());.
a7b0: 09 09 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65  ..BIO_write_file
a7c0: 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29  name(out,keyout)
a7d0: 3b 0a 09 09 50 45 4d 5f 77 72 69 74 65 5f 62 69  ;...PEM_write_bi
a7e0: 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74  o_PrivateKey(out
a7f0: 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c  ,pkey,NULL,NULL,
a800: 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09  0,NULL,NULL);...
a810: 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74  BIO_free_all(out
a820: 29 3b 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d  );....if ((cert=
a830: 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c  X509_new())==NUL
a840: 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  L) {...    Tcl_S
a850: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
a860: 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
a870: 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65  g certificate re
a880: 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09  quest",NULL);...
a890: 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65      EVP_PKEY_fre
a8a0: 65 28 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 72  e(pkey);...    r
a8b0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
a8c0: 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65  ;...}....X509_se
a8d0: 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32  t_version(cert,2
a8e0: 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45  );...ASN1_INTEGE
a8f0: 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73  R_set(X509_get_s
a900: 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74  erialNumber(cert
a910: 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30  ),serial);...X50
a920: 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
a930: 39 5f 67 65 74 5f 6e 6f 74 42 65 66 6f 72 65 28  9_get_notBefore(
a940: 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39  cert),0);...X509
a950: 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
a960: 5f 67 65 74 5f 6e 6f 74 41 66 74 65 72 28 63 65  _get_notAfter(ce
a970: 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a  rt),(long)60*60*
a980: 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39  24*days);...X509
a990: 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74  _set_pubkey(cert
a9a0: 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d  ,pkey);....name=
a9b0: 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74  X509_get_subject
a9c0: 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09  _name(cert);....
a9d0: 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
a9e0: 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
a9f0: 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  "C", MBSTRING_AS
aa00: 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  C, (unsigned cha
aa10: 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31  r *) k_C, -1, -1
aa20: 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
aa30: 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
aa40: 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42  xt(name,"ST", MB
aa50: 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73  STRING_ASC, (uns
aa60: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
aa70: 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  ST, -1, -1, 0);.
aa80: 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
aa90: 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
aaa0: 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"L", MBSTRING_
aab0: 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ASC, (unsigned c
aac0: 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20  har *) k_L, -1, 
aad0: 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
aae0: 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
aaf0: 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d  _txt(name,"O", M
ab00: 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e  BSTRING_ASC, (un
ab10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
ab20: 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _O, -1, -1, 0);.
ab30: 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
ab40: 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
ab50: 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47  e,"OU", MBSTRING
ab60: 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20  _ASC, (unsigned 
ab70: 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31  char *) k_OU, -1
ab80: 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
ab90: 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
aba0: 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22  by_txt(name,"CN"
abb0: 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
abc0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
abd0: 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20  ) k_CN, -1, -1, 
abe0: 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
abf0: 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
ac00: 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d  (name,"Email", M
ac10: 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e  BSTRING_ASC, (un
ac20: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
ac30: 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20  _Email, -1, -1, 
ac40: 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f  0);....X509_set_
ac50: 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72  subject_name(cer
ac60: 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28  t,name);....if (
ac70: 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c  !X509_sign(cert,
ac80: 70 6b 65 79 2c 45 56 50 5f 6d 64 35 28 29 29 29  pkey,EVP_md5()))
ac90: 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72   {...    X509_fr
aca0: 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ee(cert);...    
acb0: 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
acc0: 65 79 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53  ey);...    Tcl_S
acd0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
ace0: 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63  "Error signing c
acf0: 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c  ertificate",NULL
ad00: 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20  );...    return 
ad10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a  TCL_ERROR;...}..
ad20: 09 09 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49  ..out=BIO_new(BI
ad30: 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 42  O_s_file());...B
ad40: 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d  IO_write_filenam
ad50: 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 0a  e(out,pemout);..
ad60: 09 09 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f  ..PEM_write_bio_
ad70: 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a  X509(out,cert);.
ad80: 09 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f  ..BIO_free_all(o
ad90: 75 74 29 3b 0a 0a 09 09 58 35 30 39 5f 66 72 65  ut);....X509_fre
ada0: 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50  e(cert);...EVP_P
adb0: 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
adc0: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
add0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
ade0: 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65  terp,"Error gene
adf0: 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b  rating private k
ae00: 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74  ey",NULL);...ret
ae10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
ae20: 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b      }..}..break;
ae30: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62  .    default:..b
ae40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ae50: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
ae60: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
ae70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
aeb0: 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a  * Tls_Free --. *
aec0: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
aed0: 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65  re cleans up whe
aee0: 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  n a SSL socket b
aef0: 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09  ased channel. *.
af00: 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74  is closed and it
af10: 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
af20: 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a  t falls below 1.
af30: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
af40: 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.none. *. * Sid
af50: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72  e effects:. *.Fr
af60: 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74  ees all the stat
af70: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
af80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
afa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
afb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
afc0: 6f 69 64 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f  oid.#if TCL_MAJO
afd0: 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 54 6c  R_VERSION > 8.Tl
afe0: 73 5f 46 72 65 65 28 20 76 6f 69 64 20 2a 62 6c  s_Free( void *bl
aff0: 6f 63 6b 50 74 72 20 29 0a 23 65 6c 73 65 0a 54  ockPtr ).#else.T
b000: 6c 73 5f 46 72 65 65 28 20 63 68 61 72 20 2a 62  ls_Free( char *b
b010: 6c 6f 63 6b 50 74 72 20 29 0a 23 65 6e 64 69 66  lockPtr ).#endif
b020: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  .{.    State *st
b030: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
b040: 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20  *)blockPtr;..   
b050: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
b060: 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65  ");..    Tls_Cle
b070: 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20  an(statePtr);.  
b080: 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74    ckfree(blockPt
b090: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  r);.}.../*. *---
b0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b0c0: 2d 2d 2d 2d 2d 2d 2d 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: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e  . *. * Tls_Clean
b0f0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
b100: 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
b110: 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f  up when a SSL so
b120: 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e  cket based chann
b130: 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20  el. *.is closed 
b140: 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63  and its referenc
b150: 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65  e count falls be
b160: 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f  low 1.  This sho
b170: 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64  uld. *.be called
b180: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62   synchronously b
b190: 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c  y the CloseProc,
b1a0: 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45   not in the. *.E
b1b0: 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61  ventuallyFree ca
b1c0: 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65  llback.. *. * Re
b1d0: 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  sults:. *.none. 
b1e0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
b1f0: 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20  s:. *.Frees all 
b200: 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d  the state. *. *-
b210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b250: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f  --. */.void Tls_
b260: 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61  Clean(State *sta
b270: 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72  tePtr) {.    dpr
b280: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
b290: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77  .    /*.     * w
b2a0: 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65  e're assuming he
b2b0: 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69  re that we're si
b2c0: 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20  ngle-threaded.  
b2d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74     */.    if (st
b2e0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d  atePtr->timer !=
b2f0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
b300: 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44  ) NULL) {..Tcl_D
b310: 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65  eleteTimerHandle
b320: 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  r(statePtr->time
b330: 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74  r);..statePtr->t
b340: 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  imer = NULL;.   
b350: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74   }..    if (stat
b360: 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a  ePtr->bio) {../*
b370: 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20   This will call 
b380: 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75  SSL_shutdown. Bu
b390: 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70  g 1414045 */..dp
b3a0: 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f  rintf("BIO_free_
b3b0: 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50  all(%p)", stateP
b3c0: 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66  tr->bio);..BIO_f
b3d0: 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72  ree_all(statePtr
b3e0: 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74  ->bio);..statePt
b3f0: 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  r->bio = NULL;. 
b400: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
b410: 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64  tePtr->ssl) {..d
b420: 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65  printf("SSL_free
b430: 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d  (%p)", statePtr-
b440: 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65  >ssl);..SSL_free
b450: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
b460: 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20  ..statePtr->ssl 
b470: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
b480: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
b490: 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  ctx) {..SSL_CTX_
b4a0: 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63  free(statePtr->c
b4b0: 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  tx);..statePtr->
b4c0: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
b4d0: 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
b4e0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a  tr->callback) {.
b4f0: 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
b500: 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  t(statePtr->call
b510: 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72  back);..statePtr
b520: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c  ->callback = NUL
b530: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
b540: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
b550: 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  ord) {..Tcl_Decr
b560: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
b570: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73  r->password);..s
b580: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
b590: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
b5a0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65  .    dprintf("Re
b5b0: 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f  turning");.}.../
b5c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
b5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b600: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
b610: 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09  s_Init --. *. *.
b620: 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67  This is a packag
b630: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
b640: 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63   procedure, whic
b650: 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62  h is called. *.b
b660: 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20  y Tcl when this 
b670: 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65  package is to be
b680: 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74   added to an int
b690: 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20  erpreter.. *. * 
b6a0: 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f  Results:  Ssl co
b6b0: 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61  nfigured and loa
b6c0: 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ded. *. * Side e
b6d0: 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61  ffects:. *. crea
b6e0: 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61  te the ssl comma
b6f0: 6e 64 2c 20 69 6e 69 74 69 61 6c 69 73 65 20 73  nd, initialise s
b700: 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a  sl context. *. *
b710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b750: 2d 2d 2d 0a 20 2a 2f 0a 0a 44 4c 4c 45 58 50 4f  ---. */..DLLEXPO
b760: 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28  RT int Tls_Init(
b770: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
b780: 72 70 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61  rp) {..const cha
b790: 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69  r tlsTclInitScri
b7a0: 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64  pt[] = {.#includ
b7b0: 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 20 20  e "tls.tcl.h".  
b7c0: 20 20 20 20 20 20 20 20 20 20 30 78 30 30 0a 09            0x00..
b7d0: 7d 3b 0a 0a 20 20 20 20 20 20 20 20 64 70 72 69  };..        dpri
b7e0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
b7f0: 09 2f 2a 0a 09 20 2a 20 57 65 20 6f 6e 6c 79 20  ./*.. * We only 
b800: 73 75 70 70 6f 72 74 20 54 63 6c 20 38 2e 34 20  support Tcl 8.4 
b810: 6f 72 20 6e 65 77 65 72 0a 09 20 2a 2f 0a 09 69  or newer.. */..i
b820: 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f 54  f (.#ifdef USE_T
b830: 43 4c 5f 53 54 55 42 53 0a 09 20 20 20 20 54 63  CL_STUBS..    Tc
b840: 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65  l_InitStubs(inte
b850: 72 70 2c 20 22 38 2e 36 2d 22 2c 20 30 29 0a 23  rp, "8.6-", 0).#
b860: 65 6c 73 65 0a 09 20 20 20 20 54 63 6c 5f 50 6b  else..    Tcl_Pk
b870: 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c  gRequire(interp,
b880: 20 22 54 63 6c 22 2c 20 22 38 2e 36 2d 22 2c 20   "Tcl", "8.6-", 
b890: 30 29 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 20  0).#endif..     
b8a0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
b8b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b8c0: 7d 0a 0a 09 69 66 20 28 54 6c 73 4c 69 62 49 6e  }...if (TlsLibIn
b8d0: 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  it(0) != TCL_OK)
b8e0: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52   {...Tcl_AppendR
b8f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
b900: 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c  ould not initial
b910: 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22  ize SSL library"
b920: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
b930: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
b940: 52 4f 52 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 43 72  ROR;..}...Tcl_Cr
b950: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
b960: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70  nterp, "tls::cip
b970: 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62  hers", CiphersOb
b980: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
b990: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
b9a0: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
b9b0: 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62  );..Tcl_CreateOb
b9c0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
b9d0: 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65   "tls::handshake
b9e0: 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43  ", HandshakeObjC
b9f0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
ba00: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
ba10: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
ba20: 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43  ..Tcl_CreateObjC
ba30: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
ba40: 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d  tls::import", Im
ba50: 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  portObjCmd, (Cli
ba60: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
ba70: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
ba80: 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72  ) NULL);..Tcl_Cr
ba90: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
baa0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69  nterp, "tls::uni
bab0: 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74  mport", Unimport
bac0: 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
bad0: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
bae0: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
baf0: 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61 74 65  LL);..Tcl_Create
bb00: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
bb10: 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22  p, "tls::status"
bb20: 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20  , StatusObjCmd, 
bb30: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
bb40: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
bb50: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63  oc *) NULL);..Tc
bb60: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
bb70: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
bb80: 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69  :version", Versi
bb90: 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  onObjCmd, (Clien
bba0: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
bbb0: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
bbc0: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 72 65 61  NULL);..Tcl_Crea
bbd0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
bbe0: 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22  erp, "tls::misc"
bbf0: 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43  , MiscObjCmd, (C
bc00: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
bc10: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
bc20: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20   *) NULL);...if 
bc30: 28 69 6e 74 65 72 70 29 20 7b 0a 09 09 54 63 6c  (interp) {...Tcl
bc40: 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c  _Eval(interp, tl
bc50: 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 3b  sTclInitScript);
bc60: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 54 63 6c  ..}...return(Tcl
bc70: 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
bc80: 72 70 2c 20 22 74 6c 73 22 2c 20 50 41 43 4b 41  rp, "tls", PACKA
bc90: 47 45 5f 56 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a  GE_VERSION));.}.
bca0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
bcb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
bce0: 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74  . *.Tls_SafeInit
bcf0: 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d   --. *. *.------
bd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53  ----------*. *.S
bd30: 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72  tandard procedur
bd40: 65 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c  e required by 'l
bd50: 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c  oad'.. *.Initial
bd60: 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73  izes this extens
bd70: 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69  ion for a safe i
bd80: 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d  nterpreter.. *.-
bd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
bdc0: 0a 20 2a 0a 20 2a 09 53 69 64 65 65 66 66 65 63  . *. *.Sideeffec
bdd0: 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54  ts:. *..As of 'T
bde0: 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52  ls_Init'. *. *.R
bdf0: 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61  esult:. *..A sta
be00: 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20  ndard Tcl error 
be10: 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  code.. *. *-----
be20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be50: 2d 2a 0a 20 2a 2f 0a 0a 44 4c 4c 45 58 50 4f 52  -*. */..DLLEXPOR
be60: 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e  T int Tls_SafeIn
be70: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
be80: 6e 74 65 72 70 29 20 7b 0a 09 64 70 72 69 6e 74  nterp) {..dprint
be90: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 09 72 65  f("Called");..re
bea0: 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e  turn(Tls_Init(in
beb0: 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  terp));.}../*. *
bec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bef0: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c  ------*. *. *.Tl
bf00: 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20  sLibInit --. *. 
bf10: 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
bf20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf40: 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a  --*. *.Initializ
bf50: 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f  es SSL library o
bf60: 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74  nce per applicat
bf70: 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  ion. *.---------
bf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bfa0: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53  -------*. *. *.S
bfb0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
bfc0: 09 69 6e 69 74 69 6c 69 7a 65 73 20 53 53 4c 20  .initilizes SSL 
bfd0: 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65  library. *. *.Re
bfe0: 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20  sult:. *..none. 
bff0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
c000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a  ----------*. */.
c030: 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69  static int TlsLi
c040: 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74  bInit(int uninit
c050: 69 61 6c 69 7a 65 29 20 7b 0a 09 73 74 61 74 69  ialize) {..stati
c060: 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65  c int initialize
c070: 64 20 3d 20 30 3b 0a 09 69 6e 74 20 73 74 61 74  d = 0;..int stat
c080: 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66  us = TCL_OK;.#if
c090: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
c0a0: 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
c0b0: 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
c0c0: 29 0a 09 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f  )..size_t num_lo
c0d0: 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66  cks;.#endif...if
c0e0: 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20   (uninitialize) 
c0f0: 7b 0a 09 09 69 66 20 28 21 69 6e 69 74 69 61 6c  {...if (!initial
c100: 69 7a 65 64 29 20 7b 0a 09 09 09 64 70 72 69 6e  ized) {....dprin
c110: 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69  tf("Asked to uni
c120: 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77  nitialize, but w
c130: 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61  e are not initia
c140: 6c 69 7a 65 64 22 29 3b 0a 0a 09 09 09 72 65 74  lized");.....ret
c150: 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 09 7d  urn(TCL_OK);...}
c160: 0a 0a 09 09 64 70 72 69 6e 74 66 28 22 41 73 6b  ....dprintf("Ask
c170: 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69  ed to uninitiali
c180: 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  ze");..#if defin
c190: 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
c1a0: 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
c1b0: 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 09 54 63  CL_THREADS)...Tc
c1c0: 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69  l_MutexLock(&ini
c1d0: 74 5f 6d 78 29 3b 0a 0a 09 09 43 52 59 50 54 4f  t_mx);....CRYPTO
c1e0: 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f 63 61 6c  _set_locking_cal
c1f0: 6c 62 61 63 6b 28 4e 55 4c 4c 29 3b 0a 09 09 43  lback(NULL);...C
c200: 52 59 50 54 4f 5f 73 65 74 5f 69 64 5f 63 61 6c  RYPTO_set_id_cal
c210: 6c 62 61 63 6b 28 4e 55 4c 4c 29 3b 0a 0a 09 09  lback(NULL);....
c220: 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 09 09  if (locks) {....
c230: 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 09 09  free(locks);....
c240: 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  locks = NULL;...
c250: 09 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b  .locksCount = 0;
c260: 0a 09 09 7d 0a 23 65 6e 64 69 66 0a 09 09 69 6e  ...}.#endif...in
c270: 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a  itialized = 0;..
c280: 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
c290: 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
c2a0: 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
c2b0: 41 44 53 29 0a 09 09 54 63 6c 5f 4d 75 74 65 78  ADS)...Tcl_Mutex
c2c0: 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  Unlock(&init_mx)
c2d0: 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 72 65 74 75  ;.#endif....retu
c2e0: 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(TCL_OK);..}..
c2f0: 09 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64  .if (initialized
c300: 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 43  ) {...dprintf("C
c310: 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67  alled, but using
c320: 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b   cached value");
c330: 0a 09 09 72 65 74 75 72 6e 28 73 74 61 74 75 73  ...return(status
c340: 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28  );..}...dprintf(
c350: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20  "Called");..#if 
c360: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
c370: 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
c380: 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
c390: 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28  ..Tcl_MutexLock(
c3a0: 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69  &init_mx);.#endi
c3b0: 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  f..initialized =
c3c0: 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   1;..#if defined
c3d0: 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
c3e0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
c3f0: 5f 54 48 52 45 41 44 53 29 0a 09 6e 75 6d 5f 6c  _THREADS)..num_l
c400: 6f 63 6b 73 20 3d 20 43 52 59 50 54 4f 5f 6e 75  ocks = CRYPTO_nu
c410: 6d 5f 6c 6f 63 6b 73 28 29 3b 0a 09 6c 6f 63 6b  m_locks();..lock
c420: 73 43 6f 75 6e 74 20 3d 20 6e 75 6d 5f 6c 6f 63  sCount = num_loc
c430: 6b 73 3b 0a 09 6c 6f 63 6b 73 20 3d 20 6d 61 6c  ks;..locks = mal
c440: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b  loc(sizeof(*lock
c450: 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b  s) * num_locks);
c460: 0a 09 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20  ..memset(locks, 
c470: 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73  0, sizeof(*locks
c480: 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a  ) * num_locks);.
c490: 0a 09 43 52 59 50 54 4f 5f 73 65 74 5f 6c 6f 63  ..CRYPTO_set_loc
c4a0: 6b 69 6e 67 5f 63 61 6c 6c 62 61 63 6b 28 43 72  king_callback(Cr
c4b0: 79 70 74 6f 54 68 72 65 61 64 4c 6f 63 6b 43 61  yptoThreadLockCa
c4c0: 6c 6c 62 61 63 6b 29 3b 0a 09 43 52 59 50 54 4f  llback);..CRYPTO
c4d0: 5f 73 65 74 5f 69 64 5f 63 61 6c 6c 62 61 63 6b  _set_id_callback
c4e0: 28 43 72 79 70 74 6f 54 68 72 65 61 64 49 64 43  (CryptoThreadIdC
c4f0: 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66  allback);.#endif
c500: 0a 0a 09 69 66 20 28 53 53 4c 5f 6c 69 62 72 61  ...if (SSL_libra
c510: 72 79 5f 69 6e 69 74 28 29 20 21 3d 20 31 29 20  ry_init() != 1) 
c520: 7b 0a 09 09 73 74 61 74 75 73 20 3d 20 54 43 4c  {...status = TCL
c530: 5f 45 52 52 4f 52 3b 0a 09 09 67 6f 74 6f 20 64  _ERROR;...goto d
c540: 6f 6e 65 3b 0a 09 7d 0a 0a 09 53 53 4c 5f 6c 6f  one;..}...SSL_lo
c550: 61 64 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 73  ad_error_strings
c560: 28 29 3b 0a 09 45 52 52 5f 6c 6f 61 64 5f 63 72  ();..ERR_load_cr
c570: 79 70 74 6f 5f 73 74 72 69 6e 67 73 28 29 3b 0a  ypto_strings();.
c580: 0a 09 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55  ..BIO_new_tcl(NU
c590: 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 09  LL, 0);..#if 0..
c5a0: 2f 2a 0a 09 20 2a 20 58 58 58 3a 54 4f 44 4f 3a  /*.. * XXX:TODO:
c5b0: 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64   Remove this cod
c5c0: 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74  e and replace it
c5d0: 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 09 20   with a check.. 
c5e0: 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74  * for enough ent
c5f0: 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20  ropy and do not 
c600: 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75  try to create ou
c610: 72 20 6f 77 6e 0a 09 20 2a 20 74 65 72 72 69 62  r own.. * terrib
c620: 6c 65 20 65 6e 74 72 6f 70 79 0a 09 20 2a 2f 0a  le entropy.. */.
c630: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65      /*.     * Se
c640: 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75  ed the random nu
c650: 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69  mber generator i
c660: 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72  n the SSL librar
c670: 79 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 20  y,.     * using 
c680: 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e  the do/while con
c690: 73 74 72 75 63 74 20 62 65 63 61 75 73 65 20 6f  struct because o
c6a0: 66 20 74 68 65 20 62 75 67 20 6e 6f 74 65 20 69  f the bug note i
c6b0: 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 65  n the.     * Ope
c6c0: 6e 53 53 4c 20 46 41 51 20 61 74 20 68 74 74 70  nSSL FAQ at http
c6d0: 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f  ://www.openssl.o
c6e0: 72 67 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e 68  rg/support/faq.h
c6f0: 74 6d 6c 23 55 53 45 52 31 0a 20 20 20 20 20 2a  tml#USER1.     *
c700: 0a 20 20 20 20 20 2a 20 54 68 65 20 63 72 75 78  .     * The crux
c710: 20 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 20   of the problem 
c720: 69 73 20 74 68 61 74 20 53 6f 6c 61 72 69 73 20  is that Solaris 
c730: 37 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  7 does not have 
c740: 61 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61  a.     * /dev/ra
c750: 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61  ndom or /dev/ura
c760: 6e 64 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 69  ndom device so i
c770: 74 20 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 20  t cannot gather 
c780: 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 6e  enough.     * en
c790: 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 52  tropy from the R
c7a0: 41 4e 44 5f 73 65 65 64 28 29 20 77 68 65 6e 20  AND_seed() when 
c7b0: 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  TLS initializes 
c7c0: 61 6e 64 20 72 65 66 75 73 65 73 0a 20 20 20 20  and refuses.    
c7d0: 20 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72   * to go further
c7e0: 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f  . Earlier versio
c7f0: 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61  ns of OpenSSL ca
c800: 72 72 69 65 64 20 6f 6e 20 72 65 67 61 72 64 6c  rried on regardl
c810: 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ess..     */.   
c820: 20 73 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 64   srand((unsigned
c830: 20 69 6e 74 29 20 74 69 6d 65 28 28 74 69 6d 65   int) time((time
c840: 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20  _t *) NULL));.  
c850: 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d    do {..for (i =
c860: 20 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29   0; i < 16; i++)
c870: 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 64   {..    rnd_seed
c880: 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29  [i] = 1 + (char)
c890: 20 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29   (255.0 * rand()
c8a0: 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29  /(RAND_MAX+1.0))
c8b0: 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28  ;..}..RAND_seed(
c8c0: 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66  rnd_seed, sizeof
c8d0: 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 20  (rnd_seed));.   
c8e0: 20 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 5f 73   } while (RAND_s
c8f0: 74 61 74 75 73 28 29 20 21 3d 20 31 29 3b 0a 23  tatus() != 1);.#
c900: 65 6e 64 69 66 0a 0a 64 6f 6e 65 3a 0a 23 69 66  endif..done:.#if
c910: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
c920: 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
c930: 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
c940: 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f  )..Tcl_MutexUnlo
c950: 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65  ck(&init_mx);.#e
c960: 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 74  ndif...return(st
c970: 61 74 75 73 29 3b 0a 7d 0a                       atus);.}.