Hex Artifact Content

Artifact 0d8631d8e5b3ee9ee09eecefd9947e20ed23374f00bbf712c0426904bb56c48a:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 6c 69 62 2e 68 3e 0a 0a 2f 2a 20 4d  <stdlib.h>../* M
0370: 69 6e 20 4f 70 65 6e 53 53 4c 20 76 65 72 73 69  in OpenSSL versi
0380: 6f 6e 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  on */.#if OPENSS
0390: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
03a0: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 23   < 0x10101000L.#
03b0: 65 72 72 6f 72 20 22 4f 6e 6c 79 20 4f 70 65 6e  error "Only Open
03c0: 53 53 4c 20 76 31 2e 31 2e 31 20 6f 72 20 6c 61  SSL v1.1.1 or la
03d0: 74 65 72 20 69 73 20 73 75 70 70 6f 72 74 65 64  ter is supported
03e0: 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ".#endif../*. * 
03f0: 45 78 74 65 72 6e 61 6c 20 66 75 6e 63 74 69 6f  External functio
0400: 6e 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f  ns. */../*. * Fo
0410: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
0420: 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  ns. */..#define 
0430: 46 32 4e 28 6b 65 79 2c 20 64 73 70 29 20 5c 0a  F2N(key, dsp) \.
0440: 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c  .(((key) == NULL
0450: 29 20 3f 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  ) ? (char *)NULL
0460: 20 3a 20 5c 0a 09 09 54 63 6c 5f 54 72 61 6e 73   : \...Tcl_Trans
0470: 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74  lateFileName(int
0480: 65 72 70 2c 20 28 6b 65 79 29 2c 20 28 64 73 70  erp, (key), (dsp
0490: 29 29 29 0a 23 64 65 66 69 6e 65 20 52 45 41 53  ))).#define REAS
04a0: 4f 4e 28 29 09 45 52 52 5f 72 65 61 73 6f 6e 5f  ON().ERR_reason_
04b0: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52  error_string(ERR
04c0: 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 0a 0a 73  _get_error())..s
04d0: 74 61 74 69 63 20 76 6f 69 64 09 49 6e 66 6f 43  tatic void.InfoC
04e0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
04f0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72  L *ssl, int wher
0500: 65 2c 20 69 6e 74 20 72 65 74 29 3b 0a 0a 73 74  e, int ret);..st
0510: 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43 6d 64 50  atic Tcl_ObjCmdP
0520: 72 6f 63 20 43 69 70 68 65 72 73 4f 62 6a 43 6d  roc CiphersObjCm
0530: 64 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62  d;.static Tcl_Ob
0540: 6a 43 6d 64 50 72 6f 63 20 48 61 6e 64 73 68 61  jCmdProc Handsha
0550: 6b 65 4f 62 6a 43 6d 64 3b 0a 73 74 61 74 69 63  keObjCmd;.static
0560: 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20   Tcl_ObjCmdProc 
0570: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 3b 0a 73 74  ImportObjCmd;.st
0580: 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43 6d 64 50  atic Tcl_ObjCmdP
0590: 72 6f 63 20 53 74 61 74 75 73 4f 62 6a 43 6d 64  roc StatusObjCmd
05a0: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a  ;.static Tcl_Obj
05b0: 43 6d 64 50 72 6f 63 20 56 65 72 73 69 6f 6e 4f  CmdProc VersionO
05c0: 62 6a 43 6d 64 3b 0a 73 74 61 74 69 63 20 54 63  bjCmd;.static Tc
05d0: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 4d 69 73  l_ObjCmdProc Mis
05e0: 63 4f 62 6a 43 6d 64 3b 0a 73 74 61 74 69 63 20  cObjCmd;.static 
05f0: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 55  Tcl_ObjCmdProc U
0600: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 3b 0a 0a  nimportObjCmd;..
0610: 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a  static SSL_CTX *
0620: 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a  CTX_Init(State *
0630: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73  statePtr, int is
0640: 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74  Server, int prot
0650: 6f 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09  o, char *key,...
0660: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 20  char *certfile, 
0670: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b  unsigned char *k
0680: 65 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e 65  ey_asn1, unsigne
0690: 64 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73 6e  d char *cert_asn
06a0: 31 2c 0a 09 09 69 6e 74 20 6b 65 79 5f 61 73 6e  1,...int key_asn
06b0: 31 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f  1_len, int cert_
06c0: 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 61 72 20 2a  asn1_len, char *
06d0: 43 41 64 69 72 2c 20 63 68 61 72 20 2a 43 41 66  CAdir, char *CAf
06e0: 69 6c 65 2c 0a 09 09 63 68 61 72 20 2a 63 69 70  ile,...char *cip
06f0: 68 65 72 73 2c 20 63 68 61 72 20 2a 44 48 70 61  hers, char *DHpa
0700: 72 61 6d 73 29 3b 0a 0a 73 74 61 74 69 63 20 69  rams);..static i
0710: 6e 74 09 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e  nt.TlsLibInit(in
0720: 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 3b  t uninitialize);
0730: 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52  ..#define TLS_PR
0740: 4f 54 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23  OTO_SSL2..0x01.#
0750: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0760: 5f 53 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66  _SSL3..0x02.#def
0770: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ine TLS_PROTO_TL
0780: 53 31 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65  S1..0x04.#define
0790: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
07a0: 31 09 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54  1.0x08.#define T
07b0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09  LS_PROTO_TLS1_2.
07c0: 30 78 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53  0x10.#define TLS
07d0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78  _PROTO_TLS1_3.0x
07e0: 32 30 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c  20.#define ENABL
07f0: 45 44 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28  ED(flag, mask).(
0800: 28 28 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29  ((flag) & (mask)
0810: 29 20 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 2f 2a  ) == (mask))../*
0820: 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74 61 20  . * Static data 
0830: 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f 0a 0a  structures. */..
0840: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f  #ifndef OPENSSL_
0850: 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65 20 22  NO_DH.#include "
0860: 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23 65 6e  dh_params.h".#en
0870: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 57 65 20 6c 6f  dif../*. * We lo
0880: 73 65 20 74 68 65 20 74 63 6c 20 70 61 73 73 77  se the tcl passw
0890: 6f 72 64 20 63 61 6c 6c 62 61 63 6b 20 77 68 65  ord callback whe
08a0: 6e 20 77 65 20 75 73 65 20 74 68 65 20 52 53 41  n we use the RSA
08b0: 20 42 53 41 46 45 20 53 53 4c 2d 43 20 31 2e 31   BSAFE SSL-C 1.1
08c0: 2e 32 0a 20 2a 20 6c 69 62 72 61 72 69 65 73 20  .2. * libraries 
08d0: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 63  instead of the c
08e0: 75 72 72 65 6e 74 20 4f 70 65 6e 53 53 4c 20 6c  urrent OpenSSL l
08f0: 69 62 72 61 72 69 65 73 2e 0a 20 2a 2f 0a 0a 23  ibraries.. */..#
0900: 69 66 64 65 66 20 42 53 41 46 45 0a 23 64 65 66  ifdef BSAFE.#def
0910: 69 6e 65 20 50 52 45 5f 4f 50 45 4e 53 53 4c 5f  ine PRE_OPENSSL_
0920: 30 5f 39 5f 34 20 31 0a 23 65 6e 64 69 66 0a 0a  0_9_4 1.#endif..
0930: 2f 2a 0a 20 2a 20 50 72 65 20 4f 70 65 6e 53 53  /*. * Pre OpenSS
0940: 4c 20 30 2e 39 2e 34 20 43 6f 6d 70 61 74 0a 20  L 0.9.4 Compat. 
0950: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 54 41 43  */..#ifndef STAC
0960: 4b 5f 4f 46 0a 23 64 65 66 69 6e 65 20 53 54 41  K_OF.#define STA
0970: 43 4b 5f 4f 46 28 78 29 09 09 09 53 54 41 43 4b  CK_OF(x)...STACK
0980: 0a 23 64 65 66 69 6e 65 20 73 6b 5f 53 53 4c 5f  .#define sk_SSL_
0990: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 09 09  CIPHER_num(sk)..
09a0: 73 6b 5f 6e 75 6d 28 28 73 6b 29 29 0a 23 64 65  sk_num((sk)).#de
09b0: 66 69 6e 65 20 73 6b 5f 53 53 4c 5f 43 49 50 48  fine sk_SSL_CIPH
09c0: 45 52 5f 76 61 6c 75 65 28 20 73 6b 2c 20 69 6e  ER_value( sk, in
09d0: 64 65 78 29 09 28 53 53 4c 5f 43 49 50 48 45 52  dex).(SSL_CIPHER
09e0: 2a 29 73 6b 5f 76 61 6c 75 65 28 28 73 6b 29 2c  *)sk_value((sk),
09f0: 20 28 69 6e 64 65 78 29 29 0a 23 65 6e 64 69 66   (index)).#endif
0a00: 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 2d 53  ../*. * Thread-S
0a10: 61 66 65 20 54 4c 53 20 43 6f 64 65 0a 20 2a 2f  afe TLS Code. */
0a20: 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52  ..#ifdef TCL_THR
0a30: 45 41 44 53 0a 23 64 65 66 69 6e 65 20 4f 50 45  EADS.#define OPE
0a40: 4e 53 53 4c 5f 54 48 52 45 41 44 5f 44 45 46 49  NSSL_THREAD_DEFI
0a50: 4e 45 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  NES.#include <op
0a60: 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e  enssl/opensslcon
0a70: 66 2e 68 3e 0a 0a 23 69 66 64 65 66 20 4f 50 45  f.h>..#ifdef OPE
0a80: 4e 53 53 4c 5f 54 48 52 45 41 44 53 0a 23 69 6e  NSSL_THREADS.#in
0a90: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63  clude <openssl/c
0aa0: 72 79 70 74 6f 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20  rypto.h>../*. * 
0ab0: 54 68 72 65 61 64 65 64 20 6f 70 65 72 61 74 69  Threaded operati
0ac0: 6f 6e 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b  on requires lock
0ad0: 69 6e 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a  ing callbacks. *
0ae0: 20 42 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79   Based from /cry
0af0: 70 74 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f  pto/cryptlib.c o
0b00: 66 20 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53  f OpenSSL and NS
0b10: 4f 70 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74  OpenSSL.. */..st
0b20: 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a  atic Tcl_Mutex *
0b30: 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74  locks = NULL;.st
0b40: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f  atic int locksCo
0b50: 75 6e 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  unt = 0;.static 
0b60: 54 63 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d  Tcl_Mutex init_m
0b70: 78 3b 0a 0a 76 6f 69 64 20 43 72 79 70 74 6f 54  x;..void CryptoT
0b80: 68 72 65 61 64 4c 6f 63 6b 43 61 6c 6c 62 61 63  hreadLockCallbac
0b90: 6b 28 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 2c  k(.    int mode,
0ba0: 0a 20 20 20 20 69 6e 74 20 6e 2c 0a 20 20 20 20  .    int n,.    
0bb0: 54 43 4c 5f 55 4e 55 53 45 44 28 63 6f 6e 73 74  TCL_UNUSED(const
0bc0: 20 63 68 61 72 20 2a 29 2c 0a 20 20 20 20 54 43   char *),.    TC
0bd0: 4c 5f 55 4e 55 53 45 44 28 69 6e 74 29 29 0a 7b  L_UNUSED(int)).{
0be0: 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 43 52 59  ..if (mode & CRY
0bf0: 50 54 4f 5f 4c 4f 43 4b 29 20 7b 0a 09 09 2f 2a  PTO_LOCK) {.../*
0c00: 20 54 68 69 73 20 64 65 62 75 67 67 69 6e 67 20   This debugging 
0c10: 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 62 79  is turned off by
0c20: 20 64 65 66 61 75 6c 74 20 2d 2d 20 69 74 27 73   default -- it's
0c30: 20 74 6f 6f 20 6e 6f 69 73 79 2e 20 2a 2f 0a 09   too noisy. */..
0c40: 09 2f 2a 20 64 70 72 69 6e 74 66 28 22 43 61 6c  ./* dprintf("Cal
0c50: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 28 6e 3d 25  led to lock (n=%
0c60: 69 20 6f 66 20 25 69 29 22 2c 20 6e 2c 20 6c 6f  i of %i)", n, lo
0c70: 63 6b 73 43 6f 75 6e 74 29 3b 20 2a 2f 0a 09 09  cksCount); */...
0c80: 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 6c  Tcl_MutexLock(&l
0c90: 6f 63 6b 73 5b 6e 5d 29 3b 0a 09 7d 20 65 6c 73  ocks[n]);..} els
0ca0: 65 20 7b 0a 09 09 2f 2a 20 64 70 72 69 6e 74 66  e {.../* dprintf
0cb0: 28 22 43 61 6c 6c 65 64 20 74 6f 20 75 6e 6c 6f  ("Called to unlo
0cc0: 63 6b 20 28 6e 3d 25 69 20 6f 66 20 25 69 29 22  ck (n=%i of %i)"
0cd0: 2c 20 6e 2c 20 6c 6f 63 6b 73 43 6f 75 6e 74 29  , n, locksCount)
0ce0: 3b 20 2a 2f 0a 09 09 54 63 6c 5f 4d 75 74 65 78  ; */...Tcl_Mutex
0cf0: 55 6e 6c 6f 63 6b 28 26 6c 6f 63 6b 73 5b 6e 5d  Unlock(&locks[n]
0d00: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 64 70 72 69 6e  );..}.../* dprin
0d10: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b  tf("Returning");
0d20: 20 2a 2f 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a   */...return;.}.
0d30: 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 43  .unsigned long C
0d40: 72 79 70 74 6f 54 68 72 65 61 64 49 64 43 61 6c  ryptoThreadIdCal
0d50: 6c 62 61 63 6b 28 76 6f 69 64 29 20 7b 0a 09 75  lback(void) {..u
0d60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74  nsigned long ret
0d70: 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c  ;...dprintf("Cal
0d80: 6c 65 64 22 29 3b 0a 0a 09 72 65 74 20 3d 20 28  led");...ret = (
0d90: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54  unsigned long) T
0da0: 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 54 68 72  cl_GetCurrentThr
0db0: 65 61 64 28 29 3b 0a 0a 09 64 70 72 69 6e 74 66  ead();...dprintf
0dc0: 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 22  ("Returning %lu"
0dd0: 2c 20 72 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e  , ret);...return
0de0: 28 72 65 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  (ret);.}.#endif 
0df0: 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  /* OPENSSL_THREA
0e00: 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  DS */.#endif /* 
0e10: 54 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 0a  TCL_THREADS */..
0e20: 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
0e70: 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d   InfoCallback --
0e80: 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20  . *. *.Monitors 
0e90: 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  SSL connection p
0ea0: 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73  rocess. *. * Res
0eb0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
0ec0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
0ed0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
0ee0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
0ef0: 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
0f40: 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61  atic void.InfoCa
0f50: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
0f60: 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 65   *ssl, int where
0f70: 2c 20 69 6e 74 20 72 65 74 29 0a 7b 0a 20 20 20  , int ret).{.   
0f80: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
0f90: 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67   = (State*)SSL_g
0fa0: 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c  et_app_data((SSL
0fb0: 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c   *)ssl);.    Tcl
0fc0: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
0fd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 61    const char *ma
0fe0: 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20  jor, *minor;..  
0ff0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
1000: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
1010: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
1020: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
1030: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20  LL)..return;..  
1040: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
1050: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
1060: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
1070: 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 20 28  ..#if 0.    if (
1080: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41  where & SSL_CB_A
1090: 4c 45 52 54 29 20 7b 0a 09 73 65 76 20 3d 20 53  LERT) {..sev = S
10a0: 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 74  SL_alert_type_st
10b0: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a  ring_long(ret);.
10c0: 09 69 66 20 28 73 74 72 63 6d 70 28 20 73 65 76  .if (strcmp( sev
10d0: 2c 20 22 66 61 74 61 6c 22 29 3d 3d 30 29 20 7b  , "fatal")==0) {
10e0: 09 2f 2a 20 4d 61 70 20 74 6f 20 65 72 72 6f 72  ./* Map to error
10f0: 20 2a 2f 0a 09 20 20 20 20 54 6c 73 5f 45 72 72   */..    Tls_Err
1100: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 53 53 4c  or(statePtr, SSL
1110: 5f 45 52 52 4f 52 28 73 73 6c 2c 20 30 29 29 3b  _ERROR(ssl, 0));
1120: 0a 09 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 7d  ..    return;..}
1130: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1140: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53    if (where & SS
1150: 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53  L_CB_HANDSHAKE_S
1160: 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d  TART) {..major =
1170: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d   "handshake";..m
1180: 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 3b 0a  inor = "start";.
1190: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77      } else if (w
11a0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41  here & SSL_CB_HA
11b0: 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a  NDSHAKE_DONE) {.
11c0: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68  .major = "handsh
11d0: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22  ake";..minor = "
11e0: 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73  done";.    } els
11f0: 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65 20 26  e {..if (where &
1200: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09   SSL_CB_ALERT)..
1210: 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b  major = "alert";
1220: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1230: 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43   & SSL_ST_CONNEC
1240: 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e  T).major = "conn
1250: 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28  ect";..else if (
1260: 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 41  where & SSL_ST_A
1270: 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20  CCEPT)..major = 
1280: 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 09  "accept";..else.
1290: 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b  ....major = "unk
12a0: 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65  nown";...if (whe
12b0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 44  re & SSL_CB_READ
12c0: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64  )..minor = "read
12d0: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
12e0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 54  re & SSL_CB_WRIT
12f0: 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69  E)..minor = "wri
1300: 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  te";..else if (w
1310: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f  here & SSL_CB_LO
1320: 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f  OP)..minor = "lo
1330: 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  op";..else if (w
1340: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 58  here & SSL_CB_EX
1350: 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78  IT)..minor = "ex
1360: 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d  it";..else.....m
1370: 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  inor = "unknown"
1380: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
1390: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13a0: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d  ement( statePtr-
13b0: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
13c0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
13d0: 69 6e 67 4f 62 6a 28 20 22 69 6e 66 6f 22 2c 20  ingObj( "info", 
13e0: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c  -1));..    Tcl_L
13f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1400: 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69  ent( statePtr->i
1410: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
1420: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
1430: 67 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43 68 61  gObj( Tcl_GetCha
1440: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
1450: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20 29 3b  r->self), -1) );
1460: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
1470: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20  jAppendElement( 
1480: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1490: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
14a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14b0: 20 6d 61 6a 6f 72 2c 20 2d 31 29 20 29 3b 0a 0a   major, -1) );..
14c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
14d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74  ppendElement( st
14e0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20  atePtr->interp, 
14f0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
1500: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 6d  _NewStringObj( m
1510: 69 6e 6f 72 2c 20 2d 31 29 20 29 3b 0a 0a 20 20  inor, -1) );..  
1520: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 28 53    if (where & (S
1530: 53 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c 5f 43  SL_CB_LOOP|SSL_C
1540: 42 5f 45 58 49 54 29 29 20 7b 0a 09 54 63 6c 5f  B_EXIT)) {..Tcl_
1550: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1560: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e  ment( statePtr->
1570: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
1580: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
1590: 6e 67 4f 62 6a 28 20 53 53 4c 5f 73 74 61 74 65  ngObj( SSL_state
15a0: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c  _string_long(ssl
15b0: 29 2c 20 2d 31 29 20 29 3b 0a 20 20 20 20 7d 20  ), -1) );.    } 
15c0: 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26  else if (where &
15d0: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b   SSL_CB_ALERT) {
15e0: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 70  ..const char *cp
15f0: 20 3d 20 28 63 68 61 72 20 2a 29 20 53 53 4c 5f   = (char *) SSL_
1600: 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e  alert_desc_strin
1610: 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 0a 09 54  g_long(ret);...T
1620: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1630: 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74  Element( statePt
1640: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  r->interp, cmdPt
1650: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1660: 74 72 69 6e 67 4f 62 6a 28 20 63 70 2c 20 2d 31  tringObj( cp, -1
1670: 29 20 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ) );.    } else 
1680: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
1690: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74 61  pendElement( sta
16a0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63  tePtr->interp, c
16b0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
16c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 53 53  NewStringObj( SS
16d0: 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c  L_state_string_l
16e0: 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 20 29 3b  ong(ssl), -1) );
16f0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 50  .    }.    Tcl_P
1700: 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74  reserve( (Client
1710: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e  Data) statePtr->
1720: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
1730: 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c 69 65  _Preserve( (Clie
1740: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
1750: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  );..    Tcl_Incr
1760: 52 65 66 43 6f 75 6e 74 28 20 63 6d 64 50 74 72  RefCount( cmdPtr
1770: 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 54 63  );.    (void) Tc
1780: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 73 74 61 74  l_EvalObjEx(stat
1790: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d  ePtr->interp, cm
17a0: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  dPtr, TCL_EVAL_G
17b0: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 54 63 6c 5f  LOBAL);.    Tcl_
17c0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 20 63 6d  DecrRefCount( cm
17d0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  dPtr);..    Tcl_
17e0: 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e 74  Release( (Client
17f0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
1800: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
1810: 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  ( (ClientData) s
1820: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29  tatePtr->interp)
1830: 3b 0a 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ;..}.../*. *----
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1880: 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c   *. * VerifyCall
1890: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f  back --. *. *.Mo
18a0: 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69  nitors SSL certi
18b0: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f  ficate validatio
18c0: 6e 20 70 72 6f 63 65 73 73 2e 0a 20 2a 09 54 68  n process.. *.Th
18d0: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  is is called whe
18e0: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63  never a certific
18f0: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64  ate is inspected
1900: 0a 20 2a 09 6f 72 20 64 65 63 69 64 65 64 20 69  . *.or decided i
1910: 6e 76 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52 65  nvalid.. *. * Re
1920: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c  sults:. *.A call
1930: 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68  back bound to th
1940: 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74  e socket may ret
1950: 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20  urn one of:. *. 
1960: 20 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72     0...- the cer
1970: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d  tificate is deem
1980: 65 64 20 69 6e 76 61 6c 69 64 0a 20 2a 09 20 20  ed invalid. *.  
1990: 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72 74    1...- the cert
19a0: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65  ificate is deeme
19b0: 64 20 76 61 6c 69 64 0a 20 2a 09 20 20 20 20 65  d valid. *.    e
19c0: 6d 70 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f  mpty string.- no
19d0: 20 63 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69   change to certi
19e0: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f  ficate validatio
19f0: 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  n. *. * Side eff
1a00: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72  ects:. *.The err
1a10: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75   field of the cu
1a20: 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76  rrently operativ
1a30: 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20  e State is set. 
1a40: 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20  *.  to a string 
1a50: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53  describing the S
1a60: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66  SL negotiation f
1a70: 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a  ailure reason. *
1a80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
1ad0: 63 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c  c int.VerifyCall
1ae0: 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30  back(int ok, X50
1af0: 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78  9_STORE_CTX *ctx
1b00: 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ).{.    Tcl_Obj 
1b10: 2a 63 6d 64 50 74 72 2c 20 2a 72 65 73 75 6c 74  *cmdPtr, *result
1b20: 3b 0a 20 20 20 20 63 68 61 72 20 2a 65 72 72 53  ;.    char *errS
1b30: 74 72 2c 20 2a 73 74 72 69 6e 67 3b 0a 20 20 20  tr, *string;.   
1b40: 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 67 74 68   Tcl_Size length
1b50: 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c  ;.    SSL   *ssl
1b60: 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53  ..= (SSL*)X509_S
1b70: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f  TORE_CTX_get_ex_
1b80: 64 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65  data(ctx, SSL_ge
1b90: 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53  t_ex_data_X509_S
1ba0: 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b  TORE_CTX_idx());
1bb0: 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74  .    X509  *cert
1bc0: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43  ..= X509_STORE_C
1bd0: 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  TX_get_current_c
1be0: 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74  ert(ctx);.    St
1bf0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20  ate *statePtr.= 
1c00: 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f  (State*)SSL_get_
1c10: 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20  app_data(ssl);. 
1c20: 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20     int depth..= 
1c30: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
1c40: 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63  et_error_depth(c
1c50: 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72  tx);.    int err
1c60: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43  ..= X509_STORE_C
1c70: 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78  TX_get_error(ctx
1c80: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
1c90: 22 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b  "Verify: %d", ok
1ca0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 6f 6b 29  );..    if (!ok)
1cb0: 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63 68   {..errStr = (ch
1cc0: 61 72 20 2a 29 58 35 30 39 5f 76 65 72 69 66 79  ar *)X509_verify
1cd0: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
1ce0: 6e 67 28 65 72 72 29 3b 0a 20 20 20 20 7d 20 65  ng(err);.    } e
1cf0: 6c 73 65 20 7b 0a 09 65 72 72 53 74 72 20 3d 20  lse {..errStr = 
1d00: 28 63 68 61 72 20 2a 29 30 3b 0a 20 20 20 20 7d  (char *)0;.    }
1d10: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
1d20: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
1d30: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 61  NULL) {..if (sta
1d40: 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20  tePtr->vflags & 
1d50: 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f  SSL_VERIFY_FAIL_
1d60: 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29  IF_NO_PEER_CERT)
1d70: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f   {..    return o
1d80: 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  k;..} else {..  
1d90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20    return 1;..}. 
1da0: 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 20     }.    cmdPtr 
1db0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
1dc0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
1dd0: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c  lback);..    Tcl
1de0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1df0: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d  ement( statePtr-
1e00: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
1e10: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1e20: 69 6e 67 4f 62 6a 28 20 22 76 65 72 69 66 79 22  ingObj( "verify"
1e30: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c  , -1));..    Tcl
1e40: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1e50: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d  ement( statePtr-
1e60: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
1e70: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1e80: 69 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43  ingObj( Tcl_GetC
1e90: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
1ea0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20  Ptr->self), -1) 
1eb0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
1ec0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1ed0: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ( statePtr->inte
1ee0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
1ef0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 20   Tcl_NewIntObj( 
1f00: 64 65 70 74 68 29 20 29 3b 0a 0a 20 20 20 20 54  depth) );..    T
1f10: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1f20: 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74  Element( statePt
1f30: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  r->interp, cmdPt
1f40: 72 2c 0a 09 20 20 20 20 54 6c 73 5f 4e 65 77 58  r,..    Tls_NewX
1f50: 35 30 39 4f 62 6a 28 20 73 74 61 74 65 50 74 72  509Obj( statePtr
1f60: 2d 3e 69 6e 74 65 72 70 2c 20 63 65 72 74 29 20  ->interp, cert) 
1f70: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
1f80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1f90: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ( statePtr->inte
1fa0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
1fb0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 20   Tcl_NewIntObj( 
1fc0: 6f 6b 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ok) );..    Tcl_
1fd0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1fe0: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e  ment( statePtr->
1ff0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
2000: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
2010: 6e 67 4f 62 6a 28 20 65 72 72 53 74 72 20 3f 20  ngObj( errStr ? 
2020: 65 72 72 53 74 72 20 3a 20 22 22 2c 20 2d 31 29  errStr : "", -1)
2030: 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65   );..    Tcl_Pre
2040: 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44 61  serve( (ClientDa
2050: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  ta) statePtr->in
2060: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50  terp);.    Tcl_P
2070: 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74  reserve( (Client
2080: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
2090: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
20a0: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
20b0: 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20 20 20  _CALLBACK;..    
20c0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
20d0: 28 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69  ( cmdPtr);.    i
20e0: 66 20 28 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  f (Tcl_EvalObjEx
20f0: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
2100: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45  p, cmdPtr, TCL_E
2110: 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 21 3d 20 54  VAL_GLOBAL) != T
2120: 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 49 74 20  CL_OK) {../* It 
2130: 67 6f 74 20 61 6e 20 65 72 72 6f 72 20 2d 20 72  got an error - r
2140: 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66  eject the certif
2150: 69 63 61 74 65 2e 09 09 2a 2f 0a 09 54 63 6c 5f  icate...*/..Tcl_
2160: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
2170: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
2180: 70 29 3b 0a 09 6f 6b 20 3d 20 30 3b 0a 20 20 20  p);..ok = 0;.   
2190: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 75 6c   } else {..resul
21a0: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
21b0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 69  sult(statePtr->i
21c0: 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e 67 20  nterp);..string 
21d0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
21e0: 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c 20 26  romObj(result, &
21f0: 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 6e 20  length);../* An 
2200: 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c 65 61  empty result lea
2210: 76 65 73 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ves verification
2220: 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a 09   unchanged..*/..
2230: 69 66 20 28 73 74 72 69 6e 67 20 21 3d 20 4e 55  if (string != NU
2240: 4c 4c 20 26 26 20 6c 65 6e 67 74 68 20 3e 20 30  LL && length > 0
2250: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 54 63 6c  ) {..    if (Tcl
2260: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 73  _GetIntFromObj(s
2270: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
2280: 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d   result, &ok) !=
2290: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 54 63 6c   TCL_OK) {...Tcl
22a0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
22b0: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
22c0: 70 29 3b 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20  p);...ok = 0;.. 
22d0: 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20     }..}.    }.  
22e0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
22f0: 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a 20 20  nt( cmdPtr);..  
2300: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67    statePtr->flag
2310: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43  s &= ~(TLS_TCL_C
2320: 41 4c 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 20 54  ALLBACK);..    T
2330: 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69  cl_Release( (Cli
2340: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
2350: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  r);.    Tcl_Rele
2360: 61 73 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61  ase( (ClientData
2370: 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ) statePtr->inte
2380: 72 70 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  rp);..    return
2390: 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61  (ok);./* By defa
23a0: 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66  ult, leave verif
23b0: 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  ication unchange
23c0: 64 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  d..*/.}.../*. *-
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2410: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72  --. *. * Tls_Err
2420: 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  or --. *. *.Call
2430: 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  s callback with 
2440: 24 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73  $fd and $msg - s
2450: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63  o the callback c
2460: 61 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61  an decide. *.wha
2470: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72  t to do with err
2480: 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ors.. *. * Side 
2490: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
24a0: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  err field of the
24b0: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61   currently opera
24c0: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65  tive State is se
24d0: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69  t. *.  to a stri
24e0: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
24f0: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
2500: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e  n failure reason
2510: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2550: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
2560: 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20  Tls_Error(State 
2570: 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20  *statePtr, char 
2580: 2a 6d 73 67 29 0a 7b 0a 20 20 20 20 54 63 6c 5f  *msg).{.    Tcl_
2590: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 0a 20 20  Obj *cmdPtr;..  
25a0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
25b0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6d 73  d");..    if (ms
25c0: 67 20 26 26 20 2a 6d 73 67 29 20 7b 0a 09 54 63  g && *msg) {..Tc
25d0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 73  l_SetErrorCode(s
25e0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
25f0: 20 22 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63 68   "SSL", msg, (ch
2600: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20  ar *)NULL);.    
2610: 7d 20 65 6c 73 65 20 7b 0a 09 6d 73 67 20 3d 20  } else {..msg = 
2620: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63  Tcl_GetString(Tc
2630: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 73  l_GetObjResult(s
2640: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29  tatePtr->interp)
2650: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
2660: 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67  tePtr->err = msg
2670: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
2680: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d  Ptr->callback ==
2690: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
26a0: 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46   {..char buf[BUF
26b0: 53 49 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 28 62  SIZ];..sprintf(b
26c0: 75 66 2c 20 22 53 53 4c 20 63 68 61 6e 6e 65 6c  uf, "SSL channel
26d0: 20 5c 22 25 73 5c 22 3a 20 65 72 72 6f 72 3a 20   \"%s\": error: 
26e0: 25 73 22 2c 0a 09 20 20 20 20 54 63 6c 5f 47 65  %s",..    Tcl_Ge
26f0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
2700: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 6d 73  tePtr->self), ms
2710: 67 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65 73 75  g);..Tcl_SetResu
2720: 6c 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  lt( statePtr->in
2730: 74 65 72 70 2c 20 62 75 66 2c 20 54 43 4c 5f 56  terp, buf, TCL_V
2740: 4f 4c 41 54 49 4c 45 29 3b 0a 09 54 63 6c 5f 42  OLATILE);..Tcl_B
2750: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 20  ackgroundError( 
2760: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2770: 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20  );..return;.    
2780: 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  }.    cmdPtr = T
2790: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
27a0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
27b0: 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69  ck);..    Tcl_Li
27c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
27d0: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  nt(statePtr->int
27e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
27f0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
2800: 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29  bj("error", -1))
2810: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
2820: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2830: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2840: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
2850: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2860: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
2870: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
2880: 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54  f), -1));..    T
2890: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
28a0: 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72  Element(statePtr
28b0: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
28c0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
28d0: 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29  ringObj(msg, -1)
28e0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
28f0: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
2900: 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ) statePtr->inte
2910: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
2920: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
2930: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
2940: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
2950: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
2960: 20 69 66 20 28 54 63 6c 5f 45 76 61 6c 4f 62 6a   if (Tcl_EvalObj
2970: 45 78 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  Ex(statePtr->int
2980: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c  erp, cmdPtr, TCL
2990: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 21 3d  _EVAL_GLOBAL) !=
29a0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f   TCL_OK) {..Tcl_
29b0: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
29c0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
29d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
29e0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
29f0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  dPtr);..    Tcl_
2a00: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
2a10: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
2a20: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
2a30: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
2a40: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a  tePtr->interp);.
2a50: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
2a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
2aa0: 20 2a 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62   * PasswordCallb
2ab0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  ack --. *. *.Cal
2ac0: 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77  led when a passw
2ad0: 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 74 6f  ord is needed to
2ae0: 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64 20   unpack RSA and 
2af0: 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61  PEM keys.. *.Eva
2b00: 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61 73  ls any bound pas
2b10: 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e 64  sword script and
2b20: 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 73   returns the res
2b30: 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70 61  ult as. *.the pa
2b40: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20  ssword string.. 
2b50: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b90: 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20  ----. */.#ifdef 
2ba0: 50 52 45 5f 4f 50 45 4e 53 53 4c 5f 30 5f 39 5f  PRE_OPENSSL_0_9_
2bb0: 34 0a 2f 2a 0a 20 2a 20 4e 6f 20 77 61 79 20 74  4./*. * No way t
2bc0: 6f 20 68 61 6e 64 6c 65 20 75 73 65 72 2d 64 61  o handle user-da
2bd0: 74 61 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20  ta therefore no 
2be0: 77 61 79 20 77 69 74 68 6f 75 74 20 61 20 67 6c  way without a gl
2bf0: 6f 62 61 6c 0a 20 2a 20 76 61 72 69 61 62 6c 65  obal. * variable
2c00: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 54   to access the T
2c10: 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  cl interpreter..
2c20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61  */.static int.Pa
2c30: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 0a  sswordCallback(.
2c40: 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 63      TCL_UNUSED(c
2c50: 68 61 72 20 2a 29 20 2f 2a 20 62 75 66 20 2a 2f  har *) /* buf */
2c60: 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44  ,.    TCL_UNUSED
2c70: 28 69 6e 74 29 20 2f 2a 20 73 69 7a 65 20 2a 2f  (int) /* size */
2c80: 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44  ,.    TCL_UNUSED
2c90: 28 69 6e 74 29 20 2f 2a 20 76 65 72 69 66 79 20  (int) /* verify 
2ca0: 2a 2f 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e  */).{.    return
2cb0: 20 2d 31 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74 61   -1;.}.#else.sta
2cc0: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64  tic int.Password
2cd0: 43 61 6c 6c 62 61 63 6b 28 0a 20 20 20 20 63 68  Callback(.    ch
2ce0: 61 72 20 2a 62 75 66 2c 0a 20 20 20 20 69 6e 74  ar *buf,.    int
2cf0: 20 73 69 7a 65 2c 0a 20 20 20 20 54 43 4c 5f 55   size,.    TCL_U
2d00: 4e 55 53 45 44 28 69 6e 74 29 2c 20 2f 2a 20 76  NUSED(int), /* v
2d10: 65 72 69 66 79 20 2a 2f 0a 20 20 20 20 76 6f 69  erify */.    voi
2d20: 64 20 2a 75 64 61 74 61 29 0a 7b 0a 20 20 20 20  d *udata).{.    
2d30: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09  State *statePtr.
2d40: 3d 20 28 53 74 61 74 65 20 2a 29 20 75 64 61 74  = (State *) udat
2d50: 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  a;.    Tcl_Inter
2d60: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
2d70: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
2d80: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
2d90: 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 75 6c  r;.    int resul
2da0: 74 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  t;..    dprintf(
2db0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
2dc0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61  if (statePtr->pa
2dd0: 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20  ssword == NULL) 
2de0: 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c 45  {..if (Tcl_EvalE
2df0: 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  x(interp, "tls::
2e00: 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54  password", -1, T
2e10: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a  CL_EVAL_GLOBAL).
2e20: 09 09 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ..== TCL_OK) {..
2e30: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2e40: 72 65 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ret = Tcl_GetStr
2e50: 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
2e60: 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28  );..    strncpy(
2e70: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f  buf, ret, (size_
2e80: 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 72  t) size);..    r
2e90: 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 6c 65  eturn (int)strle
2ea0: 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c 73 65 20  n(ret);..} else 
2eb0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31  {..    return -1
2ec0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
2ed0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
2ee0: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
2ef0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 0a  tr->password);..
2f00: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
2f10: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
2f20: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b  atePtr->interp);
2f30: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
2f40: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
2f50: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54  tatePtr);..    T
2f60: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
2f70: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 73  cmdPtr);.    res
2f80: 75 6c 74 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62  ult = Tcl_EvalOb
2f90: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  jEx(interp, cmdP
2fa0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  tr, TCL_EVAL_GLO
2fb0: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 72 65  BAL);.    if (re
2fc0: 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  sult != TCL_OK) 
2fd0: 7b 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  {..Tcl_Backgroun
2fe0: 64 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d  dError(statePtr-
2ff0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a  >interp);.    }.
3000: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3010: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
3020: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
3030: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
3040: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52  ePtr);.    Tcl_R
3050: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
3060: 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  ta) statePtr->in
3070: 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28  terp);..    if (
3080: 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 4f 4b  result == TCL_OK
3090: 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20  ) {..const char 
30a0: 2a 72 65 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  *ret = Tcl_GetSt
30b0: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
30c0: 70 29 3b 0a 09 73 74 72 6e 63 70 79 28 62 75 66  p);..strncpy(buf
30d0: 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20  , ret, (size_t) 
30e0: 73 69 7a 65 29 3b 0a 09 72 65 74 75 72 6e 20 28  size);..return (
30f0: 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b  int)strlen(ret);
3100: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
3110: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
3120: 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a  }.#endif.../*. *
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3170: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72  ---. *. * Cipher
3180: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20  sObjCmd -- list 
3190: 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72  available cipher
31a0: 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  s. *. *.This pro
31b0: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
31c0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
31d0: 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20   "tls::ciphers" 
31e0: 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69  command. *.to li
31f0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70  st available cip
3200: 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e  hers, based upon
3210: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74   protocol select
3220: 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ed.. *. * Result
3230: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
3240: 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74   Tcl result list
3250: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
3260: 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75  ects:. *.constru
3270: 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73  cts and destroys
3280: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54   SSL context (CT
3290: 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  X). *. *--------
32a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
32e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
32f0: 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d  r *protocols[] =
3300: 20 7b 0a 20 20 20 20 22 73 73 6c 32 22 2c 20 22   {.    "ssl2", "
3310: 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22  ssl3", "tls1", "
3320: 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32  tls1.1", "tls1.2
3330: 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c  ", "tls1.3", NUL
3340: 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63  L.};.enum protoc
3350: 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c  ol {.    TLS_SSL
3360: 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53  2, TLS_SSL3, TLS
3370: 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f  _TLS1, TLS_TLS1_
3380: 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54  1, TLS_TLS1_2, T
3390: 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e  LS_TLS1_3, TLS_N
33a0: 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69  ONE.};..static i
33b0: 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  nt.CiphersObjCmd
33c0: 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44  (.    TCL_UNUSED
33d0: 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63  (void *),.    Tc
33e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
33f0: 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  ,.    int objc,.
3400: 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e      Tcl_Obj.*con
3410: 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20  st objv[]).{.   
3420: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
3430: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c   = NULL;.    SSL
3440: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
3450: 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d  ;.    SSL *ssl =
3460: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b   NULL;.    STACK
3470: 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20  _OF(SSL_CIPHER) 
3480: 2a 73 6b 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  *sk;.    const c
3490: 68 61 72 20 2a 63 70 3b 0a 20 20 20 20 63 68 61  har *cp;.    cha
34a0: 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20  r buf[BUFSIZ];. 
34b0: 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65     int index, ve
34c0: 72 62 6f 73 65 20 3d 20 30 3b 0a 0a 20 20 20 20  rbose = 0;..    
34d0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
34e0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a  );..    if ((obj
34f0: 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20  c < 2) || (objc 
3500: 3e 20 33 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  > 3)) {..Tcl_Wro
3510: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
3520: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74  , 1, objv, "prot
3530: 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 22 29  ocol ?verbose?")
3540: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
3550: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
3560: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
3570: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
3580: 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c  bjv[1], protocol
3590: 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30  s, "protocol", 0
35a0: 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c  , &index) != TCL
35b0: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
35c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
35d0: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20      if ((objc > 
35e0: 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f  2) && Tcl_GetBoo
35f0: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
3600: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65  rp, objv[2], &ve
3610: 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b  rbose) != TCL_OK
3620: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
3630: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
3640: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70   switch ((enum p
3650: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b  rotocol)index) {
3660: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53  .    case TLS_SS
3670: 4c 32 3a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  L2:..Tcl_AppendR
3680: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
3690: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
36a0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
36b0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
36c0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
36d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
36e0: 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a    case TLS_SSL3:
36f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
3700: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL3) || defined
3710: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
3720: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
3730: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54  NSSL_NO_SSL3_MET
3740: 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64  HOD)..Tcl_Append
3750: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
3760: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
3770: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
3780: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20  )NULL);..return 
3790: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
37a0: 0a 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f  ..ctx = SSL_CTX_
37b0: 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64  new(SSLv3_method
37c0: 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  ()); break;.#end
37d0: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  if.    case TLS_
37e0: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65  TLS1:.#if define
37f0: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
3800: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
3810: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
3820: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
3830: 31 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41  1_METHOD)..Tcl_A
3840: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3850: 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f  rp, "protocol no
3860: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
3870: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
3880: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3890: 23 65 6c 73 65 0a 09 63 74 78 20 3d 20 53 53 4c  #else..ctx = SSL
38a0: 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 6d  _CTX_new(TLSv1_m
38b0: 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b  ethod()); break;
38c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
38d0: 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66   TLS_TLS1_1:.#if
38e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
38f0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
3900: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
3910: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
3920: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
3930: 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65  ETHOD)..Tcl_Appe
3940: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3950: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
3960: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
3970: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
3980: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72  char *)NULL);..r
3990: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
39a0: 0a 23 65 6c 73 65 0a 09 63 74 78 20 3d 20 53 53  .#else..ctx = SS
39b0: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f  L_CTX_new(TLSv1_
39c0: 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65  1_method()); bre
39d0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ak;.#endif.#if d
39e0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
39f0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
3a00: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20  NSSL_NO_TLS1_2) 
3a10: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
3a20: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54  SL_NO_TLS1_2_MET
3a30: 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64  HOD)..Tcl_Append
3a40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
3a50: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
3a60: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
3a70: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20  )NULL);..return 
3a80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
3a90: 0a 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f  ..ctx = SSL_CTX_
3aa0: 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68  new(TLSv1_2_meth
3ab0: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65  od()); break;.#e
3ac0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
3ad0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
3ae0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
3af0: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66  O_TLS1_3) || def
3b00: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
3b10: 54 4c 53 31 5f 33 5f 4d 45 54 48 4f 44 29 0a 09  TLS1_3_METHOD)..
3b20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3b30: 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63  (interp, "protoc
3b40: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
3b50: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
3b60: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
3b70: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 63 74 78 20  ROR;.#else..ctx 
3b80: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c  = SSL_CTX_new(TL
3b90: 53 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65  S_method()); bre
3ba0: 61 6b 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ak;..SSL_CTX_set
3bb0: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _min_proto_versi
3bc0: 6f 6e 20 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  on (ctx, TLS1_3_
3bd0: 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43  VERSION);..SSL_C
3be0: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f  TX_set_max_proto
3bf0: 5f 76 65 72 73 69 6f 6e 20 28 63 74 78 2c 20 54  _version (ctx, T
3c00: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
3c10: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
3c20: 6c 74 3a 0a 09 09 62 72 65 61 6b 3b 0a 20 20 20  lt:...break;.   
3c30: 20 7d 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d   }.    if (ctx =
3c40: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
3c50: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3c60: 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63  rp, REASON(), (c
3c70: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
3c80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3c90: 20 20 20 20 7d 0a 20 20 20 20 73 73 6c 20 3d 20      }.    ssl = 
3ca0: 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20  SSL_new(ctx);.  
3cb0: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
3cc0: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
3cd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52  Result(interp, R
3ce0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
3cf0: 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58  )NULL);..SSL_CTX
3d00: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
3d10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3d20: 20 20 20 7d 0a 20 20 20 20 6f 62 6a 50 74 72 20     }.    objPtr 
3d30: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
3d40: 28 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  ( 0, NULL);..   
3d50: 20 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b   if (!verbose) {
3d60: 0a 09 66 6f 72 20 28 69 6e 64 65 78 20 3d 20 30  ..for (index = 0
3d70: 3b 20 3b 20 69 6e 64 65 78 2b 2b 29 20 7b 0a 09  ; ; index++) {..
3d80: 20 20 20 20 63 70 20 3d 20 28 63 68 61 72 2a 29      cp = (char*)
3d90: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 6c  SSL_get_cipher_l
3da0: 69 73 74 28 20 73 73 6c 2c 20 69 6e 64 65 78 29  ist( ssl, index)
3db0: 3b 0a 09 20 20 20 20 69 66 20 28 63 70 20 3d 3d  ;..    if (cp ==
3dc0: 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 20   NULL) break;.. 
3dd0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3de0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e 74  pendElement( int
3df0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 54  erp, objPtr,...T
3e00: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3e10: 20 63 70 2c 20 2d 31 29 20 29 3b 0a 09 7d 0a 20   cp, -1) );..}. 
3e20: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20     } else {..sk 
3e30: 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  = SSL_get_cipher
3e40: 73 28 73 73 6c 29 3b 0a 0a 09 66 6f 72 20 28 69  s(ssl);...for (i
3e50: 6e 64 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20  ndex = 0; index 
3e60: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  < sk_SSL_CIPHER_
3e70: 6e 75 6d 28 73 6b 29 3b 20 69 6e 64 65 78 2b 2b  num(sk); index++
3e80: 29 20 7b 0a 09 20 20 20 20 73 69 7a 65 5f 74 20  ) {..    size_t 
3e90: 69 3b 0a 09 20 20 20 20 53 53 4c 5f 43 49 50 48  i;..    SSL_CIPH
3ea0: 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 20  ER_description( 
3eb0: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61  sk_SSL_CIPHER_va
3ec0: 6c 75 65 28 20 73 6b 2c 20 69 6e 64 65 78 29 2c  lue( sk, index),
3ed0: 0a 09 09 09 09 20 20 20 20 62 75 66 2c 20 73 69  .....    buf, si
3ee0: 7a 65 6f 66 28 62 75 66 29 29 3b 0a 09 20 20 20  zeof(buf));..   
3ef0: 20 66 6f 72 20 28 69 20 3d 20 73 74 72 6c 65 6e   for (i = strlen
3f00: 28 62 75 66 29 20 2d 20 31 3b 20 69 20 3b 20 69  (buf) - 1; i ; i
3f10: 2d 2d 29 20 7b 0a 09 09 69 66 20 28 62 75 66 5b  --) {...if (buf[
3f20: 69 5d 20 3d 3d 20 27 20 27 20 7c 7c 20 62 75 66  i] == ' ' || buf
3f30: 5b 69 5d 20 3d 3d 20 27 5c 6e 27 20 7c 7c 0a 09  [i] == '\n' ||..
3f40: 09 20 20 20 20 62 75 66 5b 69 5d 20 3d 3d 20 27  .    buf[i] == '
3f50: 5c 72 27 20 7c 7c 20 62 75 66 5b 69 5d 20 3d 3d  \r' || buf[i] ==
3f60: 20 27 5c 74 27 29 20 7b 0a 09 09 20 20 20 20 62   '\t') {...    b
3f70: 75 66 5b 69 5d 20 3d 20 27 5c 30 27 3b 0a 09 09  uf[i] = '\0';...
3f80: 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 62  } else {...    b
3f90: 72 65 61 6b 3b 0a 09 09 7d 0a 09 20 20 20 20 7d  reak;...}..    }
3fa0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
3fb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20  jAppendElement( 
3fc0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a  interp, objPtr,.
3fd0: 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
3fe0: 62 6a 28 20 62 75 66 2c 20 2d 31 29 20 29 3b 0a  bj( buf, -1) );.
3ff0: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c  .}.    }.    SSL
4000: 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20  _free(ssl);.    
4010: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
4020: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  );..    Tcl_SetO
4030: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
4040: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
4050: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
4060: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
40b0: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20  HandshakeObjCmd 
40c0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f  --. *. *.This co
40d0: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
40e0: 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20   verify whether 
40f0: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73  the handshake is
4100: 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20   complete. *.or 
4110: 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  not.. *. * Resul
4120: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
4130: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20  d Tcl result. 1 
4140: 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20  means handshake 
4150: 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e  complete, 0 mean
4160: 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a  s pending.. *. *
4170: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
4180: 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20  *.May force SSL 
4190: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74  negotiation to t
41a0: 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a  ake place.. *. *
41b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41f0: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
4200: 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  int HandshakeObj
4210: 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55  Cmd(.    TCL_UNU
4220: 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20  SED(void *),.   
4230: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4240: 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a  erp,.    int obj
4250: 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  c,.    Tcl_Obj *
4260: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a  const objv[]).{.
4270: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
4280: 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  chan;        /* 
4290: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
42a0: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
42b0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
42c0: 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  ePtr;        /* 
42d0: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72  client state for
42e0: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20   ssl socket */. 
42f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65     const char *e
4300: 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rrStr = NULL;.  
4310: 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20    int ret = 1;. 
4320: 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a     int err = 0;.
4330: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
4340: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
4350: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
4360: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
4370: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
4380: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65   "channel");..re
4390: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
43a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
43b0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
43c0: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
43d0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
43e0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
43f0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
4400: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
4410: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
4420: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
4430: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
4440: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
4450: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
4460: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
4470: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
4480: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
4490: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
44a0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
44b0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
44c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
44d0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
44e0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
44f0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
4500: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
4510: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63  TLS channel", (c
4520: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
4530: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
4540: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65  .    }.    state
4550: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54  Ptr = (State *)T
4560: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
4570: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b  tanceData(chan);
4580: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
4590: 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46  alling Tls_WaitF
45a0: 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20  orConnect");.   
45b0: 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46   ret = Tls_WaitF
45c0: 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50  orConnect(stateP
45d0: 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20  tr, &err, 1);.  
45e0: 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57    dprintf("Tls_W
45f0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65  aitForConnect re
4600: 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74  turned: %i", ret
4610: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20  );..    if (ret 
4620: 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74  < 0 && ((statePt
4630: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54  r->flags & TLS_T
4640: 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72  CL_ASYNC) && (er
4650: 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b  r == EAGAIN))) {
4660: 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63  ..dprintf("Async
4670: 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45   set and err = E
4680: 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20  AGAIN");..ret = 
4690: 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  0;.    } else if
46a0: 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 65 72   (ret < 0) {..er
46b0: 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d  rStr = statePtr-
46c0: 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74  >err;..Tcl_Reset
46d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
46e0: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72  .Tcl_SetErrno(er
46f0: 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74  r);...if (!errSt
4700: 72 20 7c 7c 20 2a 65 72 72 53 74 72 20 3d 3d 20  r || *errStr == 
4710: 30 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72  0) {..    errStr
4720: 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f   = Tcl_PosixErro
4730: 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09  r(interp);..}...
4740: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
4750: 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68  (interp, "handsh
4760: 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65  ake failed: ", e
4770: 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 4e  rrStr, (char *)N
4780: 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22  ULL);..dprintf("
4790: 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52  Returning TCL_ER
47a0: 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 61  ROR with handsha
47b0: 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20  ke failed: %s", 
47c0: 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e  errStr);..return
47d0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20  (TCL_ERROR);.   
47e0: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65   } else {..if (e
47f0: 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20  rr != 0) {..    
4800: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20  dprintf("Got an 
4810: 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d  error with a com
4820: 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65  pleted handshake
4830: 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72  : err = %i", err
4840: 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a  );..}..ret = 1;.
4850: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
4860: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43  tf("Returning TC
4870: 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c  L_OK with data \
4880: 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20  "%i\"", ret);.  
4890: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
48a0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
48b0: 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a  ewIntObj(ret));.
48c0: 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f      return(TCL_O
48d0: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K);.}../*. *----
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4920: 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43   *. * ImportObjC
4930: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  md --. *. *.This
4940: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
4950: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73  voked to process
4960: 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61   the "ssl" comma
4970: 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c  nd. *. *.The ssl
4980: 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20   command pushes 
4990: 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c  SSL over a (newl
49a0: 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70  y connected) tcp
49b0: 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65   socket. *. * Re
49c0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
49d0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
49e0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
49f0: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69  cts:. *.May modi
4a00: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  fy the behavior 
4a10: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c  of an IO channel
4a20: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
4a70: 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72  static int.Impor
4a80: 74 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c  tObjCmd(.    TCL
4a90: 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c  _UNUSED(void *),
4aa0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
4ab0: 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74  *interp,.    int
4ac0: 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f   objc,.    Tcl_O
4ad0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
4ae0: 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ).{.    Tcl_Chan
4af0: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
4b00: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
4b10: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
4b20: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
4b30: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73  tr;../* client s
4b40: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63  tate for ssl soc
4b50: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ket */.    SSL_C
4b60: 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c 4c 3b  TX *ctx..= NULL;
4b70: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63  .    Tcl_Obj *sc
4b80: 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  ript..= NULL;.  
4b90: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77    Tcl_Obj *passw
4ba0: 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ord..= NULL;.   
4bb0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70   Tcl_DString upp
4bc0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
4bd0: 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e  tion, upperChann
4be0: 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65  elBlocking, uppe
4bf0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
4c00: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  , upperChannelEO
4c10: 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69  FChar;.    int i
4c20: 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  dx;.    Tcl_Size
4c30: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c   len;.    int fl
4c40: 61 67 73 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f  ags...= TLS_TCL_
4c50: 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65  INIT;.    int se
4c60: 72 76 65 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69  rver...= 0;./* i
4c70: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63  s connection inc
4c80: 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e  oming or outgoin
4c90: 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  g? */.    char *
4ca0: 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b  keyfile..= NULL;
4cb0: 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66  .    char *certf
4cc0: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ile..= NULL;.   
4cd0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4ce0: 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  key..= NULL;.   
4cf0: 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65   Tcl_Size key_le
4d00: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69  n..= 0;.    unsi
4d10: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 09  gned char *cert.
4d20: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
4d30: 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09  _Size cert_len..
4d40: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  = 0;.    char *c
4d50: 69 70 68 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a  iphers..= NULL;.
4d60: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65      char *CAfile
4d70: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68  ..= NULL;.    ch
4d80: 61 72 20 2a 43 41 64 69 72 09 09 09 3d 20 4e 55  ar *CAdir...= NU
4d90: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48  LL;.    char *DH
4da0: 70 61 72 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a  params..= NULL;.
4db0: 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09      char *model.
4dc0: 09 09 3d 20 4e 55 4c 4c 3b 0a 23 69 66 6e 64 65  ..= NULL;.#ifnde
4dd0: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  f OPENSSL_NO_TLS
4de0: 45 58 54 0a 20 20 20 20 63 68 61 72 20 2a 73 65  EXT.    char *se
4df0: 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c  rvername..= NULL
4e00: 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f  ;./* hostname fo
4e10: 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e  r Server Name In
4e20: 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64  dication */.#end
4e30: 69 66 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20  if.    int ssl2 
4e40: 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20  = 0, ssl3 = 0;. 
4e50: 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c     int tls1 = 1,
4e60: 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73   tls1_1 = 1, tls
4e70: 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20  1_2 = 1, tls1_3 
4e80: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f  = 1;.    int pro
4e90: 74 6f 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  to = 0;.    int 
4ea0: 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75  verify = 0, requ
4eb0: 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74  ire = 0, request
4ec0: 20 3d 20 31 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 1;..    dprin
4ed0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23  tf("Called");..#
4ee0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
4ef0: 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  S1) && defined(N
4f00: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66  O_TLS1_1) && def
4f10: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
4f20: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
4f30: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
4f40: 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 73  d(NO_SSL3).    s
4f50: 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  sl3 = 1;.#endif.
4f60: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
4f70: 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20  LS1).    tls1 = 
4f80: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
4f90: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
4fa0: 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b  .    tls1_1 = 0;
4fb0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
4fc0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20  ned(NO_TLS1_2). 
4fd0: 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23     tls1_2 = 0;.#
4fe0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
4ff0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  d(NO_TLS1_3).   
5000: 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e   tls1_3 = 0;.#en
5010: 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  dif..    if (obj
5020: 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72  c < 2) {..Tcl_Wr
5030: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
5040: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
5050: 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29  nnel ?options?")
5060: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
5070: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5080: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
5090: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
50a0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
50b0: 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  [1]), NULL);.   
50c0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
50d0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
50e0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
50f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
5100: 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20   /*.     * Make 
5110: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
5120: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
5130: 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20  hannel.     */. 
5140: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
5150: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
5160: 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78  );..    for (idx
5170: 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63   = 2; idx < objc
5180: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72  ; idx++) {..char
5190: 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53   *opt = Tcl_GetS
51a0: 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29  tring(objv[idx])
51b0: 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21  ;...if (opt[0] !
51c0: 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61  = '-')..    brea
51d0: 6b 3b 0a 0a 09 4f 50 54 53 54 52 28 22 2d 63 61  k;...OPTSTR("-ca
51e0: 64 69 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f  dir", CAdir);..O
51f0: 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c  PTSTR("-cafile",
5200: 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54   CAfile);..OPTST
5210: 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63  R("-certfile", c
5220: 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54  ertfile);..OPTST
5230: 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70  R("-cipher", cip
5240: 68 65 72 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  hers);..OPTOBJ("
5250: 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70  -command", scrip
5260: 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68  t);..OPTSTR("-dh
5270: 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d  params", DHparam
5280: 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65  s);..OPTSTR("-ke
5290: 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29  yfile", keyfile)
52a0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65  ;..OPTSTR("-mode
52b0: 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54  l", model);..OPT
52c0: 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c  OBJ("-password",
52d0: 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54   password);..OPT
52e0: 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c  BOOL("-require",
52f0: 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 42   require);..OPTB
5300: 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20  OOL("-request", 
5310: 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f  request);..OPTBO
5320: 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65  OL("-server", se
5330: 72 76 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 4f  rver);.#ifndef O
5340: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54  PENSSL_NO_TLSEXT
5350: 0a 09 4f 50 54 53 54 52 28 20 22 2d 73 65 72 76  ..OPTSTR( "-serv
5360: 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e  ername", servern
5370: 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 4f  ame);.#endif...O
5380: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20  PTBOOL("-ssl2", 
5390: 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  ssl2);..OPTBOOL(
53a0: 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a  "-ssl3", ssl3);.
53b0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22  .OPTBOOL("-tls1"
53c0: 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f  , tls1);..OPTBOO
53d0: 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73  L("-tls1.1", tls
53e0: 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  1_1);..OPTBOOL("
53f0: 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32  -tls1.2", tls1_2
5400: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
5410: 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 0a 09  s1.3", tls1_3)..
5420: 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c  OPTBYTE("-cert",
5430: 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29   cert, cert_len)
5440: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79  ;..OPTBYTE("-key
5450: 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29  ", key, key_len)
5460: 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69  ;...OPTBAD("opti
5470: 6f 6e 22 2c 20 22 2d 63 61 64 69 72 2c 20 2d 63  on", "-cadir, -c
5480: 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63  afile, -cert, -c
5490: 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72  ertfile, -cipher
54a0: 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70  , -command, -dhp
54b0: 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65  arams, -key, -ke
54c0: 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d  yfile, -model, -
54d0: 70 61 73 73 77 6f 72 64 2c 20 2d 72 65 71 75 69  password, -requi
54e0: 72 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 73  re, -request, -s
54f0: 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61  erver, -serverna
5500: 6d 65 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33  me, -ssl2, -ssl3
5510: 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31  , -tls1, -tls1.1
5520: 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72 20 74 6c  , -tls1.2, or tl
5530: 73 31 2e 33 22 29 3b 0a 0a 09 72 65 74 75 72 6e  s1.3");...return
5540: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5550: 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73  }.    if (reques
5560: 74 29 09 20 20 20 20 76 65 72 69 66 79 20 7c 3d  t).    verify |=
5570: 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45   SSL_VERIFY_CLIE
5580: 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45  NT_ONCE | SSL_VE
5590: 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69  RIFY_PEER;.    i
55a0: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65  f (request && re
55b0: 71 75 69 72 65 29 20 76 65 72 69 66 79 20 7c 3d  quire) verify |=
55c0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
55d0: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
55e0: 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 79  ;.    if (verify
55f0: 20 3d 3d 20 30 29 09 76 65 72 69 66 79 20 3d 20   == 0).verify = 
5600: 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b  SSL_VERIFY_NONE;
5610: 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ..    proto |= (
5620: 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  ssl2 ? TLS_PROTO
5630: 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20  _SSL2 : 0);.    
5640: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f  proto |= (ssl3 ?
5650: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20   TLS_PROTO_SSL3 
5660: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
5670: 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50  |= (tls1 ? TLS_P
5680: 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a  ROTO_TLS1 : 0);.
5690: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
56a0: 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_1 ? TLS_PROTO
56b0: 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20  _TLS1_1 : 0);.  
56c0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
56d0: 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _2 ? TLS_PROTO_T
56e0: 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20  LS1_2 : 0);.    
56f0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33  proto |= (tls1_3
5700: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
5710: 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  1_3 : 0);..    /
5720: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20  * reset to NULL 
5730: 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20  if blank string 
5740: 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20  provided */.    
5750: 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65  if (cert && !*ce
5760: 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65 72  rt)..        cer
5770: 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  t.        = NULL
5780: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26  ;.    if (key &&
5790: 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20   !*key)..       
57a0: 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e   key.        = N
57b0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72  ULL;.    if (cer
57c0: 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66  tfile && !*certf
57d0: 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 72  ile)         cer
57e0: 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20  tfile.= NULL;.  
57f0: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26    if (keyfile &&
5800: 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79   !*keyfile)..key
5810: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
5820: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70  ULL;.    if (cip
5830: 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72  hers && !*cipher
5840: 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68 65  s).        ciphe
5850: 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  rs.        = NUL
5860: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c  L;.    if (CAfil
5870: 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20  e && !*CAfile). 
5880: 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 20         CAfile.  
5890: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
58a0: 20 20 69 66 20 28 43 41 64 69 72 20 26 26 20 21    if (CAdir && !
58b0: 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 20 20  *CAdir).        
58c0: 43 41 64 69 72 09 20 20 20 20 20 20 20 20 3d 20  CAdir.        = 
58d0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48  NULL;.    if (DH
58e0: 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61  params && !*DHpa
58f0: 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48  rams).        DH
5900: 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20  params        = 
5910: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65  NULL;..    /* ne
5920: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20  w SSL state */. 
5930: 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28     statePtr..= (
5940: 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63  State *) ckalloc
5950: 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65  ((unsigned) size
5960: 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20  of(State));.    
5970: 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c  memset(statePtr,
5980: 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65   0, sizeof(State
5990: 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74  ));..    statePt
59a0: 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73  r->flags.= flags
59b0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
59c0: 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b  interp.= interp;
59d0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76  .    statePtr->v
59e0: 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a  flags.= verify;.
59f0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72      statePtr->er
5a00: 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20  r.= "";..    /* 
5a10: 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20  allocate script 
5a20: 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70  */.    if (scrip
5a30: 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  t) {..(void) Tcl
5a40: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
5a50: 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b  j(script, &len);
5a60: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20  ..if (len) {..  
5a70: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c    statePtr->call
5a80: 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09  back = script;..
5a90: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5aa0: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63  ount(statePtr->c
5ab0: 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20  allback);..}.   
5ac0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63   }..    /* alloc
5ad0: 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a  ate password */.
5ae0: 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64      if (password
5af0: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f  ) {..(void) Tcl_
5b00: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
5b10: 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29  (password, &len)
5b20: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20  ;..if (len) {.. 
5b30: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73     statePtr->pas
5b40: 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64  sword = password
5b50: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
5b60: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
5b70: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a  ->password);..}.
5b80: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d      }..    if (m
5b90: 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  odel != NULL) {.
5ba0: 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47  .int mode;../* G
5bb0: 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63  et the "model" c
5bc0: 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20  ontext */..chan 
5bd0: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
5be0: 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20  (interp, model, 
5bf0: 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61  &mode);..if (cha
5c00: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
5c10: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  l) NULL) {..    
5c20: 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a  Tls_Free((void *
5c30: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20  )statePtr);..   
5c40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5c50: 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d  R;..}.../*.. * M
5c60: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
5c70: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
5c80: 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a  st channel.. */.
5c90: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54  .chan = Tcl_GetT
5ca0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
5cb0: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61  ..if (Tcl_GetCha
5cc0: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
5cd0: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
5ce0: 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  e()) {..    Tcl_
5cf0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
5d00: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
5d10: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
5d20: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
5d30: 0a 09 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ...    "\": not 
5d40: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
5d50: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
5d60: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f      Tls_Free((vo
5d70: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
5d80: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5d90: 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d  ERROR;..}..ctx =
5da0: 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47   ((State *)Tcl_G
5db0: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
5dc0: 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74  eData(chan))->ct
5dd0: 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  x;.    } else {.
5de0: 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f  .if ((ctx = CTX_
5df0: 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 73  Init(statePtr, s
5e00: 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65  erver, proto, ke
5e10: 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c  yfile, certfile,
5e20: 20 6b 65 79 2c 0a 09 09 63 65 72 74 2c 20 6b 65   key,...cert, ke
5e30: 79 5f 6c 65 6e 2c 20 63 65 72 74 5f 6c 65 6e 2c  y_len, cert_len,
5e40: 20 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20   CAdir, CAfile, 
5e50: 63 69 70 68 65 72 73 2c 0a 09 09 44 48 70 61 72  ciphers,...DHpar
5e60: 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ams)) == NULL) {
5e70: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
5e80: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
5e90: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
5ea0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
5eb0: 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  }..    statePtr-
5ec0: 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20  >ctx = ctx;..   
5ed0: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65   /*.     * We ne
5ee0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
5ef0: 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c  that the channel
5f00: 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79   works in binary
5f10: 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a   (for the.     *
5f20: 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20   encryption not 
5f30: 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70  to get goofed up
5f40: 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c  )..     * We onl
5f50: 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74  y want to adjust
5f60: 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69   the buffering i
5f70: 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c  n pre-v2 channel
5f80: 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20  s, where.     * 
5f90: 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20  each channel in 
5fa0: 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61  the stack mainta
5fb0: 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66  ined its own buf
5fc0: 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  fers..     */.  
5fd0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
5fe0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  t(&upperChannelT
5ff0: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20  ranslation);.   
6000: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
6010: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
6020: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  ocking);.    Tcl
6030: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
6040: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
6050: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  r);.    Tcl_DStr
6060: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
6070: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a  annelEncoding);.
6080: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
6090: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
60a0: 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72   chan, "-eofchar
60b0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
60c0: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63  EOFChar);.    Tc
60d0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
60e0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
60f0: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75   "-encoding", &u
6100: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
6110: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ing);.    Tcl_Ge
6120: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
6130: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74  nterp, chan, "-t
6140: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70  ranslation", &up
6150: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
6160: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
6170: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
6180: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
6190: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70  -blocking", &upp
61a0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
61b0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  g);.    Tcl_SetC
61c0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
61d0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
61e0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61  nslation", "bina
61f0: 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ry");.    Tcl_Se
6200: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
6210: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62  nterp, chan, "-b
6220: 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22  locking", "true"
6230: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
6240: 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68  Consuming Tcl ch
6250: 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47  annel %s", Tcl_G
6260: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
6270: 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50  an));.    stateP
6280: 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53  tr->self = Tcl_S
6290: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
62a0: 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54  rp, Tls_ChannelT
62b0: 79 70 65 28 29 2c 20 73 74 61 74 65 50 74 72 2c  ype(), statePtr,
62c0: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c   (TCL_READABLE |
62d0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20   TCL_WRITABLE), 
62e0: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e  chan);.    dprin
62f0: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e  tf("Created chan
6300: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54  nel named %s", T
6310: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
6320: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
6330: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74  ));.    if (stat
6340: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
6350: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
6360: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75  ) {../*.. * No u
6370: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75  se of Tcl_Eventu
6380: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65  allyFree because
6390: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c   no possible Tcl
63a0: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a  _Preserve... */.
63b0: 09 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20  .Tls_Free((void 
63c0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65  *)statePtr);..re
63d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
63e0: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53      }..    Tcl_S
63f0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
6400: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
6410: 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c  ->self, "-transl
6420: 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72  ation", Tcl_DStr
6430: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
6440: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
6450: 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  n));.    Tcl_Set
6460: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
6470: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
6480: 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67  self, "-encoding
6490: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
64a0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
64b0: 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20  lEncoding));.   
64c0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
64d0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
64e0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
64f0: 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53  eofchar", Tcl_DS
6500: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
6510: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
6520: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
6530: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
6540: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
6550: 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c  lf, "-blocking",
6560: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
6570: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  e(&upperChannelB
6580: 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20  locking));..    
6590: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e  /*.     * SSL In
65a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20  itialization.   
65b0: 20 20 2a 2f 0a 0a 20 20 20 20 73 74 61 74 65 50    */..    stateP
65c0: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65  tr->ssl = SSL_ne
65d0: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  w(statePtr->ctx)
65e0: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65  ;.    if (!state
65f0: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20  Ptr->ssl) {../* 
6600: 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f  SSL library erro
6610: 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64  r */..Tcl_Append
6620: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
6630: 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75  couldn't constru
6640: 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20  ct ssl session: 
6650: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  ", REASON(), (ch
6660: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 6c 73  ar *)NULL);..Tls
6670: 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74  _Free((void *)st
6680: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e  atePtr);..return
6690: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
66a0: 7d 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53  }..#ifndef OPENS
66b0: 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 0a 20 20 20  SL_NO_TLSEXT.   
66c0: 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29   if (servername)
66d0: 20 7b 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74   {..if (!SSL_set
66e0: 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d  _tlsext_host_nam
66f0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  e(statePtr->ssl,
6700: 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20   servername) && 
6710: 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20  require) {..    
6720: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6730: 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e  (interp, "settin
6740: 67 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20  g TLS host name 
6750: 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64  extension failed
6760: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
6770: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
6780: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
6790: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
67a0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
67b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
67c0: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c  *.     * SSL Cal
67d0: 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20  lbacks.     */. 
67e0: 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64     SSL_set_app_d
67f0: 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ata(statePtr->ss
6800: 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  l, (void *)state
6810: 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62  Ptr);./* point b
6820: 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20  ack to us */.   
6830: 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28   SSL_set_verify(
6840: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76  statePtr->ssl, v
6850: 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c  erify, VerifyCal
6860: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f  lback);.    SSL_
6870: 43 54 58 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c  CTX_set_info_cal
6880: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
6890: 63 74 78 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63  ctx, InfoCallbac
68a0: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  k);..    /* Crea
68b0: 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42  te Tcl_Channel B
68c0: 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  IO Handler */.  
68d0: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69    statePtr->p_bi
68e0: 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28  o.= BIO_new_tcl(
68f0: 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f  statePtr, BIO_NO
6900: 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74  CLOSE);.    stat
6910: 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f  ePtr->bio.= BIO_
6920: 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29  new(BIO_f_ssl())
6930: 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65  ;..    if (serve
6940: 72 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e  r) {..statePtr->
6950: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
6960: 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65  _SERVER;..SSL_se
6970: 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73  t_accept_state(s
6980: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
6990: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 53 53 4c     } else {..SSL
69a0: 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61  _set_connect_sta
69b0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
69c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c  );.    }.    SSL
69d0: 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74  _set_bio(statePt
69e0: 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72  r->ssl, statePtr
69f0: 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74  ->p_bio, statePt
6a00: 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42  r->p_bio);.    B
6a10: 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65  IO_set_ssl(state
6a20: 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50  Ptr->bio, stateP
6a30: 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43  tr->ssl, BIO_NOC
6a40: 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  LOSE);..    /*. 
6a50: 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c      * End of SSL
6a60: 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20   Init.     */.  
6a70: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
6a80: 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65  ning %s", Tcl_Ge
6a90: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
6aa0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20  tePtr->self));. 
6ab0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
6ac0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
6ad0: 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  ) Tcl_GetChannel
6ae0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
6af0: 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  elf), TCL_VOLATI
6b00: 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LE);.    return 
6b10: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
6b20: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
6b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b60: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70  ----. *. * Unimp
6b70: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  ortObjCmd --. *.
6b80: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
6b90: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  e is invoked to 
6ba0: 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f  remove the topmo
6bb0: 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65  st channel filte
6bc0: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  r.. *. * Results
6bd0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
6be0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
6bf0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
6c00: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68   *.May modify th
6c10: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e  e behavior of an
6c20: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a   IO channel.. *.
6c30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c70: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
6c80: 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62  c int.UnimportOb
6c90: 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e  jCmd(.    TCL_UN
6ca0: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20  USED(void *),.  
6cb0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
6cc0: 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62  terp,.    int ob
6cd0: 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  jc,.    Tcl_Obj 
6ce0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b  *const objv[]).{
6cf0: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
6d00: 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63   chan;../* The c
6d10: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
6d20: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20  mode on. */..   
6d30: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
6d40: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
6d50: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
6d60: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
6d70: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
6d80: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
6d90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6da0: 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  }..    chan = Tc
6db0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
6dc0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
6dd0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  ng(objv[1]), NUL
6de0: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
6df0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
6e00: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
6e10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6e20: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
6e30: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
6e40: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
6e50: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20  pmost channel.  
6e60: 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d     */.    chan =
6e70: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
6e80: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69  el(chan);..    i
6e90: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
6ea0: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
6eb0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
6ec0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
6ed0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
6ee0: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
6ef0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
6f00: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a  me(chan),..."\":
6f10: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e   not a TLS chann
6f20: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  el", (char *)NUL
6f30: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
6f40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
6f50: 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63    if (Tcl_Unstac
6f60: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  kChannel(interp,
6f70: 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52   chan) == TCL_ER
6f80: 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ROR) {..return T
6f90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6fa0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
6fb0: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7000: 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20  . *. * CTX_Init 
7010: 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53  -- construct a S
7020: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a  SL_CTX instance.
7030: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
7040: 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54  *.A valid SSL_CT
7050: 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55  X instance or NU
7060: 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  LL.. *. * Side e
7070: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74  ffects:. *.const
7080: 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78  ructs SSL contex
7090: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d  t (CTX). *. *---
70a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70e0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 53 53 4c  . */..static SSL
70f0: 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28  _CTX *.CTX_Init(
7100: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
7110: 65 50 74 72 2c 0a 20 20 20 20 54 43 4c 5f 55 4e  ePtr,.    TCL_UN
7120: 55 53 45 44 28 69 6e 74 29 20 2f 2a 20 69 73 53  USED(int) /* isS
7130: 65 72 76 65 72 20 2a 2f 2c 0a 20 20 20 20 69 6e  erver */,.    in
7140: 74 20 70 72 6f 74 6f 2c 0a 20 20 20 20 63 68 61  t proto,.    cha
7150: 72 20 2a 6b 65 79 66 69 6c 65 2c 0a 20 20 20 20  r *keyfile,.    
7160: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a  char *certfile,.
7170: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
7180: 72 20 2a 6b 65 79 2c 0a 20 20 20 20 75 6e 73 69  r *key,.    unsi
7190: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c  gned char *cert,
71a0: 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e  .    int key_len
71b0: 2c 0a 20 20 20 20 69 6e 74 20 63 65 72 74 5f 6c  ,.    int cert_l
71c0: 65 6e 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41  en,.    char *CA
71d0: 64 69 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43  dir,.    char *C
71e0: 41 66 69 6c 65 2c 0a 20 20 20 20 63 68 61 72 20  Afile,.    char 
71f0: 2a 63 69 70 68 65 72 73 2c 0a 20 20 20 20 63 68  *ciphers,.    ch
7200: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 0a 7b 0a  ar *DHparams).{.
7210: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
7220: 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74  interp = statePt
7230: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53  r->interp;.    S
7240: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  SL_CTX *ctx = NU
7250: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  LL;.    Tcl_DStr
7260: 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f  ing ds;.    Tcl_
7270: 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20  DString ds1;.   
7280: 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20   int off = 0;.  
7290: 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61    int load_priva
72a0: 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73  te_key;.    cons
72b0: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65  t SSL_METHOD *me
72c0: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e  thod;..    dprin
72d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
72e0: 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b     if (!proto) {
72f0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
7300: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76  lt(interp, "no v
7310: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65  alid protocol se
7320: 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a  lected", (char *
7330: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20  )NULL);..return 
7340: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
7350: 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63   /* create SSL c
7360: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 69 66  ontext */.    if
7370: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
7380: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29   TLS_PROTO_SSL2)
7390: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
73a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70  esult(interp, "p
73b0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
73c0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
73d0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
73e0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64  ULL;.    }.#if d
73f0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
7400: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
7410: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  SL_NO_SSL3) || d
7420: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7430: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20  O_SSL3_METHOD). 
7440: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
7450: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
7460: 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70  SSL3)) {..Tcl_Ap
7470: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7480: 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  p, "protocol not
7490: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
74a0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74  ar *)NULL);..ret
74b0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
74c0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
74d0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
74e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
74f0: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
7500: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7510: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 69  S1_METHOD).    i
7520: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
7530: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
7540: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
7550: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7560: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
7570: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
7580: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20  )NULL);..return 
7590: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
75a0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
75b0: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
75c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
75d0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
75e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
75f0: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_1_METHOD).   
7600: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
7610: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
7620: 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_1)) {..Tcl_Ap
7630: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7640: 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  p, "protocol not
7650: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
7660: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74  ar *)NULL);..ret
7670: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
7680: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
7690: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c  ed(NO_TLS1_2) ||
76a0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
76b0: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  _NO_TLS1_2) || d
76c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
76d0: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
76e0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
76f0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
7700: 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63  O_TLS1_2)) {..Tc
7710: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7720: 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c  nterp, "protocol
7730: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
7740: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
7750: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
7760: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
7770: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
7780: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7790: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 20  NSSL_NO_TLS1_3) 
77a0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
77b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 5f 4d 45 54  SL_NO_TLS1_3_MET
77c0: 48 4f 44 29 0a 20 20 20 20 69 66 20 28 45 4e 41  HOD).    if (ENA
77d0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
77e0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b  PROTO_TLS1_3)) {
77f0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
7800: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74  lt(interp, "prot
7810: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
7820: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  ed", (char *)NUL
7830: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
7840: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
7850: 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74      switch (prot
7860: 6f 29 20 7b 0a 23 69 66 20 21 64 65 66 69 6e 65  o) {.#if !define
7870: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  d(NO_SSL3) && !d
7880: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7890: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
78a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
78b0: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  SL3_METHOD).    
78c0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  case TLS_PROTO_S
78d0: 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 53  SL3:..method = S
78e0: 53 4c 76 33 5f 6d 65 74 68 6f 64 20 28 29 3b 0a  SLv3_method ();.
78f0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
7900: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
7910: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
7920: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7930: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
7940: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
7950: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
7960: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09  LS_PROTO_TLS1:..
7970: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d  method = TLSv1_m
7980: 65 74 68 6f 64 20 28 29 3b 0a 09 62 72 65 61 6b  ethod ();..break
7990: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
79a0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
79b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
79c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20  NSSL_NO_TLS1_1) 
79d0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
79e0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45  SSL_NO_TLS1_1_ME
79f0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
7a00: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a  LS_PROTO_TLS1_1:
7a10: 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31  ..method = TLSv1
7a20: 5f 31 5f 6d 65 74 68 6f 64 20 28 29 3b 0a 09 62  _1_method ();..b
7a30: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
7a40: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
7a50: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
7a60: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7a70: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
7a80: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
7a90: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61  2_METHOD).    ca
7aa0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
7ab0: 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54  1_2:..method = T
7ac0: 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 20 28 29  LSv1_2_method ()
7ad0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
7ae0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
7af0: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
7b00: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7b10: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
7b20: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7b30: 4c 53 31 5f 33 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_3_METHOD).  
7b40: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
7b50: 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65  _TLS1_3:../* Use
7b60: 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74   the generic met
7b70: 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69  hod and constrai
7b80: 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63  nt range after c
7b90: 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65  ontext is create
7ba0: 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 54  d */..method = T
7bb0: 4c 53 5f 6d 65 74 68 6f 64 20 28 29 3b 0a 09 62  LS_method ();..b
7bc0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  reak;.#endif.   
7bd0: 20 64 65 66 61 75 6c 74 3a 0a 23 69 66 64 65 66   default:.#ifdef
7be0: 20 48 41 56 45 5f 54 4c 53 5f 4d 45 54 48 4f 44   HAVE_TLS_METHOD
7bf0: 0a 20 20 20 20 20 20 20 20 6d 65 74 68 6f 64 20  .        method 
7c00: 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 20 28 29 3b  = TLS_method ();
7c10: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 6d  .#else.        m
7c20: 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 33 5f 6d  ethod = SSLv23_m
7c30: 65 74 68 6f 64 20 28 29 3b 0a 23 65 6e 64 69 66  ethod ();.#endif
7c40: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
7c50: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
7c60: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
7c70: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
7c80: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f  OPENSSL_NO_SSL3_
7c90: 4d 45 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20  METHOD)..off |= 
7ca0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
7cb0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20  TLS_PROTO_SSL3) 
7cc0: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
7cd0: 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66  O_SSLv3);.#endif
7ce0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
7cf0: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
7d00: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7d10: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
7d20: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
7d30: 4d 45 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20  METHOD)..off |= 
7d40: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
7d50: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20  TLS_PROTO_TLS1) 
7d60: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
7d70: 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66  O_TLSv1);.#endif
7d80: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
7d90: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
7da0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7db0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
7dc0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7dd0: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 6f  LS1_1_METHOD)..o
7de0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
7df0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
7e00: 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53  TLS1_1) ? 0 : SS
7e10: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29  L_OP_NO_TLSv1_1)
7e20: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
7e30: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
7e40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
7e50: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20  NSSL_NO_TLS1_2) 
7e60: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
7e70: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45  SSL_NO_TLS1_2_ME
7e80: 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 45  THOD)..off |= (E
7e90: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
7ea0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20  S_PROTO_TLS1_2) 
7eb0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
7ec0: 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66  TLSv1_2);.#endif
7ed0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
7ee0: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
7ef0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7f00: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
7f10: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7f20: 4c 53 31 5f 33 5f 4d 45 54 48 4f 44 29 0a 09 6f  LS1_3_METHOD)..o
7f30: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
7f40: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
7f50: 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53  TLS1_3) ? 0 : SS
7f60: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29  L_OP_NO_TLSv1_3)
7f70: 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b  ;.#endif..break;
7f80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 20  .    }..    ctx 
7f90: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 20 28 6d  = SSL_CTX_new (m
7fa0: 65 74 68 6f 64 29 3b 0a 0a 20 20 20 20 69 66 20  ethod);..    if 
7fb0: 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e  (!ctx) {..return
7fc0: 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 23  (NULL);.    }..#
7fd0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
7fe0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
7ff0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8000: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72  S1_3).    if (pr
8010: 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f  oto == TLS_PROTO
8020: 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f  _TLS1_3) {..SSL_
8030: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
8040: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
8050: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
8060: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78  .SSL_CTX_set_max
8070: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
8080: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49  tx, TLS1_3_VERSI
8090: 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ON);.    }.#endi
80a0: 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  f..    SSL_CTX_s
80b0: 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c  et_app_data(ctx,
80c0: 20 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d   interp);./* rem
80d0: 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70  ember the interp
80e0: 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c  reter */.    SSL
80f0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
8100: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c  (ctx, SSL_OP_ALL
8110: 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75  );./* all SSL bu
8120: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f  g workarounds */
8130: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
8140: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66  _options(ctx, of
8150: 66 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62  f);./* all SSL b
8160: 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a  ug workarounds *
8170: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
8180: 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a  ss_set_cache_siz
8190: 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20  e(ctx, 128);..  
81a0: 20 20 69 66 20 28 63 69 70 68 65 72 73 20 21 3d    if (ciphers !=
81b0: 20 4e 55 4c 4c 29 0a 09 53 53 4c 5f 43 54 58 5f   NULL)..SSL_CTX_
81c0: 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28  set_cipher_list(
81d0: 63 74 78 2c 20 63 69 70 68 65 72 73 29 3b 0a 0a  ctx, ciphers);..
81e0: 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20      /* set some 
81f0: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20  callbacks */.   
8200: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66   SSL_CTX_set_def
8210: 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63  ault_passwd_cb(c
8220: 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c  tx, PasswordCall
8230: 62 61 63 6b 29 3b 0a 0a 23 69 66 6e 64 65 66 20  back);..#ifndef 
8240: 42 53 41 46 45 0a 20 20 20 20 53 53 4c 5f 43 54  BSAFE.    SSL_CT
8250: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61  X_set_default_pa
8260: 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61  sswd_cb_userdata
8270: 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  (ctx, (void *)st
8280: 61 74 65 50 74 72 29 3b 0a 23 65 6e 64 69 66 0a  atePtr);.#endif.
8290: 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44  .    /* read a D
82a0: 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61  iffie-Hellman pa
82b0: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f  rameters file, o
82c0: 72 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d  r use the built-
82d0: 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66  in one */.#ifdef
82e0: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20   OPENSSL_NO_DH. 
82f0: 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20     if (DHparams 
8300: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  != NULL) {..Tcl_
8310: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8320: 65 72 70 2c 0a 09 09 22 44 48 20 70 61 72 61 6d  erp,..."DH param
8330: 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74  eter support not
8340: 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68   available", (ch
8350: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c  ar *)NULL);..SSL
8360: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
8370: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
8380: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a    }.#else.    {.
8390: 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48  .DH* dh;..if (DH
83a0: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20  params != NULL) 
83b0: 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b  {..    BIO *bio;
83c0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
83d0: 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20  gInit(&ds);..   
83e0: 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66   bio = BIO_new_f
83f0: 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73  ile(F2N(DHparams
8400: 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20  , &ds), "r");.. 
8410: 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09     if (!bio) {..
8420: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
8430: 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70  (&ds);...Tcl_App
8440: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8450: 2c 0a 09 09 20 20 20 20 22 43 6f 75 6c 64 20 6e  ,...    "Could n
8460: 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d  ot find DH param
8470: 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68  eters file", (ch
8480: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53  ar *)NULL);...SS
8490: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
84a0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
84b0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20  .    }...    dh 
84c0: 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44  = PEM_read_bio_D
84d0: 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c  Hparams(bio, NUL
84e0: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  L, NULL, NULL);.
84f0: 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69  .    BIO_free(bi
8500: 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  o);..    Tcl_DSt
8510: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
8520: 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09      if (!dh) {..
8530: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
8540: 74 28 69 6e 74 65 72 70 2c 0a 09 09 20 20 20 20  t(interp,...    
8550: 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20  "Could not read 
8560: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72  DH parameters fr
8570: 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20  om file", (char 
8580: 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  *)NULL);...SSL_C
8590: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
85a0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
85b0: 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20    }..} else {.. 
85c0: 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61     dh = get_dhPa
85d0: 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f  rams();..}..SSL_
85e0: 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63  CTX_set_tmp_dh(c
85f0: 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65  tx, dh);..DH_fre
8600: 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  e(dh);.    }.#en
8610: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20  dif..    /* set 
8620: 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20  our certificate 
8630: 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76  */.    load_priv
8640: 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20  ate_key = 0;.   
8650: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d   if (certfile !=
8660: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70   NULL) {..load_p
8670: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a  rivate_key = 1;.
8680: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69  ..Tcl_DStringIni
8690: 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53  t(&ds);...if (SS
86a0: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66  L_CTX_use_certif
86b0: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20  icate_file(ctx, 
86c0: 46 32 4e 28 20 63 65 72 74 66 69 6c 65 2c 20 26  F2N( certfile, &
86d0: 64 73 29 2c 0a 09 09 09 09 09 53 53 4c 5f 46 49  ds),......SSL_FI
86e0: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
86f0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  ) {..    Tcl_DSt
8700: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
8710: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8720: 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09 09 09  sult(interp,....
8730: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
8740: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20  set certificate 
8750: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65  file ", certfile
8760: 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20  , ": ",....     
8770: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
8780: 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  *)NULL);..    SS
8790: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
87a0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
87b0: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  L;..}.    } else
87c0: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c   if (cert != NUL
87d0: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61  L) {..load_priva
87e0: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20  te_key = 1;..if 
87f0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
8800: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74  tificate_ASN1(ct
8810: 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72  x, cert_len, cer
8820: 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20  t) <= 0) {..    
8830: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
8840: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41  &ds);..    Tcl_A
8850: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8860: 72 70 2c 0a 09 09 09 20 20 20 20 20 22 75 6e 61  rp,....     "una
8870: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69  ble to set certi
8880: 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 09 20 20  ficate: ",....  
8890: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68     REASON(), (ch
88a0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20  ar *)NULL);..   
88b0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
88c0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
88d0: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65  NULL;..}.    } e
88e0: 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20  lse {..certfile 
88f0: 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65  = (char*)X509_ge
8900: 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66  t_default_cert_f
8910: 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c  ile();...if (SSL
8920: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69  _CTX_use_certifi
8930: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63  cate_file(ctx, c
8940: 65 72 74 66 69 6c 65 2c 0a 09 09 09 09 09 53 53  ertfile,......SS
8950: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20  L_FILETYPE_PEM) 
8960: 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20  <= 0) {.#if 0.. 
8970: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
8980: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63  ee(&ds);..    Tc
8990: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
89a0: 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20 20 22  nterp,....     "
89b0: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65  unable to use de
89c0: 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74  fault certificat
89d0: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69  e file ", certfi
89e0: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20  le, ": ",....   
89f0: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61    REASON(), (cha
8a00: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  r *)NULL);..    
8a10: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
8a20: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
8a30: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20  ULL;.#endif..}. 
8a40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74     }..    /* set
8a50: 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79   our private key
8a60: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64   */.    if (load
8a70: 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a  _private_key) {.
8a80: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20  .if (keyfile == 
8a90: 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e  NULL && key == N
8aa0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66  ULL) {..    keyf
8ab0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a  ile = certfile;.
8ac0: 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65  .}...if (keyfile
8ad0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
8ae0: 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76   /* get the priv
8af0: 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  ate key associat
8b00: 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72  ed with this cer
8b10: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20  tificate */..   
8b20: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20   if (keyfile == 
8b30: 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c  NULL) {...keyfil
8b40: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20  e = certfile;.. 
8b50: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53     }...    if (S
8b60: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61  SL_CTX_use_Priva
8b70: 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20  teKey_file(ctx, 
8b80: 46 32 4e 28 20 6b 65 79 66 69 6c 65 2c 20 26 64  F2N( keyfile, &d
8b90: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  s), SSL_FILETYPE
8ba0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09  _PEM) <= 0) {...
8bb0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
8bc0: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68  &ds);.../* flush
8bd0: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20   the passphrase 
8be0: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c  which might be l
8bf0: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  eft in the resul
8c00: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65  t */...Tcl_SetRe
8c10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c  sult(interp, NUL
8c20: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  L, TCL_STATIC);.
8c30: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
8c40: 6c 74 28 69 6e 74 65 72 70 2c 0a 09 09 09 20 20  lt(interp,....  
8c50: 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
8c60: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79  o set public key
8c70: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65   file ", keyfile
8c80: 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20  , " ",....      
8c90: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68     REASON(), (ch
8ca0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53  ar *)NULL);...SS
8cb0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
8cc0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
8cd0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 54 63 6c  .    }...    Tcl
8ce0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
8cf0: 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b  );..} else if (k
8d00: 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  ey != NULL) {.. 
8d10: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75     if (SSL_CTX_u
8d20: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53  se_PrivateKey_AS
8d30: 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c  N1(EVP_PKEY_RSA,
8d40: 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65   ctx, key,key_le
8d50: 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c  n) <= 0) {...Tcl
8d60: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
8d70: 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68  );.../* flush th
8d80: 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69  e passphrase whi
8d90: 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  ch might be left
8da0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
8db0: 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  /...Tcl_SetResul
8dc0: 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20  t(interp, NULL, 
8dd0: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54  TCL_STATIC);...T
8de0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8df0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
8e00: 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65  to set public ke
8e10: 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  y: ", REASON(), 
8e20: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
8e30: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
8e40: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
8e50: 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a  L;..    }..}../*
8e60: 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61   Now we know tha
8e70: 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74  t a key and cert
8e80: 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61   have been set a
8e90: 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53  gainst.. * the S
8ea0: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69  SL context */..i
8eb0: 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63  f (!SSL_CTX_chec
8ec0: 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74  k_private_key(ct
8ed0: 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  x)) {..    Tcl_A
8ee0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8ef0: 72 70 2c 0a 09 09 09 20 20 20 20 20 22 70 72 69  rp,....     "pri
8f00: 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f  vate key does no
8f10: 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74  t match the cert
8f20: 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b  ificate public k
8f30: 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68  ey",....     (ch
8f40: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20  ar *)NULL);..   
8f50: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
8f60: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
8f70: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  NULL;..}.    }..
8f80: 20 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66      /* Set verif
8f90: 69 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20  ication CAs */. 
8fa0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
8fb0: 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c  it(&ds);.    Tcl
8fc0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
8fd0: 31 29 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c  1);.    if (!SSL
8fe0: 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79  _CTX_load_verify
8ff0: 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20  _locations(ctx, 
9000: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
9010: 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73  , F2N(CAdir, &ds
9020: 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58  1)) ||..!SSL_CTX
9030: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72  _set_default_ver
9040: 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20  ify_paths(ctx)) 
9050: 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74  {.#if 0..Tcl_DSt
9060: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
9070: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
9080: 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74  &ds1);../* Don't
9090: 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20   currently care 
90a0: 69 66 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f  if this fails */
90b0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
90c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20  lt(interp, "SSL 
90d0: 64 65 66 61 75 6c 74 20 76 65 72 69 66 79 20 70  default verify p
90e0: 61 74 68 73 3a 20 22 2c 0a 09 09 52 45 41 53 4f  aths: ",...REASO
90f0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  N(), (char *)NUL
9100: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
9110: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
9120: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  NULL;.#endif.   
9130: 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73   }..    /* https
9140: 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  ://sourceforge.n
9150: 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37  et/p/tls/bugs/57
9160: 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a  / */.    /* XXX:
9170: 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73  TODO: Let the us
9180: 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73  er supply values
9190: 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66   here instead of
91a0: 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
91b0: 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69  exists on the fi
91c0: 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20  lesystem */.    
91d0: 69 66 20 28 20 43 41 66 69 6c 65 20 21 3d 20 4e  if ( CAfile != N
91e0: 55 4c 4c 20 29 20 7b 0a 20 20 20 20 20 20 20 20  ULL ) {.        
91f0: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41  STACK_OF(X509_NA
9200: 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d  ME) *certNames =
9210: 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74   SSL_load_client
9220: 5f 43 41 5f 66 69 6c 65 28 20 46 32 4e 28 43 41  _CA_file( F2N(CA
9230: 66 69 6c 65 2c 20 26 64 73 29 20 29 3b 0a 09 69  file, &ds) );..i
9240: 66 20 28 20 63 65 72 74 4e 61 6d 65 73 20 21 3d  f ( certNames !=
9250: 20 4e 55 4c 4c 20 29 20 7b 0a 09 20 20 20 20 53   NULL ) {..    S
9260: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e  SL_CTX_set_clien
9270: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63  t_CA_list(ctx, c
9280: 65 72 74 4e 61 6d 65 73 20 29 3b 0a 09 7d 0a 20  ertNames );..}. 
9290: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
92a0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
92b0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
92c0: 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72  ree(&ds1);.    r
92d0: 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f  eturn ctx;.}.../
92e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
92f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9320: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74  -------. *. * St
9330: 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  atusObjCmd -- re
9340: 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65  turn certificate
9350: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70   for connected p
9360: 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  eer.. *. * Resul
9370: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
9380: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
9390: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
93a0: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
93b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93f0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
9400: 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28  nt.StatusObjCmd(
9410: 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28  .    TCL_UNUSED(
9420: 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c  void *),.    Tcl
9430: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9440: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  .    int objc,. 
9450: 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e 73     Tcl_Obj.*cons
9460: 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20  t objv[]).{.    
9470: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
9480: 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b  .    X509 *peer;
9490: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
94a0: 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68  jPtr;.    Tcl_Ch
94b0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20  annel chan;.    
94c0: 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d  char *channelNam
94d0: 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20  e, *ciphers;.   
94e0: 20 69 6e 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20   int mode;..    
94f0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
9500: 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28  );..    switch (
9510: 6f 62 6a 63 29 20 7b 0a 09 63 61 73 65 20 32 3a  objc) {..case 2:
9520: 0a 09 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d  ..    channelNam
9530: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
9540: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 09 20 20 20  g(objv[1]);..   
9550: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 33   break;...case 3
9560: 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 72 63  :..    if (!strc
9570: 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  mp (Tcl_GetStrin
9580: 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c  g (objv[1]), "-l
9590: 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 6e  ocal")) {...chan
95a0: 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  nelName = Tcl_Ge
95b0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
95c0: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
95d0: 7d 0a 09 20 20 20 20 2f 2a 20 66 61 6c 6c 74 68  }..    /* fallth
95e0: 72 6f 75 67 68 20 2a 2f 0a 09 64 65 66 61 75 6c  rough */..defaul
95f0: 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e  t:..    Tcl_Wron
9600: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
9610: 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63   1, objv, "?-loc
9620: 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  al? channel");..
9630: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9640: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
9650: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
9660: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
9670: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64  hannelName, &mod
9680: 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  e);.    if (chan
9690: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
96a0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
96b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
96c0: 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a   }.    /*.     *
96d0: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
96e0: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
96f0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20  most channel.   
9700: 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20    */.    chan = 
9710: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
9720: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
9730: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
9740: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
9750: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
9760: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
9770: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
9780: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
9790: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
97a0: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e  (chan),..."\": n
97b0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
97c0: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
97d0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
97e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
97f0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
9800: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
9810: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
9820: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 6f 62  han);.    if (ob
9830: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72  jc == 2) {..peer
9840: 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f   = SSL_get_peer_
9850: 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74  certificate(stat
9860: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
9870: 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d  } else {..peer =
9880: 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69   SSL_get_certifi
9890: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  cate(statePtr->s
98a0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  sl);.    }.    i
98b0: 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50  f (peer) {..objP
98c0: 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39  tr = Tls_NewX509
98d0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72  Obj(interp, peer
98e0: 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20  );..if (objc == 
98f0: 32 29 20 7b 20 58 35 30 39 5f 66 72 65 65 28 70  2) { X509_free(p
9900: 65 65 72 29 3b 20 7d 0a 20 20 20 20 7d 20 65 6c  eer); }.    } el
9910: 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54  se {..objPtr = T
9920: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
9930: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20   NULL);.    }.. 
9940: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
9950: 70 65 6e 64 45 6c 65 6d 65 6e 74 20 28 69 6e 74  pendElement (int
9960: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 20 20  erp, objPtr,..  
9970: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
9980: 62 6a 20 28 22 73 62 69 74 73 22 2c 20 2d 31 29  bj ("sbits", -1)
9990: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
99a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 20  bjAppendElement 
99b0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
99c0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74  ..    Tcl_NewInt
99d0: 4f 62 6a 20 28 53 53 4c 5f 67 65 74 5f 63 69 70  Obj (SSL_get_cip
99e0: 68 65 72 5f 62 69 74 73 20 28 73 74 61 74 65 50  her_bits (stateP
99f0: 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 29  tr->ssl, NULL)))
9a00: 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d  ;..    ciphers =
9a10: 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f   (char*)SSL_get_
9a20: 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d  cipher(statePtr-
9a30: 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63  >ssl);.    if (c
9a40: 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 20 26  iphers != NULL &
9a50: 26 20 73 74 72 63 6d 70 28 63 69 70 68 65 72 73  & strcmp(ciphers
9a60: 2c 20 22 28 4e 4f 4e 45 29 22 29 21 3d 30 29 20  , "(NONE)")!=0) 
9a70: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
9a80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
9a90: 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09 54 63  rp, objPtr,...Tc
9aa0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
9ab0: 63 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09  cipher", -1));..
9ac0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
9ad0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
9ae0: 20 6f 62 6a 50 74 72 2c 0a 09 09 54 63 6c 5f 4e   objPtr,...Tcl_N
9af0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
9b00: 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65  get_cipher(state
9b10: 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b  Ptr->ssl), -1));
9b20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
9b30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
9b40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
9b50: 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72  Ptr,..Tcl_NewStr
9b60: 69 6e 67 4f 62 6a 28 22 76 65 72 73 69 6f 6e 22  ingObj("version"
9b70: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
9b80: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
9b90: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
9ba0: 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72  Ptr,..Tcl_NewStr
9bb0: 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76  ingObj(SSL_get_v
9bc0: 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d  ersion(statePtr-
9bd0: 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  >ssl), -1));..  
9be0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
9bf0: 6c 74 28 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50  lt( interp, objP
9c00: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
9c10: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
9c20: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
9c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c60: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69  ----. *. * Versi
9c70: 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  onObjCmd -- retu
9c80: 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e  rn version strin
9c90: 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a  g from OpenSSL..
9ca0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
9cb0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
9cc0: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
9cd0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
9ce0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
9cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
9d30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65  */.static int.Ve
9d40: 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 0a 20 20 20  rsionObjCmd(.   
9d50: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64   TCL_UNUSED(void
9d60: 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74   *),.    Tcl_Int
9d70: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20  erp *interp,.   
9d80: 20 54 43 4c 5f 55 4e 55 53 45 44 28 69 6e 74 29   TCL_UNUSED(int)
9d90: 20 2f 2a 20 6f 62 6a 63 20 2a 2f 2c 0a 20 20 20   /* objc */,.   
9da0: 20 54 43 4c 5f 55 4e 55 53 45 44 28 54 63 6c 5f   TCL_UNUSED(Tcl_
9db0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 29 20 2f 2a  Obj *const *) /*
9dc0: 20 6f 62 6a 76 20 2a 2f 29 0a 7b 0a 20 20 20 20   objv */).{.    
9dd0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
9de0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
9df0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62  alled");..    ob
9e00: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74  jPtr = Tcl_NewSt
9e10: 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f  ringObj(OPENSSL_
9e20: 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31  VERSION_TEXT, -1
9e30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  );..    Tcl_SetO
9e40: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
9e50: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
9e60: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
9e70: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
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 2d  ----------------
9eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
9ec0: 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69  MiscObjCmd -- mi
9ed0: 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20  sc commands. *. 
9ee0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
9ef0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
9f00: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
9f10: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
9f20: 2e 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
9f70: 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62  tatic int.MiscOb
9f80: 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e  jCmd(.    TCL_UN
9f90: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20  USED(void *),.  
9fa0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9fb0: 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62  terp,.    int ob
9fc0: 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09  jc,.    Tcl_Obj.
9fd0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b  *const objv[]).{
9fe0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
9ff0: 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73  t char *commands
a000: 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 4e   [] = { "req", N
a010: 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20  ULL };.    enum 
a020: 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c  command { C_REQ,
a030: 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20   C_DUMMY };.    
a040: 69 6e 74 20 63 6d 64 3b 0a 0a 20 20 20 20 64 70  int cmd;..    dp
a050: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
a060: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c  ..    if (objc <
a070: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
a080: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a090: 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d  1, objv, "subcom
a0a0: 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09  mand ?args?");..
a0b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a0c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
a0d0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
a0e0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
a0f0: 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 0a 09  [1], commands,..
a100: 20 20 20 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30      "command", 0
a110: 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b  ,&cmd) != TCL_OK
a120: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
a130: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
a140: 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20    switch ((enum 
a150: 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a  command) cmd) {.
a160: 09 63 61 73 65 20 43 5f 52 45 51 3a 20 7b 0a 09  .case C_REQ: {..
a170: 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b      EVP_PKEY *pk
a180: 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35  ey=NULL;..    X5
a190: 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09  09 *cert=NULL;..
a1a0: 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e      X509_NAME *n
a1b0: 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54  ame=NULL;..    T
a1c0: 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a  cl_Obj **listv;.
a1d0: 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69  .    Tcl_Size li
a1e0: 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f  stc,i;...    BIO
a1f0: 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20   *out=NULL;...  
a200: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 5f    const char *k_
a210: 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b  C="",*k_ST="",*k
a220: 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b  _L="",*k_O="",*k
a230: 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c  _OU="",*k_CN="",
a240: 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20  *k_Email="";..  
a250: 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a    char *keyout,*
a260: 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20  pemout,*str;..  
a270: 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65    int keysize,se
a280: 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b  rial=0,days=365;
a290: 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63  ...    if ((objc
a2a0: 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29  <5) || (objc>6))
a2b0: 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75   {...Tcl_WrongNu
a2c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
a2d0: 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20   objv, "keysize 
a2e0: 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65  keyfile certfile
a2f0: 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74   ?info?");...ret
a300: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a310: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
a320: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
a330: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
a340: 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20  ], &keysize) != 
a350: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75  TCL_OK) {...retu
a360: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
a370: 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74     }..    keyout
a380: 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  =Tcl_GetString(o
a390: 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65  bjv[3]);..    pe
a3a0: 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69  mout=Tcl_GetStri
a3b0: 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 09 20  ng(objv[4]);... 
a3c0: 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20     if (objc>=6) 
a3d0: 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74  {...if (Tcl_List
a3e0: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69  ObjGetElements(i
a3f0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a  nterp, objv[5],.
a400: 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74  ...&listc, &list
a410: 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  v) != TCL_OK) {.
a420: 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a430: 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69  _ERROR;...}....i
a440: 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20  f ((listc%2) != 
a450: 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  0) {...    Tcl_S
a460: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
a470: 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73  "Information lis
a480: 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e  t must have even
a490: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
a4a0: 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ents",NULL);... 
a4b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a4c0: 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28  ROR;...}...for (
a4d0: 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b  i=0; i<listc; i+
a4e0: 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d  =2) {...    str=
a4f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
a500: 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69  stv[i]);...    i
a510: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64  f (strcmp(str,"d
a520: 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69  ays")==0) {....i
a530: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
a540: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74  mObj(interp,list
a550: 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54  v[i+1],&days)!=T
a560: 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65  CL_OK)....    re
a570: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a580: 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
a590: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72  (strcmp(str,"ser
a5a0: 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69  ial")==0) {....i
a5b0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
a5c0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74  mObj(interp,list
a5d0: 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21  v[i+1],&serial)!
a5e0: 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20  =TCL_OK)....    
a5f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a600: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
a610: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73  f (strcmp(str,"s
a620: 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09  erial")==0) {...
a630: 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46  .if (Tcl_GetIntF
a640: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69  romObj(interp,li
a650: 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c  stv[i+1],&serial
a660: 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20  )!=TCL_OK)....  
a670: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a680: 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  OR;...    } else
a690: 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
a6a0: 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "C")==0) {....k_
a6b0: 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  C=Tcl_GetString(
a6c0: 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
a6d0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
a6e0: 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d  rcmp(str,"ST")==
a6f0: 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c  0) {....k_ST=Tcl
a700: 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
a710: 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
a720: 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
a730: 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09  str,"L")==0) {..
a740: 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72  ..k_L=Tcl_GetStr
a750: 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
a760: 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
a770: 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22   (strcmp(str,"O"
a780: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54  )==0) {....k_O=T
a790: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
a7a0: 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
a7b0: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
a7c0: 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20  p(str,"OU")==0) 
a7d0: 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65  {....k_OU=Tcl_Ge
a7e0: 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
a7f0: 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
a800: 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
a810: 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09  ,"CN")==0) {....
a820: 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69  k_CN=Tcl_GetStri
a830: 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
a840: 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
a850: 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61  (strcmp(str,"Ema
a860: 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  il")==0) {....k_
a870: 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72  Email=Tcl_GetStr
a880: 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
a890: 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ...    } else {.
a8a0: 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
a8b0: 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e  (interp,"Unknown
a8c0: 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c   parameter",NULL
a8d0: 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c  );....return TCL
a8e0: 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a  _ERROR;...    }.
a8f0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ..}..    }..    
a900: 69 66 20 28 28 70 6b 65 79 20 3d 20 45 56 50 5f  if ((pkey = EVP_
a910: 50 4b 45 59 5f 6e 65 77 28 29 29 20 21 3d 20 4e  PKEY_new()) != N
a920: 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 21 45 56  ULL) {...if (!EV
a930: 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53  P_PKEY_assign_RS
a940: 41 28 70 6b 65 79 2c 0a 09 09 09 52 53 41 5f 67  A(pkey,....RSA_g
a950: 65 6e 65 72 61 74 65 5f 6b 65 79 28 6b 65 79 73  enerate_key(keys
a960: 69 7a 65 2c 20 30 78 31 30 30 30 31 2c 20 4e 55  ize, 0x10001, NU
a970: 4c 4c 2c 20 4e 55 4c 4c 29 29 29 20 7b 0a 09 09  LL, NULL))) {...
a980: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
a990: 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
a9a0: 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61  generating priva
a9b0: 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09  te key",NULL);..
a9c0: 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72  .    EVP_PKEY_fr
a9d0: 65 65 28 70 6b 65 79 29 3b 0a 09 09 20 20 20 20  ee(pkey);...    
a9e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a9f0: 3b 0a 09 09 7d 0a 09 09 6f 75 74 3d 42 49 4f 5f  ;...}...out=BIO_
aa00: 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29  new(BIO_s_file()
aa10: 29 3b 0a 09 09 42 49 4f 5f 77 72 69 74 65 5f 66  );...BIO_write_f
aa20: 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f  ilename(out,keyo
aa30: 75 74 29 3b 0a 09 09 50 45 4d 5f 77 72 69 74 65  ut);...PEM_write
aa40: 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28  _bio_PrivateKey(
aa50: 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55  out,pkey,NULL,NU
aa60: 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b  LL,0,NULL,NULL);
aa70: 0a 09 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28  ...BIO_free_all(
aa80: 6f 75 74 29 3b 0a 0a 09 09 69 66 20 28 28 63 65  out);....if ((ce
aa90: 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d  rt=X509_new())==
aaa0: 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63  NULL) {...    Tc
aab0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
aac0: 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61  rp,"Error genera
aad0: 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ting certificate
aae0: 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b   request",NULL);
aaf0: 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
ab00: 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 20 20  free(pkey);...  
ab10: 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52    return(TCL_ERR
ab20: 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  OR);...}....X509
ab30: 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72  _set_version(cer
ab40: 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54  t,2);...ASN1_INT
ab50: 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65  EGER_set(X509_ge
ab60: 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63  t_serialNumber(c
ab70: 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09  ert),serial);...
ab80: 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
ab90: 58 35 30 39 5f 67 65 74 5f 6e 6f 74 42 65 66 6f  X509_get_notBefo
aba0: 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58  re(cert),0);...X
abb0: 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58  509_gmtime_adj(X
abc0: 35 30 39 5f 67 65 74 5f 6e 6f 74 41 66 74 65 72  509_get_notAfter
abd0: 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a  (cert),(long)60*
abe0: 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58  60*24*days);...X
abf0: 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63  509_set_pubkey(c
ac00: 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61  ert,pkey);....na
ac10: 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a  me=X509_get_subj
ac20: 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a  ect_name(cert);.
ac30: 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
ac40: 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
ac50: 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47  me,"C", MBSTRING
ac60: 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20  _ASC, (unsigned 
ac70: 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c  char *) k_C, -1,
ac80: 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
ac90: 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
aca0: 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c  y_txt(name,"ST",
acb0: 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
acc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
acd0: 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30   k_ST, -1, -1, 0
ace0: 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
acf0: 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
ad00: 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49  name,"L", MBSTRI
ad10: 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65  NG_ASC, (unsigne
ad20: 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d  d char *) k_L, -
ad30: 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
ad40: 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
ad50: 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22  _by_txt(name,"O"
ad60: 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
ad70: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
ad80: 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30  ) k_O, -1, -1, 0
ad90: 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
ada0: 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
adb0: 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52  name,"OU", MBSTR
adc0: 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e  ING_ASC, (unsign
add0: 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c  ed char *) k_OU,
ade0: 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
adf0: 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
ae00: 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
ae10: 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  CN", MBSTRING_AS
ae20: 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  C, (unsigned cha
ae30: 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d  r *) k_CN, -1, -
ae40: 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
ae50: 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
ae60: 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22  txt(name,"Email"
ae70: 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
ae80: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
ae90: 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d  ) k_Email, -1, -
aea0: 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73  1, 0);....X509_s
aeb0: 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28  et_subject_name(
aec0: 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69  cert,name);....i
aed0: 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65  f (!X509_sign(ce
aee0: 72 74 2c 70 6b 65 79 2c 45 56 50 5f 6d 64 35 28  rt,pkey,EVP_md5(
aef0: 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39  ))) {...    X509
af00: 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20  _free(cert);... 
af10: 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65     EVP_PKEY_free
af20: 28 70 6b 65 79 29 3b 0a 09 09 20 20 20 20 54 63  (pkey);...    Tc
af30: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
af40: 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e  rp,"Error signin
af50: 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e  g certificate",N
af60: 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75  ULL);...    retu
af70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
af80: 7d 0a 0a 09 09 6f 75 74 3d 42 49 4f 5f 6e 65 77  }....out=BIO_new
af90: 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a  (BIO_s_file());.
afa0: 09 09 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65  ..BIO_write_file
afb0: 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29  name(out,pemout)
afc0: 3b 0a 0a 09 09 50 45 4d 5f 77 72 69 74 65 5f 62  ;....PEM_write_b
afd0: 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74  io_X509(out,cert
afe0: 29 3b 0a 09 09 42 49 4f 5f 66 72 65 65 5f 61 6c  );...BIO_free_al
aff0: 6c 28 6f 75 74 29 3b 0a 0a 09 09 58 35 30 39 5f  l(out);....X509_
b000: 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56  free(cert);...EV
b010: 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
b020: 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  );..    } else {
b030: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
b040: 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67  (interp,"Error g
b050: 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74  enerating privat
b060: 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09  e key",NULL);...
b070: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b080: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65  ;..    }..}..bre
b090: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
b0a0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ..break;.    }. 
b0b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
b0c0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
b0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
b110: 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d  *. * Tls_Free --
b120: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
b130: 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20  edure cleans up 
b140: 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65  when a SSL socke
b150: 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a  t based channel.
b160: 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64   *.is closed and
b170: 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
b180: 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77  ount falls below
b190: 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73   1. *. * Results
b1a0: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.none. *. * 
b1b0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
b1c0: 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73  .Frees all the s
b1d0: 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  tate. *. *------
b1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
b220: 2f 0a 76 6f 69 64 0a 23 69 66 20 54 43 4c 5f 4d  /.void.#if TCL_M
b230: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38  AJOR_VERSION > 8
b240: 0a 54 6c 73 5f 46 72 65 65 28 20 76 6f 69 64 20  .Tls_Free( void 
b250: 2a 62 6c 6f 63 6b 50 74 72 20 29 0a 23 65 6c 73  *blockPtr ).#els
b260: 65 0a 54 6c 73 5f 46 72 65 65 28 20 63 68 61 72  e.Tls_Free( char
b270: 20 2a 62 6c 6f 63 6b 50 74 72 20 29 0a 23 65 6e   *blockPtr ).#en
b280: 64 69 66 0a 7b 0a 20 20 20 20 53 74 61 74 65 20  dif.{.    State 
b290: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
b2a0: 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a  te *)blockPtr;..
b2b0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
b2c0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f  led");..    Tls_
b2d0: 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b  Clean(statePtr);
b2e0: 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63  .    ckfree(bloc
b2f0: 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  kPtr);.}.../*. *
b300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b340: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c  ---. *. * Tls_Cl
b350: 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  ean --. *. *.Thi
b360: 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
b370: 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c  ns up when a SSL
b380: 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68   socket based ch
b390: 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73  annel. *.is clos
b3a0: 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72  ed and its refer
b3b0: 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73  ence count falls
b3c0: 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20   below 1.  This 
b3d0: 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c  should. *.be cal
b3e0: 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  led synchronousl
b3f0: 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72  y by the ClosePr
b400: 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20  oc, not in the. 
b410: 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65  *.EventuallyFree
b420: 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a   callback.. *. *
b430: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e   Results:. *.non
b440: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
b450: 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61  ects:. *.Frees a
b460: 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a  ll the state. *.
b470: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
b480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b4b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54  -----. */.void T
b4c0: 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a  ls_Clean(State *
b4d0: 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20  statePtr) {.    
b4e0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
b4f0: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
b500: 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67  * we're assuming
b510: 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65   here that we're
b520: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
b530: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20  .     */.    if 
b540: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
b550: 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f   != (Tcl_TimerTo
b560: 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ken) NULL) {..Tc
b570: 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e  l_DeleteTimerHan
b580: 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74  dler(statePtr->t
b590: 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72  imer);..statePtr
b5a0: 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a  ->timer = NULL;.
b5b0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
b5c0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a  tatePtr->bio) {.
b5d0: 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61  ./* This will ca
b5e0: 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e  ll SSL_shutdown.
b5f0: 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a   Bug 1414045 */.
b600: 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72  .dprintf("BIO_fr
b610: 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61  ee_all(%p)", sta
b620: 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49  tePtr->bio);..BI
b630: 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65  O_free_all(state
b640: 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74  Ptr->bio);..stat
b650: 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c  ePtr->bio = NULL
b660: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
b670: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b  statePtr->ssl) {
b680: 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66  ..dprintf("SSL_f
b690: 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50  ree(%p)", stateP
b6a0: 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66  tr->ssl);..SSL_f
b6b0: 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ree(statePtr->ss
b6c0: 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73  l);..statePtr->s
b6d0: 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  sl = NULL;.    }
b6e0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
b6f0: 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43  r->ctx) {..SSL_C
b700: 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  TX_free(statePtr
b710: 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74  ->ctx);..statePt
b720: 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  r->ctx = NULL;. 
b730: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
b740: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
b750: 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
b760: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63  ount(statePtr->c
b770: 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65  allback);..state
b780: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20  Ptr->callback = 
b790: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
b7a0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61  if (statePtr->pa
b7b0: 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44  ssword) {..Tcl_D
b7c0: 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ecrRefCount(stat
b7d0: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b  ePtr->password);
b7e0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  ..statePtr->pass
b7f0: 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  word = NULL;.   
b800: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   }..    dprintf(
b810: 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a  "Returning");.}.
b820: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
b830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
b870: 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a   Tls_Init --. *.
b880: 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63   *.This is a pac
b890: 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  kage initializat
b8a0: 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77  ion procedure, w
b8b0: 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20  hich is called. 
b8c0: 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68  *.by Tcl when th
b8d0: 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f  is package is to
b8e0: 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20   be added to an 
b8f0: 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a  interpreter.. *.
b900: 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c   * Results:  Ssl
b910: 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20   configured and 
b920: 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64  loaded. *. * Sid
b930: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63  e effects:. *. c
b940: 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f  reate the ssl co
b950: 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 73  mmand, initialis
b960: 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a  e ssl context. *
b970: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
b980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 44 4c 4c 45  ------. */..DLLE
b9c0: 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e  XPORT int Tls_In
b9d0: 69 74 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  it(.    Tcl_Inte
b9e0: 72 70 20 2a 69 6e 74 65 72 70 29 0a 7b 0a 20 20  rp *interp).{.  
b9f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73    const char tls
ba00: 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20  TclInitScript[] 
ba10: 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c  = {.#include "tl
ba20: 73 2e 74 63 6c 2e 68 22 0a 09 20 20 20 20 30 78  s.tcl.h"..    0x
ba30: 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64  00.    };..    d
ba40: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
ba50: 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 6f 6e  ;.../*.. * We on
ba60: 6c 79 20 73 75 70 70 6f 72 74 20 54 63 6c 20 38  ly support Tcl 8
ba70: 2e 36 20 6f 72 20 6e 65 77 65 72 0a 09 20 2a 2f  .6 or newer.. */
ba80: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69  .    if (Tcl_Ini
ba90: 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22  tStubs(interp, "
baa0: 38 2e 36 2d 22 2c 20 30 29 20 3d 3d 20 4e 55 4c  8.6-", 0) == NUL
bab0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
bac0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
bad0: 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69     if (TlsLibIni
bae0: 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  t(0) != TCL_OK) 
baf0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
bb00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75  ult(interp, "cou
bb10: 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  ld not initializ
bb20: 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20  e SSL library", 
bb30: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
bb40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bb50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
bb60: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
bb70: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
bb80: 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 72  ciphers", Cipher
bb90: 73 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30  sObjCmd, NULL, 0
bba0: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
bbb0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
bbc0: 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68  rp, "tls::handsh
bbd0: 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f  ake", HandshakeO
bbe0: 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b  bjCmd, NULL, 0);
bbf0: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
bc00: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
bc10: 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c  , "tls::import",
bc20: 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 4e   ImportObjCmd, N
bc30: 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  ULL, 0);.    Tcl
bc40: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
bc50: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
bc60: 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70  unimport", Unimp
bc70: 6f 72 74 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c  ortObjCmd, NULL,
bc80: 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65   0);.    Tcl_Cre
bc90: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
bca0: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74  terp, "tls::stat
bcb0: 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d  us", StatusObjCm
bcc0: 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20  d, NULL, 0);.   
bcd0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
bce0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
bcf0: 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65  ls::version", Ve
bd00: 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 4e 55 4c  rsionObjCmd, NUL
bd10: 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43  L, 0);.    Tcl_C
bd20: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
bd30: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69  interp, "tls::mi
bd40: 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c  sc", MiscObjCmd,
bd50: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 20 20 20 20   NULL, 0);..    
bd60: 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54  if (interp) {..T
bd70: 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  cl_Eval(interp, 
bd80: 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74  tlsTclInitScript
bd90: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  );.    }..    re
bda0: 74 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76  turn(Tcl_PkgProv
bdb0: 69 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  ide(interp, "tls
bdc0: 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ", PACKAGE_VERSI
bdd0: 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  ON));.}../*. *--
bde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be10: 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f  ----*. *. *.Tls_
be20: 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20  SafeInit --. *. 
be30: 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
be40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be60: 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20  --*. *.Standard 
be70: 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72  procedure requir
be80: 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a  ed by 'load'.. *
be90: 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69  .Initializes thi
bea0: 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20  s extension for 
beb0: 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74  a safe interpret
bec0: 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  er.. *.---------
bed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bef0: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53  -------*. *. *.S
bf00: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
bf10: 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74  .As of 'Tls_Init
bf20: 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a  '. *. *.Result:.
bf30: 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54   *..A standard T
bf40: 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  cl error code.. 
bf50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
bf60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a  ----------*. */.
bf90: 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54  .DLLEXPORT int T
bfa0: 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  ls_SafeInit(Tcl_
bfb0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20  Interp *interp) 
bfc0: 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  {.    dprintf("C
bfd0: 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74  alled");.    ret
bfe0: 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74  urn(Tls_Init(int
bff0: 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  erp));.}../*. *-
c000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c030: 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73  -----*. *. *.Tls
c040: 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  LibInit --. *. *
c050: 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
c060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c080: 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65  -*. *.Initialize
c090: 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e  s SSL library on
c0a0: 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69  ce per applicati
c0b0: 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  on. *.----------
c0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0e0: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69  ------*. *. *.Si
c0f0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09  de effects:. *..
c100: 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20  initializes SSL 
c110: 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65  library. *. *.Re
c120: 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20  sult:. *..none. 
c130: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
c140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a  ----------*. */.
c170: 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69  static int TlsLi
c180: 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74  bInit(int uninit
c190: 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74  ialize) {.    st
c1a0: 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c  atic int initial
c1b0: 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ized = 0;.    in
c1c0: 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f  t status = TCL_O
c1d0: 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  K;.#if defined(O
c1e0: 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
c1f0: 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
c200: 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65  HREADS).    size
c210: 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65  _t num_locks;.#e
c220: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e  ndif..    if (un
c230: 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69  initialize) {..i
c240: 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29  f (!initialized)
c250: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
c260: 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74  "Asked to uninit
c270: 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61  ialize, but we a
c280: 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  re not initializ
c290: 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75  ed");...    retu
c2a0: 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(TCL_OK);..}..
c2b0: 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20  .dprintf("Asked 
c2c0: 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22  to uninitialize"
c2d0: 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
c2e0: 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
c2f0: 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
c300: 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75  THREADS)..Tcl_Mu
c310: 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78  texLock(&init_mx
c320: 29 3b 0a 0a 09 43 52 59 50 54 4f 5f 73 65 74 5f  );...CRYPTO_set_
c330: 6c 6f 63 6b 69 6e 67 5f 63 61 6c 6c 62 61 63 6b  locking_callback
c340: 28 4e 55 4c 4c 29 3b 0a 09 43 52 59 50 54 4f 5f  (NULL);..CRYPTO_
c350: 73 65 74 5f 69 64 5f 63 61 6c 6c 62 61 63 6b 28  set_id_callback(
c360: 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6c 6f 63  NULL);...if (loc
c370: 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28  ks) {..    free(
c380: 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63  locks);..    loc
c390: 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  ks = NULL;..    
c3a0: 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a  locksCount = 0;.
c3b0: 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69  .}.#endif..initi
c3c0: 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66  alized = 0;..#if
c3d0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
c3e0: 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
c3f0: 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
c400: 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f  )..Tcl_MutexUnlo
c410: 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65  ck(&init_mx);.#e
c420: 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 54 43  ndif...return(TC
c430: 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  L_OK);.    }..  
c440: 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65    if (initialize
c450: 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43  d) {..dprintf("C
c460: 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67  alled, but using
c470: 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b   cached value");
c480: 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 29  ..return(status)
c490: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
c4a0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
c4b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
c4c0: 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
c4d0: 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
c4e0: 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75  EADS).    Tcl_Mu
c4f0: 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78  texLock(&init_mx
c500: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e  );.#endif.    in
c510: 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a  itialized = 1;..
c520: 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
c530: 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
c540: 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
c550: 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63  ADS).    num_loc
c560: 6b 73 20 3d 20 43 52 59 50 54 4f 5f 6e 75 6d 5f  ks = CRYPTO_num_
c570: 6c 6f 63 6b 73 28 29 3b 0a 20 20 20 20 6c 6f 63  locks();.    loc
c580: 6b 73 43 6f 75 6e 74 20 3d 20 6e 75 6d 5f 6c 6f  ksCount = num_lo
c590: 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d  cks;.    locks =
c5a0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
c5b0: 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63  locks) * num_loc
c5c0: 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ks);.    memset(
c5d0: 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66  locks, 0, sizeof
c5e0: 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c  (*locks) * num_l
c5f0: 6f 63 6b 73 29 3b 0a 0a 20 20 20 20 43 52 59 50  ocks);..    CRYP
c600: 54 4f 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f 63  TO_set_locking_c
c610: 61 6c 6c 62 61 63 6b 28 43 72 79 70 74 6f 54 68  allback(CryptoTh
c620: 72 65 61 64 4c 6f 63 6b 43 61 6c 6c 62 61 63 6b  readLockCallback
c630: 29 3b 0a 20 20 20 20 43 52 59 50 54 4f 5f 73 65  );.    CRYPTO_se
c640: 74 5f 69 64 5f 63 61 6c 6c 62 61 63 6b 28 43 72  t_id_callback(Cr
c650: 79 70 74 6f 54 68 72 65 61 64 49 64 43 61 6c 6c  yptoThreadIdCall
c660: 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  back);.#endif.. 
c670: 20 20 20 69 66 20 28 53 53 4c 5f 6c 69 62 72 61     if (SSL_libra
c680: 72 79 5f 69 6e 69 74 28 29 20 21 3d 20 31 29 20  ry_init() != 1) 
c690: 7b 0a 09 73 74 61 74 75 73 20 3d 20 54 43 4c 5f  {..status = TCL_
c6a0: 45 52 52 4f 52 3b 0a 09 67 6f 74 6f 20 64 6f 6e  ERROR;..goto don
c6b0: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 53  e;.    }..    SS
c6c0: 4c 5f 6c 6f 61 64 5f 65 72 72 6f 72 5f 73 74 72  L_load_error_str
c6d0: 69 6e 67 73 28 29 3b 0a 20 20 20 20 45 52 52 5f  ings();.    ERR_
c6e0: 6c 6f 61 64 5f 63 72 79 70 74 6f 5f 73 74 72 69  load_crypto_stri
c6f0: 6e 67 73 28 29 3b 0a 0a 20 20 20 20 42 49 4f 5f  ngs();..    BIO_
c700: 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29  new_tcl(NULL, 0)
c710: 3b 0a 0a 64 6f 6e 65 3a 0a 23 69 66 20 64 65 66  ;..done:.#if def
c720: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
c730: 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
c740: 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
c750: 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63    Tcl_MutexUnloc
c760: 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
c770: 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 28  dif..    return(
c780: 73 74 61 74 75 73 29 3b 0a 7d 0a                 status);.}.