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 32 20 32 30 30 30 2f 30 31 2f 32  ,v 1.2 2000/01/2
0090: 30 20 30 31 3a 35 30 3a 35 35 20 61 62 6f 72 72  0 01:50:55 aborr
00a0: 20 45 78 70 20 24 0a 20 2a 0a 20 2a 20 54 4c 53   Exp $. *. * TLS
00b0: 20 28 61 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e   (aka SSL) Chann
00c0: 65 6c 20 2d 20 63 61 6e 20 62 65 20 6c 61 79 65  el - can be laye
00d0: 72 65 64 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69  red on any bi-di
00e0: 72 65 63 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c  rectional. * Tcl
00f0: 5f 43 68 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20  _Channel (Note: 
0100: 52 65 71 75 69 72 65 73 20 54 72 66 20 43 6f 72  Requires Trf Cor
0110: 65 20 50 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54  e Patch). *. * T
0120: 68 69 73 20 77 61 73 20 62 75 69 6c 74 20 28 61  his was built (a
0130: 6c 6d 6f 73 74 29 20 66 72 6f 6d 20 73 63 72 61  lmost) from scra
0140: 74 63 68 20 62 61 73 65 64 20 75 70 6f 6e 20 6f  tch based upon o
0150: 62 73 65 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a  bservation of. *
0160: 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a   OpenSSL 0.9.2B.
0170: 20 2a 0a 20 2a 20 41 64 64 69 74 69 6f 6e 20 63   *. * Addition c
0180: 72 65 64 69 74 20 69 73 20 64 75 65 20 66 6f 72  redit is due for
0190: 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 65 73   Andreas Kupries
01a0: 20 28 61 2e 6b 75 70 72 69 65 73 40 77 65 73 74   (a.kupries@west
01b0: 65 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a  end.com), for. *
01c0: 20 70 72 6f 76 69 64 69 6e 67 20 74 68 65 20 54   providing the T
01d0: 63 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e 65  cl_ReplaceChanne
01e0: 6c 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 20  l mechanism and 
01f0: 77 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20  working closely 
0200: 77 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e  with me. * to en
0210: 68 61 6e 63 65 20 69 74 20 74 6f 20 73 75 70 70  hance it to supp
0220: 6f 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 76 65  ort full fileeve
0230: 6e 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a  nt semantics.. *
0240: 0a 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f  . * Also work do
0250: 6e 65 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ne by the follow
0260: 20 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 65 64   people provided
0270: 20 74 68 65 20 69 6d 70 65 74 75 73 20 74 6f 20   the impetus to 
0280: 64 6f 20 74 68 69 73 20 22 72 69 67 68 74 22 3a  do this "right":
0290: 0a 20 2a 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69  . *.tclSSL (Coli
02a0: 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61  n McCormack, Sha
02b0: 72 65 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a  red Technology).
02c0: 20 2a 09 53 53 4c 74 63 6c 20 28 50 65 74 65 72   *.SSLtcl (Peter
02d0: 20 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a   Antman). *. */.
02e0: 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e  .#include "tlsIn
02f0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74  t.h".#include "t
0300: 63 6c 4f 70 74 73 2e 68 22 0a 0a 2f 2a 0a 20 2a  clOpts.h"../*. *
0310: 20 45 78 74 65 72 6e 61 6c 20 66 75 6e 63 74 69   External functi
0320: 6f 6e 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46  ons. */../*. * F
0330: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
0340: 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65  ons. */..#define
0350: 20 46 32 4e 28 20 6b 65 79 2c 20 64 73 70 29 20   F2N( key, dsp) 
0360: 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e 55  \..(((key) == NU
0370: 4c 4c 29 3f 28 63 68 61 72 2a 29 4e 55 4c 4c 3a  LL)?(char*)NULL:
0380: 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c  Tcl_TranslateFil
0390: 65 4e 61 6d 65 28 20 69 6e 74 65 72 70 2c 20 28  eName( interp, (
03a0: 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a 23 64  key), (dsp))).#d
03b0: 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29 09 45  efine REASON().E
03c0: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f  RR_reason_error_
03d0: 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74 5f 65  string(ERR_get_e
03e0: 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69 63 20  rror())..static 
03f0: 69 6e 74 09 43 69 70 68 65 72 73 4f 62 6a 43 6d  int.CiphersObjCm
0400: 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28  d _ANSI_ARGS_ ((
0410: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
0420: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
0430: 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 20  p *interp,....  
0440: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
0450: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
0460: 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09  ));..static int.
0470: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20  HandshakeObjCmd 
0480: 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28 43 6c  _ANSI_ARGS_ ((Cl
0490: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
04a0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
04b0: 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 69  *interp,....   i
04c0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
04d0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 29   *CONST objv[]))
04e0: 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 49 6d  ;..static int.Im
04f0: 70 6f 72 74 4f 62 6a 43 6d 64 20 5f 41 4e 53 49  portObjCmd _ANSI
0500: 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74 44  _ARGS_ ((ClientD
0510: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
0520: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0530: 72 70 2c 0a 09 09 09 20 20 20 69 6e 74 20 6f 62  rp,....   int ob
0540: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  jc, Tcl_Obj *CON
0550: 53 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74  ST objv[]));..st
0560: 61 74 69 63 20 69 6e 74 09 53 74 61 74 75 73 4f  atic int.StatusO
0570: 62 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53  bjCmd _ANSI_ARGS
0580: 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63  _ ((ClientData c
0590: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
05a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09  nterp *interp,..
05b0: 09 09 20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54  ..   int objc, T
05c0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
05d0: 6a 76 5b 5d 29 29 3b 0a 73 74 61 74 69 63 20 53  jv[]));.static S
05e0: 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69 74  SL_CTX *CTX_Init
05f0: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63   _ANSI_ARGS_((Tc
0600: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0610: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61  , int proto, cha
0620: 72 20 2a 6b 65 79 2c 0a 09 09 09 20 20 20 20 63  r *key,....    c
0630: 68 61 72 20 2a 63 65 72 74 2c 20 63 68 61 72 20  har *cert, char 
0640: 2a 43 41 64 69 72 2c 20 63 68 61 72 20 2a 43 41  *CAdir, char *CA
0650: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68  file, char *ciph
0660: 65 72 73 29 29 3b 0a 0a 23 64 65 66 69 6e 65 20  ers));..#define 
0670: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 30  TLS_PROTO_SSL2.0
0680: 78 30 31 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f  x01.#define TLS_
0690: 50 52 4f 54 4f 5f 53 53 4c 33 09 30 78 30 32 0a  PROTO_SSL3.0x02.
06a0: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
06b0: 4f 5f 54 4c 53 31 09 30 78 30 34 0a 23 64 65 66  O_TLS1.0x04.#def
06c0: 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67  ine ENABLED(flag
06d0: 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29  , mask).(((flag)
06e0: 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d   & (mask)) == (m
06f0: 61 73 6b 29 29 0a 2f 2a 0a 20 2a 20 53 74 61 74  ask))./*. * Stat
0700: 69 63 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ic data structur
0710: 65 73 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  es. */..#ifndef 
0720: 4e 4f 5f 44 48 0a 2f 2a 20 66 72 6f 6d 20 6f 70  NO_DH./* from op
0730: 65 6e 73 73 6c 2f 61 70 70 73 2f 73 5f 73 65 72  enssl/apps/s_ser
0740: 76 65 72 2e 63 20 2a 2f 0a 0a 73 74 61 74 69 63  ver.c */..static
0750: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64   unsigned char d
0760: 68 35 31 32 5f 70 5b 5d 3d 7b 0a 20 20 20 20 20  h512_p[]={.     
0770: 20 20 20 30 78 44 41 2c 30 78 35 38 2c 30 78 33     0xDA,0x58,0x3
0780: 43 2c 30 78 31 36 2c 30 78 44 39 2c 30 78 38 35  C,0x16,0xD9,0x85
0790: 2c 30 78 32 32 2c 30 78 38 39 2c 30 78 44 30 2c  ,0x22,0x89,0xD0,
07a0: 30 78 45 34 2c 30 78 41 46 2c 30 78 37 35 2c 0a  0xE4,0xAF,0x75,.
07b0: 20 20 20 20 20 20 20 20 30 78 36 46 2c 30 78 34          0x6F,0x4
07c0: 43 2c 30 78 43 41 2c 30 78 39 32 2c 30 78 44 44  C,0xCA,0x92,0xDD
07d0: 2c 30 78 34 42 2c 30 78 45 35 2c 30 78 33 33 2c  ,0x4B,0xE5,0x33,
07e0: 30 78 42 38 2c 30 78 30 34 2c 30 78 46 42 2c 30  0xB8,0x04,0xFB,0
07f0: 78 30 46 2c 0a 20 20 20 20 20 20 20 20 30 78 45  x0F,.        0xE
0800: 44 2c 30 78 39 34 2c 30 78 45 46 2c 30 78 39 43  D,0x94,0xEF,0x9C
0810: 2c 30 78 38 41 2c 30 78 34 34 2c 30 78 30 33 2c  ,0x8A,0x44,0x03,
0820: 30 78 45 44 2c 30 78 35 37 2c 30 78 34 36 2c 30  0xED,0x57,0x46,0
0830: 78 35 30 2c 30 78 44 33 2c 0a 20 20 20 20 20 20  x50,0xD3,.      
0840: 20 20 30 78 36 39 2c 30 78 39 39 2c 30 78 44 42    0x69,0x99,0xDB
0850: 2c 30 78 32 39 2c 30 78 44 37 2c 30 78 37 36 2c  ,0x29,0xD7,0x76,
0860: 30 78 32 37 2c 30 78 36 42 2c 30 78 41 32 2c 30  0x27,0x6B,0xA2,0
0870: 78 44 33 2c 30 78 44 34 2c 30 78 31 32 2c 0a 20  xD3,0xD4,0x12,. 
0880: 20 20 20 20 20 20 20 30 78 45 32 2c 30 78 31 38         0xE2,0x18
0890: 2c 30 78 46 34 2c 30 78 44 44 2c 30 78 31 45 2c  ,0xF4,0xDD,0x1E,
08a0: 30 78 30 38 2c 30 78 34 43 2c 30 78 46 36 2c 30  0x08,0x4C,0xF6,0
08b0: 78 44 38 2c 30 78 30 30 2c 30 78 33 45 2c 30 78  xD8,0x00,0x3E,0x
08c0: 37 43 2c 0a 20 20 20 20 20 20 20 20 30 78 34 37  7C,.        0x47
08d0: 2c 30 78 37 34 2c 30 78 45 38 2c 30 78 33 33 2c  ,0x74,0xE8,0x33,
08e0: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 73 74 61 74  .        };.stat
08f0: 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ic unsigned char
0900: 20 64 68 35 31 32 5f 67 5b 5d 3d 7b 0a 09 30 78   dh512_g[]={..0x
0910: 30 32 2c 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 44  02,.};..static D
0920: 48 20 2a 67 65 74 5f 64 68 35 31 32 28 29 0a 7b  H *get_dh512().{
0930: 0a 20 20 20 20 44 48 20 2a 64 68 3d 4e 55 4c 4c  .    DH *dh=NULL
0940: 3b 0a 0a 20 20 20 20 69 66 20 28 28 64 68 3d 44  ;..    if ((dh=D
0950: 48 5f 6e 65 77 28 29 29 20 3d 3d 20 4e 55 4c 4c  H_new()) == NULL
0960: 29 20 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ) return(NULL);.
0970: 0a 20 20 20 20 64 68 2d 3e 70 3d 42 4e 5f 62 69  .    dh->p=BN_bi
0980: 6e 32 62 6e 28 64 68 35 31 32 5f 70 2c 73 69 7a  n2bn(dh512_p,siz
0990: 65 6f 66 28 64 68 35 31 32 5f 70 29 2c 4e 55 4c  eof(dh512_p),NUL
09a0: 4c 29 3b 0a 20 20 20 20 64 68 2d 3e 67 3d 42 4e  L);.    dh->g=BN
09b0: 5f 62 69 6e 32 62 6e 28 64 68 35 31 32 5f 67 2c  _bin2bn(dh512_g,
09c0: 73 69 7a 65 6f 66 28 64 68 35 31 32 5f 67 29 2c  sizeof(dh512_g),
09d0: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28  NULL);..    if (
09e0: 28 64 68 2d 3e 70 20 3d 3d 20 4e 55 4c 4c 29 20  (dh->p == NULL) 
09f0: 7c 7c 20 28 64 68 2d 3e 67 20 3d 3d 20 4e 55 4c  || (dh->g == NUL
0a00: 4c 29 29 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c  L))..return(NULL
0a10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 64 68  );.    return(dh
0a20: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
0a30: 20 2a 20 50 65 72 20 4f 70 65 6e 53 53 4c 20 30   * Per OpenSSL 0
0a40: 2e 39 2e 34 20 43 6f 6d 70 61 74 0a 20 2a 2f 0a  .9.4 Compat. */.
0a50: 23 69 66 6e 64 65 66 20 53 54 41 43 4b 5f 4f 46  #ifndef STACK_OF
0a60: 0a 23 64 65 66 69 6e 65 20 53 54 41 43 4b 5f 4f  .#define STACK_O
0a70: 46 28 78 29 09 09 09 53 54 41 43 4b 0a 23 64 65  F(x)...STACK.#de
0a80: 66 69 6e 65 20 73 6b 5f 53 53 4c 5f 43 49 50 48  fine sk_SSL_CIPH
0a90: 45 52 5f 6e 75 6d 28 73 6b 29 09 09 73 6b 5f 6e  ER_num(sk)..sk_n
0aa0: 75 6d 28 28 73 6b 29 29 0a 23 64 65 66 69 6e 65  um((sk)).#define
0ab0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76   sk_SSL_CIPHER_v
0ac0: 61 6c 75 65 28 20 73 6b 2c 20 69 6e 64 65 78 29  alue( sk, index)
0ad0: 09 28 53 53 4c 5f 43 49 50 48 45 52 2a 29 73 6b  .(SSL_CIPHER*)sk
0ae0: 5f 76 61 6c 75 65 28 28 73 6b 29 2c 20 28 69 6e  _value((sk), (in
0af0: 64 65 78 29 29 0a 23 65 6e 64 69 66 0a 0c 0a 2f  dex)).#endif.../
0b00: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e  -------. *. * In
0b50: 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  foCallback --. *
0b60: 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 4c  . *.monitors SSL
0b70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63   connection proc
0b80: 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ess. *. * Result
0b90: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
0ba0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
0bb0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
0bc0: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c10: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ---. */.static v
0c20: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  oid.InfoCallback
0c30: 28 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77  (SSL *ssl, int w
0c40: 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 0a 7b  here, int ret).{
0c50: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
0c60: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53  ePtr = (State*)S
0c70: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_get_app_data(
0c80: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  ssl);.    Tcl_Ob
0c90: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
0ca0: 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72  har *major; char
0cb0: 20 2a 6d 69 6e 6f 72 3b 0a 20 20 20 20 69 6e 74   *minor;.    int
0cc0: 20 77 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61   w;..    if (sta
0cd0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
0ce0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
0cf0: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20  L)..return;..   
0d00: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
0d10: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
0d20: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
0d30: 0a 23 69 66 20 30 0a 20 20 20 20 69 66 20 28 77  .#if 0.    if (w
0d40: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c  here & SSL_CB_AL
0d50: 45 52 54 29 20 7b 0a 09 73 65 76 20 3d 20 53 53  ERT) {..sev = SS
0d60: 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 74 72  L_alert_type_str
0d70: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 09  ing_long(ret);..
0d80: 69 66 20 28 73 74 72 63 6d 70 28 20 73 65 76 2c  if (strcmp( sev,
0d90: 20 22 66 61 74 61 6c 22 29 3d 3d 30 29 20 7b 09   "fatal")==0) {.
0da0: 2f 2a 20 4d 61 70 20 74 6f 20 65 72 72 6f 72 20  /* Map to error 
0db0: 2a 2f 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f  */..    Tls_Erro
0dc0: 72 28 73 74 61 74 65 50 74 72 2c 20 53 53 4c 5f  r(statePtr, SSL_
0dd0: 45 52 52 4f 52 28 73 73 6c 2c 20 30 29 29 3b 0a  ERROR(ssl, 0));.
0de0: 09 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 7d 0a  .    return;..}.
0df0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
0e00: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
0e10: 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54  _CB_HANDSHAKE_ST
0e20: 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20  ART) {..major = 
0e30: 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69  "handshake";..mi
0e40: 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20  nor = "start";. 
0e50: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68     } else if (wh
0e60: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e  ere & SSL_CB_HAN
0e70: 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09  DSHAKE_DONE) {..
0e80: 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61  major = "handsha
0e90: 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64  ke";..minor = "d
0ea0: 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65  one";.    } else
0eb0: 20 7b 0a 09 69 66 20 28 77 68 65 72 65 20 26 20   {..if (where & 
0ec0: 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d  SSL_CB_ALERT)..m
0ed0: 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a  ajor = "alert";.
0ee0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
0ef0: 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54  & SSL_ST_CONNECT
0f00: 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65  ).major = "conne
0f10: 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  ct";..else if (w
0f20: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43  here & SSL_ST_AC
0f30: 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22  CEPT)..major = "
0f40: 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09  accept";..else..
0f50: 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e  ...major = "unkn
0f60: 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72  own";...if (wher
0f70: 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29  e & SSL_CB_READ)
0f80: 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22  ..minor = "read"
0f90: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
0fa0: 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45  e & SSL_CB_WRITE
0fb0: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74  )..minor = "writ
0fc0: 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68  e";..else if (wh
0fd0: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f  ere & SSL_CB_LOO
0fe0: 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f  P)..minor = "loo
0ff0: 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68  p";..else if (wh
1000: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49  ere & SSL_CB_EXI
1010: 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69  T)..minor = "exi
1020: 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69  t";..else.....mi
1030: 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b  nor = "unknown";
1040: 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 54 63 6c  .    }...    Tcl
1050: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1060: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d  ement( statePtr-
1070: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
1080: 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74   ..    Tcl_NewSt
1090: 72 69 6e 67 4f 62 6a 28 20 22 69 6e 66 6f 22 2c  ringObj( "info",
10a0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f   -1));..    Tcl_
10b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10c0: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e  ment( statePtr->
10d0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
10e0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
10f0: 69 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43  ingObj( Tcl_GetC
1100: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
1110: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20  Ptr->self), -1) 
1120: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
1130: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1140: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ( statePtr->inte
1150: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
1160: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1170: 6a 28 20 6d 61 6a 6f 72 2c 20 2d 31 29 20 29 3b  j( major, -1) );
1180: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
1190: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20  jAppendElement( 
11a0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
11b0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
11c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11d0: 20 6d 69 6e 6f 72 2c 20 2d 31 29 20 29 3b 0a 0a   minor, -1) );..
11e0: 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20      if (where & 
11f0: 28 53 53 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c  (SSL_CB_LOOP|SSL
1200: 5f 43 42 5f 45 58 49 54 29 29 20 7b 0a 09 54 63  _CB_EXIT)) {..Tc
1210: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1220: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72  lement( statePtr
1230: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
1240: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1250: 72 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 73 74 61  ringObj( SSL_sta
1260: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73  te_string_long(s
1270: 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20 20 20  sl), -1) );.    
1280: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  } else if (where
1290: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29   & SSL_CB_ALERT)
12a0: 20 7b 0a 09 63 68 61 72 20 2a 63 70 20 3d 20 53   {..char *cp = S
12b0: 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74  SL_alert_desc_st
12c0: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a  ring_long(ret);.
12d0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
12e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74  endElement( stat
12f0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d  ePtr->interp, cm
1300: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1310: 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 63 70 2c  ewStringObj( cp,
1320: 20 2d 31 29 20 29 3b 0a 20 20 20 20 7d 20 65 6c   -1) );.    } el
1330: 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  se {..Tcl_ListOb
1340: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20  jAppendElement( 
1350: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1360: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1370: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1380: 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e   SSL_state_strin
1390: 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29  g_long(ssl), -1)
13a0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63   );.    }.    Tc
13b0: 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c 69  l_Preserve( (Cli
13c0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
13d0: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  r->interp);.    
13e0: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43  Tcl_Preserve( (C
13f0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
1400: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49  Ptr);..    Tcl_I
1410: 6e 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d 64  ncrRefCount( cmd
1420: 50 74 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  Ptr);.    (void)
1430: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 4f   Tcl_GlobalEvalO
1440: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  bj(statePtr->int
1450: 65 72 70 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20  erp, cmdPtr);.  
1460: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
1470: 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a 20 20  nt( cmdPtr);..  
1480: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20 28    Tcl_Release( (
1490: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
14a0: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52  ePtr);.    Tcl_R
14b0: 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74 44  elease( (ClientD
14c0: 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69  ata) statePtr->i
14d0: 6e 74 65 72 70 29 3b 0a 0a 7d 0a 0c 0a 2f 2a 0a  nterp);..}.../*.
14e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
14f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1520: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69  -----. *. * Veri
1530: 66 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  fyCallback --. *
1540: 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 4c  . *.monitors SSL
1550: 20 63 65 72 69 66 69 63 61 74 65 20 76 61 6c 69   cerificate vali
1560: 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20  dation process. 
1570: 2a 09 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  *.This is called
1580: 20 77 68 65 6e 65 76 65 72 20 61 20 63 65 72 74   whenever a cert
1590: 69 66 69 63 61 74 65 20 69 73 20 69 6e 73 70 65  ificate is inspe
15a0: 63 74 65 64 0a 20 2a 09 20 6f 72 20 64 65 63 69  cted. *. or deci
15b0: 64 65 64 20 69 6e 76 61 6c 69 64 0a 20 2a 0a 20  ded invalid. *. 
15c0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6f 6b  * Results:. *.ok
15d0: 20 2d 20 6c 65 74 20 53 53 4c 20 68 61 6e 64 6c   - let SSL handl
15e0: 65 20 69 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20  e it. *. * Side 
15f0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
1600: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  err field of the
1610: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61   currently opera
1620: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65  tive State is se
1630: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69  t. *.  to a stri
1640: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
1650: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
1660: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e  n failure reason
1670: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
16c0: 63 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c  c int.VerifyCall
16d0: 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30  back(int ok, X50
16e0: 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78  9_STORE_CTX *ctx
16f0: 29 0a 7b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c  ).{.    SSL *ssl
1700: 20 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54   = (SSL*)X509_ST
1710: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 61 70 70 5f  ORE_CTX_get_app_
1720: 64 61 74 61 28 63 74 78 29 3b 0a 20 20 20 20 58  data(ctx);.    X
1730: 35 30 39 20 2a 63 65 72 74 20 3d 20 58 35 30 39  509 *cert = X509
1740: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63  _STORE_CTX_get_c
1750: 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29  urrent_cert(ctx)
1760: 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  ;.    State *sta
1770: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
1780: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61  SSL_get_app_data
1790: 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f  (ssl);.    Tcl_O
17a0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
17b0: 69 6e 74 20 64 65 70 74 68 20 3d 20 58 35 30 39  int depth = X509
17c0: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65  _STORE_CTX_get_e
17d0: 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b  rror_depth(ctx);
17e0: 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 58  .    int err = X
17f0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
1800: 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 20 20  t_error(ctx);.  
1810: 20 20 63 68 61 72 20 2a 65 72 72 53 74 72 3b 0a    char *errStr;.
1820: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 73 74 64  .    dprintf(std
1830: 65 72 72 2c 20 22 56 65 72 69 66 79 3a 20 25 64  err, "Verify: %d
1840: 5c 6e 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69  \n", ok);..    i
1850: 66 20 28 21 6f 6b 29 0a 09 65 72 72 53 74 72 20  f (!ok)..errStr 
1860: 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65  = (char*)X509_ve
1870: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f  rify_cert_error_
1880: 73 74 72 69 6e 67 28 65 72 72 29 3b 0a 20 20 20  string(err);.   
1890: 20 65 6c 73 65 0a 09 65 72 72 53 74 72 20 3d 20   else..errStr = 
18a0: 28 63 68 61 72 20 2a 29 30 3b 0a 0a 20 20 20 20  (char *)0;..    
18b0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
18c0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
18d0: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20  bj*)NULL) {..if 
18e0: 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67  (statePtr->vflag
18f0: 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46  s & SSL_VERIFY_F
1900: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
1910: 45 52 54 29 0a 09 20 20 20 20 72 65 74 75 72 6e  ERT)..    return
1920: 20 6f 6b 3b 0a 09 65 6c 73 65 0a 09 20 20 20 20   ok;..else..    
1930: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1940: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
1950: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
1960: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
1970: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
1980: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1990: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ( statePtr->inte
19a0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20 20  rp, cmdPtr, ..  
19b0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
19c0: 62 6a 28 20 22 76 65 72 69 66 79 22 2c 20 2d 31  bj( "verify", -1
19d0: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73  ));..    Tcl_Lis
19e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
19f0: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  t( statePtr->int
1a00: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09 20  erp, cmdPtr, .. 
1a10: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1a20: 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43 68 61 6e  Obj( Tcl_GetChan
1a30: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
1a40: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20 29 3b 0a  ->self), -1) );.
1a50: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1a60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73  AppendElement( s
1a70: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
1a80: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
1a90: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 20 64 65 70  l_NewIntObj( dep
1aa0: 74 68 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  th) );..    Tcl_
1ab0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1ac0: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e  ment( statePtr->
1ad0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
1ae0: 09 20 20 20 20 54 6c 73 5f 4e 65 77 58 35 30 39  .    Tls_NewX509
1af0: 4f 62 6a 28 20 73 74 61 74 65 50 74 72 2d 3e 69  Obj( statePtr->i
1b00: 6e 74 65 72 70 2c 20 63 65 72 74 29 20 29 3b 0a  nterp, cert) );.
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 6f 6b 29  l_NewIntObj( ok)
1b60: 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73   );..    Tcl_Lis
1b70: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1b80: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  t( statePtr->int
1b90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
1ba0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
1bb0: 62 6a 28 20 65 72 72 53 74 72 20 3f 20 65 72 72  bj( errStr ? err
1bc0: 53 74 72 20 3a 20 22 22 2c 20 2d 31 29 20 29 3b  Str : "", -1) );
1bd0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ..    Tcl_Preser
1be0: 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29  ve( (ClientData)
1bf0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
1c00: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  p);.    Tcl_Pres
1c10: 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74  erve( (ClientDat
1c20: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
1c30: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
1c40: 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 20 20  unt( cmdPtr);.  
1c50: 20 20 69 66 20 28 54 63 6c 5f 47 6c 6f 62 61 6c    if (Tcl_Global
1c60: 45 76 61 6c 4f 62 6a 28 73 74 61 74 65 50 74 72  EvalObj(statePtr
1c70: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
1c80: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
1c90: 2f 2a 20 69 74 20 67 6f 74 20 61 6e 20 65 72 72  /* it got an err
1ca0: 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20  or - reject the 
1cb0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
1cc0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
1cd0: 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d 3e 69  ror( statePtr->i
1ce0: 6e 74 65 72 70 29 3b 0a 09 6f 6b 20 3d 20 30 3b  nterp);..ok = 0;
1cf0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69  .    } else {..i
1d00: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
1d10: 6d 4f 62 6a 28 20 73 74 61 74 65 50 74 72 2d 3e  mObj( statePtr->
1d20: 69 6e 74 65 72 70 2c 0a 09 09 20 20 20 20 54 63  interp,...    Tc
1d30: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 20  l_GetObjResult( 
1d40: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1d50: 29 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c 5f 4f  ), &ok) != TCL_O
1d60: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 42 61  K) {..    Tcl_Ba
1d70: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 20 73  ckgroundError( s
1d80: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29  tatePtr->interp)
1d90: 3b 0a 09 20 20 20 20 6f 6b 20 3d 20 30 3b 0a 09  ;..    ok = 0;..
1da0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  }.    }.    Tcl_
1db0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d  DecrRefCount( cm
1dc0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  dPtr);..    Tcl_
1dd0: 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74  Release( (Client
1de0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
1df0: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
1e00: 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  ( (ClientData) s
1e10: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29  tatePtr->interp)
1e20: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b  ;..    return(ok
1e30: 29 3b 09 2f 2a 20 6c 65 61 76 65 20 74 68 65 20  );./* leave the 
1e40: 64 69 73 70 6f 73 69 74 69 6f 6e 20 61 73 20 53  disposition as S
1e50: 53 4c 20 73 65 74 20 69 74 20 2a 2f 0a 7d 0a 0c  SL set it */.}..
1e60: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
1e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
1eb0: 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a  Tls_Error --. *.
1ec0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
1ed0: 6b 20 77 69 74 68 20 24 66 64 20 61 6e 64 20 24  k with $fd and $
1ee0: 6d 73 67 20 2d 20 73 6f 20 74 68 65 20 63 61 6c  msg - so the cal
1ef0: 6c 62 61 63 6b 20 63 61 6e 20 64 65 63 69 64 65  lback can decide
1f00: 0a 20 2a 09 77 68 61 74 20 74 6f 20 64 6f 20 77  . *.what to do w
1f10: 69 74 68 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20  ith errors.. *. 
1f20: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6f 6b  * Results:. *.ok
1f30: 20 2d 20 6c 65 74 20 53 53 4c 20 68 61 6e 64 6c   - let SSL handl
1f40: 65 20 69 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20  e it. *. * Side 
1f50: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
1f60: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  err field of the
1f70: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61   currently opera
1f80: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65  tive State is se
1f90: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69  t. *.  to a stri
1fa0: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
1fb0: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
1fc0: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e  n failure reason
1fd0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2010: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
2020: 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20  Tls_Error(State 
2030: 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20  *statePtr, char 
2040: 2a 6d 73 67 29 0a 7b 0a 20 20 20 20 54 63 6c 5f  *msg).{.    Tcl_
2050: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 0a 20 20  Obj *cmdPtr;..  
2060: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73    if (msg && *ms
2070: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72  g) {..Tcl_SetErr
2080: 6f 72 43 6f 64 65 28 20 73 74 61 74 65 50 74 72  orCode( statePtr
2090: 2d 3e 69 6e 74 65 72 70 2c 20 22 53 53 4c 22 2c  ->interp, "SSL",
20a0: 20 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e 55   msg, (char *)NU
20b0: 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  LL);.    } else 
20c0: 7b 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74  {..msg = Tcl_Get
20d0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
20e0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 73  l_GetObjResult(s
20f0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29  tatePtr->interp)
2100: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20  , NULL);.    }. 
2110: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72     statePtr->err
2120: 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66 20   = msg;..    if 
2130: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
2140: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
2150: 29 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62  )NULL) {..char b
2160: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70 72  uf[BUFSIZ];..spr
2170: 69 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20 63  intf(buf, "SSL c
2180: 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20 65  hannel \"%s\": e
2190: 72 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20 20  rror: %s",..    
21a0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
21b0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
21c0: 66 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f 53  f), msg);..Tcl_S
21d0: 65 74 52 65 73 75 6c 74 28 20 73 74 61 74 65 50  etResult( stateP
21e0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 62 75 66 2c  tr->interp, buf,
21f0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
2200: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
2210: 72 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d 3e  rror( statePtr->
2220: 69 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e  interp);..return
2230: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50  ;.    }.    cmdP
2240: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
2250: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
2260: 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20  callback);..    
2270: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2280: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50  dElement( stateP
2290: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
22a0: 74 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65  tr, ..    Tcl_Ne
22b0: 77 53 74 72 69 6e 67 4f 62 6a 28 20 22 65 72 72  wStringObj( "err
22c0: 6f 72 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  or", -1));..    
22d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
22e0: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50  dElement( stateP
22f0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
2300: 74 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65  tr, ..    Tcl_Ne
2310: 77 53 74 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f  wStringObj( Tcl_
2320: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
2330: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
2340: 2d 31 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  -1) );..    Tcl_
2350: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2360: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e  ment( statePtr->
2370: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
2380: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
2390: 6e 67 4f 62 6a 28 20 6d 73 67 2c 20 2d 31 29 20  ngObj( msg, -1) 
23a0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
23b0: 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74  erve( (ClientDat
23c0: 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  a) statePtr->int
23d0: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72  erp);.    Tcl_Pr
23e0: 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44  eserve( (ClientD
23f0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
2400: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
2410: 43 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a  Count( cmdPtr);.
2420: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 6c 6f 62      if (Tcl_Glob
2430: 61 6c 45 76 61 6c 4f 62 6a 28 73 74 61 74 65 50  alEvalObj(stateP
2440: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
2450: 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  tr) != TCL_OK) {
2460: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
2470: 45 72 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d  Error( statePtr-
2480: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a  >interp);.    }.
2490: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
24a0: 6f 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a  ount( cmdPtr);..
24b0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
24c0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74   (ClientData) st
24d0: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  atePtr);.    Tcl
24e0: 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e  _Release( (Clien
24f0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d  tData) statePtr-
2500: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a  >interp);.}.../*
2510: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2550: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73  ------. *. * Pas
2560: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 20 2d 2d  swordCallback --
2570: 20 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77   . *. *.Called w
2580: 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 69  hen a password i
2590: 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e 70 61  s needed to unpa
25a0: 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d 20 6b  ck RSA and PEM k
25b0: 65 79 73 0a 20 2a 09 45 76 61 6c 73 20 74 68 65  eys. *.Evals the
25c0: 20 74 63 6c 20 70 72 6f 63 3a 20 20 74 6c 73 3a   tcl proc:  tls:
25d0: 3a 70 61 73 73 77 6f 72 64 20 61 6e 64 20 72 65  :password and re
25e0: 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74  turns the result
25f0: 20 61 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77   as. *.the passw
2600: 6f 72 64 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ord. *----------
2610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69  ---------. */.#i
2650: 66 64 65 66 20 50 52 45 5f 4f 50 45 4e 53 53 4c  fdef PRE_OPENSSL
2660: 5f 30 5f 39 5f 34 0a 2f 2a 0a 20 2a 20 4e 6f 20  _0_9_4./*. * No 
2670: 77 61 79 20 74 6f 20 68 61 6e 64 6c 65 20 75 73  way to handle us
2680: 65 72 2d 64 61 74 61 20 74 68 65 72 65 66 6f 72  er-data therefor
2690: 65 20 6e 6f 20 77 61 79 20 77 69 74 68 6f 75 74  e no way without
26a0: 20 61 20 67 6c 6f 62 61 6c 0a 20 2a 20 76 61 72   a global. * var
26b0: 69 61 62 6c 65 20 74 6f 20 61 63 63 65 73 73 20  iable to access 
26c0: 74 68 65 20 54 63 6c 20 69 6e 74 65 72 70 72 65  the Tcl interpre
26d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
26e0: 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  nt.PasswordCallb
26f0: 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69  ack(char *buf, i
2700: 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 72  nt size, int ver
2710: 69 66 79 29 0a 7b 0a 20 20 20 20 72 65 74 75 72  ify).{.    retur
2720: 6e 20 2d 31 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74  n -1;.}.#else.st
2730: 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72  atic int.Passwor
2740: 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a  dCallback(char *
2750: 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69  buf, int size, i
2760: 6e 74 20 76 65 72 69 66 79 2c 20 76 6f 69 64 20  nt verify, void 
2770: 2a 75 64 61 74 61 29 0a 7b 0a 20 20 20 20 54 63  *udata).{.    Tc
2780: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2790: 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29   = (Tcl_Interp*)
27a0: 75 64 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28  udata;..    if (
27b0: 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c  Tcl_Eval(interp,
27c0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22   "tls::password"
27d0: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) == TCL_OK) {..
27e0: 63 68 61 72 20 2a 72 65 74 20 3d 20 54 63 6c 5f  char *ret = Tcl_
27f0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
2800: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 20  interp);.       
2810: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65   strncpy(buf, re
2820: 74 2c 20 73 69 7a 65 29 3b 0a 09 72 65 74 75 72  t, size);..retur
2830: 6e 20 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 20  n strlen(ret);. 
2840: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 74     } else {..ret
2850: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 7d 0a  urn -1;.    }.}.
2860: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28b0: 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f  -. *. * CiphersO
28c0: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76  bjCmd -- list av
28d0: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a  ailable ciphers.
28e0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
28f0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
2900: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
2910: 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f  tls::ciphers" co
2920: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74  mmand. *.to list
2930: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65   available ciphe
2940: 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70  rs, based upon p
2950: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
2960: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
2970: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
2980: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a  cl result list..
2990: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
29a0: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74  ts:. *.construct
29b0: 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53  s and destroys S
29c0: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29  SL context (CTX)
29d0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
29e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
2a20: 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73  atic int.Ciphers
2a30: 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 74  ObjCmd(clientDat
2a40: 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c  a, interp, objc,
2a50: 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e   objv).    Clien
2a60: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2a70: 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a  ;./* Not used. *
2a80: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  /.    Tcl_Interp
2a90: 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e   *interp;.    in
2aa0: 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f  t objc;.    Tcl_
2ab0: 4f 62 6a 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj.*CONST objv[
2ac0: 5d 3b 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20  ];.{.    static 
2ad0: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b  char *protocols[
2ae0: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 0a 09  ] = {.."ssl2",..
2af0: 22 73 73 6c 33 22 2c 0a 09 22 74 6c 73 31 22 2c  "ssl3",.."tls1",
2b00: 0a 09 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20  ..NULL.    };.  
2b10: 20 20 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20    enum protocol 
2b20: 7b 0a 09 54 4c 53 5f 53 53 4c 32 2c 0a 09 54 4c  {..TLS_SSL2,..TL
2b30: 53 5f 53 53 4c 33 2c 0a 09 54 4c 53 5f 54 4c 53  S_SSL3,..TLS_TLS
2b40: 31 2c 0a 09 54 4c 53 5f 4e 4f 4e 45 0a 20 20 20  1,..TLS_NONE.   
2b50: 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   };.    Tcl_Obj 
2b60: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 53 53 4c  *objPtr;.    SSL
2b70: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
2b80: 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d  ;.    SSL *ssl =
2b90: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b   NULL;.    STACK
2ba0: 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20  _OF(SSL_CIPHER) 
2bb0: 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  *sk;.    char *c
2bc0: 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a  p, buf[BUFSIZ];.
2bd0: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76      int index, v
2be0: 65 72 62 6f 73 65 20 3d 20 30 3b 0a 0a 20 20 20  erbose = 0;..   
2bf0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c   if (objc < 2 ||
2c00: 20 6f 62 6a 63 20 3e 20 33 29 20 7b 0a 09 54 63   objc > 3) {..Tc
2c10: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2c20: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2c30: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f  "protocol ?verbo
2c40: 73 65 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 72  se?");.        r
2c50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2c60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54  .    }.    if (T
2c70: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
2c80: 62 6a 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76  bj( interp, objv
2c90: 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20  [1], protocols, 
2ca0: 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 0a 09  "protocol", 0,..
2cb0: 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f  &index) != TCL_O
2cc0: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
2cd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
2ce0: 20 20 69 66 20 28 6f 62 6a 63 20 3e 20 32 20 26    if (objc > 2 &
2cf0: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  & Tcl_GetBoolean
2d00: 46 72 6f 6d 4f 62 6a 28 20 69 6e 74 65 72 70 2c  FromObj( interp,
2d10: 20 6f 62 6a 76 5b 32 5d 2c 0a 09 26 76 65 72 62   objv[2],..&verb
2d20: 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ose) != TCL_OK) 
2d30: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
2d40: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
2d50: 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f  witch ((enum pro
2d60: 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 20  tocol)index) {. 
2d70: 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c 32     case TLS_SSL2
2d80: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
2d90: 5f 53 53 4c 32 29 0a 09 09 54 63 6c 5f 41 70 70  _SSL2)...Tcl_App
2da0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2db0: 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  , "protocol not 
2dc0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
2dd0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
2de0: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09 63  ERROR;.#else...c
2df0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
2e00: 28 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29  (SSLv2_method())
2e10: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
2e20: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c      case TLS_SSL
2e30: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  3:.#if defined(N
2e40: 4f 5f 53 53 4c 33 29 0a 09 09 54 63 6c 5f 41 70  O_SSL3)...Tcl_Ap
2e50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2e60: 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  p, "protocol not
2e70: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
2e80: 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  L);...return TCL
2e90: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 09  _ERROR;.#else...
2ea0: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
2eb0: 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29  w(SSLv3_method()
2ec0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
2ed0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c  .    case TLS_TL
2ee0: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  S1:.#if defined(
2ef0: 4e 4f 5f 54 4c 53 31 29 0a 09 09 54 63 6c 5f 41  NO_TLS1)...Tcl_A
2f00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2f10: 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f  rp, "protocol no
2f20: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
2f30: 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  LL);...return TC
2f40: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
2f50: 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e  .ctx = SSL_CTX_n
2f60: 65 77 28 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28  ew(TLSv1_method(
2f70: 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  )); break;.#endi
2f80: 66 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  f.    }.    if (
2f90: 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ctx == NULL) {..
2fa0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2fb0: 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28  (interp, REASON(
2fc0: 29 2c 0a 09 20 20 20 20 28 63 68 61 72 20 2a 29  ),..    (char *)
2fd0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
2fe0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
2ff0: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e  .    ssl = SSL_n
3000: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20  ew(ctx);.    if 
3010: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
3020: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
3030: 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e  t(interp, REASON
3040: 28 29 2c 0a 09 20 20 20 20 28 63 68 61 72 20 2a  (),..    (char *
3050: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
3060: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
3070: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3080: 20 20 20 20 7d 0a 20 20 20 20 6f 62 6a 50 74 72      }.    objPtr
3090: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
30a0: 6a 28 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  j( 0, NULL);..  
30b0: 20 20 69 66 20 28 21 76 65 72 62 6f 73 65 29 20    if (!verbose) 
30c0: 7b 0a 09 66 6f 72 20 28 69 6e 64 65 78 20 3d 20  {..for (index = 
30d0: 30 3b 20 3b 20 69 6e 64 65 78 2b 2b 29 20 7b 0a  0; ; index++) {.
30e0: 09 20 20 20 20 63 70 20 3d 20 28 63 68 61 72 2a  .    cp = (char*
30f0: 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f  )SSL_get_cipher_
3100: 6c 69 73 74 28 20 73 73 6c 2c 20 69 6e 64 65 78  list( ssl, index
3110: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 70 20 3d  );..    if (cp =
3120: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09  = NULL) break;..
3130: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3140: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e  ppendElement( in
3150: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09  terp, objPtr,...
3160: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3170: 28 20 63 70 2c 20 2d 31 29 20 29 3b 0a 09 7d 0a  ( cp, -1) );..}.
3180: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b      } else {..sk
3190: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65   = SSL_get_ciphe
31a0: 72 73 28 73 73 6c 29 3b 0a 0a 09 66 6f 72 20 28  rs(ssl);...for (
31b0: 69 6e 64 65 78 20 3d 20 30 3b 20 69 6e 64 65 78  index = 0; index
31c0: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   < sk_SSL_CIPHER
31d0: 5f 6e 75 6d 28 73 6b 29 3b 20 69 6e 64 65 78 2b  _num(sk); index+
31e0: 2b 29 20 7b 0a 09 20 20 20 20 72 65 67 69 73 74  +) {..    regist
31f0: 65 72 20 69 6e 74 20 69 3b 0a 09 20 20 20 20 53  er int i;..    S
3200: 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69  SL_CIPHER_descri
3210: 70 74 69 6f 6e 28 20 73 6b 5f 53 53 4c 5f 43 49  ption( sk_SSL_CI
3220: 50 48 45 52 5f 76 61 6c 75 65 28 20 73 6b 2c 20  PHER_value( sk, 
3230: 69 6e 64 65 78 29 2c 0a 09 09 09 09 20 20 20 20  index),.....    
3240: 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  buf, sizeof(buf)
3250: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 20 3d  );..    for (i =
3260: 20 73 74 72 6c 65 6e 28 62 75 66 29 20 2d 20 31   strlen(buf) - 1
3270: 3b 20 69 20 3b 20 69 2d 2d 29 20 7b 0a 09 09 69  ; i ; i--) {...i
3280: 66 20 28 62 75 66 5b 69 5d 20 3d 3d 20 27 20 27  f (buf[i] == ' '
3290: 20 7c 7c 20 62 75 66 5b 69 5d 20 3d 3d 20 27 5c   || buf[i] == '\
32a0: 6e 27 20 7c 7c 0a 09 09 20 20 20 20 62 75 66 5b  n' ||...    buf[
32b0: 69 5d 20 3d 3d 20 27 5c 72 27 20 7c 7c 20 62 75  i] == '\r' || bu
32c0: 66 5b 69 5d 20 3d 3d 20 27 5c 74 27 29 20 7b 0a  f[i] == '\t') {.
32d0: 09 09 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 27  ..    buf[i] = '
32e0: 5c 30 27 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  \0';...} else {.
32f0: 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d  ..    break;...}
3300: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
3310: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3320: 65 6d 65 6e 74 28 20 69 6e 74 65 72 70 2c 20 6f  ement( interp, o
3330: 62 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77  bjPtr,...Tcl_New
3340: 53 74 72 69 6e 67 4f 62 6a 28 20 62 75 66 2c 20  StringObj( buf, 
3350: 2d 31 29 20 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  -1) );..}.    }.
3360: 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c      SSL_free(ssl
3370: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  );.    SSL_CTX_f
3380: 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54  ree(ctx);..    T
3390: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
33a0: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29   interp, objPtr)
33b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
33c0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3410: 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b  -. *. * Handshak
3420: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  eObjCmd --. *. *
3430: 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73  .This command is
3440: 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20   used to verify 
3450: 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64  whether the hand
3460: 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74  shake is complet
3470: 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a  e. *.or not.. *.
3480: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
3490: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
34a0: 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61  sult. 1 means ha
34b0: 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65  ndshake complete
34c0: 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e  , 0 means pendin
34d0: 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  g.. *. * Side ef
34e0: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f  fects:. *.May fo
34f0: 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74  rce SSL negotiat
3500: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63  ion to take plac
3510: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
3560: 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 61 6e 64  .static int.Hand
3570: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 63 6c 69 65  shakeObjCmd(clie
3580: 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20  ntData, interp, 
3590: 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20  objc, objv).    
35a0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
35b0: 74 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73  tData;./* Not us
35c0: 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  ed. */.    Tcl_I
35d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
35e0: 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20     int objc;.   
35f0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
3600: 6f 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63  objv[];.{.    Tc
3610: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09  l_Channel chan;.
3620: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20  ./* The channel 
3630: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e  to set a mode on
3640: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a  . */.    State *
3650: 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c  statePtr;../* cl
3660: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73  ient state for s
3670: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20  sl socket */.   
3680: 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 0a 20   int ret = 1;.. 
3690: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
36a0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
36b0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
36c0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
36d0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
36e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
36f0: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   }..    chan = T
3700: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
3710: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
3720: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
3730: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29  1], NULL), NULL)
3740: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
3750: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
3760: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20  NULL) {.        
3770: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
3790: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
37a0: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
37b0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
37c0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
37d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
37e0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
37f0: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
3800: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 20 20  elName(chan),.  
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
3820: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
3830: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20  nnel", NULL);.  
3840: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
3850: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
3860: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
3870: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61  ate *)Tcl_GetCha
3880: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
3890: 28 20 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66  ( chan);..    if
38a0: 20 28 21 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66   (!SSL_is_init_f
38b0: 69 6e 69 73 68 65 64 28 73 74 61 74 65 50 74 72  inished(statePtr
38c0: 2d 3e 73 73 6c 29 29 20 7b 0a 09 69 6e 74 20 65  ->ssl)) {..int e
38d0: 72 72 3b 0a 09 72 65 74 20 3d 20 54 6c 73 5f 57  rr;..ret = Tls_W
38e0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74  aitForConnect(st
38f0: 61 74 65 50 74 72 2c 20 26 65 72 72 29 3b 0a 09  atePtr, &err);..
3900: 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09  if (ret < 0) {..
3910: 20 20 20 20 63 68 61 72 20 2a 65 72 72 53 74 72      char *errStr
3920: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72   = statePtr->err
3930: 3b 0a 09 20 20 20 20 54 63 6c 5f 52 65 73 65 74  ;..    Tcl_Reset
3940: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
3950: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6e  .    Tcl_SetErrn
3960: 6f 28 65 72 72 29 3b 0a 0a 09 20 20 20 20 69 66  o(err);...    if
3970: 20 28 21 65 72 72 53 74 72 20 7c 7c 20 2a 65 72   (!errStr || *er
3980: 72 53 74 72 20 3d 3d 20 30 29 0a 09 20 20 20 20  rStr == 0)..    
3990: 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c      errStr = Tcl
39a0: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65  _PosixError(inte
39b0: 72 70 29 3b 0a 0a 09 20 20 20 20 54 63 6c 5f 41  rp);...    Tcl_A
39c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
39d0: 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66  rp, "handshake f
39e0: 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72  ailed: ", errStr
39f0: 2c 20 28 63 68 61 72 2a 29 4e 55 4c 4c 29 3b 0a  , (char*)NULL);.
3a00: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
3a10: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
3a20: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
3a30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
3a40: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29  _NewIntObj(ret))
3a50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3a60: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ab0: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62  -. *. * ImportOb
3ac0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
3ad0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
3ae0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
3af0: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d  ss the "ssl" com
3b00: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73  mand. *. *.The s
3b10: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65  sl command pushe
3b20: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65  s SSL over a (ne
3b30: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74  wly connected) t
3b40: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20  cp socket. *. * 
3b50: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
3b60: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
3b70: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
3b80: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f  fects:. *.May mo
3b90: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  dify the behavio
3ba0: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e  r of an IO chann
3bb0: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
3bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3c00: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70  ..static int.Imp
3c10: 6f 72 74 4f 62 6a 43 6d 64 28 63 6c 69 65 6e 74  ortObjCmd(client
3c20: 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62  Data, interp, ob
3c30: 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43 6c  jc, objv).    Cl
3c40: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
3c50: 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65 64  ata;./* Not used
3c60: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74  . */.    Tcl_Int
3c70: 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 20  erp *interp;.   
3c80: 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20 54   int objc;.    T
3c90: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
3ca0: 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63 6c 5f  jv[];.{.    Tcl_
3cb0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
3cc0: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
3cd0: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
3ce0: 2a 2f 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b  */.    BIO *bio;
3cf0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
3d00: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
3d10: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
3d20: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c  ocket */.    SSL
3d30: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
3d40: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73  ;.    Tcl_Obj *s
3d50: 63 72 69 70 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  cript = NULL;.  
3d60: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 69    int idx;.    i
3d70: 6e 74 20 66 6c 61 67 73 20 3d 20 54 4c 53 5f 54  nt flags = TLS_T
3d80: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74  CL_INIT;.    int
3d90: 20 73 65 72 76 65 72 20 3d 20 30 3b 09 09 2f 2a   server = 0;../*
3da0: 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69   is connection i
3db0: 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f  ncoming or outgo
3dc0: 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72  ing? */.    char
3dd0: 20 2a 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *key = NULL;.  
3de0: 20 20 63 68 61 72 20 2a 63 65 72 74 20 3d 20 4e    char *cert = N
3df0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  ULL;.    char *c
3e00: 69 70 68 65 72 73 20 3d 20 4e 55 4c 4c 3b 0a 20  iphers = NULL;. 
3e10: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 20     char *CAfile 
3e20: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
3e30: 20 2a 43 41 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a   *CAdir = NULL;.
3e40: 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 20      char *model 
3e50: 3d 20 4e 55 4c 4c 3b 0a 23 69 66 20 64 65 66 69  = NULL;.#if defi
3e60: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  ned(NO_SSL2).   
3e70: 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 3b 0a 23   int ssl2 = 0;.#
3e80: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 73 73 6c  else.    int ssl
3e90: 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69  2 = 1;.#endif.#i
3ea0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  f defined(NO_SSL
3eb0: 33 29 0a 20 20 20 20 69 6e 74 20 73 73 6c 33 20  3).    int ssl3 
3ec0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  = 0;.#else.    i
3ed0: 6e 74 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e  nt ssl3 = 1;.#en
3ee0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3ef0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69  NO_SSL2) && defi
3f00: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 20  ned(NO_SSL3).   
3f10: 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 3b 0a 23   int tls1 = 1;.#
3f20: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 74 6c 73  else.    int tls
3f30: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  1 = 0;.#endif.  
3f40: 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 3b    int proto = 0;
3f50: 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20  .    int verify 
3f60: 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30  = 0, require = 0
3f70: 2c 20 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a  , request = 1;..
3f80: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32      if (objc < 2
3f90: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
3fa0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
3fb0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20   objv, "channel 
3fc0: 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 20 20 20  ?options?");.   
3fd0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
3fe0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
3ff0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
4000: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
4010: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
4020: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55  mObj(objv[1], NU
4030: 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  LL), NULL);.    
4040: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
4050: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
4060: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
4070: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
4080: 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20  }..    for (idx 
4090: 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b  = 2; idx < objc;
40a0: 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20   idx++) {..char 
40b0: 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  *opt = Tcl_GetSt
40c0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
40d0: 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  [idx], NULL);...
40e0: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d  if (opt[0] != '-
40f0: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ')..    break;..
4100: 09 4f 50 54 53 54 52 28 20 22 2d 63 61 66 69 6c  .OPTSTR( "-cafil
4110: 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50  e", CAfile);..OP
4120: 54 53 54 52 28 20 22 2d 63 61 64 69 72 22 2c 20  TSTR( "-cadir", 
4130: 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 28  CAdir);..OPTSTR(
4140: 20 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65   "-certfile", ce
4150: 72 74 29 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d  rt);..OPTSTR( "-
4160: 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73  cipher", ciphers
4170: 29 3b 0a 09 4f 50 54 4f 42 4a 28 20 22 2d 63 6f  );..OPTOBJ( "-co
4180: 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b  mmand", script);
4190: 0a 09 4f 50 54 53 54 52 28 20 22 2d 6b 65 79 66  ..OPTSTR( "-keyf
41a0: 69 6c 65 22 2c 20 6b 65 79 29 3b 0a 09 4f 50 54  ile", key);..OPT
41b0: 53 54 52 28 20 22 2d 6d 6f 64 65 6c 22 2c 20 6d  STR( "-model", m
41c0: 6f 64 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  odel);..OPTBOOL(
41d0: 20 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71   "-require", req
41e0: 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uire);..OPTBOOL(
41f0: 20 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71   "-request", req
4200: 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uest);..OPTBOOL(
4210: 20 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76   "-server", serv
4220: 65 72 29 3b 0a 0a 09 4f 50 54 42 4f 4f 4c 28 20  er);...OPTBOOL( 
4230: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a  "-ssl2", ssl2);.
4240: 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 73 73 6c 33  .OPTBOOL( "-ssl3
4250: 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f  ", ssl3);..OPTBO
4260: 4f 4c 28 20 22 2d 74 6c 73 31 22 2c 20 74 6c 73  OL( "-tls1", tls
4270: 31 29 3b 0a 0a 09 4f 50 54 42 41 44 28 20 22 6f  1);...OPTBAD( "o
4280: 70 74 69 6f 6e 22 2c 20 22 2d 63 61 66 69 6c 65  ption", "-cafile
4290: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 65 72 74 66  , -cadir, -certf
42a0: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63  ile, -cipher, -c
42b0: 6f 6d 6d 61 6e 64 2c 20 2d 6b 65 79 66 69 6c 65  ommand, -keyfile
42c0: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 72 65 71 75 69  , -model, -requi
42d0: 72 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 73  re, -request, -s
42e0: 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 73 65 72  sl2, -ssl3, -ser
42f0: 76 65 72 2c 20 6f 72 20 2d 74 6c 73 31 22 29 3b  ver, or -tls1");
4300: 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
4310: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
4320: 66 20 28 72 65 71 75 65 73 74 29 20 76 65 72 69  f (request) veri
4330: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
4340: 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53  _CLIENT_ONCE | S
4350: 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a  SL_VERIFY_PEER;.
4360: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20      if (request 
4370: 26 26 20 72 65 71 75 69 72 65 29 20 76 65 72 69  && require) veri
4380: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
4390: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
43a0: 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 76  _CERT;.    if (v
43b0: 65 72 69 66 79 20 3d 3d 20 30 29 20 76 65 72 69  erify == 0) veri
43c0: 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  fy = SSL_VERIFY_
43d0: 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f  NONE;..    proto
43e0: 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f   |= (ssl2 ? TLS_
43f0: 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b  PROTO_SSL2 : 0);
4400: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73  .    proto |= (s
4410: 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  sl3 ? TLS_PROTO_
4420: 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70  SSL3 : 0);.    p
4430: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20  roto |= (tls1 ? 
4440: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a  TLS_PROTO_TLS1 :
4450: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73   0);..    /* res
4460: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c  et to NULL if bl
4470: 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69  ank string provi
4480: 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  ded */.    if (c
4490: 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 20 63  ert && !*cert) c
44a0: 65 72 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ert = NULL;.    
44b0: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79  if (key && !*key
44c0: 29 20 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ) key = NULL;.  
44d0: 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26    if (ciphers &&
44e0: 20 21 2a 63 69 70 68 65 72 73 29 20 63 69 70 68   !*ciphers) ciph
44f0: 65 72 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ers = NULL;.    
4500: 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a  if (CAfile && !*
4510: 43 41 66 69 6c 65 29 20 43 41 66 69 6c 65 20 3d  CAfile) CAfile =
4520: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43   NULL;.    if (C
4530: 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72 29  Adir && !*CAdir)
4540: 20 43 41 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a 0a   CAdir = NULL;..
4550: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d      if (model !=
4560: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f   NULL) {..int mo
4570: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20  de;../* Get the 
4580: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20  "model" context 
4590: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47  */..chan = Tcl_G
45a0: 65 74 43 68 61 6e 6e 65 6c 28 20 69 6e 74 65 72  etChannel( inter
45b0: 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29  p, model, &mode)
45c0: 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28  ;..if (chan == (
45d0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 30 29 20 7b  Tcl_Channel)0) {
45e0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
45f0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 69 66 20 28  _ERROR;..}..if (
4600: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
4610: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
4620: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
4630: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
4640: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
4650: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
4660: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
4670: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 20 20 20  ame(chan),...   
4680: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20   "\": not a TLS 
4690: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
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 73 74 61 74  _ERROR;..}..stat
46c0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
46d0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
46e0: 73 74 61 6e 63 65 44 61 74 61 28 20 63 68 61 6e  stanceData( chan
46f0: 29 3b 0a 09 63 74 78 20 3d 20 73 74 61 74 65 50  );..ctx = stateP
4700: 74 72 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65  tr->ctx;.    } e
4710: 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20  lse {..if ((ctx 
4720: 3d 20 43 54 58 5f 49 6e 69 74 28 20 69 6e 74 65  = CTX_Init( inte
4730: 72 70 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 2c 20  rp, proto, key, 
4740: 63 65 72 74 2c 20 43 41 64 69 72 2c 20 43 41 66  cert, CAdir, CAf
4750: 69 6c 65 2c 20 63 69 70 68 65 72 73 29 29 0a 09  ile, ciphers))..
4760: 20 20 20 20 3d 3d 20 28 53 53 4c 5f 43 54 58 2a      == (SSL_CTX*
4770: 29 30 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  )0) {..    retur
4780: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
4790: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 6e 65      }..    /* ne
47a0: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20  w SSL state */. 
47b0: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53     statePtr = (S
47c0: 74 61 74 65 20 2a 29 20 54 63 6c 5f 41 6c 6c 6f  tate *) Tcl_Allo
47d0: 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a  c((unsigned) siz
47e0: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20  eof(State));.   
47f0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20   statePtr->self 
4800: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 4e  = (Tcl_Channel)N
4810: 55 4c 4c 3b 0a 20 20 20 20 73 74 61 74 65 50 74  ULL;.    statePt
4820: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f  r->timer = (Tcl_
4830: 54 69 6d 65 72 54 6f 6b 65 6e 29 4e 55 4c 4c 3b  TimerToken)NULL;
4840: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
4850: 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
4860: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74     statePtr->wat
4870: 63 68 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  chMask = 0;.    
4880: 73 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65 20 3d  statePtr->mode =
4890: 20 30 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74   0;..    statePt
48a0: 72 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  r->interp = inte
48b0: 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  rp;.    statePtr
48c0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 28 54 63  ->callback = (Tc
48d0: 6c 5f 4f 62 6a 20 2a 29 30 3b 0a 0a 20 20 20 20  l_Obj *)0;..    
48e0: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73  statePtr->vflags
48f0: 20 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73   = verify;.    s
4900: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 28  tatePtr->ssl = (
4910: 53 53 4c 2a 29 30 3b 0a 20 20 20 20 73 74 61 74  SSL*)0;.    stat
4920: 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b  ePtr->ctx = ctx;
4930: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62  .    statePtr->b
4940: 69 6f 20 3d 20 28 42 49 4f 2a 29 30 3b 0a 20 20  io = (BIO*)0;.  
4950: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69    statePtr->p_bi
4960: 6f 20 3d 20 28 42 49 4f 2a 29 30 3b 0a 0a 20 20  o = (BIO*)0;..  
4970: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20    statePtr->err 
4980: 3d 20 22 22 3b 0a 0a 20 20 20 20 54 63 6c 5f 53  = "";..    Tcl_S
4990: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
49a0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
49b0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62  translation", "b
49c0: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c  inary");.    Tcl
49d0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
49e0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
49f0: 22 2d 62 75 66 66 65 72 69 6e 67 22 2c 20 22 6e  "-buffering", "n
4a00: 6f 6e 65 22 29 3b 0a 0a 23 69 66 20 54 43 4c 5f  one");..#if TCL_
4a10: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d  MAJOR_VERSION ==
4a20: 20 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f   8 && TCL_MINOR_
4a30: 56 45 52 53 49 4f 4e 20 3c 20 32 0a 20 20 20 20  VERSION < 2.    
4a40: 73 74 61 74 65 50 74 72 2d 3e 70 61 72 65 6e 74  statePtr->parent
4a50: 20 3d 20 63 68 61 6e 3b 0a 20 20 20 20 73 74 61   = chan;.    sta
4a60: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63  tePtr->self = Tc
4a70: 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c  l_ReplaceChannel
4a80: 28 20 69 6e 74 65 72 70 2c 0a 09 09 09 09 54 6c  ( interp,.....Tl
4a90: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c  s_ChannelType(),
4aa0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74   (ClientData) st
4ab0: 61 74 65 50 74 72 2c 0a 09 09 09 20 20 20 20 20  atePtr,....     
4ac0: 20 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20    (TCL_READABLE 
4ad0: 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c  | TCL_WRITABLE),
4ae0: 20 73 74 61 74 65 50 74 72 2d 3e 70 61 72 65 6e   statePtr->paren
4af0: 74 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 74  t);.#else.    st
4b00: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 63  atePtr->self = c
4b10: 68 61 6e 3b 0a 20 20 20 20 54 63 6c 5f 53 74 61  han;.    Tcl_Sta
4b20: 63 6b 43 68 61 6e 6e 65 6c 28 20 69 6e 74 65 72  ckChannel( inter
4b30: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  p, Tls_ChannelTy
4b40: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74  pe(), (ClientDat
4b50: 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 09 09  a) statePtr,....
4b60: 20 20 20 20 20 20 20 28 54 43 4c 5f 52 45 41 44         (TCL_READ
4b70: 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41  ABLE | TCL_WRITA
4b80: 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 23 65 6e  BLE), chan);.#en
4b90: 64 69 66 0a 20 20 20 20 69 66 20 28 73 74 61 74  dif.    if (stat
4ba0: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
4bb0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
4bc0: 29 20 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  ) {.        Tcl_
4bd0: 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 28 20  EventuallyFree( 
4be0: 28 43 6c 69 65 6e 74 44 61 74 61 29 73 74 61 74  (ClientData)stat
4bf0: 65 50 74 72 2c 20 54 6c 73 5f 46 72 65 65 29 3b  ePtr, Tls_Free);
4c00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4c10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
4c20: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74  ..    /* allocat
4c30: 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20  e script */.    
4c40: 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 63  if (script) {..c
4c50: 68 61 72 20 2a 20 74 6d 70 20 3d 20 54 63 6c 5f  har * tmp = Tcl_
4c60: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
4c70: 28 73 63 72 69 70 74 2c 20 4e 55 4c 4c 29 3b 0a  (script, NULL);.
4c80: 09 69 66 20 28 74 6d 70 20 26 26 20 2a 74 6d 70  .if (tmp && *tmp
4c90: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
4ca0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 54 63  r->callback = Tc
4cb0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
4cc0: 63 72 69 70 74 29 3b 0a 09 20 20 20 20 54 63 6c  cript);..    Tcl
4cd0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 20 73  _IncrRefCount( s
4ce0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
4cf0: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20  k);..}.    }.   
4d00: 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 6c 79   /* This is only
4d10: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
4d20: 6f 66 20 61 20 62 75 67 20 69 6e 20 4f 70 65 6e  of a bug in Open
4d30: 53 53 4c 2c 20 77 68 65 72 65 20 74 68 65 0a 20  SSL, where the. 
4d40: 20 20 20 20 2a 20 73 73 6c 2d 3e 76 65 72 69 66      * ssl->verif
4d50: 79 5f 63 61 6c 6c 62 61 63 6b 20 69 73 20 6e 6f  y_callback is no
4d60: 74 20 72 65 66 65 72 65 6e 63 65 64 21 21 21 20  t referenced!!! 
4d70: 28 4d 75 73 74 20 62 65 20 64 6f 6e 65 0a 20 20  (Must be done.  
4d80: 20 20 20 2a 20 2a 62 65 66 6f 72 65 2a 20 53 53     * *before* SS
4d90: 4c 5f 6e 65 77 28 29 20 69 73 20 63 61 6c 6c 65  L_new() is calle
4da0: 64 21 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53  d!.     */.    S
4db0: 53 4c 5f 43 54 58 5f 73 65 74 5f 76 65 72 69 66  SL_CTX_set_verif
4dc0: 79 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  y(statePtr->ctx,
4dd0: 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43   verify, VerifyC
4de0: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f  allback);..    /
4df0: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69  *.     * SSL Ini
4e00: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20  tialization.    
4e10: 20 2a 2f 0a 0a 20 20 20 20 73 74 61 74 65 50 74   */..    statePt
4e20: 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77  r->ssl = SSL_new
4e30: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b  (statePtr->ctx);
4e40: 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50  .    if (!stateP
4e50: 74 72 2d 3e 73 73 6c 29 20 7b 0a 20 20 20 20 20  tr->ssl) {.     
4e60: 20 20 20 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72     /* SSL librar
4e70: 79 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  y error */.     
4e80: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4e90: 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 20  ult(interp,.    
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 20 20 22 63 6f 75 6c 64 6e 27 74 20 63       "couldn't c
4ec0: 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73  onstruct ssl ses
4ed0: 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28  sion: ", REASON(
4ee0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
4f00: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  r *) NULL);.    
4f10: 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c      Tcl_Eventual
4f20: 6c 79 46 72 65 65 28 20 28 43 6c 69 65 6e 74 44  lyFree( (ClientD
4f30: 61 74 61 29 73 74 61 74 65 50 74 72 2c 20 54 6c  ata)statePtr, Tl
4f40: 73 5f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  s_Free);.       
4f50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4f60: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
4f70: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c  .     * SSL Call
4f80: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 0a 20  backs.     */.. 
4f90: 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64     SSL_set_app_d
4fa0: 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ata(statePtr->ss
4fb0: 6c 2c 20 28 56 4f 49 44 20 2a 29 73 74 61 74 65  l, (VOID *)state
4fc0: 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62  Ptr);./* point b
4fd0: 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a 20 20  ack to us */..  
4fe0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 20    /*.     * The 
4ff0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 62 72 6f  following is bro
5000: 6b 65 6e 20 2d 20 77 65 20 6e 65 65 64 20 69 73  ken - we need is
5010: 20 74 6f 20 73 65 74 20 74 68 65 0a 20 20 20 20   to set the.    
5020: 20 2a 20 76 65 72 69 66 79 5f 6d 6f 64 65 2c 20   * verify_mode, 
5030: 62 75 74 20 74 68 65 20 6c 69 62 72 61 72 79 20  but the library 
5040: 69 67 6e 6f 72 65 73 20 74 68 65 20 76 65 72 69  ignores the veri
5050: 66 79 5f 63 61 6c 6c 62 61 63 6b 21 21 21 0a 20  fy_callback!!!. 
5060: 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 53 53 4c      */.    /*SSL
5070: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74  _set_verify(stat
5080: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66  ePtr->ssl, verif
5090: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63  y, VerifyCallbac
50a0: 6b 29 3b 2a 2f 0a 0a 20 20 20 20 53 53 4c 5f 43  k);*/..    SSL_C
50b0: 54 58 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c  TX_set_info_call
50c0: 62 61 63 6b 28 20 73 74 61 74 65 50 74 72 2d 3e  back( statePtr->
50d0: 63 74 78 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63  ctx, InfoCallbac
50e0: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  k);..    /* Crea
50f0: 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42  te Tcl_Channel B
5100: 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  IO Handler */.  
5110: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69    statePtr->p_bi
5120: 6f 20 3d 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65  o = bio = BIO_ne
5130: 77 5f 74 63 6c 28 20 73 74 61 74 65 50 74 72 2c  w_tcl( statePtr,
5140: 20 42 49 4f 5f 43 4c 4f 53 45 29 3b 0a 20 20 20   BIO_CLOSE);.   
5150: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d   statePtr->bio =
5160: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73   BIO_new(BIO_f_s
5170: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28  sl());..    if (
5180: 73 65 72 76 65 72 29 20 7b 0a 09 73 74 61 74 65  server) {..state
5190: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c  Ptr->flags |= TL
51a0: 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53  S_TCL_SERVER;..S
51b0: 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74  SL_set_accept_st
51c0: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
51d0: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  l);.    } else {
51e0: 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63  ..SSL_set_connec
51f0: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72  t_state(statePtr
5200: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  ->ssl);.    }.  
5210: 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74    SSL_set_bio(st
5220: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 62 69 6f  atePtr->ssl, bio
5230: 2c 20 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f  , bio);.    BIO_
5240: 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72  set_ssl(statePtr
5250: 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d  ->bio, statePtr-
5260: 3e 73 73 6c 2c 20 42 49 4f 5f 43 4c 4f 53 45 29  >ssl, BIO_CLOSE)
5270: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
5280: 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74   End of SSL Init
5290: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  .     */.    Tcl
52a0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
52b0: 70 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  p, Tcl_GetChanne
52c0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
52d0: 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  self), TCL_VOLAT
52e0: 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ILE);.    return
52f0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
5300: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f  -----. *. * CTX_
5350: 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63  Init -- construc
5360: 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74  t a SSL_CTX inst
5370: 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ance. *. * Resul
5380: 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53  ts:. *.A valid S
5390: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20  SL_CTX instance 
53a0: 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53  or NULL.. *. * S
53b0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
53c0: 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63  constructs SSL c
53d0: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a  ontext (CTX). *.
53e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5420: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
5430: 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f  c SSL_CTX *.CTX_
5440: 49 6e 69 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  Init(interp, pro
5450: 74 6f 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 43  to, key, cert, C
5460: 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69  Adir, CAfile, ci
5470: 70 68 65 72 73 29 0a 20 20 20 20 54 63 6c 5f 49  phers).    Tcl_I
5480: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
5490: 20 20 20 69 6e 74 20 70 72 6f 74 6f 3b 0a 20 20     int proto;.  
54a0: 20 20 63 68 61 72 20 2a 6b 65 79 3b 0a 20 20 20    char *key;.   
54b0: 20 63 68 61 72 20 2a 63 65 72 74 3b 0a 20 20 20   char *cert;.   
54c0: 20 63 68 61 72 20 2a 43 41 64 69 72 3b 0a 20 20   char *CAdir;.  
54d0: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 3b 0a    char *CAfile;.
54e0: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72      char *cipher
54f0: 73 3b 0a 7b 0a 20 20 20 20 53 53 4c 5f 43 54 58  s;.{.    SSL_CTX
5500: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ctx = NULL;.  
5510: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73    Tcl_DString ds
5520: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
5530: 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f  g ds1;.    int o
5540: 66 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ff = 0;..    /* 
5550: 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65  create SSL conte
5560: 78 74 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  xt */.#if !defin
5570: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
5580: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
5590: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
55a0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
55b0: 4f 5f 53 53 4c 32 29 20 26 26 0a 09 45 4e 41 42  O_SSL2) &&..ENAB
55c0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
55d0: 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 63  ROTO_SSL3)) {..c
55e0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
55f0: 28 53 53 4c 76 32 33 5f 6d 65 74 68 6f 64 28 29  (SSLv23_method()
5600: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 0a 23 65  );.    } else.#e
5610: 6e 64 69 66 0a 20 20 20 20 69 66 20 28 45 4e 41  ndif.    if (ENA
5620: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
5630: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 23  PROTO_SSL2)) {.#
5640: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  if defined(NO_SS
5650: 4c 32 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  L2)..Tcl_AppendR
5660: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70  esult(interp, "p
5670: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
5680: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
5690: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20  return (SSL_CTX 
56a0: 2a 29 30 3b 0a 23 65 6c 73 65 0a 09 63 74 78 20  *)0;.#else..ctx 
56b0: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53  = SSL_CTX_new(SS
56c0: 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 23  Lv2_method());.#
56d0: 65 6e 64 69 66 0a 20 20 20 20 7d 20 65 6c 73 65  endif.    } else
56e0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
56f0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
5700: 53 31 29 29 20 7b 0a 09 63 74 78 20 3d 20 53 53  S1)) {..ctx = SS
5710: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f  L_CTX_new(TLSv1_
5720: 6d 65 74 68 6f 64 28 29 29 3b 0a 20 20 20 20 7d  method());.    }
5730: 20 65 6c 73 65 20 69 66 20 28 45 4e 41 42 4c 45   else if (ENABLE
5740: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
5750: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 23 69 66 20  TO_SSL3)) {.#if 
5760: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
5770: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
5780: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74  lt(interp, "prot
5790: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
57a0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
57b0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30  urn (SSL_CTX *)0
57c0: 3b 0a 23 65 6c 73 65 0a 09 63 74 78 20 3d 20 53  ;.#else..ctx = S
57d0: 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 33  SL_CTX_new(SSLv3
57e0: 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 23 65 6e 64  _method());.#end
57f0: 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  if.    } else {.
5800: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
5810: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61  t(interp, "no va
5820: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  lid protocol sel
5830: 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  ected", NULL);..
5840: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20  return (SSL_CTX 
5850: 2a 29 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  *)0;.    }.    o
5860: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
5870: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
5880: 54 4c 53 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f  TLS1) ? 0 : SSL_
5890: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 20 20  OP_NO_TLSv1);.  
58a0: 20 20 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45    off |= (ENABLE
58b0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
58c0: 54 4f 5f 53 53 4c 32 29 20 3f 20 30 20 3a 20 53  TO_SSL2) ? 0 : S
58d0: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b  SL_OP_NO_SSLv2);
58e0: 0a 20 20 20 20 6f 66 66 20 7c 3d 20 28 45 4e 41  .    off |= (ENA
58f0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
5900: 50 52 4f 54 4f 5f 53 53 4c 33 29 20 3f 20 30 20  PROTO_SSL3) ? 0 
5910: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76  : SSL_OP_NO_SSLv
5920: 33 29 3b 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58  3);..    SSL_CTX
5930: 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 20 63  _set_app_data( c
5940: 74 78 2c 20 28 56 4f 49 44 2a 29 69 6e 74 65 72  tx, (VOID*)inter
5950: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20  p);./* remember 
5960: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
5970: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
5980: 65 74 5f 6f 70 74 69 6f 6e 73 28 20 63 74 78 2c  et_options( ctx,
5990: 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a   SSL_OP_ALL);./*
59a0: 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72   all SSL bug wor
59b0: 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20  karounds */.    
59c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
59d0: 6f 6e 73 28 20 63 74 78 2c 20 6f 66 66 29 3b 09  ons( ctx, off);.
59e0: 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77  /* all SSL bug w
59f0: 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20  orkarounds */.  
5a00: 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73    SSL_CTX_sess_s
5a10: 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 20 63  et_cache_size( c
5a20: 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 69  tx, 128);..    i
5a30: 66 20 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55  f (ciphers != NU
5a40: 4c 4c 29 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  LL)..SSL_CTX_set
5a50: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78  _cipher_list(ctx
5a60: 2c 20 63 69 70 68 65 72 73 29 3b 0a 0a 20 20 20  , ciphers);..   
5a70: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c   /* set some cal
5a80: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53  lbacks */.    SS
5a90: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
5aa0: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c  t_passwd_cb(ctx,
5ab0: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63   PasswordCallbac
5ac0: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  k);.    SSL_CTX_
5ad0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73  set_default_pass
5ae0: 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63  wd_cb_userdata(c
5af0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74 65  tx, (void *)inte
5b00: 72 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 4f  rp);..#ifndef NO
5b10: 5f 44 48 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64  _DH.    {..DH* d
5b20: 68 20 3d 20 67 65 74 5f 64 68 35 31 32 28 29 3b  h = get_dh512();
5b30: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d  ..SSL_CTX_set_tm
5b40: 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09  p_dh(ctx, dh);..
5b50: 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 20 20  DH_free(dh);.   
5b60: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
5b70: 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 66  * set our certif
5b80: 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 69 66 20  icate */.    if 
5b90: 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b  (cert != NULL) {
5ba0: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69  ..Tcl_DStringIni
5bb0: 74 28 26 64 73 29 3b 0a 0a 20 20 20 20 20 20 20  t(&ds);..       
5bc0: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65   if (SSL_CTX_use
5bd0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c  _certificate_fil
5be0: 65 28 63 74 78 2c 20 46 32 4e 28 20 63 65 72 74  e(ctx, F2N( cert
5bf0: 2c 20 26 64 73 29 2c 0a 09 09 09 09 09 53 53 4c  , &ds),......SSL
5c00: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
5c10: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
5c20: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
5c30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63  ;.            Tc
5c40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
5c50: 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 20 20 20  nterp,.         
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c70: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 73      "unable to s
5c80: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66  et certificate f
5c90: 69 6c 65 20 22 2c 20 63 65 72 74 2c 20 22 3a 20  ile ", cert, ": 
5ca0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
5cd0: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  *) NULL);.      
5ce0: 20 20 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72        SSL_CTX_fr
5cf0: 65 65 28 63 74 78 29 3b 0a 20 20 20 20 20 20 20  ee(ctx);.       
5d00: 20 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c       return (SSL
5d10: 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 20 20  _CTX *)0;.      
5d20: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
5d30: 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 20  get the private 
5d40: 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
5d50: 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 69  ith this certifi
5d60: 63 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  cate */.        
5d70: 69 66 20 28 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29  if (key == NULL)
5d80: 20 6b 65 79 3d 63 65 72 74 3b 0a 0a 20 20 20 20   key=cert;..    
5d90: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f      if (SSL_CTX_
5da0: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66  use_PrivateKey_f
5db0: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 20 6b 65  ile(ctx, F2N( ke
5dc0: 79 2c 20 26 64 73 29 2c 0a 09 09 09 09 09 53 53  y, &ds),......SS
5dd0: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20  L_FILETYPE_PEM) 
5de0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c  <= 0) {..    Tcl
5df0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
5e00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
5e10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5e20: 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 20 20  interp,.        
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e40: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
5e50: 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66  set public key f
5e60: 69 6c 65 20 22 2c 20 6b 65 79 2c 20 22 20 22 2c  ile ", key, " ",
5e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 45                RE
5e90: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
5ea0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20   NULL);.        
5eb0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
5ec0: 28 63 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20  (ctx);.         
5ed0: 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43     return (SSL_C
5ee0: 54 58 20 2a 29 30 3b 0a 20 20 20 20 20 20 20 20  TX *)0;.        
5ef0: 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  }..Tcl_DStringFr
5f00: 65 65 28 26 64 73 29 3b 0a 20 20 20 20 20 20 20  ee(&ds);.       
5f10: 20 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20   /* Now we know 
5f20: 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63  that a key and c
5f30: 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65  ert have been se
5f40: 74 20 61 67 61 69 6e 73 74 0a 20 20 20 20 20 20  t against.      
5f50: 20 20 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e     * the SSL con
5f60: 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  text */.        
5f70: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65  if (!SSL_CTX_che
5f80: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63  ck_private_key(c
5f90: 74 78 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  tx)) {.         
5fa0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
5fb0: 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 20  ult(interp,.    
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fd0: 20 20 20 20 20 20 20 20 20 22 70 72 69 76 61 74           "privat
5fe0: 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  e key does not m
5ff0: 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69  atch the certifi
6000: 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22  cate public key"
6010: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6030: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  char *) NULL);. 
6040: 20 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43             SSL_C
6050: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 20 20  TX_free(ctx);.  
6060: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6070: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20   (SSL_CTX *)0;. 
6080: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65         }.    } e
6090: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 63 65  lse {.        ce
60a0: 72 74 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39  rt = (char*)X509
60b0: 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72  _get_default_cer
60c0: 74 5f 66 69 6c 65 28 29 3b 0a 0a 20 20 20 20 20  t_file();..     
60d0: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75     if (SSL_CTX_u
60e0: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66  se_certificate_f
60f0: 69 6c 65 28 63 74 78 2c 20 63 65 72 74 2c 0a 09  ile(ctx, cert,..
6100: 09 09 09 09 53 53 4c 5f 46 49 4c 45 54 59 50 45  ....SSL_FILETYPE
6110: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69  _PEM) <= 0) {.#i
6120: 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  f 0..    Tcl_DSt
6130: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20  ringFree(&ds);. 
6140: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41             Tcl_A
6150: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
6160: 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rp,.            
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6180: 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20   "unable to use 
6190: 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63  default certific
61a0: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74  ate file ", cert
61b0: 2c 20 22 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  , ": ",.        
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61d0: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28       REASON(), (
61e0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  char *) NULL);. 
61f0: 20 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43             SSL_C
6200: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 20 20  TX_free(ctx);.  
6210: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6220: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 23   (SSL_CTX *)0;.#
6230: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a  endif.        }.
6240: 20 20 20 20 7d 0a 09 0a 20 20 20 20 54 63 6c 5f      }...    Tcl_
6250: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
6260: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
6270: 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20  gInit(&ds1);.   
6280: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f   if (!SSL_CTX_lo
6290: 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69  ad_verify_locati
62a0: 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66  ons(ctx, F2N(CAf
62b0: 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43  ile, &ds), F2N(C
62c0: 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a  Adir, &ds1)) ||.
62d0: 20 20 20 20 20 20 20 20 21 53 53 4c 5f 43 54 58          !SSL_CTX
62e0: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72  _set_default_ver
62f0: 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20  ify_paths(ctx)) 
6300: 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74  {.#if 0..Tcl_DSt
6310: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
6320: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
6330: 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74  &ds1);../* Don't
6340: 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20   currently care 
6350: 69 66 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f  if this fails */
6360: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
6370: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20  lt(interp, "SSL 
6380: 64 65 66 61 75 6c 74 20 76 65 72 69 66 79 20 70  default verify p
6390: 61 74 68 73 3a 20 22 2c 0a 20 20 20 20 20 20 20  aths: ",.       
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63b0: 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20        REASON(), 
63c0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
63d0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
63e0: 78 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c  x);..return (SSL
63f0: 5f 43 54 58 20 2a 29 30 3b 0a 23 65 6e 64 69 66  _CTX *)0;.#endif
6400: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 43  .    }.    SSL_C
6410: 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41  TX_set_client_CA
6420: 5f 6c 69 73 74 28 63 74 78 2c 20 53 53 4c 5f 6c  _list(ctx, SSL_l
6430: 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69  oad_client_CA_fi
6440: 6c 65 28 20 46 32 4e 28 43 41 66 69 6c 65 2c 20  le( F2N(CAfile, 
6450: 26 64 73 29 20 29 29 3b 0a 0a 20 20 20 20 54 63  &ds) ));..    Tc
6460: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
6470: 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  s);.    Tcl_DStr
6480: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 20  ingFree(&ds1);. 
6490: 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d     return ctx;.}
64a0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
64f0: 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d  * StatusObjCmd -
6500: 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69  - return certifi
6510: 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74  cate for connect
6520: 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52  ed peer.. *. * R
6530: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
6540: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
6550: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
6560: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
6570: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
65c0: 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a  ic int.StatusObj
65d0: 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20  Cmd(clientData, 
65e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62  interp, objc, ob
65f0: 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61  jv).    ClientDa
6600: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f  ta clientData;./
6610: 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20  * Not used. */. 
6620: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
6630: 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f  nterp;.    int o
6640: 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  bjc;.    Tcl_Obj
6650: 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a  .*CONST objv[];.
6660: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
6670: 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20  tePtr;.    X509 
6680: 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f  *peer;.    Tcl_O
6690: 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20  bj *objPtr;.    
66a0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
66b0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e  ;.    char *chan
66c0: 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72  nelName, *cipher
66d0: 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b  s;.    int mode;
66e0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
66f0: 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 20 20 54  = 2) {.        T
6700: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
6710: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
6720: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 20 20 20   "channel");.   
6730: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6740: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6750: 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54   channelName = T
6760: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
6770: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c  Obj(objv[1], NUL
6780: 4c 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20  L);..    chan = 
6790: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 20  Tcl_GetChannel( 
67a0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e  interp, channelN
67b0: 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20  ame, &mode);.   
67c0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
67d0: 6c 5f 43 68 61 6e 6e 65 6c 29 30 29 20 7b 0a 09  l_Channel)0) {..
67e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
67f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
6800: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
6810: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
6820: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
6830: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
6840: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6850: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
6860: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
6870: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 20 20  elName(chan),.  
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
6890: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
68a0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20  nnel", NULL);.  
68b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
68c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
68d0: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
68e0: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61  ate *)Tcl_GetCha
68f0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
6900: 28 20 63 68 61 6e 29 3b 0a 20 20 20 20 70 65 65  ( chan);.    pee
6910: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  r = SSL_get_peer
6920: 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61  _certificate(sta
6930: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
6940: 20 69 66 20 28 70 65 65 72 29 0a 09 6f 62 6a 50   if (peer)..objP
6950: 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39  tr = Tls_NewX509
6960: 4f 62 6a 28 20 69 6e 74 65 72 70 2c 20 70 65 65  Obj( interp, pee
6970: 72 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 6f 62  r);.    else..ob
6980: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
6990: 73 74 4f 62 6a 28 20 30 2c 20 4e 55 4c 4c 29 3b  stObj( 0, NULL);
69a0: 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20  ..    ciphers = 
69b0: 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63  (char*)SSL_get_c
69c0: 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ipher(statePtr->
69d0: 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69  ssl);.    if (ci
69e0: 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 20 26 26  phers != NULL &&
69f0: 20 73 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c   strcmp(ciphers,
6a00: 20 22 28 4e 4f 4e 45 29 22 29 21 3d 30 29 20 7b   "(NONE)")!=0) {
6a10: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
6a20: 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e 74 65  endElement( inte
6a30: 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 54 63  rp, objPtr,...Tc
6a40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20  l_NewStringObj( 
6a50: 22 63 69 70 68 65 72 22 2c 20 2d 31 29 20 29 3b  "cipher", -1) );
6a60: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
6a70: 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e 74 65  endElement( inte
6a80: 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 54 63  rp, objPtr,...Tc
6a90: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20  l_NewStringObj( 
6aa0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73  SSL_get_cipher(s
6ab0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d  tatePtr->ssl), -
6ac0: 31 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1) );.    }.    
6ad0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
6ae0: 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  ( interp, objPtr
6af0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
6b00: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b50: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65  --. *. * Tls_Fre
6b60: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  e --. *. *.This 
6b70: 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
6b80: 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
6b90: 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
6ba0: 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
6bb0: 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
6bc0: 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
6bd0: 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73  elow 1. *. * Res
6be0: 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
6bf0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
6c00: 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
6c10: 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46  -. */.void.Tls_F
6c70: 72 65 65 28 20 63 68 61 72 20 2a 62 6c 6f 63 6b  ree( char *block
6c80: 50 74 72 20 29 0a 7b 0a 20 20 20 20 53 74 61 74  Ptr ).{.    Stat
6c90: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
6ca0: 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b  tate *)blockPtr;
6cb0: 0a 0a 20 20 20 20 2f 2a 20 77 65 27 72 65 20 61  ..    /* we're a
6cc0: 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61  ssuming here tha
6cd0: 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74  t we're single-t
6ce0: 68 72 65 61 64 65 64 20 2a 2f 0a 20 20 20 20 69  hreaded */.    i
6cf0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  f (statePtr->ssl
6d00: 29 20 7b 0a 09 53 53 4c 5f 73 68 75 74 64 6f 77  ) {..SSL_shutdow
6d10: 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  n(statePtr->ssl)
6d20: 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74  ;..SSL_free(stat
6d30: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
6d40: 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
6d50: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 0a 09 54  tr->callback)..T
6d60: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6d70: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
6d80: 63 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  ck);..    if (st
6d90: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d  atePtr->timer !=
6da0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
6db0: 29 4e 55 4c 4c 29 0a 09 54 63 6c 5f 44 65 6c 65  )NULL)..Tcl_Dele
6dc0: 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 20 28  teTimerHandler (
6dd0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
6de0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ;..    Tcl_Free(
6df0: 28 63 68 61 72 20 2a 29 73 74 61 74 65 50 74 72  (char *)statePtr
6e00: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6e50: 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d   *. * Tls_Init -
6e60: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20  -. *. *.This is 
6e70: 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61  a package initia
6e80: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75  lization procedu
6e90: 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c  re, which is cal
6ea0: 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68  led. *.by Tcl wh
6eb0: 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20  en this package 
6ec0: 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  is to be added t
6ed0: 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72  o an interpreter
6ee0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
6ef0: 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64    Ssl configured
6f00: 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20   and loaded. *. 
6f10: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
6f20: 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73   *. create the s
6f30: 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74  sl command, init
6f40: 69 61 6c 69 73 65 20 73 73 6c 20 63 6f 6e 74 65  ialise ssl conte
6f50: 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  xt. *. *--------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
6fa0: 0a 69 6e 74 0a 54 6c 73 5f 49 6e 69 74 28 54 63  .int.Tls_Init(Tc
6fb0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
6fc0: 29 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74 65  )../* Interprete
6fd0: 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 70  r in which the p
6fe0: 61 63 6b 61 67 65 20 69 73 0a 20 20 20 20 20 20  ackage is.      
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7010: 20 20 20 2a 20 74 6f 20 62 65 20 6d 61 64 65 20     * to be made 
7020: 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 7b 0a  available. */.{.
7030: 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  #if TCL_MAJOR_VE
7040: 52 53 49 4f 4e 20 3e 3d 20 38 20 26 26 20 54 43  RSION >= 8 && TC
7050: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MINOR_VERSION 
7060: 3e 3d 20 32 0a 20 20 20 20 69 66 20 28 21 54 63  >= 2.    if (!Tc
7070: 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65  l_InitStubs(inte
7080: 72 70 2c 20 54 43 4c 5f 56 45 52 53 49 4f 4e 2c  rp, TCL_VERSION,
7090: 20 30 29 29 20 7b 0a 20 20 20 20 20 20 20 20 72   0)) {.        r
70a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
70b0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
70c0: 20 20 53 53 4c 5f 6c 6f 61 64 5f 65 72 72 6f 72    SSL_load_error
70d0: 5f 73 74 72 69 6e 67 73 28 29 3b 0a 20 20 20 20  _strings();.    
70e0: 45 52 52 5f 6c 6f 61 64 5f 63 72 79 70 74 6f 5f  ERR_load_crypto_
70f0: 73 74 72 69 6e 67 73 28 29 3b 0a 20 20 20 20 53  strings();.    S
7100: 53 4c 5f 6c 69 62 72 61 72 79 5f 69 6e 69 74 28  SL_library_init(
7110: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  );..    Tcl_Crea
7120: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
7130: 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65  erp, "tls::ciphe
7140: 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43  rs", CiphersObjC
7150: 6d 64 20 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  md , (ClientData
7160: 29 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ) 0,.           
7170: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
7180: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
7190: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c   NULL);..    Tcl
71a0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
71b0: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
71c0: 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64  handshake", Hand
71d0: 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2c 20 28 43  shakeObjCmd , (C
71e0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 0a 20 20  lientData) 0,.  
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7200: 20 20 20 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65      (Tcl_CmdDele
7210: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
7220: 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
7230: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
7240: 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22  p, "tls::import"
7250: 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2c  , ImportObjCmd ,
7260: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
7270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7280: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 44         (Tcl_CmdD
7290: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
72a0: 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65  L);..    Tcl_Cre
72b0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
72c0: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74  terp, "tls::stat
72d0: 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d  us", StatusObjCm
72e0: 64 20 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  d , (ClientData)
72f0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
7300: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
7310: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
7320: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 72 65 74 75  NULL);..    retu
7330: 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  rn Tcl_PkgProvid
7340: 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47  e(interp, PACKAG
7350: 45 2c 20 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a  E, VERSION);.}..
7360: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
7370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
73a0: 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69  *. *.Tls_SafeIni
73b0: 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d  t --. *. *.-----
73c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09  -----------*. *.
73f0: 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75  Standard procedu
7400: 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 27  re required by '
7410: 6c 6f 61 64 27 2e 20 0a 20 2a 09 49 6e 69 74 69  load'. . *.Initi
7420: 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 65  alizes this exte
7430: 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65  nsion for a safe
7440: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a   interpreter.. *
7450: 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
7460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7480: 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 65 66 66  -*. *. *.Sideeff
7490: 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20  ects:. *..As of 
74a0: 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a  'Tls_Init'. *. *
74b0: 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73  .Result:. *..A s
74c0: 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f  tandard Tcl erro
74d0: 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  r code.. *. *---
74e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7510: 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6c  ---*. */..int.Tl
7520: 73 5f 53 61 66 65 49 6e 69 74 20 28 54 63 6c 5f  s_SafeInit (Tcl_
7530: 49 6e 74 65 72 70 2a 20 69 6e 74 65 72 70 29 0a  Interp* interp).
7540: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73  {.    return Tls
7550: 5f 49 6e 69 74 20 28 69 6e 74 65 72 70 29 3b 0a  _Init (interp);.
7560: 7d 0a                                            }.