Hex Artifact Content

Artifact ad0e17ca784360fcec8422580d5ea035e9658e45:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 20  tarfish Systems 
00d0: 0a 20 2a 0a 20 2a 20 24 48 65 61 64 65 72 3a 20  . *. * $Header: 
00e0: 2f 68 6f 6d 65 2f 72 6b 65 65 6e 65 2f 74 6d 70  /home/rkeene/tmp
00f0: 2f 63 76 73 32 66 6f 73 73 69 6c 2f 2e 2e 2f 74  /cvs2fossil/../t
0100: 63 6c 74 6c 73 2f 74 6c 73 2f 74 6c 73 2f 74 6c  cltls/tls/tls/tl
0110: 73 2e 63 2c 76 20 31 2e 32 38 20 32 30 30 38 2f  s.c,v 1.28 2008/
0120: 30 33 2f 31 39 20 31 39 3a 35 39 3a 34 30 20 68  03/19 19:59:40 h
0130: 6f 62 62 73 32 20 45 78 70 20 24 0a 20 2a 0a 20  obbs2 Exp $. *. 
0140: 2a 20 54 4c 53 20 28 61 6b 61 20 53 53 4c 29 20  * TLS (aka SSL) 
0150: 43 68 61 6e 6e 65 6c 20 2d 20 63 61 6e 20 62 65  Channel - can be
0160: 20 6c 61 79 65 72 65 64 20 6f 6e 20 61 6e 79 20   layered on any 
0170: 62 69 2d 64 69 72 65 63 74 69 6f 6e 61 6c 0a 20  bi-directional. 
0180: 2a 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 28 4e  * Tcl_Channel (N
0190: 6f 74 65 3a 20 52 65 71 75 69 72 65 73 20 54 72  ote: Requires Tr
01a0: 66 20 43 6f 72 65 20 50 61 74 63 68 29 0a 20 2a  f Core Patch). *
01b0: 0a 20 2a 20 54 68 69 73 20 77 61 73 20 62 75 69  . * This was bui
01c0: 6c 74 20 28 61 6c 6d 6f 73 74 29 20 66 72 6f 6d  lt (almost) from
01d0: 20 73 63 72 61 74 63 68 20 62 61 73 65 64 20 75   scratch based u
01e0: 70 6f 6e 20 6f 62 73 65 72 76 61 74 69 6f 6e 20  pon observation 
01f0: 6f 66 0a 20 2a 20 4f 70 65 6e 53 53 4c 20 30 2e  of. * OpenSSL 0.
0200: 39 2e 32 42 0a 20 2a 0a 20 2a 20 41 64 64 69 74  9.2B. *. * Addit
0210: 69 6f 6e 20 63 72 65 64 69 74 20 69 73 20 64 75  ion credit is du
0220: 65 20 66 6f 72 20 41 6e 64 72 65 61 73 20 4b 75  e for Andreas Ku
0230: 70 72 69 65 73 20 28 61 2e 6b 75 70 72 69 65 73  pries (a.kupries
0240: 40 77 65 73 74 65 6e 64 2e 63 6f 6d 29 2c 20 66  @westend.com), f
0250: 6f 72 0a 20 2a 20 70 72 6f 76 69 64 69 6e 67 20  or. * providing 
0260: 74 68 65 20 54 63 6c 5f 52 65 70 6c 61 63 65 43  the Tcl_ReplaceC
0270: 68 61 6e 6e 65 6c 20 6d 65 63 68 61 6e 69 73 6d  hannel mechanism
0280: 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 63 6c 6f   and working clo
0290: 73 65 6c 79 20 77 69 74 68 20 6d 65 0a 20 2a 20  sely with me. * 
02a0: 74 6f 20 65 6e 68 61 6e 63 65 20 69 74 20 74 6f  to enhance it to
02b0: 20 73 75 70 70 6f 72 74 20 66 75 6c 6c 20 66 69   support full fi
02c0: 6c 65 65 76 65 6e 74 20 73 65 6d 61 6e 74 69 63  leevent semantic
02d0: 73 2e 0a 20 2a 0a 20 2a 20 41 6c 73 6f 20 77 6f  s.. *. * Also wo
02e0: 72 6b 20 64 6f 6e 65 20 62 79 20 74 68 65 20 66  rk done by the f
02f0: 6f 6c 6c 6f 77 20 70 65 6f 70 6c 65 20 70 72 6f  ollow people pro
0300: 76 69 64 65 64 20 74 68 65 20 69 6d 70 65 74 75  vided the impetu
0310: 73 20 74 6f 20 64 6f 20 74 68 69 73 20 22 72 69  s to do this "ri
0320: 67 68 74 22 3a 0a 20 2a 09 74 63 6c 53 53 4c 20  ght":. *.tclSSL 
0330: 28 43 6f 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 6b  (Colin McCormack
0340: 2c 20 53 68 61 72 65 64 20 54 65 63 68 6e 6f 6c  , Shared Technol
0350: 6f 67 79 29 0a 20 2a 09 53 53 4c 74 63 6c 20 28  ogy). *.SSLtcl (
0360: 50 65 74 65 72 20 41 6e 74 6d 61 6e 29 0a 20 2a  Peter Antman). *
0370: 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22  . */..#include "
0380: 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  tlsInt.h".#inclu
0390: 64 65 20 22 74 63 6c 4f 70 74 73 2e 68 22 0a 23  de "tclOpts.h".#
03a0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
03b0: 68 3e 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72 6e  h>../*. * Extern
03c0: 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a 2f  al functions. */
03d0: 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20  ../*. * Forward 
03e0: 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f  declarations. */
03f0: 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 20 6b  ..#define F2N( k
0400: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0410: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
0420: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
0430: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
0440: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
0450: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
0460: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29  #define REASON()
0470: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f  .ERR_reason_erro
0480: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74  r_string(ERR_get
0490: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69  _error())..stati
04a0: 63 20 76 6f 69 64 09 49 6e 66 6f 43 61 6c 6c 62  c void.InfoCallb
04b0: 61 63 6b 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20  ack _ANSI_ARGS_ 
04c0: 28 28 43 4f 4e 53 54 20 53 53 4c 20 2a 73 73 6c  ((CONST SSL *ssl
04d0: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74  , int where, int
04e0: 20 72 65 74 29 29 3b 0a 0a 73 74 61 74 69 63 20   ret));..static 
04f0: 69 6e 74 09 43 69 70 68 65 72 73 4f 62 6a 43 6d  int.CiphersObjCm
0500: 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28  d _ANSI_ARGS_ ((
0510: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
0520: 74 44 61 74 61 2c 0a 09 09 09 54 63 6c 5f 49 6e  tData,....Tcl_In
0530: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
0540: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
0550: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 29 3b  *CONST objv[]));
0560: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 48 61 6e  ..static int.Han
0570: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 5f 41 4e  dshakeObjCmd _AN
0580: 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e  SI_ARGS_ ((Clien
0590: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
05a0: 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 20  ,....Tcl_Interp 
05b0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
05c0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  c, Tcl_Obj *CONS
05d0: 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 61  T objv[]));..sta
05e0: 74 69 63 20 69 6e 74 09 49 6d 70 6f 72 74 4f 62  tic int.ImportOb
05f0: 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f  jCmd _ANSI_ARGS_
0600: 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c   ((ClientData cl
0610: 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 63 6c  ientData,....Tcl
0620: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0630: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
0640: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
0650: 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09  ));..static int.
0660: 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 5f 41 4e  StatusObjCmd _AN
0670: 53 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e  SI_ARGS_ ((Clien
0680: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
0690: 2c 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 20  ,....Tcl_Interp 
06a0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
06b0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  c, Tcl_Obj *CONS
06c0: 54 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 61  T objv[]));..sta
06d0: 74 69 63 20 69 6e 74 09 56 65 72 73 69 6f 6e 4f  tic int.VersionO
06e0: 62 6a 43 6d 64 20 5f 41 4e 53 49 5f 41 52 47 53  bjCmd _ANSI_ARGS
06f0: 5f 20 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63  _ ((ClientData c
0700: 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 54 63  lientData,....Tc
0710: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0720: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
0730: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
0740: 5d 29 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  ]));..static int
0750: 09 4d 69 73 63 4f 62 6a 43 6d 64 20 5f 41 4e 53  .MiscObjCmd _ANS
0760: 49 5f 41 52 47 53 5f 20 28 28 43 6c 69 65 6e 74  I_ARGS_ ((Client
0770: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
0780: 0a 09 09 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ....Tcl_Interp *
0790: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
07a0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54  , Tcl_Obj *CONST
07b0: 20 6f 62 6a 76 5b 5d 29 29 3b 0a 0a 73 74 61 74   objv[]));..stat
07c0: 69 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f  ic SSL_CTX *CTX_
07d0: 49 6e 69 74 20 5f 41 4e 53 49 5f 41 52 47 53 5f  Init _ANSI_ARGS_
07e0: 28 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  ((State *statePt
07f0: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
0800: 61 72 20 2a 6b 65 79 2c 0a 09 09 09 63 68 61 72  ar *key,....char
0810: 20 2a 63 65 72 74 2c 20 63 68 61 72 20 2a 43 41   *cert, char *CA
0820: 64 69 72 2c 20 63 68 61 72 20 2a 43 41 66 69 6c  dir, char *CAfil
0830: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73  e, char *ciphers
0840: 29 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53  ));..#define TLS
0850: 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 30 78 30 31  _PROTO_SSL2.0x01
0860: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
0870: 54 4f 5f 53 53 4c 33 09 30 78 30 32 0a 23 64 65  TO_SSL3.0x02.#de
0880: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  fine TLS_PROTO_T
0890: 4c 53 31 09 30 78 30 34 0a 23 64 65 66 69 6e 65  LS1.0x04.#define
08a0: 20 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d   ENABLED(flag, m
08b0: 61 73 6b 29 09 28 28 28 66 6c 61 67 29 20 26 20  ask).(((flag) & 
08c0: 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b  (mask)) == (mask
08d0: 29 29 0a 0a 2f 2a 0a 20 2a 20 53 74 61 74 69 63  ))../*. * Static
08e0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
08f0: 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 4f  . */..#ifndef NO
0900: 5f 44 48 0a 2f 2a 20 66 72 6f 6d 20 6f 70 65 6e  _DH./* from open
0910: 73 73 6c 2f 61 70 70 73 2f 73 5f 73 65 72 76 65  ssl/apps/s_serve
0920: 72 2e 63 20 2a 2f 0a 0a 73 74 61 74 69 63 20 75  r.c */..static u
0930: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 68 35  nsigned char dh5
0940: 31 32 5f 70 5b 5d 3d 7b 0a 09 30 78 44 41 2c 30  12_p[]={..0xDA,0
0950: 78 35 38 2c 30 78 33 43 2c 30 78 31 36 2c 30 78  x58,0x3C,0x16,0x
0960: 44 39 2c 30 78 38 35 2c 30 78 32 32 2c 30 78 38  D9,0x85,0x22,0x8
0970: 39 2c 30 78 44 30 2c 30 78 45 34 2c 30 78 41 46  9,0xD0,0xE4,0xAF
0980: 2c 30 78 37 35 2c 0a 09 30 78 36 46 2c 30 78 34  ,0x75,..0x6F,0x4
0990: 43 2c 30 78 43 41 2c 30 78 39 32 2c 30 78 44 44  C,0xCA,0x92,0xDD
09a0: 2c 30 78 34 42 2c 30 78 45 35 2c 30 78 33 33 2c  ,0x4B,0xE5,0x33,
09b0: 30 78 42 38 2c 30 78 30 34 2c 30 78 46 42 2c 30  0xB8,0x04,0xFB,0
09c0: 78 30 46 2c 0a 09 30 78 45 44 2c 30 78 39 34 2c  x0F,..0xED,0x94,
09d0: 30 78 45 46 2c 30 78 39 43 2c 30 78 38 41 2c 30  0xEF,0x9C,0x8A,0
09e0: 78 34 34 2c 30 78 30 33 2c 30 78 45 44 2c 30 78  x44,0x03,0xED,0x
09f0: 35 37 2c 30 78 34 36 2c 30 78 35 30 2c 30 78 44  57,0x46,0x50,0xD
0a00: 33 2c 0a 09 30 78 36 39 2c 30 78 39 39 2c 30 78  3,..0x69,0x99,0x
0a10: 44 42 2c 30 78 32 39 2c 30 78 44 37 2c 30 78 37  DB,0x29,0xD7,0x7
0a20: 36 2c 30 78 32 37 2c 30 78 36 42 2c 30 78 41 32  6,0x27,0x6B,0xA2
0a30: 2c 30 78 44 33 2c 30 78 44 34 2c 30 78 31 32 2c  ,0xD3,0xD4,0x12,
0a40: 0a 09 30 78 45 32 2c 30 78 31 38 2c 30 78 46 34  ..0xE2,0x18,0xF4
0a50: 2c 30 78 44 44 2c 30 78 31 45 2c 30 78 30 38 2c  ,0xDD,0x1E,0x08,
0a60: 30 78 34 43 2c 30 78 46 36 2c 30 78 44 38 2c 30  0x4C,0xF6,0xD8,0
0a70: 78 30 30 2c 30 78 33 45 2c 30 78 37 43 2c 0a 09  x00,0x3E,0x7C,..
0a80: 30 78 34 37 2c 30 78 37 34 2c 30 78 45 38 2c 30  0x47,0x74,0xE8,0
0a90: 78 33 33 2c 0a 09 7d 3b 0a 73 74 61 74 69 63 20  x33,..};.static 
0aa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 68  unsigned char dh
0ab0: 35 31 32 5f 67 5b 5d 3d 7b 0a 09 30 78 30 32 2c  512_g[]={..0x02,
0ac0: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 44 48 20 2a  .};..static DH *
0ad0: 67 65 74 5f 64 68 35 31 32 28 29 0a 7b 0a 20 20  get_dh512().{.  
0ae0: 20 20 44 48 20 2a 64 68 3d 4e 55 4c 4c 3b 0a 0a    DH *dh=NULL;..
0af0: 20 20 20 20 69 66 20 28 28 64 68 3d 44 48 5f 6e      if ((dh=DH_n
0b00: 65 77 28 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 72  ew()) == NULL) r
0b10: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 20 20  eturn(NULL);..  
0b20: 20 20 64 68 2d 3e 70 3d 42 4e 5f 62 69 6e 32 62    dh->p=BN_bin2b
0b30: 6e 28 64 68 35 31 32 5f 70 2c 73 69 7a 65 6f 66  n(dh512_p,sizeof
0b40: 28 64 68 35 31 32 5f 70 29 2c 4e 55 4c 4c 29 3b  (dh512_p),NULL);
0b50: 0a 20 20 20 20 64 68 2d 3e 67 3d 42 4e 5f 62 69  .    dh->g=BN_bi
0b60: 6e 32 62 6e 28 64 68 35 31 32 5f 67 2c 73 69 7a  n2bn(dh512_g,siz
0b70: 65 6f 66 28 64 68 35 31 32 5f 67 29 2c 4e 55 4c  eof(dh512_g),NUL
0b80: 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 64 68  L);..    if ((dh
0b90: 2d 3e 70 20 3d 3d 20 4e 55 4c 4c 29 20 7c 7c 20  ->p == NULL) || 
0ba0: 28 64 68 2d 3e 67 20 3d 3d 20 4e 55 4c 4c 29 29  (dh->g == NULL))
0bb0: 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
0bc0: 20 20 20 20 72 65 74 75 72 6e 28 64 68 29 3b 0a      return(dh);.
0bd0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  }.#endif../*. * 
0be0: 44 65 66 69 6e 65 64 20 69 6e 20 54 6c 73 5f 49  Defined in Tls_I
0bf0: 6e 69 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  nit to determine
0c00: 20 77 68 61 74 20 6b 69 6e 64 20 6f 66 20 63 68   what kind of ch
0c10: 61 6e 6e 65 6c 73 20 77 65 20 61 72 65 20 75 73  annels we are us
0c20: 69 6e 67 0a 20 2a 20 28 6f 6c 64 2d 73 74 79 6c  ing. * (old-styl
0c30: 65 20 38 2e 32 2e 30 2d 38 2e 33 2e 31 20 6f 72  e 8.2.0-8.3.1 or
0c40: 20 6e 65 77 2d 73 74 79 6c 65 20 38 2e 33 2e 32   new-style 8.3.2
0c50: 2b 29 2e 0a 20 2a 2f 0a 69 6e 74 20 63 68 61 6e  +).. */.int chan
0c60: 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e 3b 0a  nelTypeVersion;.
0c70: 0a 2f 2a 0a 20 2a 20 57 65 20 6c 6f 73 65 20 74  ./*. * We lose t
0c80: 68 65 20 74 63 6c 20 70 61 73 73 77 6f 72 64 20  he tcl password 
0c90: 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 77 65  callback when we
0ca0: 20 75 73 65 20 74 68 65 20 52 53 41 20 42 53 41   use the RSA BSA
0cb0: 46 45 20 53 53 4c 2d 43 20 31 2e 31 2e 32 0a 20  FE SSL-C 1.1.2. 
0cc0: 2a 20 6c 69 62 72 61 72 69 65 73 20 69 6e 73 74  * libraries inst
0cd0: 65 61 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ead of the curre
0ce0: 6e 74 20 4f 70 65 6e 53 53 4c 20 6c 69 62 72 61  nt OpenSSL libra
0cf0: 72 69 65 73 2e 0a 20 2a 2f 0a 0a 23 69 66 64 65  ries.. */..#ifde
0d00: 66 20 42 53 41 46 45 0a 23 64 65 66 69 6e 65 20  f BSAFE.#define 
0d10: 50 52 45 5f 4f 50 45 4e 53 53 4c 5f 30 5f 39 5f  PRE_OPENSSL_0_9_
0d20: 34 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  4 1.#endif../*. 
0d30: 2a 20 50 72 65 20 4f 70 65 6e 53 53 4c 20 30 2e  * Pre OpenSSL 0.
0d40: 39 2e 34 20 43 6f 6d 70 61 74 0a 20 2a 2f 0a 0a  9.4 Compat. */..
0d50: 23 69 66 6e 64 65 66 20 53 54 41 43 4b 5f 4f 46  #ifndef STACK_OF
0d60: 0a 23 64 65 66 69 6e 65 20 53 54 41 43 4b 5f 4f  .#define STACK_O
0d70: 46 28 78 29 09 09 09 53 54 41 43 4b 0a 23 64 65  F(x)...STACK.#de
0d80: 66 69 6e 65 20 73 6b 5f 53 53 4c 5f 43 49 50 48  fine sk_SSL_CIPH
0d90: 45 52 5f 6e 75 6d 28 73 6b 29 09 09 73 6b 5f 6e  ER_num(sk)..sk_n
0da0: 75 6d 28 28 73 6b 29 29 0a 23 64 65 66 69 6e 65  um((sk)).#define
0db0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76   sk_SSL_CIPHER_v
0dc0: 61 6c 75 65 28 20 73 6b 2c 20 69 6e 64 65 78 29  alue( sk, index)
0dd0: 09 28 53 53 4c 5f 43 49 50 48 45 52 2a 29 73 6b  .(SSL_CIPHER*)sk
0de0: 5f 76 61 6c 75 65 28 28 73 6b 29 2c 20 28 69 6e  _value((sk), (in
0df0: 64 65 78 29 29 0a 23 65 6e 64 69 66 0a 0a 0c 0a  dex)).#endif....
0e00: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49  --------. *. * I
0e50: 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  nfoCallback --. 
0e60: 2a 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53  *. *.monitors SS
0e70: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f  L connection pro
0e80: 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cess. *. * Resul
0e90: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
0ea0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0eb0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
0ec0: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
0ed0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f10: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
0f20: 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63  void.InfoCallbac
0f30: 6b 28 43 4f 4e 53 54 20 53 53 4c 20 2a 73 73 6c  k(CONST SSL *ssl
0f40: 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74  , int where, int
0f50: 20 72 65 74 29 0a 7b 0a 20 20 20 20 53 74 61 74   ret).{.    Stat
0f60: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
0f70: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70  tate*)SSL_get_ap
0f80: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73  p_data((SSL *)ss
0f90: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  l);.    Tcl_Obj 
0fa0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61  *cmdPtr;.    cha
0fb0: 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 20 2a  r *major; char *
0fc0: 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 69 66 20 28  minor;..    if (
0fd0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
0fe0: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  ck == (Tcl_Obj*)
0ff0: 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a  NULL)..return;..
1000: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
1010: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
1020: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
1030: 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66  );..#if 0.    if
1040: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1050: 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65 76 20 3d  _ALERT) {..sev =
1060: 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f   SSL_alert_type_
1070: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29  string_long(ret)
1080: 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 28 20 73  ;..if (strcmp( s
1090: 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d 30 29  ev, "fatal")==0)
10a0: 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 72 72   {./* Map to err
10b0: 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 5f 45  or */..    Tls_E
10c0: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 53  rror(statePtr, S
10d0: 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 30 29  SL_ERROR(ssl, 0)
10e0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 3b 0a  );..    return;.
10f0: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .}.    }.#endif.
1100: 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20      if (where & 
1110: 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45  SSL_CB_HANDSHAKE
1120: 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72  _START) {..major
1130: 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a   = "handshake";.
1140: 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22  .minor = "start"
1150: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
1160: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1170: 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20  HANDSHAKE_DONE) 
1180: 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64  {..major = "hand
1190: 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d  shake";..minor =
11a0: 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65   "done";.    } e
11b0: 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65  lse {..if (where
11c0: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29   & SSL_CB_ALERT)
11d0: 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74  ..major = "alert
11e0: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
11f0: 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e  re & SSL_ST_CONN
1200: 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f  ECT).major = "co
1210: 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66  nnect";..else if
1220: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54   (where & SSL_ST
1230: 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20  _ACCEPT)..major 
1240: 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73  = "accept";..els
1250: 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75  e.....major = "u
1260: 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77  nknown";...if (w
1270: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45  here & SSL_CB_RE
1280: 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65  AD)..minor = "re
1290: 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  ad";..else if (w
12a0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52  here & SSL_CB_WR
12b0: 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77  ITE)..minor = "w
12c0: 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20  rite";..else if 
12d0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
12e0: 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22  LOOP)..minor = "
12f0: 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20  loop";..else if 
1300: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1310: 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22  EXIT)..minor = "
1320: 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09  exit";..else....
1330: 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77  .minor = "unknow
1340: 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  n";.    }..    T
1350: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1360: 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74  Element( statePt
1370: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  r->interp, cmdPt
1380: 72 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  r, ..    Tcl_New
1390: 53 74 72 69 6e 67 4f 62 6a 28 20 22 69 6e 66 6f  StringObj( "info
13a0: 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63  ", -1));..    Tc
13b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
13c0: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72  lement( statePtr
13d0: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
13e0: 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  , ..    Tcl_NewS
13f0: 74 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65  tringObj( Tcl_Ge
1400: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
1410: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
1420: 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69  ) );..    Tcl_Li
1430: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1440: 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  nt( statePtr->in
1450: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1460: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1470: 4f 62 6a 28 20 6d 61 6a 6f 72 2c 20 2d 31 29 20  Obj( major, -1) 
1480: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
1490: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
14a0: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ( statePtr->inte
14b0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
14c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14d0: 6a 28 20 6d 69 6e 6f 72 2c 20 2d 31 29 20 29 3b  j( minor, -1) );
14e0: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20  ..    if (where 
14f0: 26 20 28 53 53 4c 5f 43 42 5f 4c 4f 4f 50 7c 53  & (SSL_CB_LOOP|S
1500: 53 4c 5f 43 42 5f 45 58 49 54 29 29 20 7b 0a 09  SL_CB_EXIT)) {..
1510: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1520: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50  dElement( stateP
1530: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
1540: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
1550: 53 74 72 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 73  StringObj( SSL_s
1560: 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67  tate_string_long
1570: 28 73 73 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20  (ssl), -1) );.  
1580: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65    } else if (whe
1590: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
15a0: 54 29 20 7b 0a 09 43 4f 4e 53 54 20 63 68 61 72  T) {..CONST char
15b0: 20 2a 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20   *cp = (char *) 
15c0: 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73  SSL_alert_desc_s
15d0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b  tring_long(ret);
15e0: 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
15f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61  pendElement( sta
1600: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63  tePtr->interp, c
1610: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
1620: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 63 70  NewStringObj( cp
1630: 2c 20 2d 31 29 20 29 3b 0a 20 20 20 20 7d 20 65  , -1) );.    } e
1640: 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f  lse {..Tcl_ListO
1650: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1660: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
1670: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1680: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1690: 28 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69  ( SSL_state_stri
16a0: 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31  ng_long(ssl), -1
16b0: 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ) );.    }.    T
16c0: 63 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c  cl_Preserve( (Cl
16d0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
16e0: 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20  tr->interp);.   
16f0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 20 28   Tcl_Preserve( (
1700: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
1710: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ePtr);..    Tcl_
1720: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d  IncrRefCount( cm
1730: 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f 69 64  dPtr);.    (void
1740: 29 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c  ) Tcl_GlobalEval
1750: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 69 6e  Obj(statePtr->in
1760: 74 65 72 70 2c 20 63 6d 64 50 74 72 29 3b 0a 20  terp, cmdPtr);. 
1770: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
1780: 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a 20  unt( cmdPtr);.. 
1790: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 20     Tcl_Release( 
17a0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
17b0: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  tePtr);.    Tcl_
17c0: 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74  Release( (Client
17d0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e  Data) statePtr->
17e0: 69 6e 74 65 72 70 29 3b 0a 0a 7d 0a 0c 0a 2f 2a  interp);..}.../*
17f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72  ------. *. * Ver
1840: 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  ifyCallback --. 
1850: 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53  *. *.Monitors SS
1860: 4c 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61  L certificate va
1870: 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lidation process
1880: 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 63 61 6c  .. *.This is cal
1890: 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 63  led whenever a c
18a0: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 6e  ertificate is in
18b0: 73 70 65 63 74 65 64 0a 20 2a 09 6f 72 20 64 65  spected. *.or de
18c0: 63 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 0a 20  cided invalid.. 
18d0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
18e0: 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e  .A callback boun
18f0: 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20  d to the socket 
1900: 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f  may return one o
1910: 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20  f:. *.    0...- 
1920: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
1930: 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69  is deemed invali
1940: 64 0a 20 2a 09 20 20 20 20 31 09 09 09 2d 20 74  d. *.    1...- t
1950: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69  he certificate i
1960: 73 20 64 65 65 6d 65 64 20 76 61 6c 69 64 0a 20  s deemed valid. 
1970: 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74 72 69  *.    empty stri
1980: 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74  ng.- no change t
1990: 6f 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61  o certificate va
19a0: 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53  lidation. *. * S
19b0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
19c0: 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66  The err field of
19d0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   the currently o
19e0: 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69  perative State i
19f0: 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20  s set. *.  to a 
1a00: 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e  string describin
1a10: 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69  g the SSL negoti
1a20: 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65  ation failure re
1a30: 61 73 6f 6e 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ason. *---------
1a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
1a80: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79  tatic int.Verify
1a90: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c  Callback(int ok,
1aa0: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20   X509_STORE_CTX 
1ab0: 2a 63 74 78 29 0a 7b 0a 20 20 20 20 54 63 6c 5f  *ctx).{.    Tcl_
1ac0: 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 72 65  Obj *cmdPtr, *re
1ad0: 73 75 6c 74 3b 0a 20 20 20 20 63 68 61 72 20 2a  sult;.    char *
1ae0: 65 72 72 53 74 72 2c 20 2a 73 74 72 69 6e 67 3b  errStr, *string;
1af0: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 3b  .    int length;
1b00: 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09  .    SSL   *ssl.
1b10: 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54  .= (SSL*)X509_ST
1b20: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 61 70 70 5f  ORE_CTX_get_app_
1b30: 64 61 74 61 28 63 74 78 29 3b 0a 20 20 20 20 58  data(ctx);.    X
1b40: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35  509  *cert..= X5
1b50: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
1b60: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74  _current_cert(ct
1b70: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  x);.    State *s
1b80: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65  tatePtr.= (State
1b90: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61  *)SSL_get_app_da
1ba0: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 69 6e 74  ta(ssl);.    int
1bb0: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53   depth..= X509_S
1bc0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
1bd0: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20  or_depth(ctx);. 
1be0: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35     int err..= X5
1bf0: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
1c00: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20  _error(ctx);..  
1c10: 20 20 64 70 72 69 6e 74 66 28 73 74 64 65 72 72    dprintf(stderr
1c20: 2c 20 22 56 65 72 69 66 79 3a 20 25 64 5c 6e 22  , "Verify: %d\n"
1c30: 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28  , ok);..    if (
1c40: 21 6f 6b 29 20 7b 0a 09 65 72 72 53 74 72 20 3d  !ok) {..errStr =
1c50: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72   (char*)X509_ver
1c60: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
1c70: 74 72 69 6e 67 28 65 72 72 29 3b 0a 20 20 20 20  tring(err);.    
1c80: 7d 20 65 6c 73 65 20 7b 0a 09 65 72 72 53 74 72  } else {..errStr
1c90: 20 3d 20 28 63 68 61 72 20 2a 29 30 3b 0a 20 20   = (char *)0;.  
1ca0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
1cb0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
1cc0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
1cd0: 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65 50  L) {..if (stateP
1ce0: 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c  tr->vflags & SSL
1cf0: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f  _VERIFY_FAIL_IF_
1d00: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a  NO_PEER_CERT) {.
1d10: 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a  .    return ok;.
1d20: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72  .} else {..    r
1d30: 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20  eturn 1;..}.    
1d40: 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  }.    cmdPtr = T
1d50: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
1d60: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
1d70: 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69  ck);..    Tcl_Li
1d80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1d90: 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  nt( statePtr->in
1da0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a 09  terp, cmdPtr, ..
1db0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
1dc0: 67 4f 62 6a 28 20 22 76 65 72 69 66 79 22 2c 20  gObj( "verify", 
1dd0: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c  -1));..    Tcl_L
1de0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1df0: 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69  ent( statePtr->i
1e00: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 0a  nterp, cmdPtr, .
1e10: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
1e20: 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43 68  ngObj( Tcl_GetCh
1e30: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
1e40: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20 29  tr->self), -1) )
1e50: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
1e60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1e70: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
1e80: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1e90: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 20 64  Tcl_NewIntObj( d
1ea0: 65 70 74 68 29 20 29 3b 0a 0a 20 20 20 20 54 63  epth) );..    Tc
1eb0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1ec0: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72  lement( statePtr
1ed0: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
1ee0: 2c 0a 09 20 20 20 20 54 6c 73 5f 4e 65 77 58 35  ,..    Tls_NewX5
1ef0: 30 39 4f 62 6a 28 20 73 74 61 74 65 50 74 72 2d  09Obj( statePtr-
1f00: 3e 69 6e 74 65 72 70 2c 20 63 65 72 74 29 20 29  >interp, cert) )
1f10: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
1f20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1f30: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
1f40: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1f50: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 20 6f  Tcl_NewIntObj( o
1f60: 6b 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c  k) );..    Tcl_L
1f70: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1f80: 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69  ent( statePtr->i
1f90: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
1fa0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
1fb0: 67 4f 62 6a 28 20 65 72 72 53 74 72 20 3f 20 65  gObj( errStr ? e
1fc0: 72 72 53 74 72 20 3a 20 22 22 2c 20 2d 31 29 20  rrStr : "", -1) 
1fd0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
1fe0: 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61 74  erve( (ClientDat
1ff0: 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  a) statePtr->int
2000: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72  erp);.    Tcl_Pr
2010: 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44  eserve( (ClientD
2020: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
2030: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66  .    statePtr->f
2040: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f  lags |= TLS_TCL_
2050: 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20 20 20 54  CALLBACK;..    T
2060: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
2070: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66   cmdPtr);.    if
2080: 20 28 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c   (Tcl_GlobalEval
2090: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 69 6e  Obj(statePtr->in
20a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 29 20 21 3d  terp, cmdPtr) !=
20b0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 49   TCL_OK) {../* I
20c0: 74 20 67 6f 74 20 61 6e 20 65 72 72 6f 72 20 2d  t got an error -
20d0: 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74   reject the cert
20e0: 69 66 69 63 61 74 65 2e 09 09 2a 2f 0a 09 54 63  ificate...*/..Tc
20f0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
2100: 72 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  r( statePtr->int
2110: 65 72 70 29 3b 0a 09 6f 6b 20 3d 20 30 3b 0a 20  erp);..ok = 0;. 
2120: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
2130: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
2140: 52 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  Result(statePtr-
2150: 3e 69 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e  >interp);..strin
2160: 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
2170: 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c  gFromObj(result,
2180: 20 26 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41   &length);../* A
2190: 6e 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c  n empty result l
21a0: 65 61 76 65 73 20 76 65 72 69 66 69 63 61 74 69  eaves verificati
21b0: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f  on unchanged..*/
21c0: 0a 09 69 66 20 28 6c 65 6e 67 74 68 20 3e 20 30  ..if (length > 0
21d0: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 54 63 6c  ) {..    if (Tcl
21e0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 73  _GetIntFromObj(s
21f0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
2200: 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d   result, &ok) !=
2210: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 54 63 6c   TCL_OK) {...Tcl
2220: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
2230: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
2240: 70 29 3b 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20  p);...ok = 0;.. 
2250: 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20     }..}.    }.  
2260: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
2270: 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a 20 20  nt( cmdPtr);..  
2280: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67    statePtr->flag
2290: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43  s &= ~(TLS_TCL_C
22a0: 41 4c 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 20 54  ALLBACK);..    T
22b0: 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69  cl_Release( (Cli
22c0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
22d0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  r);.    Tcl_Rele
22e0: 61 73 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61  ase( (ClientData
22f0: 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ) statePtr->inte
2300: 72 70 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  rp);..    return
2310: 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61  (ok);./* By defa
2320: 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66  ult, leave verif
2330: 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  ication unchange
2340: 64 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  d..*/.}.../*. *-
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2390: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72  --. *. * Tls_Err
23a0: 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  or --. *. *.Call
23b0: 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  s callback with 
23c0: 24 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73  $fd and $msg - s
23d0: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63  o the callback c
23e0: 61 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61  an decide. *.wha
23f0: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72  t to do with err
2400: 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ors.. *. * Side 
2410: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
2420: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  err field of the
2430: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61   currently opera
2440: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65  tive State is se
2450: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69  t. *.  to a stri
2460: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
2470: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
2480: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e  n failure reason
2490: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
24e0: 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20  Tls_Error(State 
24f0: 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20  *statePtr, char 
2500: 2a 6d 73 67 29 0a 7b 0a 20 20 20 20 54 63 6c 5f  *msg).{.    Tcl_
2510: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 0a 20 20  Obj *cmdPtr;..  
2520: 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a 6d 73    if (msg && *ms
2530: 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72  g) {..Tcl_SetErr
2540: 6f 72 43 6f 64 65 28 73 74 61 74 65 50 74 72 2d  orCode(statePtr-
2550: 3e 69 6e 74 65 72 70 2c 20 22 53 53 4c 22 2c 20  >interp, "SSL", 
2560: 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  msg, (char *)NUL
2570: 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  L);.    } else {
2580: 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53  ..msg = Tcl_GetS
2590: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c  tringFromObj(Tcl
25a0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 73 74  _GetObjResult(st
25b0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 2c  atePtr->interp),
25c0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20   NULL);.    }.  
25d0: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20    statePtr->err 
25e0: 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66 20 28  = msg;..    if (
25f0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
2600: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  ck == (Tcl_Obj*)
2610: 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75  NULL) {..char bu
2620: 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70 72 69  f[BUFSIZ];..spri
2630: 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20 63 68  ntf(buf, "SSL ch
2640: 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20 65 72  annel \"%s\": er
2650: 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20 20 54  ror: %s",..    T
2660: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
2670: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
2680: 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f 53 65  ), msg);..Tcl_Se
2690: 74 52 65 73 75 6c 74 28 20 73 74 61 74 65 50 74  tResult( statePt
26a0: 72 2d 3e 69 6e 74 65 72 70 2c 20 62 75 66 2c 20  r->interp, buf, 
26b0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 09  TCL_VOLATILE);..
26c0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
26d0: 72 6f 72 28 20 73 74 61 74 65 50 74 72 2d 3e 69  ror( statePtr->i
26e0: 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 3b  nterp);..return;
26f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 74  .    }.    cmdPt
2700: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2710: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
2720: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54  allback);..    T
2730: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2740: 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72  Element(statePtr
2750: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
2760: 2c 20 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  , ..    Tcl_NewS
2770: 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22  tringObj("error"
2780: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c  , -1));..    Tcl
2790: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
27a0: 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  ement(statePtr->
27b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
27c0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
27d0: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
27e0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
27f0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
2800: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
2810: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73  jAppendElement(s
2820: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
2830: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
2840: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
2850: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54  sg, -1));..    T
2860: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
2870: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
2880: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  r->interp);.    
2890: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c  Tcl_Preserve((Cl
28a0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
28b0: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e  tr);..    Tcl_In
28c0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
28d0: 72 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  r);.    if (Tcl_
28e0: 47 6c 6f 62 61 6c 45 76 61 6c 4f 62 6a 28 73 74  GlobalEvalObj(st
28f0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20  atePtr->interp, 
2900: 63 6d 64 50 74 72 29 20 21 3d 20 54 43 4c 5f 4f  cmdPtr) != TCL_O
2910: 4b 29 20 7b 0a 09 54 63 6c 5f 42 61 63 6b 67 72  K) {..Tcl_Backgr
2920: 6f 75 6e 64 45 72 72 6f 72 28 73 74 61 74 65 50  oundError(stateP
2930: 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20  tr->interp);.   
2940: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
2950: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
2960: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ..    Tcl_Releas
2970: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
2980: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63  tatePtr);.    Tc
2990: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
29a0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d  tData) statePtr-
29b0: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a  >interp);.}.../*
29c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
29d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a00: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73  ------. *. * Pas
2a10: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 20 2d 2d  swordCallback --
2a20: 20 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77   . *. *.Called w
2a30: 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 69  hen a password i
2a40: 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e 70 61  s needed to unpa
2a50: 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d 20 6b  ck RSA and PEM k
2a60: 65 79 73 2e 0a 20 2a 09 45 76 61 6c 73 20 61 6e  eys.. *.Evals an
2a70: 79 20 62 6f 75 6e 64 20 70 61 73 73 77 6f 72 64  y bound password
2a80: 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75   script and retu
2a90: 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 61  rns the result a
2aa0: 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77 6f 72  s. *.the passwor
2ab0: 64 20 73 74 72 69 6e 67 2e 0a 20 2a 2d 2d 2d 2d  d string.. *----
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2b00: 20 2a 2f 0a 23 69 66 64 65 66 20 50 52 45 5f 4f   */.#ifdef PRE_O
2b10: 50 45 4e 53 53 4c 5f 30 5f 39 5f 34 0a 2f 2a 0a  PENSSL_0_9_4./*.
2b20: 20 2a 20 4e 6f 20 77 61 79 20 74 6f 20 68 61 6e   * No way to han
2b30: 64 6c 65 20 75 73 65 72 2d 64 61 74 61 20 74 68  dle user-data th
2b40: 65 72 65 66 6f 72 65 20 6e 6f 20 77 61 79 20 77  erefore no way w
2b50: 69 74 68 6f 75 74 20 61 20 67 6c 6f 62 61 6c 0a  ithout a global.
2b60: 20 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 61   * variable to a
2b70: 63 63 65 73 73 20 74 68 65 20 54 63 6c 20 69 6e  ccess the Tcl in
2b80: 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 73 74  terpreter..*/.st
2b90: 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72  atic int.Passwor
2ba0: 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a  dCallback(char *
2bb0: 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69  buf, int size, i
2bc0: 6e 74 20 76 65 72 69 66 79 29 0a 7b 0a 20 20 20  nt verify).{.   
2bd0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 23 65   return -1;.}.#e
2be0: 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 0a 50  lse.static int.P
2bf0: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28  asswordCallback(
2c00: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73  char *buf, int s
2c10: 69 7a 65 2c 20 69 6e 74 20 76 65 72 69 66 79 2c  ize, int verify,
2c20: 20 76 6f 69 64 20 2a 75 64 61 74 61 29 0a 7b 0a   void *udata).{.
2c30: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
2c40: 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr.= (State *) 
2c50: 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49  udata;.    Tcl_I
2c60: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
2c70: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2c80: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
2c90: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 72  mdPtr;.    int r
2ca0: 65 73 75 6c 74 3b 0a 0a 20 20 20 20 69 66 20 28  esult;..    if (
2cb0: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
2cc0: 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  rd == NULL) {..i
2cd0: 66 20 28 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65  f (Tcl_Eval(inte
2ce0: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f  rp, "tls::passwo
2cf0: 72 64 22 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20  rd") == TCL_OK) 
2d00: 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65 74  {..    char *ret
2d10: 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f   = (char *) Tcl_
2d20: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
2d30: 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73 74  interp);..    st
2d40: 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20  rncpy(buf, ret, 
2d50: 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a  (size_t) size);.
2d60: 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74  .    return (int
2d70: 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d  )strlen(ret);..}
2d80: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74   else {..    ret
2d90: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d  urn -1;..}.    }
2da0: 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  ..    cmdPtr = T
2db0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
2dc0: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
2dd0: 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  rd);..    Tcl_Pr
2de0: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
2df0: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  ta) statePtr->in
2e00: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50  terp);.    Tcl_P
2e10: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
2e20: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
2e30: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
2e40: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
2e50: 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f     result = Tcl_
2e60: 47 6c 6f 62 61 6c 45 76 61 6c 4f 62 6a 28 69 6e  GlobalEvalObj(in
2e70: 74 65 72 70 2c 20 63 6d 64 50 74 72 29 3b 0a 20  terp, cmdPtr);. 
2e80: 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d     if (result !=
2e90: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f   TCL_OK) {..Tcl_
2ea0: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
2eb0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2ec0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
2ed0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
2ee0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  dPtr);..    Tcl_
2ef0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
2f00: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
2f10: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
2f20: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
2f30: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a  tePtr->interp);.
2f40: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20  .    if (result 
2f50: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68  == TCL_OK) {..ch
2f60: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20  ar *ret = (char 
2f70: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  *) Tcl_GetString
2f80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2f90: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65  .strncpy(buf, re
2fa0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65  t, (size_t) size
2fb0: 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e 74 29  );..return (int)
2fc0: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 20 20 20  strlen(ret);.   
2fd0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 74 75 72   } else {..retur
2fe0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 7d 0a 23 65  n -1;.    }.}.#e
2ff0: 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ndif.../*. *----
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3040: 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a   *. * CiphersObj
3050: 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69  Cmd -- list avai
3060: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a  lable ciphers. *
3070: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
3080: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
3090: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c   process the "tl
30a0: 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d  s::ciphers" comm
30b0: 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61  and. *.to list a
30c0: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73  vailable ciphers
30d0: 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f  , based upon pro
30e0: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a  tocol selected..
30f0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
3100: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
3110: 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a   result list.. *
3120: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
3130: 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20  :. *.constructs 
3140: 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c  and destroys SSL
3150: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20   context (CTX). 
3160: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
31b0: 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62  ic int.CiphersOb
31c0: 6a 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c  jCmd(clientData,
31d0: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f   interp, objc, o
31e0: 62 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44  bjv).    ClientD
31f0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09  ata clientData;.
3200: 2f 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a  /* Not used. */.
3210: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
3220: 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20  interp;.    int 
3230: 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  objc;.    Tcl_Ob
3240: 6a 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b  j.*CONST objv[];
3250: 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20 43 4f  .{.    static CO
3260: 4e 53 54 38 34 20 63 68 61 72 20 2a 70 72 6f 74  NST84 char *prot
3270: 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73  ocols[] = {.."ss
3280: 6c 32 22 2c 09 22 73 73 6c 33 22 2c 09 22 74 6c  l2",."ssl3",."tl
3290: 73 31 22 2c 09 4e 55 4c 4c 0a 20 20 20 20 7d 3b  s1",.NULL.    };
32a0: 0a 20 20 20 20 65 6e 75 6d 20 70 72 6f 74 6f 63  .    enum protoc
32b0: 6f 6c 20 7b 0a 09 54 4c 53 5f 53 53 4c 32 2c 20  ol {..TLS_SSL2, 
32c0: 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c  TLS_SSL3, TLS_TL
32d0: 53 31 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 20 20 20  S1, TLS_NONE.   
32e0: 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   };.    Tcl_Obj 
32f0: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 53 53 4c  *objPtr;.    SSL
3300: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
3310: 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d  ;.    SSL *ssl =
3320: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b   NULL;.    STACK
3330: 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20  _OF(SSL_CIPHER) 
3340: 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  *sk;.    char *c
3350: 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a  p, buf[BUFSIZ];.
3360: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76      int index, v
3370: 65 72 62 6f 73 65 20 3d 20 30 3b 0a 0a 20 20 20  erbose = 0;..   
3380: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c   if (objc < 2 ||
3390: 20 6f 62 6a 63 20 3e 20 33 29 20 7b 0a 09 54 63   objc > 3) {..Tc
33a0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
33b0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
33c0: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f  "protocol ?verbo
33d0: 73 65 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  se?");..return T
33e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
33f0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49      if (Tcl_GetI
3400: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 20 69 6e 74  ndexFromObj( int
3410: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72  erp, objv[1], pr
3420: 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63  otocols, "protoc
3430: 6f 6c 22 2c 20 30 2c 0a 09 26 69 6e 64 65 78 29  ol", 0,..&index)
3440: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
3450: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3460: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6f  .    }.    if (o
3470: 62 6a 63 20 3e 20 32 20 26 26 20 54 63 6c 5f 47  bjc > 2 && Tcl_G
3480: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
3490: 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  ( interp, objv[2
34a0: 5d 2c 0a 09 26 76 65 72 62 6f 73 65 29 20 21 3d  ],..&verbose) !=
34b0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
34c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
34d0: 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28    }.    switch (
34e0: 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69  (enum protocol)i
34f0: 6e 64 65 78 29 20 7b 0a 20 20 20 20 63 61 73 65  ndex) {.    case
3500: 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 64   TLS_SSL2:.#if d
3510: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a  efined(NO_SSL2).
3520: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
3530: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74  lt(interp, "prot
3540: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
3550: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72 65  ed", NULL);...re
3560: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3570: 23 65 6c 73 65 0a 09 09 63 74 78 20 3d 20 53 53  #else...ctx = SS
3580: 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f  L_CTX_new(SSLv2_
3590: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b  method()); break
35a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  ;.#endif.    cas
35b0: 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20  e TLS_SSL3:.#if 
35c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
35d0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
35e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f  ult(interp, "pro
35f0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
3600: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72  ted", NULL);...r
3610: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3620: 0a 23 65 6c 73 65 0a 09 09 63 74 78 20 3d 20 53  .#else...ctx = S
3630: 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 33  SL_CTX_new(SSLv3
3640: 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61  _method()); brea
3650: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  k;.#endif.    ca
3660: 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66  se TLS_TLS1:.#if
3670: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
3680: 29 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  )...Tcl_AppendRe
3690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72  sult(interp, "pr
36a0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
36b0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 09  rted", NULL);...
36c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
36d0: 3b 0a 23 65 6c 73 65 0a 09 09 63 74 78 20 3d 20  ;.#else...ctx = 
36e0: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76  SSL_CTX_new(TLSv
36f0: 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65  1_method()); bre
3700: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  ak;.#endif.    d
3710: 65 66 61 75 6c 74 3a 0a 09 09 62 72 65 61 6b 3b  efault:...break;
3720: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63  .    }.    if (c
3730: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  tx == NULL) {..T
3740: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
3750: 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29  interp, REASON()
3760: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
3770: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
3780: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
3790: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78  sl = SSL_new(ctx
37a0: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  );.    if (ssl =
37b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
37c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
37d0: 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63  rp, REASON(), (c
37e0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
37f0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
3800: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
3810: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  ROR;.    }.    o
3820: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
3830: 69 73 74 4f 62 6a 28 20 30 2c 20 4e 55 4c 4c 29  istObj( 0, NULL)
3840: 3b 0a 0a 20 20 20 20 69 66 20 28 21 76 65 72 62  ;..    if (!verb
3850: 6f 73 65 29 20 7b 0a 09 66 6f 72 20 28 69 6e 64  ose) {..for (ind
3860: 65 78 20 3d 20 30 3b 20 3b 20 69 6e 64 65 78 2b  ex = 0; ; index+
3870: 2b 29 20 7b 0a 09 20 20 20 20 63 70 20 3d 20 28  +) {..    cp = (
3880: 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69  char*)SSL_get_ci
3890: 70 68 65 72 5f 6c 69 73 74 28 20 73 73 6c 2c 20  pher_list( ssl, 
38a0: 69 6e 64 65 78 29 3b 0a 09 20 20 20 20 69 66 20  index);..    if 
38b0: 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65  (cp == NULL) bre
38c0: 61 6b 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ak;..    Tcl_Lis
38d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
38e0: 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  t( interp, objPt
38f0: 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69  r,...Tcl_NewStri
3900: 6e 67 4f 62 6a 28 20 63 70 2c 20 2d 31 29 20 29  ngObj( cp, -1) )
3910: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
3920: 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f  {..sk = SSL_get_
3930: 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 0a 09  ciphers(ssl);...
3940: 66 6f 72 20 28 69 6e 64 65 78 20 3d 20 30 3b 20  for (index = 0; 
3950: 69 6e 64 65 78 20 3c 20 73 6b 5f 53 53 4c 5f 43  index < sk_SSL_C
3960: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69  IPHER_num(sk); i
3970: 6e 64 65 78 2b 2b 29 20 7b 0a 09 20 20 20 20 72  ndex++) {..    r
3980: 65 67 69 73 74 65 72 20 73 69 7a 65 5f 74 20 69  egister size_t i
3990: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 49 50 48 45  ;..    SSL_CIPHE
39a0: 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 20 73  R_description( s
39b0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
39c0: 75 65 28 20 73 6b 2c 20 69 6e 64 65 78 29 2c 0a  ue( sk, index),.
39d0: 09 09 09 09 20 20 20 20 62 75 66 2c 20 73 69 7a  ....    buf, siz
39e0: 65 6f 66 28 62 75 66 29 29 3b 0a 09 20 20 20 20  eof(buf));..    
39f0: 66 6f 72 20 28 69 20 3d 20 73 74 72 6c 65 6e 28  for (i = strlen(
3a00: 62 75 66 29 20 2d 20 31 3b 20 69 20 3b 20 69 2d  buf) - 1; i ; i-
3a10: 2d 29 20 7b 0a 09 09 69 66 20 28 62 75 66 5b 69  -) {...if (buf[i
3a20: 5d 20 3d 3d 20 27 20 27 20 7c 7c 20 62 75 66 5b  ] == ' ' || buf[
3a30: 69 5d 20 3d 3d 20 27 5c 6e 27 20 7c 7c 0a 09 09  i] == '\n' ||...
3a40: 20 20 20 20 62 75 66 5b 69 5d 20 3d 3d 20 27 5c      buf[i] == '\
3a50: 72 27 20 7c 7c 20 62 75 66 5b 69 5d 20 3d 3d 20  r' || buf[i] == 
3a60: 27 5c 74 27 29 20 7b 0a 09 09 20 20 20 20 62 75  '\t') {...    bu
3a70: 66 5b 69 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 7d  f[i] = '\0';...}
3a80: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 62 72   else {...    br
3a90: 65 61 6b 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  eak;...}..    }.
3aa0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3ab0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69  AppendElement( i
3ac0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09  nterp, objPtr,..
3ad0: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  .Tcl_NewStringOb
3ae0: 6a 28 20 62 75 66 2c 20 2d 31 29 20 29 3b 0a 09  j( buf, -1) );..
3af0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f  }.    }.    SSL_
3b00: 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53  free(ssl);.    S
3b10: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
3b20: 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ;..    Tcl_SetOb
3b30: 6a 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c  jResult( interp,
3b40: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
3b50: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
3b60: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
3bb0: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20  HandshakeObjCmd 
3bc0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f  --. *. *.This co
3bd0: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
3be0: 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20   verify whether 
3bf0: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73  the handshake is
3c00: 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20   complete. *.or 
3c10: 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  not.. *. * Resul
3c20: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
3c30: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20  d Tcl result. 1 
3c40: 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20  means handshake 
3c50: 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e  complete, 0 mean
3c60: 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a  s pending.. *. *
3c70: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
3c80: 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20  *.May force SSL 
3c90: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74  negotiation to t
3ca0: 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a  ake place.. *. *
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cf0: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
3d00: 69 6e 74 0a 48 61 6e 64 73 68 61 6b 65 4f 62 6a  int.HandshakeObj
3d10: 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20  Cmd(clientData, 
3d20: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62  interp, objc, ob
3d30: 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61  jv).    ClientDa
3d40: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f  ta clientData;./
3d50: 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20  * Not used. */. 
3d60: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
3d70: 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f  nterp;.    int o
3d80: 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  bjc;.    Tcl_Obj
3d90: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a   *CONST objv[];.
3da0: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
3db0: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
3dc0: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
3dd0: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20   mode on. */.   
3de0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
3df0: 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61  ;../* client sta
3e00: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65  te for ssl socke
3e10: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74  t */.    int ret
3e20: 20 3d 20 31 3b 0a 0a 20 20 20 20 69 66 20 28 6f   = 1;..    if (o
3e30: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
3e40: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
3e50: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
3e60: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
3e70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3e80: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20    }..    chan = 
3e90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
3ea0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
3eb0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
3ec0: 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c  [1], NULL), NULL
3ed0: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
3ee0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
3ef0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
3f00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
3f10: 7d 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65  }.    if (channe
3f20: 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20  lTypeVersion == 
3f30: 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53  TLS_CHANNEL_VERS
3f40: 49 4f 4e 5f 32 29 20 7b 0a 09 2f 2a 0a 09 20 2a  ION_2) {../*.. *
3f50: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
3f60: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
3f70: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a  most channel.. *
3f80: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  /..chan = Tcl_Ge
3f90: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
3fa0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  );.    }.    if 
3fb0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
3fc0: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
3fd0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
3fe0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
3ff0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
4000: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
4010: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
4020: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e  (chan),..."\": n
4030: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
4040: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
4050: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
4060: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20   }.    statePtr 
4070: 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47  = (State *)Tcl_G
4080: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
4090: 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20  eData(chan);..  
40a0: 20 20 69 66 20 28 21 53 53 4c 5f 69 73 5f 69 6e    if (!SSL_is_in
40b0: 69 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61 74  it_finished(stat
40c0: 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 69  ePtr->ssl)) {..i
40d0: 6e 74 20 65 72 72 3b 0a 09 72 65 74 20 3d 20 54  nt err;..ret = T
40e0: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  ls_WaitForConnec
40f0: 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72  t(statePtr, &err
4100: 29 3b 0a 09 69 66 20 28 28 73 74 61 74 65 50 74  );..if ((statePt
4110: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54  r->flags & TLS_T
4120: 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 65 72 72  CL_ASYNC) && err
4130: 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09 20   == EAGAIN) {.. 
4140: 20 20 20 72 65 74 20 3d 20 30 3b 0a 09 7d 0a 09     ret = 0;..}..
4150: 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09  if (ret < 0) {..
4160: 20 20 20 20 43 4f 4e 53 54 20 63 68 61 72 20 2a      CONST char *
4170: 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 74  errStr = statePt
4180: 72 2d 3e 65 72 72 3b 0a 09 20 20 20 20 54 63 6c  r->err;..    Tcl
4190: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
41a0: 65 72 70 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  erp);..    Tcl_S
41b0: 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09  etErrno(err);...
41c0: 20 20 20 20 69 66 20 28 21 65 72 72 53 74 72 20      if (!errStr 
41d0: 7c 7c 20 2a 65 72 72 53 74 72 20 3d 3d 20 30 29  || *errStr == 0)
41e0: 20 7b 0a 09 09 65 72 72 53 74 72 20 3d 20 54 63   {...errStr = Tc
41f0: 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  l_PosixError(int
4200: 65 72 70 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  erp);..    }... 
4210: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4220: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e  ult(interp, "han
4230: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22  dshake failed: "
4240: 2c 20 65 72 72 53 74 72 2c 0a 09 09 20 20 20 20  , errStr,...    
4250: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
4260: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4270: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
4280: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
4290: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
42a0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29  l_NewIntObj(ret)
42b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
42c0: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f  --. *. * ImportO
4320: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
4330: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
4340: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
4350: 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f  ess the "ssl" co
4360: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20  mmand. *. *.The 
4370: 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68  ssl command push
4380: 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e  es SSL over a (n
4390: 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20  ewly connected) 
43a0: 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a  tcp socket. *. *
43b0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
43c0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
43d0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
43e0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d  ffects:. *.May m
43f0: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69  odify the behavi
4400: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e  or of an IO chan
4410: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
4420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4460: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d  /..static int.Im
4470: 70 6f 72 74 4f 62 6a 43 6d 64 28 63 6c 69 65 6e  portObjCmd(clien
4480: 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f  tData, interp, o
4490: 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20 20 43  bjc, objv).    C
44a0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
44b0: 44 61 74 61 3b 09 2f 2a 20 4e 6f 74 20 75 73 65  Data;./* Not use
44c0: 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  d. */.    Tcl_In
44d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
44e0: 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20 20    int objc;.    
44f0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
4500: 62 6a 76 5b 5d 3b 0a 7b 0a 20 20 20 20 54 63 6c  bjv[];.{.    Tcl
4510: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
4520: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
4530: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e  o set a mode on.
4540: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73   */.    State *s
4550: 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69  tatePtr;../* cli
4560: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73  ent state for ss
4570: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20  l socket */.    
4580: 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 3d 20 4e  SSL_CTX *ctx.= N
4590: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
45a0: 20 2a 73 63 72 69 70 74 09 3d 20 4e 55 4c 4c 3b   *script.= NULL;
45b0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61  .    Tcl_Obj *pa
45c0: 73 73 77 6f 72 64 09 3d 20 4e 55 4c 4c 3b 0a 20  ssword.= NULL;. 
45d0: 20 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20     int idx;.    
45e0: 69 6e 74 20 66 6c 61 67 73 09 09 3d 20 54 4c 53  int flags..= TLS
45f0: 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69  _TCL_INIT;.    i
4600: 6e 74 20 73 65 72 76 65 72 09 09 3d 20 30 3b 09  nt server..= 0;.
4610: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  /* is connection
4620: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74   incoming or out
4630: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68  going? */.    ch
4640: 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b  ar *key..= NULL;
4650: 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 09  .    char *cert.
4660: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61  .= NULL;.    cha
4670: 72 20 2a 63 69 70 68 65 72 73 09 3d 20 4e 55 4c  r *ciphers.= NUL
4680: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66  L;.    char *CAf
4690: 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ile.= NULL;.    
46a0: 63 68 61 72 20 2a 43 41 64 69 72 09 09 3d 20 4e  char *CAdir..= N
46b0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d  ULL;.    char *m
46c0: 6f 64 65 6c 09 09 3d 20 4e 55 4c 4c 3b 0a 23 69  odel..= NULL;.#i
46d0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  f defined(NO_SSL
46e0: 32 29 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20  2).    int ssl2 
46f0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  = 0;.#else.    i
4700: 6e 74 20 73 73 6c 32 20 3d 20 31 3b 0a 23 65 6e  nt ssl2 = 1;.#en
4710: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
4720: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 6e 74  NO_SSL3).    int
4730: 20 73 73 6c 33 20 3d 20 30 3b 0a 23 65 6c 73 65   ssl3 = 0;.#else
4740: 0a 20 20 20 20 69 6e 74 20 73 73 6c 33 20 3d 20  .    int ssl3 = 
4750: 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  1;.#endif.#if de
4760: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26  fined(NO_SSL2) &
4770: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  & defined(NO_SSL
4780: 33 29 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20  3).    int tls1 
4790: 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  = 1;.#else.    i
47a0: 6e 74 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e  nt tls1 = 0;.#en
47b0: 64 69 66 0a 20 20 20 20 69 6e 74 20 70 72 6f 74  dif.    int prot
47c0: 6f 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 76  o = 0;.    int v
47d0: 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69  erify = 0, requi
47e0: 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20  re = 0, request 
47f0: 3d 20 31 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  = 1;..    if (ob
4800: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
4810: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
4820: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
4830: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22  annel ?options?"
4840: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
4850: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
4860: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
4870: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
4880: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
4890: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c  Obj(objv[1], NUL
48a0: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
48b0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
48c0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
48d0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
48e0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
48f0: 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72   (channelTypeVer
4900: 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e  sion == TLS_CHAN
4910: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 20 7b  NEL_VERSION_2) {
4920: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75  ../*.. * Make su
4930: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
4940: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
4950: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20  nnel.. */..chan 
4960: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
4970: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 7d  nel(chan);.    }
4980: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d  ..    for (idx =
4990: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20   2; idx < objc; 
49a0: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a  idx++) {..char *
49b0: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  opt = Tcl_GetStr
49c0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
49d0: 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69  idx], NULL);...i
49e0: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27  f (opt[0] != '-'
49f0: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  )..    break;...
4a00: 4f 50 54 53 54 52 28 20 22 2d 63 61 64 69 72 22  OPTSTR( "-cadir"
4a10: 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54  , CAdir);..OPTST
4a20: 52 28 20 22 2d 63 61 66 69 6c 65 22 2c 20 43 41  R( "-cafile", CA
4a30: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 20  file);..OPTSTR( 
4a40: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72  "-certfile", cer
4a50: 74 29 3b 0a 09 4f 50 54 53 54 52 28 20 22 2d 63  t);..OPTSTR( "-c
4a60: 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29  ipher", ciphers)
4a70: 3b 0a 09 4f 50 54 4f 42 4a 28 20 22 2d 63 6f 6d  ;..OPTOBJ( "-com
4a80: 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a  mand", script);.
4a90: 09 4f 50 54 53 54 52 28 20 22 2d 6b 65 79 66 69  .OPTSTR( "-keyfi
4aa0: 6c 65 22 2c 20 6b 65 79 29 3b 0a 09 4f 50 54 53  le", key);..OPTS
4ab0: 54 52 28 20 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f  TR( "-model", mo
4ac0: 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 20 22  del);..OPTOBJ( "
4ad0: 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73  -password", pass
4ae0: 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  word);..OPTBOOL(
4af0: 20 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71   "-require", req
4b00: 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uire);..OPTBOOL(
4b10: 20 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71   "-request", req
4b20: 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uest);..OPTBOOL(
4b30: 20 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76   "-server", serv
4b40: 65 72 29 3b 0a 0a 09 4f 50 54 42 4f 4f 4c 28 20  er);...OPTBOOL( 
4b50: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a  "-ssl2", ssl2);.
4b60: 09 4f 50 54 42 4f 4f 4c 28 20 22 2d 73 73 6c 33  .OPTBOOL( "-ssl3
4b70: 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f  ", ssl3);..OPTBO
4b80: 4f 4c 28 20 22 2d 74 6c 73 31 22 2c 20 74 6c 73  OL( "-tls1", tls
4b90: 31 29 3b 0a 0a 09 4f 50 54 42 41 44 28 20 22 6f  1);...OPTBAD( "o
4ba0: 70 74 69 6f 6e 22 2c 20 22 2d 63 61 64 69 72 2c  ption", "-cadir,
4bb0: 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 66   -cafile, -certf
4bc0: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63  ile, -cipher, -c
4bd0: 6f 6d 6d 61 6e 64 2c 20 2d 6b 65 79 66 69 6c 65  ommand, -keyfile
4be0: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77  , -model, -passw
4bf0: 6f 72 64 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d  ord, -require, -
4c00: 72 65 71 75 65 73 74 2c 20 2d 73 65 72 76 65 72  request, -server
4c10: 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20  , -ssl2, -ssl3, 
4c20: 6f 72 20 2d 74 6c 73 31 22 29 3b 0a 0a 09 72 65  or -tls1");...re
4c30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4c40: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65      }.    if (re
4c50: 71 75 65 73 74 29 09 20 20 20 20 76 65 72 69 66  quest).    verif
4c60: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  y |= SSL_VERIFY_
4c70: 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53  CLIENT_ONCE | SS
4c80: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20  L_VERIFY_PEER;. 
4c90: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26     if (request &
4ca0: 26 20 72 65 71 75 69 72 65 29 20 76 65 72 69 66  & require) verif
4cb0: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  y |= SSL_VERIFY_
4cc0: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f  FAIL_IF_NO_PEER_
4cd0: 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 76 65  CERT;.    if (ve
4ce0: 72 69 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66  rify == 0).verif
4cf0: 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e  y = SSL_VERIFY_N
4d00: 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20  ONE;..    proto 
4d10: 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50  |= (ssl2 ? TLS_P
4d20: 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a  ROTO_SSL2 : 0);.
4d30: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73      proto |= (ss
4d40: 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  l3 ? TLS_PROTO_S
4d50: 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  SL3 : 0);.    pr
4d60: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54  oto |= (tls1 ? T
4d70: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20  LS_PROTO_TLS1 : 
4d80: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65  0);..    /* rese
4d90: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61  t to NULL if bla
4da0: 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64  nk string provid
4db0: 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65  ed */.    if (ce
4dc0: 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 63  rt && !*cert)..c
4dd0: 65 72 74 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ert.= NULL;.    
4de0: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79  if (key && !*key
4df0: 29 09 09 6b 65 79 09 3d 20 4e 55 4c 4c 3b 0a 20  )..key.= NULL;. 
4e00: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26     if (ciphers &
4e10: 26 20 21 2a 63 69 70 68 65 72 73 29 09 63 69 70  & !*ciphers).cip
4e20: 68 65 72 73 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  hers.= NULL;.   
4e30: 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21   if (CAfile && !
4e40: 2a 43 41 66 69 6c 65 29 09 43 41 66 69 6c 65 09  *CAfile).CAfile.
4e50: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
4e60: 43 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72  CAdir && !*CAdir
4e70: 29 09 43 41 64 69 72 09 3d 20 4e 55 4c 4c 3b 0a  ).CAdir.= NULL;.
4e80: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20  .    /* new SSL 
4e90: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61  state */.    sta
4ea0: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20  tePtr..= (State 
4eb0: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69  *) ckalloc((unsi
4ec0: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61  gned) sizeof(Sta
4ed0: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  te));.    memset
4ee0: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69  (statePtr, 0, si
4ef0: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20  zeof(State));.. 
4f00: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
4f10: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs.= flags;.    
4f20: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
4f30: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73  .= interp;.    s
4f40: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09  tatePtr->vflags.
4f50: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74  = verify;.    st
4f60: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22  atePtr->err.= ""
4f70: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  ;..    /* alloca
4f80: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20  te script */.   
4f90: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09   if (script) {..
4fa0: 63 68 61 72 20 2a 74 6d 70 20 3d 20 54 63 6c 5f  char *tmp = Tcl_
4fb0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
4fc0: 28 73 63 72 69 70 74 2c 20 4e 55 4c 4c 29 3b 0a  (script, NULL);.
4fd0: 09 69 66 20 28 74 6d 70 20 26 26 20 2a 74 6d 70  .if (tmp && *tmp
4fe0: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
4ff0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 54 63  r->callback = Tc
5000: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
5010: 63 72 69 70 74 29 3b 0a 09 20 20 20 20 54 63 6c  cript);..    Tcl
5020: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
5030: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
5040: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
5050: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73   /* allocate pas
5060: 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20  sword */.    if 
5070: 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 63 68  (password) {..ch
5080: 61 72 20 2a 74 6d 70 20 3d 20 54 63 6c 5f 47 65  ar *tmp = Tcl_Ge
5090: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
50a0: 61 73 73 77 6f 72 64 2c 20 4e 55 4c 4c 29 3b 0a  assword, NULL);.
50b0: 09 69 66 20 28 74 6d 70 20 26 26 20 2a 74 6d 70  .if (tmp && *tmp
50c0: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
50d0: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 54 63  r->password = Tc
50e0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
50f0: 61 73 73 77 6f 72 64 29 3b 0a 09 20 20 20 20 54  assword);..    T
5100: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5110: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
5120: 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  rd);..}.    }.. 
5130: 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20     if (model != 
5140: 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64  NULL) {..int mod
5150: 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22  e;../* Get the "
5160: 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a  model" context *
5170: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  /..chan = Tcl_Ge
5180: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
5190: 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a   model, &mode);.
51a0: 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63  .if (chan == (Tc
51b0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
51c0: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65   {..    Tls_Free
51d0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
51e0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
51f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09   TCL_ERROR;..}..
5200: 69 66 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56  if (channelTypeV
5210: 65 72 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48  ersion == TLS_CH
5220: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29  ANNEL_VERSION_2)
5230: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20   {..    /*..    
5240: 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20   * Make sure to 
5250: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
5260: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09  opmost channel..
5270: 20 20 20 20 20 2a 2f 0a 09 20 20 20 20 63 68 61       */..    cha
5280: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
5290: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 7d 0a  annel(chan);..}.
52a0: 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e  .if (Tcl_GetChan
52b0: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
52c0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
52d0: 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  ()) {..    Tcl_A
52e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
52f0: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
5300: 20 5c 22 22 2c 0a 09 09 20 20 20 20 54 63 6c 5f   \"",...    Tcl_
5310: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
5320: 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61  han), "\": not a
5330: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e   TLS channel", N
5340: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
5350: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
5360: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
5370: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
5380: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65  }..ctx = ((State
5390: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
53a0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
53b0: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d  an))->ctx;.    }
53c0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74   else {..if ((ct
53d0: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61  x = CTX_Init(sta
53e0: 74 65 50 74 72 2c 20 70 72 6f 74 6f 2c 20 6b 65  tePtr, proto, ke
53f0: 79 2c 20 63 65 72 74 2c 20 43 41 64 69 72 2c 20  y, cert, CAdir, 
5400: 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 29  CAfile, ciphers)
5410: 29 0a 09 20 20 20 20 3d 3d 20 28 53 53 4c 5f 43  )..    == (SSL_C
5420: 54 58 2a 29 30 29 20 7b 0a 09 20 20 20 20 54 6c  TX*)0) {..    Tl
5430: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
5440: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
5450: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5460: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
5470: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20  statePtr->ctx = 
5480: 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ctx;..    /*.   
5490: 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d    * We need to m
54a0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
54b0: 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20  e channel works 
54c0: 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74  in binary (for t
54d0: 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70  he.     * encryp
54e0: 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20  tion not to get 
54f0: 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20  goofed up)..    
5500: 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20   * We only want 
5510: 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75  to adjust the bu
5520: 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76  ffering in pre-v
5530: 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72  2 channels, wher
5540: 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68  e.     * each ch
5550: 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61  annel in the sta
5560: 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74  ck maintained it
5570: 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20  s own buffers.. 
5580: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53      */.    Tcl_S
5590: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
55a0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
55b0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62  translation", "b
55c0: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 69 66 20  inary");.    if 
55d0: 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73  (channelTypeVers
55e0: 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e 4e  ion == TLS_CHANN
55f0: 45 4c 5f 56 45 52 53 49 4f 4e 5f 31 29 20 7b 0a  EL_VERSION_1) {.
5600: 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f  .Tcl_SetChannelO
5610: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
5620: 61 6e 2c 20 22 2d 62 75 66 66 65 72 69 6e 67 22  an, "-buffering"
5630: 2c 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 7d  , "none");.    }
5640: 0a 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65  ..    if (channe
5650: 6c 54 79 70 65 56 65 72 73 69 6f 6e 20 3d 3d 20  lTypeVersion == 
5660: 54 4c 53 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53  TLS_CHANNEL_VERS
5670: 49 4f 4e 5f 32 29 20 7b 0a 09 73 74 61 74 65 50  ION_2) {..stateP
5680: 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53  tr->self = Tcl_S
5690: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
56a0: 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54  rp, Tls_ChannelT
56b0: 79 70 65 28 29 2c 0a 09 09 28 43 6c 69 65 6e 74  ype(),...(Client
56c0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20  Data) statePtr, 
56d0: 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20  (TCL_READABLE | 
56e0: 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63  TCL_WRITABLE), c
56f0: 68 61 6e 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  han);.    } else
5700: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 65   {..statePtr->se
5710: 6c 66 20 3d 20 63 68 61 6e 3b 0a 09 54 63 6c 5f  lf = chan;..Tcl_
5720: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  StackChannel(int
5730: 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  erp, Tls_Channel
5740: 54 79 70 65 28 29 2c 0a 09 09 28 43 6c 69 65 6e  Type(),...(Clien
5750: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c  tData) statePtr,
5760: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c   (TCL_READABLE |
5770: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20   TCL_WRITABLE), 
5780: 63 68 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  chan);.    }.   
5790: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
57a0: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
57b0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a  nel) NULL) {../*
57c0: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54  .. * No use of T
57d0: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65  cl_EventuallyFre
57e0: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73  e because no pos
57f0: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72  sible Tcl_Preser
5800: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72  ve... */..Tls_Fr
5810: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
5820: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54  ePtr);..return T
5830: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5840: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
5850: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f  SL Initializatio
5860: 6e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73  n.     */..    s
5870: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53  tatePtr->ssl = S
5880: 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d  SL_new(statePtr-
5890: 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21  >ctx);.    if (!
58a0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b  statePtr->ssl) {
58b0: 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79  ../* SSL library
58c0: 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41   error */..Tcl_A
58d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
58e0: 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f  rp, "couldn't co
58f0: 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73  nstruct ssl sess
5900: 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  ion: ", REASON()
5910: 2c 0a 09 09 28 63 68 61 72 20 2a 29 20 4e 55 4c  ,...(char *) NUL
5920: 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63  L);..Tls_Free((c
5930: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
5940: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
5950: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5960: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61  /*.     * SSL Ca
5970: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a  llbacks.     */.
5980: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70  .    SSL_set_app
5990: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e  _data(statePtr->
59a0: 73 73 6c 2c 20 28 56 4f 49 44 20 2a 29 73 74 61  ssl, (VOID *)sta
59b0: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74  tePtr);./* point
59c0: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a   back to us */..
59d0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69      SSL_set_veri
59e0: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  fy(statePtr->ssl
59f0: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79  , verify, Verify
5a00: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20  Callback);..    
5a10: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 69 6e 66 6f  SSL_CTX_set_info
5a20: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
5a30: 74 72 2d 3e 63 74 78 2c 20 49 6e 66 6f 43 61 6c  tr->ctx, InfoCal
5a40: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20  lback);..    /* 
5a50: 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e  Create Tcl_Chann
5a60: 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a  el BIO Handler *
5a70: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
5a80: 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f  p_bio.= BIO_new_
5a90: 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49  tcl(statePtr, BI
5aa0: 4f 5f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74  O_CLOSE);.    st
5ab0: 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49  atePtr->bio.= BI
5ac0: 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28  O_new(BIO_f_ssl(
5ad0: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72  ));..    if (ser
5ae0: 76 65 72 29 20 7b 0a 09 73 74 61 74 65 50 74 72  ver) {..statePtr
5af0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
5b00: 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f  CL_SERVER;..SSL_
5b10: 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65  set_accept_state
5b20: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
5b30: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 53  .    } else {..S
5b40: 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73  SL_set_connect_s
5b50: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  tate(statePtr->s
5b60: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53  sl);.    }.    S
5b70: 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65  SL_set_bio(state
5b80: 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50  Ptr->ssl, stateP
5b90: 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65  tr->p_bio, state
5ba0: 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20  Ptr->p_bio);.   
5bb0: 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61   BIO_set_ssl(sta
5bc0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74  tePtr->bio, stat
5bd0: 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e  ePtr->ssl, BIO_N
5be0: 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a  OCLOSE);..    /*
5bf0: 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53  .     * End of S
5c00: 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a  SL Init.     */.
5c10: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
5c20: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
5c30: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  *) Tcl_GetChanne
5c40: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
5c50: 73 65 6c 66 29 2c 0a 09 20 20 20 20 54 43 4c 5f  self),..    TCL_
5c60: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
5c70: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
5c80: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
5c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
5cd0: 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e   CTX_Init -- con
5ce0: 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58  struct a SSL_CTX
5cf0: 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20   instance. *. * 
5d00: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61  Results:. *.A va
5d10: 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74  lid SSL_CTX inst
5d20: 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a  ance or NULL.. *
5d30: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
5d40: 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20  :. *.constructs 
5d50: 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58  SSL context (CTX
5d60: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ). *. *---------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
5db0: 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a  static SSL_CTX *
5dc0: 0a 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50  .CTX_Init(stateP
5dd0: 74 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 2c 20  tr, proto, key, 
5de0: 63 65 72 74 2c 20 43 41 64 69 72 2c 20 43 41 66  cert, CAdir, CAf
5df0: 69 6c 65 2c 20 63 69 70 68 65 72 73 29 0a 20 20  ile, ciphers).  
5e00: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
5e10: 72 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f  r;.    int proto
5e20: 3b 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 3b  ;.    char *key;
5e30: 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 3b  .    char *cert;
5e40: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72  .    char *CAdir
5e50: 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69  ;.    char *CAfi
5e60: 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69  le;.    char *ci
5e70: 70 68 65 72 73 3b 0a 7b 0a 20 20 20 20 54 63 6c  phers;.{.    Tcl
5e80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20  _Interp *interp 
5e90: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
5ea0: 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20  rp;.    SSL_CTX 
5eb0: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *ctx = NULL;.   
5ec0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b   Tcl_DString ds;
5ed0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
5ee0: 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66   ds1;.    int of
5ef0: 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 63  f = 0;..    /* c
5f00: 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78  reate SSL contex
5f10: 74 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  t */.#if !define
5f20: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
5f30: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a  efined(NO_SSL3).
5f40: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
5f50: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
5f60: 5f 53 53 4c 32 29 20 26 26 0a 09 45 4e 41 42 4c  _SSL2) &&..ENABL
5f70: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
5f80: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 63 74  OTO_SSL3)) {..ct
5f90: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28  x = SSL_CTX_new(
5fa0: 53 53 4c 76 32 33 5f 6d 65 74 68 6f 64 28 29 29  SSLv23_method())
5fb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 0a 23 65 6e  ;.    } else.#en
5fc0: 64 69 66 0a 20 20 20 20 69 66 20 28 45 4e 41 42  dif.    if (ENAB
5fd0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
5fe0: 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 23 69  ROTO_SSL2)) {.#i
5ff0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  f defined(NO_SSL
6000: 32 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  2)..Tcl_AppendRe
6010: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72  sult(interp, "pr
6020: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
6030: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
6040: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
6050: 29 30 3b 0a 23 65 6c 73 65 0a 09 63 74 78 20 3d  )0;.#else..ctx =
6060: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c   SSL_CTX_new(SSL
6070: 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 23 65  v2_method());.#e
6080: 6e 64 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20  ndif.    } else 
6090: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
60a0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
60b0: 31 29 29 20 7b 0a 09 63 74 78 20 3d 20 53 53 4c  1)) {..ctx = SSL
60c0: 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 6d  _CTX_new(TLSv1_m
60d0: 65 74 68 6f 64 28 29 29 3b 0a 20 20 20 20 7d 20  ethod());.    } 
60e0: 65 6c 73 65 20 69 66 20 28 45 4e 41 42 4c 45 44  else if (ENABLED
60f0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
6100: 4f 5f 53 53 4c 33 29 29 20 7b 0a 23 69 66 20 64  O_SSL3)) {.#if d
6110: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a  efined(NO_SSL3).
6120: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
6130: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f  t(interp, "proto
6140: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
6150: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  d", NULL);..retu
6160: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b  rn (SSL_CTX *)0;
6170: 0a 23 65 6c 73 65 0a 09 63 74 78 20 3d 20 53 53  .#else..ctx = SS
6180: 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f  L_CTX_new(SSLv3_
6190: 6d 65 74 68 6f 64 28 29 29 3b 0a 23 65 6e 64 69  method());.#endi
61a0: 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  f.    } else {..
61b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
61c0: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c  (interp, "no val
61d0: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  id protocol sele
61e0: 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  cted", NULL);..r
61f0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
6200: 29 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 66  )0;.    }.    of
6210: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
6220: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
6230: 4c 53 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  LS1) ? 0 : SSL_O
6240: 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 20 20 20  P_NO_TLSv1);.   
6250: 20 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44   off |= (ENABLED
6260: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
6270: 4f 5f 53 53 4c 32 29 20 3f 20 30 20 3a 20 53 53  O_SSL2) ? 0 : SS
6280: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a  L_OP_NO_SSLv2);.
6290: 20 20 20 20 6f 66 66 20 7c 3d 20 28 45 4e 41 42      off |= (ENAB
62a0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
62b0: 52 4f 54 4f 5f 53 53 4c 33 29 20 3f 20 30 20 3a  ROTO_SSL3) ? 0 :
62c0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33   SSL_OP_NO_SSLv3
62d0: 29 3b 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
62e0: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 20 63 74  set_app_data( ct
62f0: 78 2c 20 28 56 4f 49 44 2a 29 69 6e 74 65 72 70  x, (VOID*)interp
6300: 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74  );./* remember t
6310: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  he interpreter *
6320: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
6330: 74 5f 6f 70 74 69 6f 6e 73 28 20 63 74 78 2c 20  t_options( ctx, 
6340: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20  SSL_OP_ALL);./* 
6350: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b  all SSL bug work
6360: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53  arounds */.    S
6370: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
6380: 6e 73 28 20 63 74 78 2c 20 6f 66 66 29 3b 09 2f  ns( ctx, off);./
6390: 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f  * all SSL bug wo
63a0: 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20  rkarounds */.   
63b0: 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65   SSL_CTX_sess_se
63c0: 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 20 63 74  t_cache_size( ct
63d0: 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 69 66  x, 128);..    if
63e0: 20 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c   (ciphers != NUL
63f0: 4c 29 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  L)..SSL_CTX_set_
6400: 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c  cipher_list(ctx,
6410: 20 63 69 70 68 65 72 73 29 3b 0a 0a 20 20 20 20   ciphers);..    
6420: 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c  /* set some call
6430: 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c  backs */.    SSL
6440: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
6450: 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20  _passwd_cb(ctx, 
6460: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b  PasswordCallback
6470: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 42 53 41 46  );..#ifndef BSAF
6480: 45 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  E.    SSL_CTX_se
6490: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64  t_default_passwd
64a0: 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78  _cb_userdata(ctx
64b0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
64c0: 74 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  tr);.#endif..#if
64d0: 6e 64 65 66 20 4e 4f 5f 44 48 0a 20 20 20 20 7b  ndef NO_DH.    {
64e0: 0a 09 44 48 2a 20 64 68 20 3d 20 67 65 74 5f 64  ..DH* dh = get_d
64f0: 68 35 31 32 28 29 3b 0a 09 53 53 4c 5f 43 54 58  h512();..SSL_CTX
6500: 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c  _set_tmp_dh(ctx,
6510: 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 64   dh);..DH_free(d
6520: 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  h);.    }.#endif
6530: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72  ..    /* set our
6540: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
6550: 20 20 20 20 69 66 20 28 63 65 72 74 20 21 3d 20      if (cert != 
6560: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 53 74  NULL) {..Tcl_DSt
6570: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a  ringInit(&ds);..
6580: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
6590: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c  _certificate_fil
65a0: 65 28 63 74 78 2c 20 46 32 4e 28 20 63 65 72 74  e(ctx, F2N( cert
65b0: 2c 20 26 64 73 29 2c 0a 09 09 09 09 09 53 53 4c  , &ds),......SSL
65c0: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
65d0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
65e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
65f0: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ;..    Tcl_Appen
6600: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a  dResult(interp,.
6610: 09 09 09 20 20 20 20 20 22 75 6e 61 62 6c 65 20  ...     "unable 
6620: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61  to set certifica
6630: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 2c  te file ", cert,
6640: 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52   ": ",....     R
6650: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
6660: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
6670: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
6680: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 53  ..    return (SS
6690: 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 0a 09  L_CTX *)0;..}...
66a0: 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61  /* get the priva
66b0: 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  te key associate
66c0: 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74  d with this cert
66d0: 69 66 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28  ificate */..if (
66e0: 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 6b 65 79  key == NULL) key
66f0: 3d 63 65 72 74 3b 0a 0a 09 69 66 20 28 53 53 4c  =cert;...if (SSL
6700: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65  _CTX_use_Private
6710: 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32  Key_file(ctx, F2
6720: 4e 28 20 6b 65 79 2c 20 26 64 73 29 2c 0a 09 09  N( key, &ds),...
6730: 09 09 09 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  ...SSL_FILETYPE_
6740: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20  PEM) <= 0) {..  
6750: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
6760: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 2f 2a 20  e(&ds);..    /* 
6770: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68  flush the passph
6780: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74  rase which might
6790: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
67a0: 72 65 73 75 6c 74 20 2a 2f 0a 09 20 20 20 20 54  result */..    T
67b0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
67c0: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53  erp, NULL, TCL_S
67d0: 54 41 54 49 43 29 3b 0a 09 20 20 20 20 54 63 6c  TATIC);..    Tcl
67e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
67f0: 74 65 72 70 2c 0a 09 09 09 20 20 20 20 20 22 75  terp,....     "u
6800: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62  nable to set pub
6810: 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20  lic key file ", 
6820: 6b 65 79 2c 20 22 20 22 2c 0a 09 09 09 20 20 20  key, " ",....   
6830: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61    REASON(), (cha
6840: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
6850: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
6860: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
6870: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d  (SSL_CTX *)0;..}
6880: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
6890: 65 28 26 64 73 29 3b 0a 09 2f 2a 20 4e 6f 77 20  e(&ds);../* Now 
68a0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b  we know that a k
68b0: 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 65  ey and cert have
68c0: 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e 73   been set agains
68d0: 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63 6f  t.. * the SSL co
68e0: 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 53  ntext */..if (!S
68f0: 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 69  SL_CTX_check_pri
6900: 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20 7b  vate_key(ctx)) {
6910: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
6920: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09  Result(interp,..
6930: 09 09 20 20 20 20 20 22 70 72 69 76 61 74 65 20  ..     "private 
6940: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
6950: 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61  ch the certifica
6960: 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a  te public key",.
6970: 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29  ...     (char *)
6980: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
6990: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
69a0: 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c  .    return (SSL
69b0: 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20  _CTX *)0;..}.   
69c0: 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 20   } else {..cert 
69d0: 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65  = (char*)X509_ge
69e0: 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66  t_default_cert_f
69f0: 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c  ile();...if (SSL
6a00: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69  _CTX_use_certifi
6a10: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63  cate_file(ctx, c
6a20: 65 72 74 2c 0a 09 09 09 09 09 53 53 4c 5f 46 49  ert,......SSL_FI
6a30: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
6a40: 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54  ) {.#if 0..    T
6a50: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
6a60: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70  ds);..    Tcl_Ap
6a70: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6a80: 70 2c 0a 09 09 09 20 20 20 20 20 22 75 6e 61 62  p,....     "unab
6a90: 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c  le to use defaul
6aa0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
6ab0: 6c 65 20 22 2c 20 63 65 72 74 2c 20 22 3a 20 22  le ", cert, ": "
6ac0: 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e  ,....     REASON
6ad0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
6ae0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
6af0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
6b00: 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58   return (SSL_CTX
6b10: 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a   *)0;.#endif..}.
6b20: 20 20 20 20 7d 0a 09 0a 20 20 20 20 54 63 6c 5f      }...    Tcl_
6b30: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
6b40: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
6b50: 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20  gInit(&ds1);.   
6b60: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f   if (!SSL_CTX_lo
6b70: 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69  ad_verify_locati
6b80: 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66  ons(ctx, F2N(CAf
6b90: 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43  ile, &ds), F2N(C
6ba0: 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a  Adir, &ds1)) ||.
6bb0: 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65  .!SSL_CTX_set_de
6bc0: 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74  fault_verify_pat
6bd0: 68 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30  hs(ctx)) {.#if 0
6be0: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
6bf0: 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74  e(&ds);..Tcl_DSt
6c00: 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a  ringFree(&ds1);.
6c10: 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e  ./* Don't curren
6c20: 74 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73  tly care if this
6c30: 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41   fails */..Tcl_A
6c40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
6c50: 72 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74  rp, "SSL default
6c60: 20 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22   verify paths: "
6c70: 2c 0a 09 09 52 45 41 53 4f 4e 28 29 2c 20 28 63  ,...REASON(), (c
6c80: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
6c90: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
6ca0: 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43  ;..return (SSL_C
6cb0: 54 58 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 20  TX *)0;.#endif. 
6cc0: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 43 54 58     }.    SSL_CTX
6cd0: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c  _set_client_CA_l
6ce0: 69 73 74 28 63 74 78 2c 20 53 53 4c 5f 6c 6f 61  ist(ctx, SSL_loa
6cf0: 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65  d_client_CA_file
6d00: 28 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64  ( F2N(CAfile, &d
6d10: 73 29 20 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  s) ));..    Tcl_
6d20: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
6d30: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
6d40: 67 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20  gFree(&ds1);.   
6d50: 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c   return ctx;.}..
6d60: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
6db0: 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20  StatusObjCmd -- 
6dc0: 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61  return certifica
6dd0: 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64  te for connected
6de0: 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73   peer.. *. * Res
6df0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
6e00: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
6e10: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
6e20: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
6e30: 20 2a 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 2d  ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e70: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
6e80: 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d   int.StatusObjCm
6e90: 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e  d(clientData, in
6ea0: 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76  terp, objc, objv
6eb0: 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61  ).    ClientData
6ec0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20   clientData;./* 
6ed0: 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20  Not used. */.   
6ee0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
6ef0: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f 62 6a  erp;.    int obj
6f00: 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a  c;.    Tcl_Obj.*
6f10: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a 7b 0a  CONST objv[];.{.
6f20: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
6f30: 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70  Ptr;.    X509 *p
6f40: 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  eer;.    Tcl_Obj
6f50: 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63   *objPtr;.    Tc
6f60: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a  l_Channel chan;.
6f70: 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65      char *channe
6f80: 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b  lName, *ciphers;
6f90: 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 0a  .    int mode;..
6fa0: 20 20 20 20 73 77 69 74 63 68 20 28 6f 62 6a 63      switch (objc
6fb0: 29 20 7b 0a 09 63 61 73 65 20 32 3a 0a 09 20 20  ) {..case 2:..  
6fc0: 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20    channelName = 
6fd0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
6fe0: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55  mObj(objv[1], NU
6ff0: 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  LL);..    break;
7000: 0a 0a 09 63 61 73 65 20 33 3a 0a 09 20 20 20 20  ...case 3:..    
7010: 69 66 20 28 21 73 74 72 63 6d 70 20 28 54 63 6c  if (!strcmp (Tcl
7020: 5f 47 65 74 53 74 72 69 6e 67 20 28 6f 62 6a 76  _GetString (objv
7030: 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29  [1]), "-local"))
7040: 20 7b 0a 09 09 63 68 61 6e 6e 65 6c 4e 61 6d 65   {...channelName
7050: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
7060: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
7070: 20 4e 55 4c 4c 29 3b 0a 09 09 62 72 65 61 6b 3b   NULL);...break;
7080: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2f 2a 20  ..    }..    /* 
7090: 65 6c 73 65 20 66 61 6c 6c 2e 2e 2e 20 2a 2f 0a  else fall... */.
70a0: 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 54  .default:..    T
70b0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
70c0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
70d0: 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e   "?-local? chann
70e0: 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72  el");..    retur
70f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7100: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   }..    chan = T
7110: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
7120: 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d  terp, channelNam
7130: 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69  e, &mode);.    i
7140: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
7150: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
7160: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7170: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
7180: 20 28 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72   (channelTypeVer
7190: 73 69 6f 6e 20 3d 3d 20 54 4c 53 5f 43 48 41 4e  sion == TLS_CHAN
71a0: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 29 20 7b  NEL_VERSION_2) {
71b0: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75  ../*.. * Make su
71c0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
71d0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
71e0: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20  nnel.. */..chan 
71f0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
7200: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 7d  nel(chan);.    }
7210: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
7220: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
7230: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
7240: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
7250: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7260: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
7270: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
7280: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
7290: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53  .."\": not a TLS
72a0: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29   channel", NULL)
72b0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
72c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
72d0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65  tatePtr.= (State
72e0: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
72f0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
7300: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 6f 62  han);.    if (ob
7310: 6a 63 20 3d 3d 20 32 29 0a 09 70 65 65 72 09 3d  jc == 2)..peer.=
7320: 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65   SSL_get_peer_ce
7330: 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50  rtificate(stateP
7340: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 65 6c  tr->ssl);.    el
7350: 73 65 0a 09 70 65 65 72 09 3d 20 53 53 4c 5f 67  se..peer.= SSL_g
7360: 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73  et_certificate(s
7370: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
7380: 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09     if (peer) {..
7390: 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77  objPtr = Tls_New
73a0: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20  X509Obj(interp, 
73b0: 70 65 65 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73  peer);.    } els
73c0: 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63  e {..objPtr = Tc
73d0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
73e0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  NULL);.    }..  
73f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
7400: 65 6e 64 45 6c 65 6d 65 6e 74 20 28 69 6e 74 65  endElement (inte
7410: 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 20 20 20  rp, objPtr,..   
7420: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
7430: 6a 20 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29  j ("sbits", -1))
7440: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
7450: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 20 28  jAppendElement (
7460: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a  interp, objPtr,.
7470: 09 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  .    Tcl_NewIntO
7480: 62 6a 20 28 53 53 4c 5f 67 65 74 5f 63 69 70 68  bj (SSL_get_ciph
7490: 65 72 5f 62 69 74 73 20 28 73 74 61 74 65 50 74  er_bits (statePt
74a0: 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b  r->ssl, NULL)));
74b0: 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20  ..    ciphers = 
74c0: 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63  (char*)SSL_get_c
74d0: 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ipher(statePtr->
74e0: 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69  ssl);.    if (ci
74f0: 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 20 26 26  phers != NULL &&
7500: 20 73 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c   strcmp(ciphers,
7510: 20 22 28 4e 4f 4e 45 29 22 29 21 3d 30 29 20 7b   "(NONE)")!=0) {
7520: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
7530: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
7540: 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 54 63 6c  p, objPtr,...Tcl
7550: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
7560: 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54  ipher", -1));..T
7570: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
7580: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
7590: 6f 62 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e 65  objPtr,...Tcl_Ne
75a0: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67  wStringObj(SSL_g
75b0: 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50  et_cipher(stateP
75c0: 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a  tr->ssl), -1));.
75d0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
75e0: 74 4f 62 6a 52 65 73 75 6c 74 28 20 69 6e 74 65  tObjResult( inte
75f0: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
7600: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
7610: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
7660: 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64   * VersionObjCmd
7670: 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69   -- return versi
7680: 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f  on string from O
7690: 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65  penSSL.. *. * Re
76a0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
76b0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
76c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
76d0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
76e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
76f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7720: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
7730: 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a  c int.VersionObj
7740: 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20  Cmd(clientData, 
7750: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62  interp, objc, ob
7760: 6a 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61  jv).    ClientDa
7770: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f  ta clientData;./
7780: 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20  * Not used. */. 
7790: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
77a0: 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f  nterp;.    int o
77b0: 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  bjc;.    Tcl_Obj
77c0: 09 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a  .*CONST objv[];.
77d0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  {.    Tcl_Obj *o
77e0: 62 6a 50 74 72 3b 0a 0a 20 20 20 20 6f 62 6a 50  bjPtr;..    objP
77f0: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  tr = Tcl_NewStri
7800: 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45  ngObj(OPENSSL_VE
7810: 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b  RSION_TEXT, -1);
7820: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
7830: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
7840: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
7850: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
7860: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69  -------. *. * Mi
78b0: 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63  scObjCmd -- misc
78c0: 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20   commands. *. * 
78d0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
78e0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
78f0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
7900: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
7910: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
7920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7950: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
7960: 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43  tic int.MiscObjC
7970: 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 69  md(clientData, i
7980: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
7990: 76 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74  v).    ClientDat
79a0: 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a  a clientData;./*
79b0: 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20   Not used. */.  
79c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
79d0: 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 6f 62  terp;.    int ob
79e0: 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09  jc;.    Tcl_Obj.
79f0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 0a 7b  *CONST objv[];.{
7a00: 0a 20 20 20 20 43 4f 4e 53 54 38 34 20 63 68 61  .    CONST84 cha
7a10: 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d  r *commands [] =
7a20: 20 7b 20 22 72 65 71 22 2c 20 4e 55 4c 4c 20 7d   { "req", NULL }
7a30: 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61  ;.    enum comma
7a40: 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 44 55  nd { C_REQ, C_DU
7a50: 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63  MMY };.    int c
7a60: 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  md;..    if (obj
7a70: 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72  c < 2) {..Tcl_Wr
7a80: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
7a90: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62  p, 1, objv, "sub
7aa0: 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29  command ?args?")
7ab0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
7ac0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
7ad0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
7ae0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
7af0: 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73  bjv[1], commands
7b00: 2c 0a 09 20 20 20 20 22 63 6f 6d 6d 61 6e 64 22  ,..    "command"
7b10: 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c  , 0,&cmd) != TCL
7b20: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
7b30: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7b40: 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e  .    switch ((en
7b50: 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29  um command) cmd)
7b60: 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 20   {..case C_REQ: 
7b70: 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20  {..    EVP_PKEY 
7b80: 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *pkey=NULL;..   
7b90: 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c   X509 *cert=NULL
7ba0: 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45  ;..    X509_NAME
7bb0: 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20   *name=NULL;..  
7bc0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74    Tcl_Obj **list
7bd0: 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74  v;..    int list
7be0: 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a  c,i;...    BIO *
7bf0: 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20  out=NULL;...    
7c00: 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f  char *k_C="",*k_
7c10: 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b  ST="",*k_L="",*k
7c20: 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a  _O="",*k_OU="",*
7c30: 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c  k_CN="",*k_Email
7c40: 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a  ="";..    char *
7c50: 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a  keyout,*pemout,*
7c60: 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65  str;..    int ke
7c70: 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64  ysize,serial=0,d
7c80: 61 79 73 3d 33 36 35 3b 0a 09 20 20 20 20 0a 09  ays=365;..    ..
7c90: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29      if ((objc<5)
7ca0: 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a   || (objc>6)) {.
7cb0: 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
7cc0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
7cd0: 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79  jv, "keysize key
7ce0: 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69  file certfile ?i
7cf0: 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e  nfo?");...return
7d00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
7d10: 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c   }...    if (Tcl
7d20: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
7d30: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
7d40: 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c  &keysize) != TCL
7d50: 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20  _OK) {...return 
7d60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
7d70: 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63  }..    keyout=Tc
7d80: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
7d90: 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75  [3]);..    pemou
7da0: 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  t=Tcl_GetString(
7db0: 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 09 20 20 20 20  objv[4]);...    
7dc0: 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09  if (objc>=6) {..
7dd0: 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a  .if (Tcl_ListObj
7de0: 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65  GetElements(inte
7df0: 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09  rp, objv[5],....
7e00: 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20  &listc, &listv) 
7e10: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20  != TCL_OK) {... 
7e20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7e30: 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ROR;...}....if (
7e40: 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20  (listc%2) != 0) 
7e50: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52  {...    Tcl_SetR
7e60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e  esult(interp,"In
7e70: 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d  formation list m
7e80: 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75  ust have even nu
7e90: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
7ea0: 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  s",NULL);...    
7eb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7ec0: 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30  ;...}...for (i=0
7ed0: 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29  ; i<listc; i+=2)
7ee0: 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c   {...    str=Tcl
7ef0: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
7f00: 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28  [i]);...    if (
7f10: 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73  strcmp(str,"days
7f20: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28  ")==0) {....if (
7f30: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
7f40: 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69  j(interp,listv[i
7f50: 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f  +1],&days)!=TCL_
7f60: 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72  OK)....    retur
7f70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20  n TCL_ERROR;... 
7f80: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
7f90: 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c  rcmp(str,"serial
7fa0: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28  ")==0) {....if (
7fb0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
7fc0: 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69  j(interp,listv[i
7fd0: 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43  +1],&serial)!=TC
7fe0: 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74  L_OK)....    ret
7ff0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
8000: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
8010: 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69  strcmp(str,"seri
8020: 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  al")==0) {....if
8030: 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
8040: 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
8050: 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d  [i+1],&serial)!=
8060: 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72  TCL_OK)....    r
8070: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8080: 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
8090: 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22   (strcmp(str,"C"
80a0: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54  )==0) {....k_C=T
80b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
80c0: 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
80d0: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
80e0: 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20  p(str,"ST")==0) 
80f0: 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65  {....k_ST=Tcl_Ge
8100: 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
8110: 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
8120: 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
8130: 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ,"L")==0) {....k
8140: 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  _L=Tcl_GetString
8150: 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
8160: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
8170: 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d  trcmp(str,"O")==
8180: 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f  0) {....k_O=Tcl_
8190: 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
81a0: 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
81b0: 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
81c0: 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09  tr,"OU")==0) {..
81d0: 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74  ..k_OU=Tcl_GetSt
81e0: 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
81f0: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
8200: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
8210: 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43  N")==0) {....k_C
8220: 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  N=Tcl_GetString(
8230: 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
8240: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
8250: 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22  rcmp(str,"Email"
8260: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61  )==0) {....k_Ema
8270: 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  il=Tcl_GetString
8280: 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
8290: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09      } else {....
82a0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
82b0: 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61  terp,"Unknown pa
82c0: 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a  rameter",NULL);.
82d0: 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
82e0: 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d  ROR;...    }...}
82f0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20  ..    }..    if 
8300: 28 28 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45  ((pkey = EVP_PKE
8310: 59 5f 6e 65 77 28 29 29 20 21 3d 20 4e 55 4c 4c  Y_new()) != NULL
8320: 29 20 7b 0a 09 09 69 66 20 28 21 45 56 50 5f 50  ) {...if (!EVP_P
8330: 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70  KEY_assign_RSA(p
8340: 6b 65 79 2c 0a 09 09 09 52 53 41 5f 67 65 6e 65  key,....RSA_gene
8350: 72 61 74 65 5f 6b 65 79 28 6b 65 79 73 69 7a 65  rate_key(keysize
8360: 2c 20 30 78 31 30 30 30 31 2c 20 4e 55 4c 4c 2c  , 0x10001, NULL,
8370: 20 4e 55 4c 4c 29 29 29 20 7b 0a 09 09 20 20 20   NULL))) {...   
8380: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
8390: 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e  nterp,"Error gen
83a0: 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20  erating private 
83b0: 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  key",NULL);...  
83c0: 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
83d0: 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 72 65 74  pkey);...    ret
83e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
83f0: 09 7d 0a 09 09 6f 75 74 3d 42 49 4f 5f 6e 65 77  .}...out=BIO_new
8400: 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a  (BIO_s_file());.
8410: 09 09 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65  ..BIO_write_file
8420: 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29  name(out,keyout)
8430: 3b 0a 09 09 50 45 4d 5f 77 72 69 74 65 5f 62 69  ;...PEM_write_bi
8440: 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74  o_PrivateKey(out
8450: 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c  ,pkey,NULL,NULL,
8460: 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09  0,NULL,NULL);...
8470: 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74  BIO_free_all(out
8480: 29 3b 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d  );....if ((cert=
8490: 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c  X509_new())==NUL
84a0: 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  L) {...    Tcl_S
84b0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
84c0: 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
84d0: 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65  g certificate re
84e0: 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09  quest",NULL);...
84f0: 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65      EVP_PKEY_fre
8500: 65 28 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 72  e(pkey);...    r
8510: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
8520: 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65  ;...}....X509_se
8530: 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32  t_version(cert,2
8540: 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45  );...ASN1_INTEGE
8550: 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73  R_set(X509_get_s
8560: 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74  erialNumber(cert
8570: 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30  ),serial);...X50
8580: 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
8590: 39 5f 67 65 74 5f 6e 6f 74 42 65 66 6f 72 65 28  9_get_notBefore(
85a0: 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39  cert),0);...X509
85b0: 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
85c0: 5f 67 65 74 5f 6e 6f 74 41 66 74 65 72 28 63 65  _get_notAfter(ce
85d0: 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a  rt),(long)60*60*
85e0: 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39  24*days);...X509
85f0: 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74  _set_pubkey(cert
8600: 2c 70 6b 65 79 29 3b 0a 09 09 0a 09 09 6e 61 6d  ,pkey);......nam
8610: 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65  e=X509_get_subje
8620: 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a  ct_name(cert);..
8630: 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
8640: 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
8650: 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"C", MBSTRING_
8660: 41 53 43 2c 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31  ASC, k_C, -1, -1
8670: 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
8680: 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
8690: 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42  xt(name,"ST", MB
86a0: 53 54 52 49 4e 47 5f 41 53 43 2c 20 6b 5f 53 54  STRING_ASC, k_ST
86b0: 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
86c0: 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
86d0: 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
86e0: 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  "L", MBSTRING_AS
86f0: 43 2c 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20  C, k_L, -1, -1, 
8700: 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
8710: 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
8720: 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52  (name,"O", MBSTR
8730: 49 4e 47 5f 41 53 43 2c 20 6b 5f 4f 2c 20 2d 31  ING_ASC, k_O, -1
8740: 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
8750: 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
8760: 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22  by_txt(name,"OU"
8770: 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
8780: 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_OU, -1, -1, 0)
8790: 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
87a0: 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
87b0: 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49  ame,"CN", MBSTRI
87c0: 4e 47 5f 41 53 43 2c 20 6b 5f 43 4e 2c 20 2d 31  NG_ASC, k_CN, -1
87d0: 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
87e0: 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
87f0: 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61  by_txt(name,"Ema
8800: 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  il", MBSTRING_AS
8810: 43 2c 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20  C, k_Email, -1, 
8820: 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f  -1, 0);....X509_
8830: 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65  set_subject_name
8840: 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09  (cert,name);....
8850: 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63  if (!X509_sign(c
8860: 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 6d 64 35  ert,pkey,EVP_md5
8870: 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30  ())) {...    X50
8880: 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09  9_free(cert);...
8890: 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65      EVP_PKEY_fre
88a0: 65 28 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 54  e(pkey);...    T
88b0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
88c0: 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69  erp,"Error signi
88d0: 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c  ng certificate",
88e0: 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74  NULL);...    ret
88f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
8900: 09 7d 0a 0a 09 09 6f 75 74 3d 42 49 4f 5f 6e 65  .}....out=BIO_ne
8910: 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b  w(BIO_s_file());
8920: 0a 09 09 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c  ...BIO_write_fil
8930: 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74  ename(out,pemout
8940: 29 3b 0a 0a 09 09 50 45 4d 5f 77 72 69 74 65 5f  );....PEM_write_
8950: 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72  bio_X509(out,cer
8960: 74 29 3b 0a 09 09 42 49 4f 5f 66 72 65 65 5f 61  t);...BIO_free_a
8970: 6c 6c 28 6f 75 74 29 3b 0a 0a 09 09 58 35 30 39  ll(out);....X509
8980: 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45  _free(cert);...E
8990: 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
89a0: 79 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  y);..    } else 
89b0: 7b 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  {...Tcl_SetResul
89c0: 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
89d0: 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61  generating priva
89e0: 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09  te key",NULL);..
89f0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
8a00: 52 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72  R;..    }..}..br
8a10: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
8a20: 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  :..break;.    }.
8a30: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
8a40: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
8a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8a90: 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d   *. * Tls_Free -
8aa0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
8ab0: 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70  cedure cleans up
8ac0: 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b   when a SSL sock
8ad0: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c  et based channel
8ae0: 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e  . *.is closed an
8af0: 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  d its reference 
8b00: 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f  count falls belo
8b10: 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  w 1. *. * Result
8b20: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.none. *. *
8b30: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
8b40: 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20  *.Frees all the 
8b50: 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  state. *. *-----
8b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8ba0: 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65  */.void.Tls_Free
8bb0: 28 20 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72  ( char *blockPtr
8bc0: 20 29 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a   ).{.    State *
8bd0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
8be0: 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20  e *)blockPtr;.. 
8bf0: 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61     Tls_Clean(sta
8c00: 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72  tePtr);.    ckfr
8c10: 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a  ee(blockPtr);.}.
8c20: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
8c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
8c70: 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a   Tls_Clean --. *
8c80: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
8c90: 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65  re cleans up whe
8ca0: 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  n a SSL socket b
8cb0: 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09  ased channel. *.
8cc0: 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74  is closed and it
8cd0: 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
8ce0: 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e  t falls below 1.
8cf0: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a    This should. *
8d00: 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68  .be called synch
8d10: 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20  ronously by the 
8d20: 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69  CloseProc, not i
8d30: 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61  n the. *.Eventua
8d40: 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b  llyFree callback
8d50: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
8d60: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.none. *. * S
8d70: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
8d80: 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74  Frees all the st
8d90: 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ate. *. *-------
8da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
8de0: 0a 76 6f 69 64 0a 54 6c 73 5f 43 6c 65 61 6e 28  .void.Tls_Clean(
8df0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29  State *statePtr)
8e00: 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  .{.    /*.     *
8e10: 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20   we're assuming 
8e20: 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20  here that we're 
8e30: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a  single-threaded.
8e40: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20       */..    if 
8e50: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
8e60: 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f   != (Tcl_TimerTo
8e70: 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ken) NULL) {..Tc
8e80: 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e  l_DeleteTimerHan
8e90: 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74  dler(statePtr->t
8ea0: 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72  imer);..statePtr
8eb0: 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a  ->timer = NULL;.
8ec0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
8ed0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a  tatePtr->bio) {.
8ee0: 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61  ./* This will ca
8ef0: 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e  ll SSL_shutdown.
8f00: 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a   Bug 1414045 */.
8f10: 09 64 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .dprintf(stderr,
8f20: 20 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25   "BIO_free_all(%
8f30: 70 29 5c 6e 22 2c 20 73 74 61 74 65 50 74 72 2d  p)\n", statePtr-
8f40: 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65  >bio);..BIO_free
8f50: 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62  _all(statePtr->b
8f60: 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  io);..statePtr->
8f70: 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  bio = NULL;.    
8f80: 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
8f90: 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69  tr->ssl) {..dpri
8fa0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 53 4c  ntf(stderr, "SSL
8fb0: 5f 66 72 65 65 28 25 70 29 5c 6e 22 2c 20 73 74  _free(%p)\n", st
8fc0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53  atePtr->ssl);..S
8fd0: 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  SL_free(statePtr
8fe0: 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74  ->ssl);..statePt
8ff0: 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20  r->ssl = NULL;. 
9000: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
9010: 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53  tePtr->ctx) {..S
9020: 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74  SL_CTX_free(stat
9030: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61  ePtr->ctx);..sta
9040: 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c  tePtr->ctx = NUL
9050: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
9060: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
9070: 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  ack) {..Tcl_Decr
9080: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
9090: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73  r->callback);..s
90a0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
90b0: 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  k = NULL;.    }.
90c0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
90d0: 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54  ->password) {..T
90e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
90f0: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
9100: 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  rd);..statePtr->
9110: 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b  password = NULL;
9120: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  .    }.}.../*. *
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9170: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e  ---. *. * Tls_In
9180: 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  it --. *. *.This
9190: 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e   is a package in
91a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
91b0: 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73  cedure, which is
91c0: 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63   called. *.by Tc
91d0: 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b  l when this pack
91e0: 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64  age is to be add
91f0: 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72  ed to an interpr
9200: 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  eter.. *. * Resu
9210: 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67  lts:  Ssl config
9220: 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a  ured and loaded.
9230: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
9240: 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74  ts:. *. create t
9250: 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20  he ssl command, 
9260: 69 6e 69 74 69 61 6c 69 73 65 20 73 73 6c 20 63  initialise ssl c
9270: 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ontext. *. *----
9280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
92c0: 20 2a 2f 0a 0a 69 6e 74 0a 54 6c 73 5f 49 6e 69   */..int.Tls_Ini
92d0: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
92e0: 74 65 72 70 29 09 09 2f 2a 20 49 6e 74 65 72 70  terp)../* Interp
92f0: 72 65 74 65 72 20 69 6e 20 77 68 69 63 68 20 74  reter in which t
9300: 68 65 20 70 61 63 6b 61 67 65 20 69 73 0a 09 09  he package is...
9310: 09 09 09 20 2a 20 74 6f 20 62 65 20 6d 61 64 65  ... * to be made
9320: 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 7b   available. */.{
9330: 0a 20 20 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20  .    int major, 
9340: 6d 69 6e 6f 72 2c 20 70 61 74 63 68 6c 65 76 65  minor, patchleve
9350: 6c 2c 20 72 65 6c 65 61 73 65 2c 20 69 3b 0a 20  l, release, i;. 
9360: 20 20 20 63 68 61 72 20 72 6e 64 5f 73 65 65 64     char rnd_seed
9370: 5b 31 36 5d 20 3d 20 22 47 72 7a 53 6c 70 6c 4b  [16] = "GrzSlplK
9380: 71 55 64 6e 6e 7a 50 21 22 3b 09 2f 2a 20 31 36  qUdnnzP!";./* 16
9390: 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20 2f   bytes */..    /
93a0: 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 6f 72 69  *.     * The ori
93b0: 67 69 6e 61 6c 20 38 2e 32 2e 30 20 73 74 61 63  ginal 8.2.0 stac
93c0: 6b 65 64 20 63 68 61 6e 6e 65 6c 20 69 6d 70 6c  ked channel impl
93d0: 65 6d 65 6e 74 61 74 69 6f 6e 20 28 61 6e 64 20  ementation (and 
93e0: 74 68 65 20 70 61 74 63 68 0a 20 20 20 20 20 2a  the patch.     *
93f0: 20 74 68 61 74 20 70 72 65 63 65 64 65 64 20 69   that preceded i
9400: 74 29 20 68 61 64 20 70 72 6f 62 6c 65 6d 73 20  t) had problems 
9410: 77 69 74 68 20 73 63 61 6c 61 62 69 6c 69 74 79  with scalability
9420: 20 61 6e 64 20 72 6f 62 75 73 74 6e 65 73 73 2e   and robustness.
9430: 0a 20 20 20 20 20 2a 20 54 68 65 73 65 20 77 65  .     * These we
9440: 72 65 20 61 64 64 72 65 73 73 20 69 6e 20 38 2e  re address in 8.
9450: 33 2e 32 20 2f 20 38 2e 34 61 32 2c 20 73 6f 20  3.2 / 8.4a2, so 
9460: 77 65 20 6e 6f 77 20 72 65 71 75 69 72 65 20 74  we now require t
9470: 68 61 74 20 61 73 20 61 0a 20 20 20 20 20 2a 20  hat as a.     * 
9480: 6d 69 6e 69 6d 75 6d 20 66 6f 72 20 54 4c 53 20  minimum for TLS 
9490: 31 2e 34 2b 2e 20 20 57 65 20 6f 6e 6c 79 20 73  1.4+.  We only s
94a0: 75 70 70 6f 72 74 20 38 2e 32 2b 20 6e 6f 77 20  upport 8.2+ now 
94b0: 28 38 2e 33 2e 32 2b 20 70 72 65 66 65 72 72 65  (8.3.2+ preferre
94c0: 64 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  d)..     */.    
94d0: 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f  if (.#ifdef USE_
94e0: 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f 49  TCL_STUBS..Tcl_I
94f0: 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c  nitStubs(interp,
9500: 20 22 38 2e 32 22 2c 20 30 29 0a 23 65 6c 73 65   "8.2", 0).#else
9510: 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65  ..Tcl_PkgRequire
9520: 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20  (interp, "Tcl", 
9530: 22 38 2e 32 22 2c 20 30 29 0a 23 65 6e 64 69 66  "8.2", 0).#endif
9540: 0a 09 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  ..== NULL) {..re
9550: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9560: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
9570: 20 20 20 2a 20 47 65 74 20 74 68 65 20 76 65 72     * Get the ver
9580: 73 69 6f 6e 20 73 6f 20 77 65 20 63 61 6e 20 72  sion so we can r
9590: 75 6e 74 69 6d 65 20 73 77 69 74 63 68 20 6f 6e  untime switch on
95a0: 20 61 76 61 69 6c 61 62 6c 65 20 66 75 6e 63 74   available funct
95b0: 69 6f 6e 61 6c 69 74 79 2e 0a 20 20 20 20 20 2a  ionality..     *
95c0: 20 54 4c 53 20 73 68 6f 75 6c 64 20 72 65 61 6c   TLS should real
95d0: 6c 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ly only be used 
95e0: 69 6e 20 38 2e 33 2e 32 2b 2c 20 62 75 74 20 74  in 8.3.2+, but t
95f0: 68 65 20 6f 74 68 65 72 20 77 6f 72 6b 73 20 66  he other works f
9600: 6f 72 0a 20 20 20 20 20 2a 20 73 6f 6d 65 20 6c  or.     * some l
9610: 69 6d 69 74 65 64 20 66 75 6e 63 74 69 6f 6e 61  imited functiona
9620: 6c 69 74 79 2c 20 73 6f 20 61 6e 20 61 74 74 65  lity, so an atte
9630: 6d 70 74 20 61 74 20 73 75 70 70 6f 72 74 20 69  mpt at support i
9640: 73 20 6d 61 64 65 2e 0a 20 20 20 20 20 2a 2f 0a  s made..     */.
9650: 20 20 20 20 54 63 6c 5f 47 65 74 56 65 72 73 69      Tcl_GetVersi
9660: 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f  on(&major, &mino
9670: 72 2c 20 26 70 61 74 63 68 6c 65 76 65 6c 2c 20  r, &patchlevel, 
9680: 26 72 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 69  &release);.    i
9690: 66 20 28 28 6d 61 6a 6f 72 20 3e 20 38 29 20 7c  f ((major > 8) |
96a0: 7c 20 28 28 6d 61 6a 6f 72 20 3d 3d 20 38 29 20  | ((major == 8) 
96b0: 26 26 20 28 28 6d 69 6e 6f 72 20 3e 20 33 29 20  && ((minor > 3) 
96c0: 7c 7c 20 28 28 6d 69 6e 6f 72 20 3d 3d 20 33 29  || ((minor == 3)
96d0: 20 26 26 0a 09 20 20 20 20 28 72 65 6c 65 61 73   &&..    (releas
96e0: 65 20 3d 3d 20 54 43 4c 5f 46 49 4e 41 4c 5f 52  e == TCL_FINAL_R
96f0: 45 4c 45 41 53 45 29 20 26 26 20 28 70 61 74 63  ELEASE) && (patc
9700: 68 6c 65 76 65 6c 20 3e 3d 20 32 29 29 29 29 29  hlevel >= 2)))))
9710: 20 7b 0a 09 2f 2a 20 38 2e 33 2e 32 2b 20 2a 2f   {../* 8.3.2+ */
9720: 0a 09 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72  ..channelTypeVer
9730: 73 69 6f 6e 20 3d 20 54 4c 53 5f 43 48 41 4e 4e  sion = TLS_CHANN
9740: 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 3b 0a 20 20  EL_VERSION_2;.  
9750: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 38    } else {../* 8
9760: 2e 32 2e 30 20 2d 20 38 2e 33 2e 31 20 2a 2f 0a  .2.0 - 8.3.1 */.
9770: 09 63 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73  .channelTypeVers
9780: 69 6f 6e 20 3d 20 54 4c 53 5f 43 48 41 4e 4e 45  ion = TLS_CHANNE
9790: 4c 5f 56 45 52 53 49 4f 4e 5f 31 3b 0a 20 20 20  L_VERSION_1;.   
97a0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 53 53 4c 5f   }..    if (SSL_
97b0: 6c 69 62 72 61 72 79 5f 69 6e 69 74 28 29 20 21  library_init() !
97c0: 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  = 1) {..Tcl_Appe
97d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
97e0: 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74   "could not init
97f0: 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61  ialize SSL libra
9800: 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ry", NULL);..ret
9810: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9820: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 6c 6f 61     }.    SSL_loa
9830: 64 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 73 28  d_error_strings(
9840: 29 3b 0a 20 20 20 20 45 52 52 5f 6c 6f 61 64 5f  );.    ERR_load_
9850: 63 72 79 70 74 6f 5f 73 74 72 69 6e 67 73 28 29  crypto_strings()
9860: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
9870: 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d   Seed the random
9880: 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
9890: 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62  r in the SSL lib
98a0: 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69  rary,.     * usi
98b0: 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20  ng the do/while 
98c0: 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73  construct becaus
98d0: 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74  e of the bug not
98e0: 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20  e in the.     * 
98f0: 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68  OpenSSL FAQ at h
9900: 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73  ttp://www.openss
9910: 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61  l.org/support/fa
9920: 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20  q.html#USER1.   
9930: 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63    *.     * The c
9940: 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c  rux of the probl
9950: 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72  em is that Solar
9960: 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61  is 7 does not ha
9970: 76 65 20 61 20 0a 20 20 20 20 20 2a 20 2f 64 65  ve a .     * /de
9980: 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76  v/random or /dev
9990: 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20  /urandom device 
99a0: 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74  so it cannot gat
99b0: 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20  her enough.     
99c0: 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74  * entropy from t
99d0: 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77  he RAND_seed() w
99e0: 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69  hen TLS initiali
99f0: 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a  zes and refuses.
9a00: 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72       * to go fur
9a10: 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65  ther. Earlier ve
9a20: 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53  rsions of OpenSS
9a30: 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67  L carried on reg
9a40: 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f  ardless..     */
9a50: 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69  .    srand((unsi
9a60: 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28  gned int) time((
9a70: 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29  time_t *) NULL))
9a80: 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20  ;.    do {..for 
9a90: 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20  (i = 0; i < 16; 
9aa0: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f  i++) {..    rnd_
9ab0: 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63  seed[i] = 1 + (c
9ac0: 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61  har) (255.0 * ra
9ad0: 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31  nd()/(RAND_MAX+1
9ae0: 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73  .0));..}..RAND_s
9af0: 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69  eed(rnd_seed, si
9b00: 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b  zeof(rnd_seed));
9b10: 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41  .    } while (RA
9b20: 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31  ND_status() != 1
9b30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  );..    Tcl_Crea
9b40: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
9b50: 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65  erp, "tls::ciphe
9b60: 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43  rs", CiphersObjC
9b70: 6d 64 2c 0a 09 20 20 20 20 28 43 6c 69 65 6e 74  md,..    (Client
9b80: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
9b90: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
9ba0: 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43  ULL);..    Tcl_C
9bb0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
9bc0: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61  interp, "tls::ha
9bd0: 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68  ndshake", Handsh
9be0: 61 6b 65 4f 62 6a 43 6d 64 2c 0a 09 20 20 20 20  akeObjCmd,..    
9bf0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
9c00: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
9c10: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20  oc *) NULL);..  
9c20: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
9c30: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
9c40: 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d  tls::import", Im
9c50: 70 6f 72 74 4f 62 6a 43 6d 64 2c 0a 09 20 20 20  portObjCmd,..   
9c60: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
9c70: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
9c80: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20  roc *) NULL);.. 
9c90: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
9ca0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
9cb0: 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53  "tls::status", S
9cc0: 74 61 74 75 73 4f 62 6a 43 6d 64 2c 0a 09 20 20  tatusObjCmd,..  
9cd0: 20 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30    (ClientData) 0
9ce0: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
9cf0: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a  Proc *) NULL);..
9d00: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
9d10: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
9d20: 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c   "tls::version",
9d30: 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 0a   VersionObjCmd,.
9d40: 09 20 20 20 20 28 43 6c 69 65 6e 74 44 61 74 61  .    (ClientData
9d50: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
9d60: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
9d70: 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ;..    Tcl_Creat
9d80: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
9d90: 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c  rp, "tls::misc",
9da0: 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 0a 09 20 20   MiscObjCmd,..  
9db0: 20 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30    (ClientData) 0
9dc0: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
9dd0: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a  Proc *) NULL);..
9de0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50      return Tcl_P
9df0: 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
9e00: 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20  , PACKAGE_NAME, 
9e10: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
9e20: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
9e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e60: 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66  -*. *. *.Tls_Saf
9e70: 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d  eInit --. *. *.-
9e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
9eb0: 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f  . *.Standard pro
9ec0: 63 65 64 75 72 65 20 72 65 71 75 69 72 65 64 20  cedure required 
9ed0: 62 79 20 27 6c 6f 61 64 27 2e 20 0a 20 2a 09 49  by 'load'. . *.I
9ee0: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20  nitializes this 
9ef0: 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20  extension for a 
9f00: 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72  safe interpreter
9f10: 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *.-----------
9f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f40: 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64  -----*. *. *.Sid
9f50: 65 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73  eeffects:. *..As
9f60: 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20   of 'Tls_Init'. 
9f70: 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09  *. *.Result:. *.
9f80: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
9f90: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20  error code.. *. 
9fa0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
9fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9fd0: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 69 6e  -------*. */..in
9fe0: 74 0a 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 28  t.Tls_SafeInit (
9ff0: 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65  Tcl_Interp* inte
a000: 72 70 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e  rp).{.    return
a010: 20 54 6c 73 5f 49 6e 69 74 20 28 69 6e 74 65 72   Tls_Init (inter
a020: 70 29 3b 0a 7d 0a                                p);.}.