Hex Artifact Content

Artifact caad573382e149e6364aefe88b5e52aaedc44207:


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: 0a 20 2a 20 24 48 65 61 64 65 72 3a 20 2f 68 6f  . * $Header: /ho
0050: 6d 65 2f 72 6b 65 65 6e 65 2f 74 6d 70 2f 63 76  me/rkeene/tmp/cv
0060: 73 32 66 6f 73 73 69 6c 2f 2e 2e 2f 74 63 6c 74  s2fossil/../tclt
0070: 6c 73 2f 74 6c 73 2f 74 6c 73 2f 74 6c 73 2e 63  ls/tls/tls/tls.c
0080: 2c 76 20 31 2e 35 20 32 30 30 30 2f 30 36 2f 30  ,v 1.5 2000/06/0
0090: 36 20 30 31 3a 30 34 3a 33 35 20 73 74 61 6e 74  6 01:04:35 stant
00a0: 6f 6e 20 45 78 70 20 24 0a 20 2a 0a 20 2a 20 54  on Exp $. *. * T
00b0: 4c 53 20 28 61 6b 61 20 53 53 4c 29 20 43 68 61  LS (aka SSL) Cha
00c0: 6e 6e 65 6c 20 2d 20 63 61 6e 20 62 65 20 6c 61  nnel - can be la
00d0: 79 65 72 65 64 20 6f 6e 20 61 6e 79 20 62 69 2d  yered on any bi-
00e0: 64 69 72 65 63 74 69 6f 6e 61 6c 0a 20 2a 20 54  directional. * T
00f0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 28 4e 6f 74 65  cl_Channel (Note
0100: 3a 20 52 65 71 75 69 72 65 73 20 54 72 66 20 43  : Requires Trf C
0110: 6f 72 65 20 50 61 74 63 68 29 0a 20 2a 0a 20 2a  ore Patch). *. *
0120: 20 54 68 69 73 20 77 61 73 20 62 75 69 6c 74 20   This was built 
0130: 28 61 6c 6d 6f 73 74 29 20 66 72 6f 6d 20 73 63  (almost) from sc
0140: 72 61 74 63 68 20 62 61 73 65 64 20 75 70 6f 6e  ratch based upon
0150: 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 6f 66 0a   observation of.
0160: 20 2a 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 32   * OpenSSL 0.9.2
0170: 42 0a 20 2a 0a 20 2a 20 41 64 64 69 74 69 6f 6e  B. *. * Addition
0180: 20 63 72 65 64 69 74 20 69 73 20 64 75 65 20 66   credit is due f
0190: 6f 72 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69  or Andreas Kupri
01a0: 65 73 20 28 61 2e 6b 75 70 72 69 65 73 40 77 65  es (a.kupries@we
01b0: 73 74 65 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a  stend.com), for.
01c0: 20 2a 20 70 72 6f 76 69 64 69 6e 67 20 74 68 65   * providing the
01d0: 20 54 63 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e   Tcl_ReplaceChan
01e0: 6e 65 6c 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e  nel mechanism an
01f0: 64 20 77 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c  d working closel
0200: 79 20 77 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20  y with me. * to 
0210: 65 6e 68 61 6e 63 65 20 69 74 20 74 6f 20 73 75  enhance it to su
0220: 70 70 6f 72 74 20 66 75 6c 6c 20 66 69 6c 65 65  pport full filee
0230: 76 65 6e 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a  vent semantics..
0240: 20 2a 0a 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20   *. * Also work 
0250: 64 6f 6e 65 20 62 79 20 74 68 65 20 66 6f 6c 6c  done by the foll
0260: 6f 77 20 70 65 6f 70 6c 65 20 70 72 6f 76 69 64  ow people provid
0270: 65 64 20 74 68 65 20 69 6d 70 65 74 75 73 20 74  ed the impetus t
0280: 6f 20 64 6f 20 74 68 69 73 20 22 72 69 67 68 74  o do this "right
0290: 22 3a 0a 20 2a 09 74 63 6c 53 53 4c 20 28 43 6f  ":. *.tclSSL (Co
02a0: 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c 20 53  lin McCormack, S
02b0: 68 61 72 65 64 20 54 65 63 68 6e 6f 6c 6f 67 79  hared Technology
02c0: 29 0a 20 2a 09 53 53 4c 74 63 6c 20 28 50 65 74  ). *.SSLtcl (Pet
02d0: 65 72 20 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a  er Antman). *. *
02e0: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73  /..#include "tls
02f0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0300: 22 74 63 6c 4f 70 74 73 2e 68 22 0a 0a 2f 2a 0a  "tclOpts.h"../*.
0310: 20 2a 20 45 78 74 65 72 6e 61 6c 20 66 75 6e 63   * External func
0320: 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a  tions. */../*. *
0330: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
0340: 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69  tions. */..#defi
0350: 6e 65 20 46 32 4e 28 20 6b 65 79 2c 20 64 73 70  ne F2N( key, dsp
0360: 29 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20  ) \..(((key) == 
0370: 4e 55 4c 4c 29 3f 28 63 68 61 72 2a 29 4e 55 4c  NULL)?(char*)NUL
0380: 4c 3a 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46  L:Tcl_TranslateF
0390: 69 6c 65 4e 61 6d 65 28 20 69 6e 74 65 72 70 2c  ileName( interp,
03a0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
03b0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29  #define REASON()
03c0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f  .ERR_reason_erro
03d0: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74  r_string(ERR_get
03e0: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69  _error())..stati
03f0: 63 20 69 6e 74 09 43 69 70 68 65 72 73 4f 62 6a  c int.CiphersObj
0400: 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20  Cmd _ANSI_ARGS_ 
0410: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  ((ClientData cli
0420: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
0430: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09  erp *interp,....
0440: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c     int objc, Tcl
0450: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
0460: 5b 5d 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e  []));..static in
0470: 74 09 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d  t.HandshakeObjCm
0480: 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28  d _ANSI_ARGS_ ((
0490: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
04a0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
04b0: 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 20  p *interp,....  
04c0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
04d0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
04e0: 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09  ));..static int.
04f0: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 5f 41 4e  ImportObjCmd _AN
0500: 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e  SI_ARGS_ ((Clien
0510: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
0520: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
0530: 74 65 72 70 2c 0a 09 09 09 20 20 20 69 6e 74 20  terp,....   int 
0540: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43  objc, Tcl_Obj *C
0550: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a  ONST objv[]));..
0560: 73 74 61 74 69 63 20 69 6e 74 09 53 74 61 74 75  static int.Statu
0570: 73 4f 62 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52  sObjCmd _ANSI_AR
0580: 47 53 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61  GS_ ((ClientData
0590: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
05a0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
05b0: 0a 09 09 09 20 20 20 69 6e 74 20 6f 62 6a 63 2c  ....   int objc,
05c0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
05d0: 6f 62 6a 76 5b 5d 29 29 3b 0a 73 74 61 74 69 63  objv[]));.static
05e0: 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e   SSL_CTX *CTX_In
05f0: 69 74 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28  it _ANSI_ARGS_((
0600: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0610: 72 70 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63  rp, int proto, c
0620: 68 61 72 20 2a 6b 65 79 2c 0a 09 09 09 20 20 20  har *key,....   
0630: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 63 68 61   char *cert, cha
0640: 72 20 2a 43 41 64 69 72 2c 20 63 68 61 72 20 2a  r *CAdir, char *
0650: 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69  CAfile, char *ci
0660: 70 68 65 72 73 29 29 3b 0a 0a 23 64 65 66 69 6e  phers));..#defin
0670: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  e TLS_PROTO_SSL2
0680: 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20 54 4c  .0x01.#define TL
0690: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 30 78 30  S_PROTO_SSL3.0x0
06a0: 32 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52  2.#define TLS_PR
06b0: 4f 54 4f 5f 54 4c 53 31 09 30 78 30 34 0a 23 64  OTO_TLS1.0x04.#d
06c0: 65 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c  efine ENABLED(fl
06d0: 61 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61  ag, mask).(((fla
06e0: 67 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20  g) & (mask)) == 
06f0: 28 6d 61 73 6b 29 29 0a 2f 2a 0a 20 2a 20 53 74  (mask))./*. * St
0700: 61 74 69 63 20 64 61 74 61 20 73 74 72 75 63 74  atic data struct
0710: 75 72 65 73 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65  ures. */..#ifnde
0720: 66 20 4e 4f 5f 44 48 0a 2f 2a 20 66 72 6f 6d 20  f NO_DH./* from 
0730: 6f 70 65 6e 73 73 6c 2f 61 70 70 73 2f 73 5f 73  openssl/apps/s_s
0740: 65 72 76 65 72 2e 63 20 2a 2f 0a 0a 73 74 61 74  erver.c */..stat
0750: 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ic unsigned char
0760: 20 64 68 35 31 32 5f 70 5b 5d 3d 7b 0a 20 20 20   dh512_p[]={.   
0770: 20 20 20 20 20 30 78 44 41 2c 30 78 35 38 2c 30       0xDA,0x58,0
0780: 78 33 43 2c 30 78 31 36 2c 30 78 44 39 2c 30 78  x3C,0x16,0xD9,0x
0790: 38 35 2c 30 78 32 32 2c 30 78 38 39 2c 30 78 44  85,0x22,0x89,0xD
07a0: 30 2c 30 78 45 34 2c 30 78 41 46 2c 30 78 37 35  0,0xE4,0xAF,0x75
07b0: 2c 0a 20 20 20 20 20 20 20 20 30 78 36 46 2c 30  ,.        0x6F,0
07c0: 78 34 43 2c 30 78 43 41 2c 30 78 39 32 2c 30 78  x4C,0xCA,0x92,0x
07d0: 44 44 2c 30 78 34 42 2c 30 78 45 35 2c 30 78 33  DD,0x4B,0xE5,0x3
07e0: 33 2c 30 78 42 38 2c 30 78 30 34 2c 30 78 46 42  3,0xB8,0x04,0xFB
07f0: 2c 30 78 30 46 2c 0a 20 20 20 20 20 20 20 20 30  ,0x0F,.        0
0800: 78 45 44 2c 30 78 39 34 2c 30 78 45 46 2c 30 78  xED,0x94,0xEF,0x
0810: 39 43 2c 30 78 38 41 2c 30 78 34 34 2c 30 78 30  9C,0x8A,0x44,0x0
0820: 33 2c 30 78 45 44 2c 30 78 35 37 2c 30 78 34 36  3,0xED,0x57,0x46
0830: 2c 30 78 35 30 2c 30 78 44 33 2c 0a 20 20 20 20  ,0x50,0xD3,.    
0840: 20 20 20 20 30 78 36 39 2c 30 78 39 39 2c 30 78      0x69,0x99,0x
0850: 44 42 2c 30 78 32 39 2c 30 78 44 37 2c 30 78 37  DB,0x29,0xD7,0x7
0860: 36 2c 30 78 32 37 2c 30 78 36 42 2c 30 78 41 32  6,0x27,0x6B,0xA2
0870: 2c 30 78 44 33 2c 30 78 44 34 2c 30 78 31 32 2c  ,0xD3,0xD4,0x12,
0880: 0a 20 20 20 20 20 20 20 20 30 78 45 32 2c 30 78  .        0xE2,0x
0890: 31 38 2c 30 78 46 34 2c 30 78 44 44 2c 30 78 31  18,0xF4,0xDD,0x1
08a0: 45 2c 30 78 30 38 2c 30 78 34 43 2c 30 78 46 36  E,0x08,0x4C,0xF6
08b0: 2c 30 78 44 38 2c 30 78 30 30 2c 30 78 33 45 2c  ,0xD8,0x00,0x3E,
08c0: 30 78 37 43 2c 0a 20 20 20 20 20 20 20 20 30 78  0x7C,.        0x
08d0: 34 37 2c 30 78 37 34 2c 30 78 45 38 2c 30 78 33  47,0x74,0xE8,0x3
08e0: 33 2c 0a 20 20 20 20 20 20 20 20 7d 3b 0a 73 74  3,.        };.st
08f0: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68  atic unsigned ch
0900: 61 72 20 64 68 35 31 32 5f 67 5b 5d 3d 7b 0a 09  ar dh512_g[]={..
0910: 30 78 30 32 2c 0a 7d 3b 0a 0a 73 74 61 74 69 63  0x02,.};..static
0920: 20 44 48 20 2a 67 65 74 5f 64 68 35 31 32 28 29   DH *get_dh512()
0930: 0a 7b 0a 20 20 20 20 44 48 20 2a 64 68 3d 4e 55  .{.    DH *dh=NU
0940: 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 28 64 68  LL;..    if ((dh
0950: 3d 44 48 5f 6e 65 77 28 29 29 20 3d 3d 20 4e 55  =DH_new()) == NU
0960: 4c 4c 29 20 72 65 74 75 72 6e 28 4e 55 4c 4c 29  LL) return(NULL)
0970: 3b 0a 0a 20 20 20 20 64 68 2d 3e 70 3d 42 4e 5f  ;..    dh->p=BN_
0980: 62 69 6e 32 62 6e 28 64 68 35 31 32 5f 70 2c 73  bin2bn(dh512_p,s
0990: 69 7a 65 6f 66 28 64 68 35 31 32 5f 70 29 2c 4e  izeof(dh512_p),N
09a0: 55 4c 4c 29 3b 0a 20 20 20 20 64 68 2d 3e 67 3d  ULL);.    dh->g=
09b0: 42 4e 5f 62 69 6e 32 62 6e 28 64 68 35 31 32 5f  BN_bin2bn(dh512_
09c0: 67 2c 73 69 7a 65 6f 66 28 64 68 35 31 32 5f 67  g,sizeof(dh512_g
09d0: 29 2c 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66  ),NULL);..    if
09e0: 20 28 28 64 68 2d 3e 70 20 3d 3d 20 4e 55 4c 4c   ((dh->p == NULL
09f0: 29 20 7c 7c 20 28 64 68 2d 3e 67 20 3d 3d 20 4e  ) || (dh->g == N
0a00: 55 4c 4c 29 29 0a 09 72 65 74 75 72 6e 28 4e 55  ULL))..return(NU
0a10: 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28  LL);.    return(
0a20: 64 68 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  dh);.}.#endif...
0a30: 2f 2a 0a 20 2a 20 57 65 20 6c 6f 73 65 20 74 68  /*. * We lose th
0a40: 65 20 74 63 6c 20 70 61 73 73 77 6f 72 64 20 63  e tcl password c
0a50: 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 77 65 20  allback when we 
0a60: 75 73 65 20 74 68 65 20 52 53 41 20 42 53 41 46  use the RSA BSAF
0a70: 45 20 53 53 4c 2d 43 20 31 2e 31 2e 32 0a 20 2a  E SSL-C 1.1.2. *
0a80: 20 6c 69 62 72 61 72 69 65 73 20 69 6e 73 74 65   libraries inste
0a90: 61 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ad of the curren
0aa0: 74 20 4f 70 65 6e 53 53 4c 20 6c 69 62 72 61 72  t OpenSSL librar
0ab0: 69 65 73 2e 0a 20 2a 2f 0a 0a 23 69 66 64 65 66  ies.. */..#ifdef
0ac0: 20 42 53 41 46 45 0a 23 64 65 66 69 6e 65 20 50   BSAFE.#define P
0ad0: 52 45 5f 4f 50 45 4e 53 53 4c 5f 30 5f 39 5f 34  RE_OPENSSL_0_9_4
0ae0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a   1.#endif../*. *
0af0: 20 50 65 72 20 4f 70 65 6e 53 53 4c 20 30 2e 39   Per OpenSSL 0.9
0b00: 2e 34 20 43 6f 6d 70 61 74 0a 20 2a 2f 0a 0a 23  .4 Compat. */..#
0b10: 69 66 6e 64 65 66 20 53 54 41 43 4b 5f 4f 46 0a  ifndef STACK_OF.
0b20: 23 64 65 66 69 6e 65 20 53 54 41 43 4b 5f 4f 46  #define STACK_OF
0b30: 28 78 29 09 09 09 53 54 41 43 4b 0a 23 64 65 66  (x)...STACK.#def
0b40: 69 6e 65 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  ine sk_SSL_CIPHE
0b50: 52 5f 6e 75 6d 28 73 6b 29 09 09 73 6b 5f 6e 75  R_num(sk)..sk_nu
0b60: 6d 28 28 73 6b 29 29 0a 23 64 65 66 69 6e 65 20  m((sk)).#define 
0b70: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61  sk_SSL_CIPHER_va
0b80: 6c 75 65 28 20 73 6b 2c 20 69 6e 64 65 78 29 09  lue( sk, index).
0b90: 28 53 53 4c 5f 43 49 50 48 45 52 2a 29 73 6b 5f  (SSL_CIPHER*)sk_
0ba0: 76 61 6c 75 65 28 28 73 6b 29 2c 20 28 69 6e 64  value((sk), (ind
0bb0: 65 78 29 29 0a 23 65 6e 64 69 66 0a 0a 0c 0a 2f  ex)).#endif..../
0bc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e  -------. *. * In
0c10: 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  foCallback --. *
0c20: 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 4c  . *.monitors SSL
0c30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63   connection proc
0c40: 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ess. *. * Result
0c50: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
0c60: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
0c70: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
0c80: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cd0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ---. */.static v
0ce0: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  oid.InfoCallback
0cf0: 28 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77  (SSL *ssl, int w
0d00: 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 0a 7b  here, int ret).{
0d10: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
0d20: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53  ePtr = (State*)S
0d30: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_get_app_data(
0d40: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  ssl);.    Tcl_Ob
0d50: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
0d60: 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72  har *major; char
0d70: 20 2a 6d 69 6e 6f 72 3b 0a 20 20 20 20 69 6e 74   *minor;.    int
0d80: 20 77 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61   w;..    if (sta
0d90: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
0da0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
0db0: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20  L)..return;..   
0dc0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
0dd0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
0de0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
0df0: 0a 23 69 66 20 30 0a 20 20 20 20 69 66 20 28 77  .#if 0.    if (w
0e00: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c  here & SSL_CB_AL
0e10: 45 52 54 29 20 7b 0a 09 73 65 76 20 3d 20 53 53  ERT) {..sev = SS
0e20: 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 74 72  L_alert_type_str
0e30: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 09  ing_long(ret);..
0e40: 69 66 20 28 73 74 72 63 6d 70 28 20 73 65 76 2c  if (strcmp( sev,
0e50: 20 22 66 61 74 61 6c 22 29 3d 3d 30 29 20 7b 09   "fatal")==0) {.
0e60: 2f 2a 20 4d 61 70 20 74 6f 20 65 72 72 6f 72 20  /* Map to error 
0e70: 2a 2f 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f  */..    Tls_Erro
0e80: 72 28 73 74 61 74 65 50 74 72 2c 20 53 53 4c 5f  r(statePtr, SSL_
0e90: 45 52 52 4f 52 28 73 73 6c 2c 20 30 29 29 3b 0a  ERROR(ssl, 0));.
0ea0: 09 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 7d 0a  .    return;..}.
0eb0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
0ec0: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
0ed0: 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54  _CB_HANDSHAKE_ST
0ee0: 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20  ART) {..major = 
0ef0: 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69  "handshake";..mi
0f00: 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20  nor = "start";. 
0f10: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68     } else if (wh
0f20: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e  ere & SSL_CB_HAN
0f30: 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09  DSHAKE_DONE) {..
0f40: 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61  major = "handsha
0f50: 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64  ke";..minor = "d
0f60: 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65  one";.    } else
0f70: 20 7b 0a 09 69 66 20 28 77 68 65 72 65 20 26 20   {..if (where & 
0f80: 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d  SSL_CB_ALERT)..m
0f90: 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a  ajor = "alert";.
0fa0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
0fb0: 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54  & SSL_ST_CONNECT
0fc0: 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65  ).major = "conne
0fd0: 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  ct";..else if (w
0fe0: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43  here & SSL_ST_AC
0ff0: 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22  CEPT)..major = "
1000: 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09  accept";..else..
1010: 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e  ...major = "unkn
1020: 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72  own";...if (wher
1030: 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29  e & SSL_CB_READ)
1040: 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22  ..minor = "read"
1050: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1060: 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45  e & SSL_CB_WRITE
1070: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74  )..minor = "writ
1080: 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68  e";..else if (wh
1090: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f  ere & SSL_CB_LOO
10a0: 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f  P)..minor = "loo
10b0: 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68  p";..else if (wh
10c0: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49  ere & SSL_CB_EXI
10d0: 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69  T)..minor = "exi
10e0: 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69  t";..else.....mi
10f0: 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b  nor = "unknown";
1100: 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 54 63 6c  .    }...    Tcl
1110: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1120: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d  ement( statePtr-
1130: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
1140: 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74   ..    Tcl_NewSt
1150: 72 69 6e 67 4f 62 6a 28 20 22 69 6e 66 6f 22 2c  ringObj( "info",
1160: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f   -1));..    Tcl_
1170: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1180: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e  ment( statePtr->
1190: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
11a0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
11b0: 69 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43  ingObj( Tcl_GetC
11c0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
11d0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20  Ptr->self), -1) 
11e0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
11f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1200: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ( statePtr->inte
1210: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
1220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1230: 6a 28 20 6d 61 6a 6f 72 2c 20 2d 31 29 20 29 3b  j( major, -1) );
1240: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
1250: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20  jAppendElement( 
1260: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1270: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1280: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1290: 20 6d 69 6e 6f 72 2c 20 2d 31 29 20 29 3b 0a 0a   minor, -1) );..
12a0: 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20      if (where & 
12b0: 28 53 53 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c  (SSL_CB_LOOP|SSL
12c0: 5f 43 42 5f 45 58 49 54 29 29 20 7b 0a 09 54 63  _CB_EXIT)) {..Tc
12d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12e0: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72  lement( statePtr
12f0: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
1300: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1310: 72 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 73 74 61  ringObj( SSL_sta
1320: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73  te_string_long(s
1330: 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20 20 20  sl), -1) );.    
1340: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  } else if (where
1350: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29   & SSL_CB_ALERT)
1360: 20 7b 0a 09 63 68 61 72 20 2a 63 70 20 3d 20 53   {..char *cp = S
1370: 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74  SL_alert_desc_st
1380: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a  ring_long(ret);.
1390: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
13a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74  endElement( stat
13b0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d  ePtr->interp, cm
13c0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
13d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 63 70 2c  ewStringObj( cp,
13e0: 20 2d 31 29 20 29 3b 0a 20 20 20 20 7d 20 65 6c   -1) );.    } el
13f0: 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  se {..Tcl_ListOb
1400: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20  jAppendElement( 
1410: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1420: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1430: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1440: 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e   SSL_state_strin
1450: 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29  g_long(ssl), -1)
1460: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63   );.    }.    Tc
1470: 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c 69  l_Preserve( (Cli
1480: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
1490: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  r->interp);.    
14a0: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43  Tcl_Preserve( (C
14b0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
14c0: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49  Ptr);..    Tcl_I
14d0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d 64  ncrRefCount( cmd
14e0: 50 74 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  Ptr);.    (void)
14f0: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 4f   Tcl_GlobalEvalO
1500: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  bj(statePtr->int
1510: 65 72 70 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20  erp, cmdPtr);.  
1520: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
1530: 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a 20 20  nt( cmdPtr);..  
1540: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20 28    Tcl_Release( (
1550: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
1560: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52  ePtr);.    Tcl_R
1570: 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74 44  elease( (ClientD
1580: 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69  ata) statePtr->i
1590: 6e 74 65 72 70 29 3b 0a 0a 7d 0a 0c 0a 2f 2a 0a  nterp);..}.../*.
15a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69  -----. *. * Veri
15f0: 66 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  fyCallback --. *
1600: 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 4c  . *.monitors SSL
1610: 20 63 65 72 69 66 69 63 61 74 65 20 76 61 6c 69   cerificate vali
1620: 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20  dation process. 
1630: 2a 09 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  *.This is called
1640: 20 77 68 65 6e 65 76 65 72 20 61 20 63 65 72 74   whenever a cert
1650: 69 66 69 63 61 74 65 20 69 73 20 69 6e 73 70 65  ificate is inspe
1660: 63 74 65 64 0a 20 2a 09 20 6f 72 20 64 65 63 69  cted. *. or deci
1670: 64 65 64 20 69 6e 76 61 6c 69 64 0a 20 2a 0a 20  ded invalid. *. 
1680: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6f 6b  * Results:. *.ok
1690: 20 2d 20 6c 65 74 20 53 53 4c 20 68 61 6e 64 6c   - let SSL handl
16a0: 65 20 69 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20  e it. *. * Side 
16b0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
16c0: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  err field of the
16d0: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61   currently opera
16e0: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65  tive State is se
16f0: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69  t. *.  to a stri
1700: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
1710: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
1720: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e  n failure reason
1730: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
1780: 63 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c  c int.VerifyCall
1790: 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30  back(int ok, X50
17a0: 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78  9_STORE_CTX *ctx
17b0: 29 0a 7b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c  ).{.    SSL *ssl
17c0: 20 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54   = (SSL*)X509_ST
17d0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 61 70 70 5f  ORE_CTX_get_app_
17e0: 64 61 74 61 28 63 74 78 29 3b 0a 20 20 20 20 58  data(ctx);.    X
17f0: 35 30 39 20 2a 63 65 72 74 20 3d 20 58 35 30 39  509 *cert = X509
1800: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63  _STORE_CTX_get_c
1810: 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29  urrent_cert(ctx)
1820: 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  ;.    State *sta
1830: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
1840: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61  SSL_get_app_data
1850: 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f  (ssl);.    Tcl_O
1860: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
1870: 69 6e 74 20 64 65 70 74 68 20 3d 20 58 35 30 39  int depth = X509
1880: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65  _STORE_CTX_get_e
1890: 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b  rror_depth(ctx);
18a0: 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 58  .    int err = X
18b0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
18c0: 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 20 20  t_error(ctx);.  
18d0: 20 20 63 68 61 72 20 2a 65 72 72 53 74 72 3b 0a    char *errStr;.
18e0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64  .    dprintf(std
18f0: 65 72 72 2c 20 22 56 65 72 69 66 79 3a 20 25 64  err, "Verify: %d
1900: 5c 6e 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69  \n", ok);..    i
1910: 66 20 28 21 6f 6b 29 0a 09 65 72 72 53 74 72 20  f (!ok)..errStr 
1920: 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65  = (char*)X509_ve
1930: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f  rify_cert_error_
1940: 73 74 72 69 6e 67 28 65 72 72 29 3b 0a 20 20 20  string(err);.   
1950: 20 65 6c 73 65 0a 09 65 72 72 53 74 72 20 3d 20   else..errStr = 
1960: 28 63 68 61 72 20 2a 29 30 3b 0a 0a 20 20 20 20  (char *)0;..    
1970: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
1980: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
1990: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20  bj*)NULL) {..if 
19a0: 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67  (statePtr->vflag
19b0: 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46  s & SSL_VERIFY_F
19c0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
19d0: 45 52 54 29 0a 09 20 20 20 20 72 65 74 75 72 6e  ERT)..    return
19e0: 20 6f 6b 3b 0a 09 65 6c 73 65 0a 09 20 20 20 20   ok;..else..    
19f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1a00: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
1a10: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
1a20: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
1a30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
1a40: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1a50: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ( statePtr->inte
1a60: 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 20  rp, cmdPtr, ..  
1a70: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
1a80: 62 6a 28 20 22 76 65 72 69 66 79 22 2c 20 2d 31  bj( "verify", -1
1a90: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73  ));..    Tcl_Lis
1aa0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1ab0: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  t( statePtr->int
1ac0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20  erp, cmdPtr, .. 
1ad0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1ae0: 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43 68 61 6e  Obj( Tcl_GetChan
1af0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
1b00: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20 29 3b 0a  ->self), -1) );.
1b10: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1b20: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73  AppendElement( s
1b30: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
1b40: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
1b50: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 20 64 65 70  l_NewIntObj( dep
1b60: 74 68 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  th) );..    Tcl_
1b70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1b80: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e  ment( statePtr->
1b90: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
1ba0: 09 20 20 20 20 54 6c 73 5f 4e 65 77 58 35 30 39  .    Tls_NewX509
1bb0: 4f 62 6a 28 20 73 74 61 74 65 50 74 72 2d 3e 69  Obj( statePtr->i
1bc0: 6e 74 65 72 70 2c 20 63 65 72 74 29 20 29 3b 0a  nterp, cert) );.
1bd0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1be0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73  AppendElement( s
1bf0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
1c00: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
1c10: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 20 6f 6b 29  l_NewIntObj( ok)
1c20: 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73   );..    Tcl_Lis
1c30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1c40: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  t( statePtr->int
1c50: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
1c60: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
1c70: 62 6a 28 20 65 72 72 53 74 72 20 3f 20 65 72 72  bj( errStr ? err
1c80: 53 74 72 20 3a 20 22 22 2c 20 2d 31 29 20 29 3b  Str : "", -1) );
1c90: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ..    Tcl_Preser
1ca0: 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29  ve( (ClientData)
1cb0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
1cc0: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  p);.    Tcl_Pres
1cd0: 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74  erve( (ClientDat
1ce0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
1cf0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
1d00: 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 20 20  unt( cmdPtr);.  
1d10: 20 20 69 66 20 28 54 63 6c 5f 47 6c 6f 62 61 6c    if (Tcl_Global
1d20: 45 76 61 6c 4f 62 6a 28 73 74 61 74 65 50 74 72  EvalObj(statePtr
1d30: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
1d40: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
1d50: 2f 2a 20 69 74 20 67 6f 74 20 61 6e 20 65 72 72  /* it got an err
1d60: 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20  or - reject the 
1d70: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
1d80: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
1d90: 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d 3e 69  ror( statePtr->i
1da0: 6e 74 65 72 70 29 3b 0a 09 6f 6b 20 3d 20 30 3b  nterp);..ok = 0;
1db0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69  .    } else {..i
1dc0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
1dd0: 6d 4f 62 6a 28 20 73 74 61 74 65 50 74 72 2d 3e  mObj( statePtr->
1de0: 69 6e 74 65 72 70 2c 0a 09 09 20 20 20 20 54 63  interp,...    Tc
1df0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 20  l_GetObjResult( 
1e00: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1e10: 29 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c 5f 4f  ), &ok) != TCL_O
1e20: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 42 61  K) {..    Tcl_Ba
1e30: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 20 73  ckgroundError( s
1e40: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29  tatePtr->interp)
1e50: 3b 0a 09 20 20 20 20 6f 6b 20 3d 20 30 3b 0a 09  ;..    ok = 0;..
1e60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  }.    }.    Tcl_
1e70: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d  DecrRefCount( cm
1e80: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  dPtr);..    Tcl_
1e90: 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74  Release( (Client
1ea0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
1eb0: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
1ec0: 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  ( (ClientData) s
1ed0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29  tatePtr->interp)
1ee0: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b  ;..    return(ok
1ef0: 29 3b 09 2f 2a 20 6c 65 61 76 65 20 74 68 65 20  );./* leave the 
1f00: 64 69 73 70 6f 73 69 74 69 6f 6e 20 61 73 20 53  disposition as S
1f10: 53 4c 20 73 65 74 20 69 74 20 2a 2f 0a 7d 0a 0c  SL set it */.}..
1f20: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
1f70: 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a  Tls_Error --. *.
1f80: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
1f90: 6b 20 77 69 74 68 20 24 66 64 20 61 6e 64 20 24  k with $fd and $
1fa0: 6d 73 67 20 2d 20 73 6f 20 74 68 65 20 63 61 6c  msg - so the cal
1fb0: 6c 62 61 63 6b 20 63 61 6e 20 64 65 63 69 64 65  lback can decide
1fc0: 0a 20 2a 09 77 68 61 74 20 74 6f 20 64 6f 20 77  . *.what to do w
1fd0: 69 74 68 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20  ith errors.. *. 
1fe0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6f 6b  * Results:. *.ok
1ff0: 20 2d 20 6c 65 74 20 53 53 4c 20 68 61 6e 64 6c   - let SSL handl
2000: 65 20 69 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20  e it. *. * Side 
2010: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
2020: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  err field of the
2030: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61   currently opera
2040: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65  tive State is se
2050: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69  t. *.  to a stri
2060: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
2070: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
2080: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e  n failure reason
2090: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
20e0: 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20  Tls_Error(State 
20f0: 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20  *statePtr, char 
2100: 2a 6d 73 67 29 0a 7b 0a 20 20 20 20 54 63 6c 5f  *msg).{.    Tcl_
2110: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 0a 20 20  Obj *cmdPtr;..  
2120: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73    if (msg && *ms
2130: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72  g) {..Tcl_SetErr
2140: 6f 72 43 6f 64 65 28 20 73 74 61 74 65 50 74 72  orCode( statePtr
2150: 2d 3e 69 6e 74 65 72 70 2c 20 22 53 53 4c 22 2c  ->interp, "SSL",
2160: 20 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e 55   msg, (char *)NU
2170: 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  LL);.    } else 
2180: 7b 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74  {..msg = Tcl_Get
2190: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
21a0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 73  l_GetObjResult(s
21b0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29  tatePtr->interp)
21c0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20  , NULL);.    }. 
21d0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72     statePtr->err
21e0: 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66 20   = msg;..    if 
21f0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
2200: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
2210: 29 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62  )NULL) {..char b
2220: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70 72  uf[BUFSIZ];..spr
2230: 69 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20 63  intf(buf, "SSL c
2240: 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20 65  hannel \"%s\": e
2250: 72 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20 20  rror: %s",..    
2260: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
2270: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
2280: 66 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f 53  f), msg);..Tcl_S
2290: 65 74 52 65 73 75 6c 74 28 20 73 74 61 74 65 50  etResult( stateP
22a0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 62 75 66 2c  tr->interp, buf,
22b0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
22c0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
22d0: 72 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d 3e  rror( statePtr->
22e0: 69 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e  interp);..return
22f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50  ;.    }.    cmdP
2300: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
2310: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
2320: 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20  callback);..    
2330: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2340: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50  dElement( stateP
2350: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
2360: 74 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65  tr, ..    Tcl_Ne
2370: 77 53 74 72 69 6e 67 4f 62 6a 28 20 22 65 72 72  wStringObj( "err
2380: 6f 72 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  or", -1));..    
2390: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
23a0: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50  dElement( stateP
23b0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
23c0: 74 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65  tr, ..    Tcl_Ne
23d0: 77 53 74 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f  wStringObj( Tcl_
23e0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
23f0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
2400: 2d 31 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  -1) );..    Tcl_
2410: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2420: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e  ment( statePtr->
2430: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
2440: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
2450: 6e 67 4f 62 6a 28 20 6d 73 67 2c 20 2d 31 29 20  ngObj( msg, -1) 
2460: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
2470: 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74  erve( (ClientDat
2480: 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  a) statePtr->int
2490: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72  erp);.    Tcl_Pr
24a0: 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44  eserve( (ClientD
24b0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
24c0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
24d0: 43 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a  Count( cmdPtr);.
24e0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 6c 6f 62      if (Tcl_Glob
24f0: 61 6c 45 76 61 6c 4f 62 6a 28 73 74 61 74 65 50  alEvalObj(stateP
2500: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
2510: 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  tr) != TCL_OK) {
2520: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
2530: 45 72 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d  Error( statePtr-
2540: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a  >interp);.    }.
2550: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2560: 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a  ount( cmdPtr);..
2570: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
2580: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74   (ClientData) st
2590: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  atePtr);.    Tcl
25a0: 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e  _Release( (Clien
25b0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d  tData) statePtr-
25c0: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a  >interp);.}.../*
25d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
25e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2610: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73  ------. *. * Pas
2620: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 20 2d 2d  swordCallback --
2630: 20 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77   . *. *.Called w
2640: 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 69  hen a password i
2650: 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e 70 61  s needed to unpa
2660: 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d 20 6b  ck RSA and PEM k
2670: 65 79 73 0a 20 2a 09 45 76 61 6c 73 20 74 68 65  eys. *.Evals the
2680: 20 74 63 6c 20 70 72 6f 63 3a 20 20 74 6c 73 3a   tcl proc:  tls:
2690: 3a 70 61 73 73 77 6f 72 64 20 61 6e 64 20 72 65  :password and re
26a0: 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74  turns the result
26b0: 20 61 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77   as. *.the passw
26c0: 6f 72 64 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ord. *----------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69  ---------. */.#i
2710: 66 64 65 66 20 50 52 45 5f 4f 50 45 4e 53 53 4c  fdef PRE_OPENSSL
2720: 5f 30 5f 39 5f 34 0a 2f 2a 0a 20 2a 20 4e 6f 20  _0_9_4./*. * No 
2730: 77 61 79 20 74 6f 20 68 61 6e 64 6c 65 20 75 73  way to handle us
2740: 65 72 2d 64 61 74 61 20 74 68 65 72 65 66 6f 72  er-data therefor
2750: 65 20 6e 6f 20 77 61 79 20 77 69 74 68 6f 75 74  e no way without
2760: 20 61 20 67 6c 6f 62 61 6c 0a 20 2a 20 76 61 72   a global. * var
2770: 69 61 62 6c 65 20 74 6f 20 61 63 63 65 73 73 20  iable to access 
2780: 74 68 65 20 54 63 6c 20 69 6e 74 65 72 70 72 65  the Tcl interpre
2790: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
27a0: 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  nt.PasswordCallb
27b0: 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69  ack(char *buf, i
27c0: 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 72  nt size, int ver
27d0: 69 66 79 29 0a 7b 0a 20 20 20 20 72 65 74 75 72  ify).{.    retur
27e0: 6e 20 2d 31 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74  n -1;.}.#else.st
27f0: 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72  atic int.Passwor
2800: 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a  dCallback(char *
2810: 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69  buf, int size, i
2820: 6e 74 20 76 65 72 69 66 79 2c 20 76 6f 69 64 20  nt verify, void 
2830: 2a 75 64 61 74 61 29 0a 7b 0a 20 20 20 20 54 63  *udata).{.    Tc
2840: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2850: 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29   = (Tcl_Interp*)
2860: 75 64 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28  udata;..    if (
2870: 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c  Tcl_Eval(interp,
2880: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22   "tls::password"
2890: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) == TCL_OK) {..
28a0: 63 68 61 72 20 2a 72 65 74 20 3d 20 54 63 6c 5f  char *ret = Tcl_
28b0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
28c0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 20  interp);.       
28d0: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65   strncpy(buf, re
28e0: 74 2c 20 73 69 7a 65 29 3b 0a 09 72 65 74 75 72  t, size);..retur
28f0: 6e 20 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 20  n strlen(ret);. 
2900: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 74     } else {..ret
2910: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 7d 0a  urn -1;.    }.}.
2920: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f  -. *. * CiphersO
2980: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76  bjCmd -- list av
2990: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a  ailable ciphers.
29a0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
29b0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
29c0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
29d0: 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f  tls::ciphers" co
29e0: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74  mmand. *.to list
29f0: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65   available ciphe
2a00: 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70  rs, based upon p
2a10: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
2a20: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
2a30: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
2a40: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a  cl result list..
2a50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2a60: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74  ts:. *.construct
2a70: 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53  s and destroys S
2a80: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29  SL context (CTX)
2a90: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74  ---------. */.st
2ae0: 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73  atic int.Ciphers
2af0: 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 74  ObjCmd(clientDat
2b00: 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c  a, interp, objc,
2b10: 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e   objv).    Clien
2b20: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2b30: 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a  ;./* Not used. *
2b40: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  /.    Tcl_Interp
2b50: 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e   *interp;.    in
2b60: 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f  t objc;.    Tcl_
2b70: 4f 62 6a 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj.*CONST objv[
2b80: 5d 3b 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20  ];.{.    static 
2b90: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b  char *protocols[
2ba0: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 0a 09  ] = {.."ssl2",..
2bb0: 22 73 73 6c 33 22 2c 0a 09 22 74 6c 73 31 22 2c  "ssl3",.."tls1",
2bc0: 0a 09 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20  ..NULL.    };.  
2bd0: 20 20 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20    enum protocol 
2be0: 7b 0a 09 54 4c 53 5f 53 53 4c 32 2c 0a 09 54 4c  {..TLS_SSL2,..TL
2bf0: 53 5f 53 53 4c 33 2c 0a 09 54 4c 53 5f 54 4c 53  S_SSL3,..TLS_TLS
2c00: 31 2c 0a 09 54 4c 53 5f 4e 4f 4e 45 0a 20 20 20  1,..TLS_NONE.   
2c10: 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   };.    Tcl_Obj 
2c20: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 53 53 4c  *objPtr;.    SSL
2c30: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
2c40: 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d  ;.    SSL *ssl =
2c50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b   NULL;.    STACK
2c60: 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20  _OF(SSL_CIPHER) 
2c70: 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  *sk;.    char *c
2c80: 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a  p, buf[BUFSIZ];.
2c90: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76      int index, v
2ca0: 65 72 62 6f 73 65 20 3d 20 30 3b 0a 0a 20 20 20  erbose = 0;..   
2cb0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c   if (objc < 2 ||
2cc0: 20 6f 62 6a 63 20 3e 20 33 29 20 7b 0a 09 54 63   objc > 3) {..Tc
2cd0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2ce0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2cf0: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f  "protocol ?verbo
2d00: 73 65 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 72  se?");.        r
2d10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2d20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54  .    }.    if (T
2d30: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
2d40: 62 6a 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76  bj( interp, objv
2d50: 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20  [1], protocols, 
2d60: 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 0a 09  "protocol", 0,..
2d70: 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f  &index) != TCL_O
2d80: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
2d90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
2da0: 20 20 69 66 20 28 6f 62 6a 63 20 3e 20 32 20 26    if (objc > 2 &
2db0: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  & Tcl_GetBoolean
2dc0: 46 72 6f 6d 4f 62 6a 28 20 69 6e 74 65 72 70 2c  FromObj( interp,
2dd0: 20 6f 62 6a 76 5b 32 5d 2c 0a 09 26 76 65 72 62   objv[2],..&verb
2de0: 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ose) != TCL_OK) 
2df0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
2e00: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
2e10: 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f  witch ((enum pro
2e20: 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 20  tocol)index) {. 
2e30: 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c 32     case TLS_SSL2
2e40: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
2e50: 5f 53 53 4c 32 29 0a 09 09 54 63 6c 5f 41 70 70  _SSL2)...Tcl_App
2e60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2e70: 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  , "protocol not 
2e80: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
2e90: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
2ea0: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 63  ERROR;.#else...c
2eb0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
2ec0: 28 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29  (SSLv2_method())
2ed0: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
2ee0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c      case TLS_SSL
2ef0: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  3:.#if defined(N
2f00: 4f 5f 53 53 4c 33 29 0a 09 09 54 63 6c 5f 41 70  O_SSL3)...Tcl_Ap
2f10: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2f20: 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  p, "protocol not
2f30: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
2f40: 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  L);...return TCL
2f50: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09  _ERROR;.#else...
2f60: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
2f70: 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29  w(SSLv3_method()
2f80: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
2f90: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c  .    case TLS_TL
2fa0: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  S1:.#if defined(
2fb0: 4e 4f 5f 54 4c 53 31 29 0a 09 09 54 63 6c 5f 41  NO_TLS1)...Tcl_A
2fc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2fd0: 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f  rp, "protocol no
2fe0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
2ff0: 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  LL);...return TC
3000: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
3010: 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e  .ctx = SSL_CTX_n
3020: 65 77 28 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28  ew(TLSv1_method(
3030: 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  )); break;.#endi
3040: 66 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  f.    }.    if (
3050: 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ctx == NULL) {..
3060: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3070: 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28  (interp, REASON(
3080: 29 2c 0a 09 20 20 20 20 28 63 68 61 72 20 2a 29  ),..    (char *)
3090: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
30a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
30b0: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e  .    ssl = SSL_n
30c0: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20  ew(ctx);.    if 
30d0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
30e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
30f0: 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e  t(interp, REASON
3100: 28 29 2c 0a 09 20 20 20 20 28 63 68 61 72 20 2a  (),..    (char *
3110: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
3120: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
3130: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3140: 20 20 20 20 7d 0a 20 20 20 20 6f 62 6a 50 74 72      }.    objPtr
3150: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
3160: 6a 28 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  j( 0, NULL);..  
3170: 20 20 69 66 20 28 21 76 65 72 62 6f 73 65 29 20    if (!verbose) 
3180: 7b 0a 09 66 6f 72 20 28 69 6e 64 65 78 20 3d 20  {..for (index = 
3190: 30 3b 20 3b 20 69 6e 64 65 78 2b 2b 29 20 7b 0a  0; ; index++) {.
31a0: 09 20 20 20 20 63 70 20 3d 20 28 63 68 61 72 2a  .    cp = (char*
31b0: 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f  )SSL_get_cipher_
31c0: 6c 69 73 74 28 20 73 73 6c 2c 20 69 6e 64 65 78  list( ssl, index
31d0: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 70 20 3d  );..    if (cp =
31e0: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09  = NULL) break;..
31f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3200: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e  ppendElement( in
3210: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09  terp, objPtr,...
3220: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3230: 28 20 63 70 2c 20 2d 31 29 20 29 3b 0a 09 7d 0a  ( cp, -1) );..}.
3240: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b      } else {..sk
3250: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65   = SSL_get_ciphe
3260: 72 73 28 73 73 6c 29 3b 0a 0a 09 66 6f 72 20 28  rs(ssl);...for (
3270: 69 6e 64 65 78 20 3d 20 30 3b 20 69 6e 64 65 78  index = 0; index
3280: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   < sk_SSL_CIPHER
3290: 5f 6e 75 6d 28 73 6b 29 3b 20 69 6e 64 65 78 2b  _num(sk); index+
32a0: 2b 29 20 7b 0a 09 20 20 20 20 72 65 67 69 73 74  +) {..    regist
32b0: 65 72 20 69 6e 74 20 69 3b 0a 09 20 20 20 20 53  er int i;..    S
32c0: 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69  SL_CIPHER_descri
32d0: 70 74 69 6f 6e 28 20 73 6b 5f 53 53 4c 5f 43 49  ption( sk_SSL_CI
32e0: 50 48 45 52 5f 76 61 6c 75 65 28 20 73 6b 2c 20  PHER_value( sk, 
32f0: 69 6e 64 65 78 29 2c 0a 09 09 09 09 20 20 20 20  index),.....    
3300: 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  buf, sizeof(buf)
3310: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 20 3d  );..    for (i =
3320: 20 73 74 72 6c 65 6e 28 62 75 66 29 20 2d 20 31   strlen(buf) - 1
3330: 3b 20 69 20 3b 20 69 2d 2d 29 20 7b 0a 09 09 69  ; i ; i--) {...i
3340: 66 20 28 62 75 66 5b 69 5d 20 3d 3d 20 27 20 27  f (buf[i] == ' '
3350: 20 7c 7c 20 62 75 66 5b 69 5d 20 3d 3d 20 27 5c   || buf[i] == '\
3360: 6e 27 20 7c 7c 0a 09 09 20 20 20 20 62 75 66 5b  n' ||...    buf[
3370: 69 5d 20 3d 3d 20 27 5c 72 27 20 7c 7c 20 62 75  i] == '\r' || bu
3380: 66 5b 69 5d 20 3d 3d 20 27 5c 74 27 29 20 7b 0a  f[i] == '\t') {.
3390: 09 09 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 27  ..    buf[i] = '
33a0: 5c 30 27 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  \0';...} else {.
33b0: 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d  ..    break;...}
33c0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
33d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
33e0: 65 6d 65 6e 74 28 20 69 6e 74 65 72 70 2c 20 6f  ement( interp, o
33f0: 62 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77  bjPtr,...Tcl_New
3400: 53 74 72 69 6e 67 4f 62 6a 28 20 62 75 66 2c 20  StringObj( buf, 
3410: 2d 31 29 20 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  -1) );..}.    }.
3420: 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c      SSL_free(ssl
3430: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  );.    SSL_CTX_f
3440: 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54  ree(ctx);..    T
3450: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
3460: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29   interp, objPtr)
3470: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3480: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b  -. *. * Handshak
34e0: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  eObjCmd --. *. *
34f0: 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73  .This command is
3500: 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20   used to verify 
3510: 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64  whether the hand
3520: 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74  shake is complet
3530: 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a  e. *.or not.. *.
3540: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
3550: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
3560: 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61  sult. 1 means ha
3570: 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65  ndshake complete
3580: 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e  , 0 means pendin
3590: 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  g.. *. * Side ef
35a0: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f  fects:. *.May fo
35b0: 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74  rce SSL negotiat
35c0: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63  ion to take plac
35d0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
3620: 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 61 6e 64  .static int.Hand
3630: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 63 6c 69 65  shakeObjCmd(clie
3640: 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20  ntData, interp, 
3650: 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20  objc, objv).    
3660: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
3670: 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73  tData;./* Not us
3680: 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  ed. */.    Tcl_I
3690: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
36a0: 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20     int objc;.   
36b0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
36c0: 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63  objv[];.{.    Tc
36d0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09  l_Channel chan;.
36e0: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20  ./* The channel 
36f0: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e  to set a mode on
3700: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a  . */.    State *
3710: 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c  statePtr;../* cl
3720: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73  ient state for s
3730: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20  sl socket */.   
3740: 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 0a 20   int ret = 1;.. 
3750: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
3760: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
3770: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
3780: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
3790: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
37a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
37b0: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   }..    chan = T
37c0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
37d0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
37e0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
37f0: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29  1], NULL), NULL)
3800: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
3810: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
3820: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20  NULL) {.        
3830: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3840: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
3850: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
3860: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
3870: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
3880: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
3890: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
38a0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
38b0: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
38c0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 20 20  elName(chan),.  
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
38e0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
38f0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20  nnel", NULL);.  
3900: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
3910: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
3920: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
3930: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61  ate *)Tcl_GetCha
3940: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
3950: 28 20 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66  ( chan);..    if
3960: 20 28 21 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66   (!SSL_is_init_f
3970: 69 6e 69 73 68 65 64 28 73 74 61 74 65 50 74 72  inished(statePtr
3980: 2d 3e 73 73 6c 29 29 20 7b 0a 09 69 6e 74 20 65  ->ssl)) {..int e
3990: 72 72 3b 0a 09 72 65 74 20 3d 20 54 6c 73 5f 57  rr;..ret = Tls_W
39a0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74  aitForConnect(st
39b0: 61 74 65 50 74 72 2c 20 26 65 72 72 29 3b 0a 09  atePtr, &err);..
39c0: 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09  if (ret < 0) {..
39d0: 20 20 20 20 63 68 61 72 20 2a 65 72 72 53 74 72      char *errStr
39e0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72   = statePtr->err
39f0: 3b 0a 09 20 20 20 20 54 63 6c 5f 52 65 73 65 74  ;..    Tcl_Reset
3a00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
3a10: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6e  .    Tcl_SetErrn
3a20: 6f 28 65 72 72 29 3b 0a 0a 09 20 20 20 20 69 66  o(err);...    if
3a30: 20 28 21 65 72 72 53 74 72 20 7c 7c 20 2a 65 72   (!errStr || *er
3a40: 72 53 74 72 20 3d 3d 20 30 29 0a 09 20 20 20 20  rStr == 0)..    
3a50: 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c      errStr = Tcl
3a60: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65  _PosixError(inte
3a70: 72 70 29 3b 0a 0a 09 20 20 20 20 54 63 6c 5f 41  rp);...    Tcl_A
3a80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3a90: 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66  rp, "handshake f
3aa0: 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72  ailed: ", errStr
3ab0: 2c 20 28 63 68 61 72 2a 29 4e 55 4c 4c 29 3b 0a  , (char*)NULL);.
3ac0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
3ad0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
3ae0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
3af0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
3b00: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29  _NewIntObj(ret))
3b10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3b20: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b70: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62  -. *. * ImportOb
3b80: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
3b90: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
3ba0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
3bb0: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d  ss the "ssl" com
3bc0: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73  mand. *. *.The s
3bd0: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65  sl command pushe
3be0: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65  s SSL over a (ne
3bf0: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74  wly connected) t
3c00: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20  cp socket. *. * 
3c10: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
3c20: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
3c30: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
3c40: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f  fects:. *.May mo
3c50: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  dify the behavio
3c60: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e  r of an IO chann
3c70: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3cc0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70  ..static int.Imp
3cd0: 6f 72 74 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74  ortObjCmd(client
3ce0: 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62  Data, interp, ob
3cf0: 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c  jc, objv).    Cl
3d00: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
3d10: 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64  ata;./* Not used
3d20: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74  . */.    Tcl_Int
3d30: 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20  erp *interp;.   
3d40: 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54   int objc;.    T
3d50: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
3d60: 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63 6c 5f  jv[];.{.    Tcl_
3d70: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
3d80: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
3d90: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
3da0: 2a 2f 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b  */.    BIO *bio;
3db0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
3dc0: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
3dd0: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
3de0: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c  ocket */.    SSL
3df0: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
3e00: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73  ;.    Tcl_Obj *s
3e10: 63 72 69 70 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  cript = NULL;.  
3e20: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 69    int idx;.    i
3e30: 6e 74 20 66 6c 61 67 73 20 3d 20 54 4c 53 5f 54  nt flags = TLS_T
3e40: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74  CL_INIT;.    int
3e50: 20 73 65 72 76 65 72 20 3d 20 30 3b 09 09 2f 2a   server = 0;../*
3e60: 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69   is connection i
3e70: 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f  ncoming or outgo
3e80: 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72  ing? */.    char
3e90: 20 2a 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *key = NULL;.  
3ea0: 20 20 63 68 61 72 20 2a 63 65 72 74 20 3d 20 4e    char *cert = N
3eb0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  ULL;.    char *c
3ec0: 69 70 68 65 72 73 20 3d 20 4e 55 4c 4c 3b 0a 20  iphers = NULL;. 
3ed0: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 20     char *CAfile 
3ee0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
3ef0: 20 2a 43 41 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a   *CAdir = NULL;.
3f00: 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 20      char *model 
3f10: 3d 20 4e 55 4c 4c 3b 0a 23 69 66 20 64 65 66 69  = NULL;.#if defi
3f20: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  ned(NO_SSL2).   
3f30: 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 3b 0a 23   int ssl2 = 0;.#
3f40: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 73 73 6c  else.    int ssl
3f50: 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69  2 = 1;.#endif.#i
3f60: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  f defined(NO_SSL
3f70: 33 29 0a 20 20 20 20 69 6e 74 20 73 73 6c 33 20  3).    int ssl3 
3f80: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  = 0;.#else.    i
3f90: 6e 74 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e  nt ssl3 = 1;.#en
3fa0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3fb0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69  NO_SSL2) && defi
3fc0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 20  ned(NO_SSL3).   
3fd0: 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 3b 0a 23   int tls1 = 1;.#
3fe0: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 74 6c 73  else.    int tls
3ff0: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  1 = 0;.#endif.  
4000: 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 3b    int proto = 0;
4010: 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20  .    int verify 
4020: 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30  = 0, require = 0
4030: 2c 20 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a  , request = 1;..
4040: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32      if (objc < 2
4050: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
4060: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
4070: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20   objv, "channel 
4080: 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 20 20 20  ?options?");.   
4090: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
40a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
40b0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
40c0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
40d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
40e0: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55  mObj(objv[1], NU
40f0: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  LL), NULL);.    
4100: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
4110: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
4120: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
4130: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
4140: 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20  }..    for (idx 
4150: 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b  = 2; idx < objc;
4160: 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20   idx++) {..char 
4170: 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  *opt = Tcl_GetSt
4180: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
4190: 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  [idx], NULL);...
41a0: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d  if (opt[0] != '-
41b0: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ')..    break;..
41c0: 09 4f 50 54 53 54 52 28 20 22 2d 63 61 66 69 6c  .OPTSTR( "-cafil
41d0: 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50  e", CAfile);..OP
41e0: 54 53 54 52 28 20 22 2d 63 61 64 69 72 22 2c 20  TSTR( "-cadir", 
41f0: 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 28  CAdir);..OPTSTR(
4200: 20 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65   "-certfile", ce
4210: 72 74 29 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d  rt);..OPTSTR( "-
4220: 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73  cipher", ciphers
4230: 29 3b 0a 09 4f 50 54 4f 42 4a 28 20 22 2d 63 6f  );..OPTOBJ( "-co
4240: 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b  mmand", script);
4250: 0a 09 4f 50 54 53 54 52 28 20 22 2d 6b 65 79 66  ..OPTSTR( "-keyf
4260: 69 6c 65 22 2c 20 6b 65 79 29 3b 0a 09 4f 50 54  ile", key);..OPT
4270: 53 54 52 28 20 22 2d 6d 6f 64 65 6c 22 2c 20 6d  STR( "-model", m
4280: 6f 64 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  odel);..OPTBOOL(
4290: 20 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71   "-require", req
42a0: 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uire);..OPTBOOL(
42b0: 20 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71   "-request", req
42c0: 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uest);..OPTBOOL(
42d0: 20 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76   "-server", serv
42e0: 65 72 29 3b 0a 0a 09 4f 50 54 42 4f 4f 4c 28 20  er);...OPTBOOL( 
42f0: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a  "-ssl2", ssl2);.
4300: 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 73 73 6c 33  .OPTBOOL( "-ssl3
4310: 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f  ", ssl3);..OPTBO
4320: 4f 4c 28 20 22 2d 74 6c 73 31 22 2c 20 74 6c 73  OL( "-tls1", tls
4330: 31 29 3b 0a 0a 09 4f 50 54 42 41 44 28 20 22 6f  1);...OPTBAD( "o
4340: 70 74 69 6f 6e 22 2c 20 22 2d 63 61 66 69 6c 65  ption", "-cafile
4350: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 65 72 74 66  , -cadir, -certf
4360: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63  ile, -cipher, -c
4370: 6f 6d 6d 61 6e 64 2c 20 2d 6b 65 79 66 69 6c 65  ommand, -keyfile
4380: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 72 65 71 75 69  , -model, -requi
4390: 72 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 73  re, -request, -s
43a0: 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 73 65 72  sl2, -ssl3, -ser
43b0: 76 65 72 2c 20 6f 72 20 2d 74 6c 73 31 22 29 3b  ver, or -tls1");
43c0: 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
43d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
43e0: 66 20 28 72 65 71 75 65 73 74 29 20 76 65 72 69  f (request) veri
43f0: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
4400: 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53  _CLIENT_ONCE | S
4410: 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a  SL_VERIFY_PEER;.
4420: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20      if (request 
4430: 26 26 20 72 65 71 75 69 72 65 29 20 76 65 72 69  && require) veri
4440: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
4450: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
4460: 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 76  _CERT;.    if (v
4470: 65 72 69 66 79 20 3d 3d 20 30 29 20 76 65 72 69  erify == 0) veri
4480: 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  fy = SSL_VERIFY_
4490: 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f  NONE;..    proto
44a0: 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f   |= (ssl2 ? TLS_
44b0: 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b  PROTO_SSL2 : 0);
44c0: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73  .    proto |= (s
44d0: 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  sl3 ? TLS_PROTO_
44e0: 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70  SSL3 : 0);.    p
44f0: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20  roto |= (tls1 ? 
4500: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a  TLS_PROTO_TLS1 :
4510: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73   0);..    /* res
4520: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c  et to NULL if bl
4530: 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69  ank string provi
4540: 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  ded */.    if (c
4550: 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 20 63  ert && !*cert) c
4560: 65 72 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ert = NULL;.    
4570: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79  if (key && !*key
4580: 29 20 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ) key = NULL;.  
4590: 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26    if (ciphers &&
45a0: 20 21 2a 63 69 70 68 65 72 73 29 20 63 69 70 68   !*ciphers) ciph
45b0: 65 72 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ers = NULL;.    
45c0: 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a  if (CAfile && !*
45d0: 43 41 66 69 6c 65 29 20 43 41 66 69 6c 65 20 3d  CAfile) CAfile =
45e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43   NULL;.    if (C
45f0: 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72 29  Adir && !*CAdir)
4600: 20 43 41 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a 0a   CAdir = NULL;..
4610: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d      if (model !=
4620: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f   NULL) {..int mo
4630: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20  de;../* Get the 
4640: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20  "model" context 
4650: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47  */..chan = Tcl_G
4660: 65 74 43 68 61 6e 6e 65 6c 28 20 69 6e 74 65 72  etChannel( inter
4670: 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29  p, model, &mode)
4680: 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28  ;..if (chan == (
4690: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 30 29 20 7b  Tcl_Channel)0) {
46a0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
46b0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 69 66 20 28  _ERROR;..}..if (
46c0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
46d0: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
46e0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
46f0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
4700: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
4710: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
4720: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
4730: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 20 20 20  ame(chan),...   
4740: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20   "\": not a TLS 
4750: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
4760: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
4770: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 73 74 61 74  _ERROR;..}..stat
4780: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
4790: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
47a0: 73 74 61 6e 63 65 44 61 74 61 28 20 63 68 61 6e  stanceData( chan
47b0: 29 3b 0a 09 63 74 78 20 3d 20 73 74 61 74 65 50  );..ctx = stateP
47c0: 74 72 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65  tr->ctx;.    } e
47d0: 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20  lse {..if ((ctx 
47e0: 3d 20 43 54 58 5f 49 6e 69 74 28 20 69 6e 74 65  = CTX_Init( inte
47f0: 72 70 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 2c 20  rp, proto, key, 
4800: 63 65 72 74 2c 20 43 41 64 69 72 2c 20 43 41 66  cert, CAdir, CAf
4810: 69 6c 65 2c 20 63 69 70 68 65 72 73 29 29 0a 09  ile, ciphers))..
4820: 20 20 20 20 3d 3d 20 28 53 53 4c 5f 43 54 58 2a      == (SSL_CTX*
4830: 29 30 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  )0) {..    retur
4840: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
4850: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 6e 65      }..    /* ne
4860: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20  w SSL state */. 
4870: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53     statePtr = (S
4880: 74 61 74 65 20 2a 29 20 54 63 6c 5f 41 6c 6c 6f  tate *) Tcl_Allo
4890: 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a  c((unsigned) siz
48a0: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20  eof(State));.   
48b0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20   statePtr->self 
48c0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 4e  = (Tcl_Channel)N
48d0: 55 4c 4c 3b 0a 20 20 20 20 73 74 61 74 65 50 74  ULL;.    statePt
48e0: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f  r->timer = (Tcl_
48f0: 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c 3b  TimerToken)NULL;
4900: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
4910: 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
4920: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74     statePtr->wat
4930: 63 68 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  chMask = 0;.    
4940: 73 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65 20 3d  statePtr->mode =
4950: 20 30 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74   0;..    statePt
4960: 72 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  r->interp = inte
4970: 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  rp;.    statePtr
4980: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 28 54 63  ->callback = (Tc
4990: 6c 5f 4f 62 6a 20 2a 29 30 3b 0a 0a 20 20 20 20  l_Obj *)0;..    
49a0: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73  statePtr->vflags
49b0: 20 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73   = verify;.    s
49c0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 28  tatePtr->ssl = (
49d0: 53 53 4c 2a 29 30 3b 0a 20 20 20 20 73 74 61 74  SSL*)0;.    stat
49e0: 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b  ePtr->ctx = ctx;
49f0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62  .    statePtr->b
4a00: 69 6f 20 3d 20 28 42 49 4f 2a 29 30 3b 0a 20 20  io = (BIO*)0;.  
4a10: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69    statePtr->p_bi
4a20: 6f 20 3d 20 28 42 49 4f 2a 29 30 3b 0a 0a 20 20  o = (BIO*)0;..  
4a30: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20    statePtr->err 
4a40: 3d 20 22 22 3b 0a 0a 20 20 20 20 54 63 6c 5f 53  = "";..    Tcl_S
4a50: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
4a60: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
4a70: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62  translation", "b
4a80: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c  inary");.    Tcl
4a90: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
4aa0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
4ab0: 22 2d 62 75 66 66 65 72 69 6e 67 22 2c 20 22 6e  "-buffering", "n
4ac0: 6f 6e 65 22 29 3b 0a 0a 23 69 66 20 54 43 4c 5f  one");..#if TCL_
4ad0: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d  MAJOR_VERSION ==
4ae0: 20 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f   8 && TCL_MINOR_
4af0: 56 45 52 53 49 4f 4e 20 3c 20 32 0a 20 20 20 20  VERSION < 2.    
4b00: 73 74 61 74 65 50 74 72 2d 3e 70 61 72 65 6e 74  statePtr->parent
4b10: 20 3d 20 63 68 61 6e 3b 0a 20 20 20 20 73 74 61   = chan;.    sta
4b20: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63  tePtr->self = Tc
4b30: 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c  l_ReplaceChannel
4b40: 28 20 69 6e 74 65 72 70 2c 0a 09 09 09 09 54 6c  ( interp,.....Tl
4b50: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c  s_ChannelType(),
4b60: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74   (ClientData) st
4b70: 61 74 65 50 74 72 2c 0a 09 09 09 20 20 20 20 20  atePtr,....     
4b80: 20 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20    (TCL_READABLE 
4b90: 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c  | TCL_WRITABLE),
4ba0: 20 73 74 61 74 65 50 74 72 2d 3e 70 61 72 65 6e   statePtr->paren
4bb0: 74 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 74  t);.#else.    st
4bc0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 63  atePtr->self = c
4bd0: 68 61 6e 3b 0a 20 20 20 20 54 63 6c 5f 53 74 61  han;.    Tcl_Sta
4be0: 63 6b 43 68 61 6e 6e 65 6c 28 20 69 6e 74 65 72  ckChannel( inter
4bf0: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  p, Tls_ChannelTy
4c00: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74  pe(), (ClientDat
4c10: 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 09 09  a) statePtr,....
4c20: 20 20 20 20 20 20 20 28 54 43 4c 5f 52 45 41 44         (TCL_READ
4c30: 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41  ABLE | TCL_WRITA
4c40: 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 23 65 6e  BLE), chan);.#en
4c50: 64 69 66 0a 20 20 20 20 69 66 20 28 73 74 61 74  dif.    if (stat
4c60: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
4c70: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
4c80: 29 20 7b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63  ) {..Tls_Free((c
4c90: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
4ca0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
4cb0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
4cc0: 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  }..    /* alloca
4cd0: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20  te script */.   
4ce0: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09   if (script) {..
4cf0: 63 68 61 72 20 2a 20 74 6d 70 20 3d 20 54 63 6c  char * tmp = Tcl
4d00: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
4d10: 6a 28 73 63 72 69 70 74 2c 20 4e 55 4c 4c 29 3b  j(script, NULL);
4d20: 0a 09 69 66 20 28 74 6d 70 20 26 26 20 2a 74 6d  ..if (tmp && *tm
4d30: 70 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50  p) {..    stateP
4d40: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 54  tr->callback = T
4d50: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
4d60: 73 63 72 69 70 74 29 3b 0a 09 20 20 20 20 54 63  script);..    Tc
4d70: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 20  l_IncrRefCount( 
4d80: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
4d90: 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20  ck);..}.    }.  
4da0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 6c    /* This is onl
4db0: 79 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  y needed because
4dc0: 20 6f 66 20 61 20 62 75 67 20 69 6e 20 4f 70 65   of a bug in Ope
4dd0: 6e 53 53 4c 2c 20 77 68 65 72 65 20 74 68 65 0a  nSSL, where the.
4de0: 20 20 20 20 20 2a 20 73 73 6c 2d 3e 76 65 72 69       * ssl->veri
4df0: 66 79 5f 63 61 6c 6c 62 61 63 6b 20 69 73 20 6e  fy_callback is n
4e00: 6f 74 20 72 65 66 65 72 65 6e 63 65 64 21 21 21  ot referenced!!!
4e10: 20 28 4d 75 73 74 20 62 65 20 64 6f 6e 65 0a 20   (Must be done. 
4e20: 20 20 20 20 2a 20 2a 62 65 66 6f 72 65 2a 20 53      * *before* S
4e30: 53 4c 5f 6e 65 77 28 29 20 69 73 20 63 61 6c 6c  SL_new() is call
4e40: 65 64 21 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ed!.     */.    
4e50: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 76 65 72 69  SSL_CTX_set_veri
4e60: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  fy(statePtr->ctx
4e70: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79  , verify, Verify
4e80: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20  Callback);..    
4e90: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e  /*.     * SSL In
4ea0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20  itialization.   
4eb0: 20 20 2a 2f 0a 0a 20 20 20 20 73 74 61 74 65 50    */..    stateP
4ec0: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65  tr->ssl = SSL_ne
4ed0: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  w(statePtr->ctx)
4ee0: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65  ;.    if (!state
4ef0: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 20 20 20 20  Ptr->ssl) {.    
4f00: 20 20 20 20 2f 2a 20 53 53 4c 20 6c 69 62 72 61      /* SSL libra
4f10: 72 79 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  ry error */.    
4f20: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4f30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20  sult(interp,.   
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f50: 20 20 20 20 20 20 22 63 6f 75 6c 64 6e 27 74 20        "couldn't 
4f60: 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65  construct ssl se
4f70: 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e  ssion: ", REASON
4f80: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
4fa0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c  ar *) NULL);..Tl
4fb0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
4fc0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20  statePtr);.     
4fd0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
4fe0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
4ff0: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61  /*.     * SSL Ca
5000: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a  llbacks.     */.
5010: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70  .    SSL_set_app
5020: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e  _data(statePtr->
5030: 73 73 6c 2c 20 28 56 4f 49 44 20 2a 29 73 74 61  ssl, (VOID *)sta
5040: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74  tePtr);./* point
5050: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a   back to us */..
5060: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68      /*.     * Th
5070: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 62  e following is b
5080: 72 6f 6b 65 6e 20 2d 20 77 65 20 6e 65 65 64 20  roken - we need 
5090: 69 73 20 74 6f 20 73 65 74 20 74 68 65 0a 20 20  is to set the.  
50a0: 20 20 20 2a 20 76 65 72 69 66 79 5f 6d 6f 64 65     * verify_mode
50b0: 2c 20 62 75 74 20 74 68 65 20 6c 69 62 72 61 72  , but the librar
50c0: 79 20 69 67 6e 6f 72 65 73 20 74 68 65 20 76 65  y ignores the ve
50d0: 72 69 66 79 5f 63 61 6c 6c 62 61 63 6b 21 21 21  rify_callback!!!
50e0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 53  .     */.    /*S
50f0: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74  SL_set_verify(st
5100: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72  atePtr->ssl, ver
5110: 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62  ify, VerifyCallb
5120: 61 63 6b 29 3b 2a 2f 0a 0a 20 20 20 20 53 53 4c  ack);*/..    SSL
5130: 5f 43 54 58 5f 73 65 74 5f 69 6e 66 6f 5f 63 61  _CTX_set_info_ca
5140: 6c 6c 62 61 63 6b 28 20 73 74 61 74 65 50 74 72  llback( statePtr
5150: 2d 3e 63 74 78 2c 20 49 6e 66 6f 43 61 6c 6c 62  ->ctx, InfoCallb
5160: 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  ack);..    /* Cr
5170: 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  eate Tcl_Channel
5180: 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a   BIO Handler */.
5190: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f      statePtr->p_
51a0: 62 69 6f 20 3d 20 62 69 6f 20 3d 20 42 49 4f 5f  bio = bio = BIO_
51b0: 6e 65 77 5f 74 63 6c 28 20 73 74 61 74 65 50 74  new_tcl( statePt
51c0: 72 2c 20 42 49 4f 5f 43 4c 4f 53 45 29 3b 0a 20  r, BIO_CLOSE);. 
51d0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f     statePtr->bio
51e0: 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66   = BIO_new(BIO_f
51f0: 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66  _ssl());..    if
5200: 20 28 73 65 72 76 65 72 29 20 7b 0a 09 73 74 61   (server) {..sta
5210: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  tePtr->flags |= 
5220: 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a  TLS_TCL_SERVER;.
5230: 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f  .SSL_set_accept_
5240: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  state(statePtr->
5250: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ssl);.    } else
5260: 20 7b 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e   {..SSL_set_conn
5270: 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 50  ect_state(stateP
5280: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a  tr->ssl);.    }.
5290: 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28      SSL_set_bio(
52a0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 62  statePtr->ssl, b
52b0: 69 6f 2c 20 62 69 6f 29 3b 0a 20 20 20 20 42 49  io, bio);.    BI
52c0: 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50  O_set_ssl(stateP
52d0: 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74  tr->bio, statePt
52e0: 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 43 4c 4f 53  r->ssl, BIO_CLOS
52f0: 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  E);..    /*.    
5300: 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e   * End of SSL In
5310: 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54  it.     */.    T
5320: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
5330: 65 72 70 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  erp, Tcl_GetChan
5340: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
5350: 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c  ->self), TCL_VOL
5360: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
5370: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
5380: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53c0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54  -------. *. * CT
53d0: 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72  X_Init -- constr
53e0: 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e  uct a SSL_CTX in
53f0: 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73  stance. *. * Res
5400: 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64  ults:. *.A valid
5410: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63   SSL_CTX instanc
5420: 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a  e or NULL.. *. *
5430: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
5440: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c  *.constructs SSL
5450: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20   context (CTX). 
5460: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
54b0: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54  tic SSL_CTX *.CT
54c0: 58 5f 49 6e 69 74 28 69 6e 74 65 72 70 2c 20 70  X_Init(interp, p
54d0: 72 6f 74 6f 2c 20 6b 65 79 2c 20 63 65 72 74 2c  roto, key, cert,
54e0: 20 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20   CAdir, CAfile, 
54f0: 63 69 70 68 65 72 73 29 0a 20 20 20 20 54 63 6c  ciphers).    Tcl
5500: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
5510: 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 3b 0a  .    int proto;.
5520: 20 20 20 20 63 68 61 72 20 2a 6b 65 79 3b 0a 20      char *key;. 
5530: 20 20 20 63 68 61 72 20 2a 63 65 72 74 3b 0a 20     char *cert;. 
5540: 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 3b 0a     char *CAdir;.
5550: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65      char *CAfile
5560: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
5570: 65 72 73 3b 0a 7b 0a 20 20 20 20 53 53 4c 5f 43  ers;.{.    SSL_C
5580: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
5590: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
55a0: 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  ds;.    Tcl_DStr
55b0: 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74  ing ds1;.    int
55c0: 20 6f 66 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f   off = 0;..    /
55d0: 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e  * create SSL con
55e0: 74 65 78 74 20 2a 2f 0a 23 69 66 20 21 64 65 66  text */.#if !def
55f0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
5600: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
5610: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  3).    if (ENABL
5620: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
5630: 4f 54 4f 5f 53 53 4c 32 29 20 26 26 0a 09 45 4e  OTO_SSL2) &&..EN
5640: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
5650: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a  _PROTO_SSL3)) {.
5660: 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e  .ctx = SSL_CTX_n
5670: 65 77 28 53 53 4c 76 32 33 5f 6d 65 74 68 6f 64  ew(SSLv23_method
5680: 28 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 0a  ());.    } else.
5690: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 45  #endif.    if (E
56a0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
56b0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b  S_PROTO_SSL2)) {
56c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
56d0: 53 53 4c 32 29 0a 09 54 63 6c 5f 41 70 70 65 6e  SSL2)..Tcl_Appen
56e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
56f0: 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75  "protocol not su
5700: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
5710: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54  ..return (SSL_CT
5720: 58 20 2a 29 30 3b 0a 23 65 6c 73 65 0a 09 63 74  X *)0;.#else..ct
5730: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28  x = SSL_CTX_new(
5740: 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b  SSLv2_method());
5750: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 20 65 6c  .#endif.    } el
5760: 73 65 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70  se if (ENABLED(p
5770: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
5780: 54 4c 53 31 29 29 20 7b 0a 09 63 74 78 20 3d 20  TLS1)) {..ctx = 
5790: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76  SSL_CTX_new(TLSv
57a0: 31 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 20 20 20  1_method());.   
57b0: 20 7d 20 65 6c 73 65 20 69 66 20 28 45 4e 41 42   } else if (ENAB
57c0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
57d0: 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 23 69  ROTO_SSL3)) {.#i
57e0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  f defined(NO_SSL
57f0: 33 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  3)..Tcl_AppendRe
5800: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72  sult(interp, "pr
5810: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
5820: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
5830: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
5840: 29 30 3b 0a 23 65 6c 73 65 0a 09 63 74 78 20 3d  )0;.#else..ctx =
5850: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c   SSL_CTX_new(SSL
5860: 76 33 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 23 65  v3_method());.#e
5870: 6e 64 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20  ndif.    } else 
5880: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
5890: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
58a0: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73  valid protocol s
58b0: 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  elected", NULL);
58c0: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54  ..return (SSL_CT
58d0: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 20 20 20  X *)0;.    }.   
58e0: 20 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44   off |= (ENABLED
58f0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
5900: 4f 5f 54 4c 53 31 29 20 3f 20 30 20 3a 20 53 53  O_TLS1) ? 0 : SS
5910: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a  L_OP_NO_TLSv1);.
5920: 20 20 20 20 6f 66 66 20 7c 3d 20 28 45 4e 41 42      off |= (ENAB
5930: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
5940: 52 4f 54 4f 5f 53 53 4c 32 29 20 3f 20 30 20 3a  ROTO_SSL2) ? 0 :
5950: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32   SSL_OP_NO_SSLv2
5960: 29 3b 0a 20 20 20 20 6f 66 66 20 7c 3d 20 28 45  );.    off |= (E
5970: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
5980: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 3f 20  S_PROTO_SSL3) ? 
5990: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53  0 : SSL_OP_NO_SS
59a0: 4c 76 33 29 3b 0a 0a 20 20 20 20 53 53 4c 5f 43  Lv3);..    SSL_C
59b0: 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28  TX_set_app_data(
59c0: 20 63 74 78 2c 20 28 56 4f 49 44 2a 29 69 6e 74   ctx, (VOID*)int
59d0: 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65  erp);./* remembe
59e0: 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  r the interprete
59f0: 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  r */.    SSL_CTX
5a00: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 20 63 74  _set_options( ct
5a10: 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09  x, SSL_OP_ALL);.
5a20: 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77  /* all SSL bug w
5a30: 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20  orkarounds */.  
5a40: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70    SSL_CTX_set_op
5a50: 74 69 6f 6e 73 28 20 63 74 78 2c 20 6f 66 66 29  tions( ctx, off)
5a60: 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67  ;./* all SSL bug
5a70: 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a   workarounds */.
5a80: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73      SSL_CTX_sess
5a90: 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28  _set_cache_size(
5aa0: 20 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20   ctx, 128);..   
5ab0: 20 69 66 20 28 63 69 70 68 65 72 73 20 21 3d 20   if (ciphers != 
5ac0: 4e 55 4c 4c 29 0a 09 53 53 4c 5f 43 54 58 5f 73  NULL)..SSL_CTX_s
5ad0: 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63  et_cipher_list(c
5ae0: 74 78 2c 20 63 69 70 68 65 72 73 29 3b 0a 0a 20  tx, ciphers);.. 
5af0: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63     /* set some c
5b00: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20  allbacks */.    
5b10: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
5b20: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74  ult_passwd_cb(ct
5b30: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  x, PasswordCallb
5b40: 61 63 6b 29 3b 0a 0a 23 69 66 6e 64 65 66 20 42  ack);..#ifndef B
5b50: 53 41 46 45 0a 20 20 20 20 53 53 4c 5f 43 54 58  SAFE.    SSL_CTX
5b60: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73  _set_default_pas
5b70: 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28  swd_cb_userdata(
5b80: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74  ctx, (void *)int
5b90: 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  erp);.#endif..#i
5ba0: 66 6e 64 65 66 20 4e 4f 5f 44 48 0a 20 20 20 20  fndef NO_DH.    
5bb0: 7b 0a 09 44 48 2a 20 64 68 20 3d 20 67 65 74 5f  {..DH* dh = get_
5bc0: 64 68 35 31 32 28 29 3b 0a 09 53 53 4c 5f 43 54  dh512();..SSL_CT
5bd0: 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78  X_set_tmp_dh(ctx
5be0: 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28  , dh);..DH_free(
5bf0: 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  dh);.    }.#endi
5c00: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  f..    /* set ou
5c10: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  r certificate */
5c20: 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 21 3d  .    if (cert !=
5c30: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 53   NULL) {..Tcl_DS
5c40: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
5c50: 0a 20 20 20 20 20 20 20 20 69 66 20 28 53 53 4c  .        if (SSL
5c60: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69  _CTX_use_certifi
5c70: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46  cate_file(ctx, F
5c80: 32 4e 28 20 63 65 72 74 2c 20 26 64 73 29 2c 0a  2N( cert, &ds),.
5c90: 09 09 09 09 09 53 53 4c 5f 46 49 4c 45 54 59 50  .....SSL_FILETYP
5ca0: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09  E_PEM) <= 0) {..
5cb0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
5cc0: 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 20 20  ree(&ds);.      
5cd0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
5ce0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20  Result(interp,. 
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e 61              "una
5d10: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69  ble to set certi
5d20: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63  ficate file ", c
5d30: 65 72 74 2c 20 22 3a 20 22 2c 0a 20 20 20 20 20  ert, ": ",.     
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d50: 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29          REASON()
5d60: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
5d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 53  ;.            SS
5d80: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
5d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
5da0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30  urn (SSL_CTX *)0
5db0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
5dc0: 20 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20       /* get the 
5dd0: 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f  private key asso
5de0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
5df0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
5e00: 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20          if (key 
5e10: 3d 3d 20 4e 55 4c 4c 29 20 6b 65 79 3d 63 65 72  == NULL) key=cer
5e20: 74 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28  t;..        if (
5e30: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76  SSL_CTX_use_Priv
5e40: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c  ateKey_file(ctx,
5e50: 20 46 32 4e 28 20 6b 65 79 2c 20 26 64 73 29 2c   F2N( key, &ds),
5e60: 0a 09 09 09 09 09 53 53 4c 5f 46 49 4c 45 54 59  ......SSL_FILETY
5e70: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a  PE_PEM) <= 0) {.
5e80: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
5e90: 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 20  Free(&ds);.     
5ea0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
5eb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a  dResult(interp,.
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e               "un
5ee0: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c  able to set publ
5ef0: 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b  ic key file ", k
5f00: 65 79 2c 20 22 20 22 2c 0a 20 20 20 20 20 20 20  ey, " ",.       
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20        REASON(), 
5f30: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f              SSL_
5f50: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 20  CTX_free(ctx);. 
5f60: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
5f70: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a  n (SSL_CTX *)0;.
5f80: 20 20 20 20 20 20 20 20 7d 0a 09 54 63 6c 5f 44          }..Tcl_D
5f90: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
5fa0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20  .        /* Now 
5fb0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b  we know that a k
5fc0: 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 65  ey and cert have
5fd0: 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e 73   been set agains
5fe0: 74 0a 20 20 20 20 20 20 20 20 20 2a 20 74 68 65  t.         * the
5ff0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a   SSL context */.
6000: 20 20 20 20 20 20 20 20 69 66 20 28 21 53 53 4c          if (!SSL
6010: 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61  _CTX_check_priva
6020: 74 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 20  te_key(ctx)) {. 
6030: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41             Tcl_A
6040: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
6050: 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rp,.            
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f   "private key do
6080: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
6090: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62   certificate pub
60a0: 6c 69 63 20 6b 65 79 22 2c 0a 20 20 20 20 20 20  lic key",.      
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 20         (char *) 
60d0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  NULL);.         
60e0: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
60f0: 63 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ctx);.          
6100: 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54    return (SSL_CT
6110: 58 20 2a 29 30 3b 0a 20 20 20 20 20 20 20 20 7d  X *)0;.        }
6120: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
6130: 20 20 20 20 20 20 63 65 72 74 20 3d 20 28 63 68        cert = (ch
6140: 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66  ar*)X509_get_def
6150: 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29  ault_cert_file()
6160: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 53  ;..        if (S
6170: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69  SL_CTX_use_certi
6180: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c  ficate_file(ctx,
6190: 20 63 65 72 74 2c 0a 09 09 09 09 09 53 53 4c 5f   cert,......SSL_
61a0: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d  FILETYPE_PEM) <=
61b0: 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20   0) {.#if 0..   
61c0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
61d0: 28 26 64 73 29 3b 0a 20 20 20 20 20 20 20 20 20  (&ds);.         
61e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
61f0: 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 20  ult(interp,.    
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65           "unable
6220: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20   to use default 
6230: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65  certificate file
6240: 20 22 2c 20 63 65 72 74 2c 20 22 3a 20 22 2c 0a   ", cert, ": ",.
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 52 45 41               REA
6270: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
6280: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  NULL);.         
6290: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
62a0: 63 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ctx);.          
62b0: 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54    return (SSL_CT
62c0: 58 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 20 20  X *)0;.#endif.  
62d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 09 0a        }.    }...
62e0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
62f0: 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63  nit(&ds);.    Tc
6300: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
6310: 73 31 29 3b 0a 20 20 20 20 69 66 20 28 21 53 53  s1);.    if (!SS
6320: 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66  L_CTX_load_verif
6330: 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c  y_locations(ctx,
6340: 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73   F2N(CAfile, &ds
6350: 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 26 64  ), F2N(CAdir, &d
6360: 73 31 29 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  s1)) ||.        
6370: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66  !SSL_CTX_set_def
6380: 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68  ault_verify_path
6390: 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a  s(ctx)) {.#if 0.
63a0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
63b0: 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72  (&ds);..Tcl_DStr
63c0: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09  ingFree(&ds1);..
63d0: 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74  /* Don't current
63e0: 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20  ly care if this 
63f0: 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70  fails */..Tcl_Ap
6400: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6410: 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20  p, "SSL default 
6420: 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c  verify paths: ",
6430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 45                RE
6450: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
6460: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58   NULL);..SSL_CTX
6470: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
6480: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30  urn (SSL_CTX *)0
6490: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
64a0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63     SSL_CTX_set_c
64b0: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74  lient_CA_list(ct
64c0: 78 2c 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65  x, SSL_load_clie
64d0: 6e 74 5f 43 41 5f 66 69 6c 65 28 20 46 32 4e 28  nt_CA_file( F2N(
64e0: 43 41 66 69 6c 65 2c 20 26 64 73 29 20 29 29 3b  CAfile, &ds) ));
64f0: 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
6500: 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20  gFree(&ds);.    
6510: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
6520: 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72  &ds1);.    retur
6530: 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  n ctx;.}.../*. *
6540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6580: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73  ---. *. * Status
6590: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e  ObjCmd -- return
65a0: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72   certificate for
65b0: 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e   connected peer.
65c0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
65d0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
65e0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
65f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6600: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
6610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6650: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53   */.static int.S
6660: 74 61 74 75 73 4f 62 6a 43 6d 64 28 63 6c 69 65  tatusObjCmd(clie
6670: 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20  ntData, interp, 
6680: 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20  objc, objv).    
6690: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
66a0: 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73  tData;./* Not us
66b0: 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  ed. */.    Tcl_I
66c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
66d0: 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20     int objc;.   
66e0: 20 54 63 6c 5f 4f 62 6a 09 2a 43 4f 4e 53 54 20   Tcl_Obj.*CONST 
66f0: 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 53 74  objv[];.{.    St
6700: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20  ate *statePtr;. 
6710: 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20     X509 *peer;. 
6720: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
6730: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  tr;.    Tcl_Chan
6740: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68  nel chan;.    ch
6750: 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  ar *channelName,
6760: 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69   *ciphers;.    i
6770: 6e 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66  nt mode;..    if
6780: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 20   (objc != 2) {. 
6790: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
67a0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
67b0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
67c0: 6c 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  l");.        ret
67d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
67e0: 20 20 20 7d 0a 20 20 20 20 63 68 61 6e 6e 65 6c     }.    channel
67f0: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
6800: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
6810: 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  [1], NULL);..   
6820: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
6830: 68 61 6e 6e 65 6c 28 20 69 6e 74 65 72 70 2c 20  hannel( interp, 
6840: 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f  channelName, &mo
6850: 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  de);.    if (cha
6860: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
6870: 6c 29 30 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  l)0) {..return T
6880: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6890: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43      if (Tcl_GetC
68a0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
68b0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
68c0: 79 70 65 28 29 29 20 7b 0a 20 20 20 20 20 20 20  ype()) {.       
68d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
68e0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
68f0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
6900: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
6910: 68 61 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  han),.          
6920: 20 20 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61        "\": not a
6930: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e   TLS channel", N
6940: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ULL);.        re
6950: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6960: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
6970: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63  tr = (State *)Tc
6980: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
6990: 61 6e 63 65 44 61 74 61 28 20 63 68 61 6e 29 3b  anceData( chan);
69a0: 0a 20 20 20 20 70 65 65 72 20 3d 20 53 53 4c 5f  .    peer = SSL_
69b0: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69  get_peer_certifi
69c0: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  cate(statePtr->s
69d0: 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 70 65 65  sl);.    if (pee
69e0: 72 29 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73  r)..objPtr = Tls
69f0: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 20 69 6e 74  _NewX509Obj( int
6a00: 65 72 70 2c 20 70 65 65 72 29 3b 0a 20 20 20 20  erp, peer);.    
6a10: 65 6c 73 65 0a 09 6f 62 6a 50 74 72 20 3d 20 54  else..objPtr = T
6a20: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 20 30  cl_NewListObj( 0
6a30: 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 63 69  , NULL);..    ci
6a40: 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53  phers = (char*)S
6a50: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74  SL_get_cipher(st
6a60: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
6a70: 20 20 69 66 20 28 63 69 70 68 65 72 73 20 21 3d    if (ciphers !=
6a80: 20 4e 55 4c 4c 20 26 26 20 73 74 72 63 6d 70 28   NULL && strcmp(
6a90: 63 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e 45 29  ciphers, "(NONE)
6aa0: 22 29 21 3d 30 29 20 7b 0a 09 54 63 6c 5f 4c 69  ")!=0) {..Tcl_Li
6ab0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6ac0: 6e 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50  nt( interp, objP
6ad0: 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72  tr,...Tcl_NewStr
6ae0: 69 6e 67 4f 62 6a 28 20 22 63 69 70 68 65 72 22  ingObj( "cipher"
6af0: 2c 20 2d 31 29 20 29 3b 0a 09 54 63 6c 5f 4c 69  , -1) );..Tcl_Li
6b00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6b10: 6e 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50  nt( interp, objP
6b20: 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72  tr,...Tcl_NewStr
6b30: 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 67 65 74 5f  ingObj( SSL_get_
6b40: 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d  cipher(statePtr-
6b50: 3e 73 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20  >ssl), -1) );.  
6b60: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f    }.    Tcl_SetO
6b70: 62 6a 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  bjResult( interp
6b80: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
6b90: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
6ba0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
6bf0: 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a   Tls_Free --. *.
6c00: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
6c10: 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e  e cleans up when
6c20: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
6c30: 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69  sed channel. *.i
6c40: 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73  s closed and its
6c50: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6c60: 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20   falls below 1. 
6c70: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
6c80: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
6c90: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
6ca0: 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
6cb0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
6cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
6d00: 69 64 0a 54 6c 73 5f 46 72 65 65 28 20 63 68 61  id.Tls_Free( cha
6d10: 72 20 2a 62 6c 6f 63 6b 50 74 72 20 29 0a 7b 0a  r *blockPtr ).{.
6d20: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
6d30: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62  Ptr = (State *)b
6d40: 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 54 6c  lockPtr;..    Tl
6d50: 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72  s_Clean(statePtr
6d60: 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  );.    Tcl_Free(
6d70: 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f  blockPtr);.}.../
6d80: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dc0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
6dd0: 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a  s_Clean --. *. *
6de0: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
6df0: 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61  cleans up when a
6e00: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
6e10: 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20  d channel. *.is 
6e20: 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72  closed and its r
6e30: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
6e40: 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54  alls below 1.  T
6e50: 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65  his should. *.be
6e60: 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e   called synchron
6e70: 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f  ously by the Clo
6e80: 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74  seProc, not in t
6e90: 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79  he. *.Eventually
6ea0: 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  Free callback.. 
6eb0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
6ec0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
6ed0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
6ee0: 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
6ef0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
6f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
6f40: 69 64 0a 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61  id.Tls_Clean(Sta
6f50: 74 65 20 2a 73 74 61 74 65 50 74 72 29 0a 7b 0a  te *statePtr).{.
6f60: 20 20 20 20 2f 2a 20 77 65 27 72 65 20 61 73 73      /* we're ass
6f70: 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20  uming here that 
6f80: 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72  we're single-thr
6f90: 65 61 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20  eaded */.    if 
6fa0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20  (statePtr->ssl) 
6fb0: 7b 0a 09 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28  {..SSL_shutdown(
6fc0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
6fd0: 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50  .SSL_free(stateP
6fe0: 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65  tr->ssl);..state
6ff0: 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b  Ptr->ssl = NULL;
7000: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
7010: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
7020: 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  k) {..Tcl_DecrRe
7030: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
7040: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61  >callback);..sta
7050: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
7060: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  = NULL;.    }.. 
7070: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
7080: 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54  >timer != (Tcl_T
7090: 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c 29 20  imerToken)NULL) 
70a0: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d  {..Tcl_DeleteTim
70b0: 65 72 48 61 6e 64 6c 65 72 20 28 73 74 61 74 65  erHandler (state
70c0: 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74  Ptr->timer);..st
70d0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20  atePtr->timer = 
70e0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a  NULL;.    }.}...
70f0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
7100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7130: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
7140: 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  ls_Init --. *. *
7150: 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61  .This is a packa
7160: 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ge initializatio
7170: 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69  n procedure, whi
7180: 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09  ch is called. *.
7190: 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73  by Tcl when this
71a0: 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62   package is to b
71b0: 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e  e added to an in
71c0: 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a  terpreter.. *. *
71d0: 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63   Results:  Ssl c
71e0: 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f  onfigured and lo
71f0: 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20  aded. *. * Side 
7200: 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65  effects:. *. cre
7210: 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d  ate the ssl comm
7220: 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 73 65 20  and, initialise 
7230: 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20  ssl context. *. 
7240: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
7250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7280: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6c  ----. */..int.Tl
7290: 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
72a0: 70 20 2a 69 6e 74 65 72 70 29 09 09 2f 2a 20 49  p *interp)../* I
72b0: 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 77 68  nterpreter in wh
72c0: 69 63 68 20 74 68 65 20 70 61 63 6b 61 67 65 20  ich the package 
72d0: 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  is.             
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 74 6f              * to
7300: 20 62 65 20 6d 61 64 65 20 61 76 61 69 6c 61 62   be made availab
7310: 6c 65 2e 20 2a 2f 0a 7b 0a 23 69 66 20 54 43 4c  le. */.{.#if TCL
7320: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e  _MAJOR_VERSION >
7330: 3d 20 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52  = 8 && TCL_MINOR
7340: 5f 56 45 52 53 49 4f 4e 20 3e 3d 20 32 0a 20 20  _VERSION >= 2.  
7350: 20 20 69 66 20 28 21 54 63 6c 5f 49 6e 69 74 53    if (!Tcl_InitS
7360: 74 75 62 73 28 69 6e 74 65 72 70 2c 20 54 43 4c  tubs(interp, TCL
7370: 5f 56 45 52 53 49 4f 4e 2c 20 30 29 29 20 7b 0a  _VERSION, 0)) {.
7380: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
7390: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
73a0: 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 6c  #endif.    SSL_l
73b0: 6f 61 64 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  oad_error_string
73c0: 73 28 29 3b 0a 20 20 20 20 45 52 52 5f 6c 6f 61  s();.    ERR_loa
73d0: 64 5f 63 72 79 70 74 6f 5f 73 74 72 69 6e 67 73  d_crypto_strings
73e0: 28 29 3b 0a 20 20 20 20 53 53 4c 5f 6c 69 62 72  ();.    SSL_libr
73f0: 61 72 79 5f 69 6e 69 74 28 29 3b 0a 0a 20 20 20  ary_init();..   
7400: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
7410: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
7420: 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69  ls::ciphers", Ci
7430: 70 68 65 72 73 4f 62 6a 43 6d 64 20 2c 20 28 43  phersObjCmd , (C
7440: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 0a 20 20  lientData) 0,.  
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 20 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65      (Tcl_CmdDele
7470: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
7480: 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
7490: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
74a0: 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61  p, "tls::handsha
74b0: 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62  ke", HandshakeOb
74c0: 6a 43 6d 64 20 2c 20 28 43 6c 69 65 6e 74 44 61  jCmd , (ClientDa
74d0: 74 61 29 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ta) 0,.         
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
74f0: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
7500: 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54  *) NULL);..    T
7510: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
7520: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
7530: 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72  ::import", Impor
7540: 74 4f 62 6a 43 6d 64 20 2c 20 28 43 6c 69 65 6e  tObjCmd , (Clien
7550: 74 44 61 74 61 29 20 30 2c 0a 20 20 20 20 20 20  tData) 0,.      
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
7580: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20  oc *) NULL);..  
7590: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
75a0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
75b0: 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74  tls::status", St
75c0: 61 74 75 73 4f 62 6a 43 6d 64 20 2c 20 28 43 6c  atusObjCmd , (Cl
75d0: 69 65 6e 74 44 61 74 61 29 20 30 2c 0a 20 20 20  ientData) 0,.   
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 20 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74     (Tcl_CmdDelet
7600: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
7610: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  .    return Tcl_
7620: 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
7630: 70 2c 20 50 41 43 4b 41 47 45 2c 20 56 45 52 53  p, PACKAGE, VERS
7640: 49 4f 4e 29 3b 0a 7d 0a 0a 0c 0a 2f 2a 0a 20 2a  ION);.}..../*. *
7650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7680: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c  ------*. *. *.Tl
7690: 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a  s_SafeInit --. *
76a0: 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *.------------
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76d0: 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72  ----*. *.Standar
76e0: 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 75  d procedure requ
76f0: 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 20  ired by 'load'. 
7700: 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20  . *.Initializes 
7710: 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66  this extension f
7720: 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 70  or a safe interp
7730: 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d  reter.. *.------
7740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
7770: 2a 09 53 69 64 65 65 66 66 65 63 74 73 3a 0a 20  *.Sideeffects:. 
7780: 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e  *..As of 'Tls_In
7790: 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74  it'. *. *.Result
77a0: 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64  :. *..A standard
77b0: 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e   Tcl error code.
77c0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
77d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
7800: 2f 0a 0a 69 6e 74 0a 54 6c 73 5f 53 61 66 65 49  /..int.Tls_SafeI
7810: 6e 69 74 20 28 54 63 6c 5f 49 6e 74 65 72 70 2a  nit (Tcl_Interp*
7820: 20 69 6e 74 65 72 70 29 0a 7b 0a 20 20 20 20 72   interp).{.    r
7830: 65 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74 20 28  eturn Tls_Init (
7840: 69 6e 74 65 72 70 29 3b 0a 7d 0a                 interp);.}.