Hex Artifact Content

Artifact a5b24e4b6d206de7d22961cdd7e5e70ab6d4096c112971d248af2ab31928b20e:


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 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72  dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a   declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b  /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29  #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f  .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74  r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69  _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49  c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65  nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65  Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20  ar *key,...char 
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67  *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73  ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09  r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e  int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f  , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72  len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a  , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b  char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73  ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e  LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66  itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65  L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09   TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c  .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78  S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38  ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23  TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65  _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61  fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67  g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28  ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20  mask))..#define 
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22  SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a  SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74  /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f  a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53  ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65  L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23   "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72  endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64  ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e  L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64  _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65  slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69  ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68  ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e  readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e   requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42  g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74  ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20  o/cryptlib.c of 
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70  OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74  enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f  ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e  ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63  t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b  l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53  .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65  SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45  ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a  ADS */..../*****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
09a0: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20  ./* Callbacks   
09b0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45  --------. *. * E
0a20: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d  val Callback Com
0a30: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76  mand --. *. *.Ev
0a40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
0a50: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e  and and catch an
0a60: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52  y errors. *. * R
0a70: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43  esults:. *.0 = C
0a80: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ommand returned 
0a90: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74  fail or eval ret
0aa0: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a  urned TCL_ERROR.
0ab0: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72   *.1 = Command r
0ac0: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20  eturned success 
0ad0: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
0ae0: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69   TCL_OK. *. * Si
0af0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45  de effects:. *.E
0b00: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63  valuates callbac
0b10: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d  k command. *. *-
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
0b70: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54  t.EvalCallback(T
0b80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b90: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50  p, State *stateP
0ba0: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64  tr, Tcl_Obj *cmd
0bb0: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63  Ptr) {.    int c
0bc0: 6f 64 65 2c 20 6f 6b 3b 0a 0a 20 20 20 20 54 63  ode, ok;..    Tc
0bd0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
0be0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
0bf0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
0c00: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
0c10: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
0c20: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
0c30: 77 69 74 68 20 73 75 63 63 65 73 73 20 66 6f 72  with success for
0c40: 20 6f 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61   ok or return va
0c50: 6c 75 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20  lue 1, fail for 
0c60: 65 72 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20  error or return 
0c70: 76 61 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 63  value 0 */.    c
0c80: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62  ode = Tcl_EvalOb
0c90: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  jEx(interp, cmdP
0ca0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  tr, TCL_EVAL_GLO
0cb0: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f  BAL);.    if (co
0cc0: 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  de == TCL_OK) {.
0cd0: 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74  ./* Check result
0ce0: 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75   for return valu
0cf0: 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72  e */..Tcl_Obj *r
0d00: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
0d10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
0d20: 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d  ;..if (result ==
0d30: 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74   NULL || Tcl_Get
0d40: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
0d50: 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20  p, result, &ok) 
0d60: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
0d70: 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20 20    ok = 1;..}.   
0d80: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72   } else {../* Er
0d90: 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65  ror - reject the
0da0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
0db0: 09 6f 6b 20 3d 20 30 3b 0a 23 69 66 20 28 54 43  .ok = 0;.#if (TC
0dc0: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
0dd0: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49  == 8) && (TCL_MI
0de0: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29  NOR_VERSION < 6)
0df0: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
0e00: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
0e10: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
0e20: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e  oundException(in
0e30: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
0e40: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  dif.    }..    T
0e50: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0e60: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
0e70: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  );.    Tcl_Relea
0e80: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0e90: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
0ea0: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  urn ok;.}.../*. 
0eb0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43  ----. *. * InfoC
0f00: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
0f10: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f  .Monitors SSL co
0f20: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73  nnection process
0f30: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0f40: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
0f50: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
0f60: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
0f70: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ---. */.static v
0fd0: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  oid.InfoCallback
0fe0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
0ff0: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20   int where, int 
1000: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ret) {.    State
1010: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
1020: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
1030: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
1040: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
1050: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
1060: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
1070: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
1080: 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 6a  r;.    char *maj
1090: 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b  or; char *minor;
10a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
10b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
10c0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
10d0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
10e0: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b  *)NULL)..return;
10f0: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20  ..    if (where 
1100: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
1110: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a  KE_START) {..maj
1120: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
1130: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72  ;..minor = "star
1140: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  t";.    } else i
1150: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1160: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45  B_HANDSHAKE_DONE
1170: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
1180: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
1190: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d   = "done";.    }
11a0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65   else {..if (whe
11b0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
11c0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65  T)..major = "ale
11d0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  rt";..else if (w
11e0: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f  here & SSL_ST_CO
11f0: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22  NNECT).major = "
1200: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20  connect";..else 
1210: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1220: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f  ST_ACCEPT)..majo
1230: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65  r = "accept";..e
1240: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20  lse.....major = 
1250: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20  "unknown";...if 
1260: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1270: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22  READ)..minor = "
1280: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20  read";..else if 
1290: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
12a0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20  WRITE)..minor = 
12b0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69  "write";..else i
12c0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
12d0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d  B_LOOP)..minor =
12e0: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69   "loop";..else i
12f0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1300: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d  B_EXIT)..minor =
1310: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09   "exit";..else..
1320: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e  ...minor = "unkn
1330: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
1340: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
1350: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
1360: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
1370: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
1380: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
1390: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
13a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
13b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
13c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
13d0: 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20  info", -1));.   
13e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
13f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1400: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1410: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1420: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
1430: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
1440: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
1450: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1460: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
1470: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
1480: 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d  ringObj(major, -
1490: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
14a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14b0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
14c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14d0: 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a  bj(minor, -1));.
14e0: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26  .    if (where &
14f0: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b   SSL_CB_ALERT) {
1500: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
1510: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1520: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1530: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1540: 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f  (SSL_alert_desc_
1550: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29  string_long(ret)
1560: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
1570: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1580: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1590: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
15a0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72  ringObj(SSL_aler
15b0: 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f  t_type_string_lo
15c0: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20  ng(ret), -1));. 
15d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
15e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
15f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1600: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1610: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
1620: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e  state_string_lon
1630: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54  g(ssl), -1));..T
1640: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1650: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1660: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
1670: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c  tringObj("info",
1680: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   -1));.    }..  
1690: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
16a0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
16b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
16c0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
16d0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
16e0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
16f0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
1700: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
1710: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65  --. *. * Message
1770: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
1780: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70  *.Monitors SSL p
1790: 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73  rotocol messages
17a0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
17b0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
17c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
17d0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
17e0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ---. */.#ifndef 
1840: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54  OPENSSL_NO_SSL_T
1850: 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64  RACE.static void
1860: 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b  .MessageCallback
1870: 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e  (int write_p, in
1880: 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63  t version, int c
1890: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e  ontent_type, con
18a0: 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69  st void *buf, si
18b0: 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73  ze_t len, SSL *s
18c0: 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  sl, void *arg) {
18d0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
18e0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
18f0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
1900: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
1910: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
1920: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
1930: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65  tr;.    char *ve
1940: 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49  r, *type;.    BI
1950: 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72  O *bio;.    char
1960: 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a   buffer[15000];.
1970: 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20      buffer[0] = 
1980: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
1990: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
19a0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
19b0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
19c0: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72  bj*)NULL)..retur
19d0: 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76  n;..    switch(v
19e0: 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f 50  ersion) {.#if OP
19f0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
1a00: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
1a10: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
1a20: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
1a30: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
1a40: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 53  SL2).    case SS
1a50: 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  L2_VERSION:..ver
1a60: 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65   = "SSLv2";..bre
1a70: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
1a80: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
1a90: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
1aa0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20  NSSL_NO_SSL3).  
1ab0: 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53    case SSL3_VERS
1ac0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c  ION:..ver = "SSL
1ad0: 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  v3";..break;.#en
1ae0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53  dif.    case TLS
1af0: 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  1_VERSION:..ver 
1b00: 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61  = "TLSv1";..brea
1b10: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31  k;.    case TLS1
1b20: 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  _1_VERSION:..ver
1b30: 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62   = "TLSv1.1";..b
1b40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b50: 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09  LS1_2_VERSION:..
1b60: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b  ver = "TLSv1.2";
1b70: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1b80: 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  e TLS1_3_VERSION
1b90: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1ba0: 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  3";..break;.    
1bb0: 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20 20 20  case 0:.        
1bc0: 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62  ver = "none";..b
1bd0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
1be0: 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f  t:..ver = "unkno
1bf0: 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  wn";..break;.   
1c00: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28   }..    switch (
1c10: 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a  content_type) {.
1c20: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1c30: 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d  _HEADER:..type =
1c40: 20 22 48 65 61 64 65 72 22 3b 0a 20 20 20 20 20   "Header";.     
1c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1c60: 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52  se SSL3_RT_INNER
1c70: 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09  _CONTENT_TYPE:..
1c80: 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f  type = "Inner Co
1c90: 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 20 20 20  ntent Type";.   
1ca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cb0: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41  case SSL3_RT_CHA
1cc0: 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a  NGE_CIPHER_SPEC:
1cd0: 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65  ..type = "Change
1ce0: 20 43 69 70 68 65 72 22 3b 0a 20 20 20 20 20 20   Cipher";.      
1cf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d00: 65 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a  e SSL3_RT_ALERT:
1d10: 0a 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22  ..type = "Alert"
1d20: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d30: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d40: 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79  T_HANDSHAKE:..ty
1d50: 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22  pe = "Handshake"
1d60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d70: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d80: 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41  T_APPLICATION_DA
1d90: 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70  TA:..type = "App
1da0: 20 44 61 74 61 22 3b 0a 20 20 20 20 20 20 20 20   Data";.        
1db0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1dc0: 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45  DTLS1_RT_HEARTBE
1dd0: 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61  AT:..type = "Hea
1de0: 72 74 62 65 61 74 22 3b 0a 20 20 20 20 20 20 20  rtbeat";.       
1df0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
1e00: 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e  ult:..type = "un
1e10: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20  known";.    }.. 
1e20: 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70     /* Needs comp
1e30: 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile time option 
1e40: 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63  "enable-ssl-trac
1e50: 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  e". */.    if ((
1e60: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio = BIO_new(BI
1e70: 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e  O_s_mem())) != N
1e80: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09  ULL) {..int n;..
1e90: 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f  SSL_trace(write_
1ea0: 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74  p, version, cont
1eb0: 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c  ent_type, buf, l
1ec0: 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a  en, ssl, (void *
1ed0: 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f  )bio);..n = BIO_
1ee0: 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72  read(bio, buffer
1ef0: 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e  , min(BIO_pendin
1f00: 67 28 62 69 6f 29 2c 20 31 34 39 39 39 29 29 3b  g(bio), 14999));
1f10: 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20  ..n = (n<0) ? 0 
1f20: 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20  : n;..buffer[n] 
1f30: 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f  = 0;..(void)BIO_
1f40: 66 6c 75 73 68 28 62 69 6f 29 3b 0a 20 09 42 49  flush(bio);. .BI
1f50: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20  O_free(bio);.   
1f60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
1f70: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
1f80: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
1f90: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1fa0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
1fb0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
1fc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1fd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1fe0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1ff0: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20  gObj("message", 
2000: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2010: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2020: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2030: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
2040: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
2050: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
2060: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
2070: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2080: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2090: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
20a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
20b0: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74  (write_p ? "Sent
20c0: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20  " : "Received", 
20d0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
20e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
20f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2100: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2110: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20  Obj(ver, -1));. 
2120: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2130: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2140: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2150: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70  NewStringObj(typ
2160: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  e, -1));.    Tcl
2170: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2180: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2190: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
21a0: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
21b0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
21c0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
21d0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
21e0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
21f0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
2200: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2210: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2220: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2230: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
2240: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61  -. *. * VerifyCa
22a0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
22b0: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72  Monitors SSL cer
22c0: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
22d0: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65  ion process. Use
22e0: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  d to control the
22f0: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65  . *.behavior whe
2300: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59  n the SSL_VERIFY
2310: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65  _PEER flag is se
2320: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  t. This is calle
2330: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20  d. *.whenever a 
2340: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69  certificate is i
2350: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69  nspected or deci
2360: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c  ded invalid. Cal
2370: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20  led for. *.each 
2380: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74  certificate in t
2390: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20  he cert chain.. 
23a0: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09  *. * Checks:. *.
23b0: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69  certificate chai
23c0: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61  n is checked sta
23d0: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64  rting with the d
23e0: 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c  eepest nesting l
23f0: 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72  evel. *.  (the r
2400: 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61  oot CA certifica
2410: 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75  te) and worked u
2420: 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65  pward to the pee
2430: 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e  r's certificate.
2440: 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72  . *.All signatur
2450: 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75  es are valid, cu
2460: 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69  rrent time is wi
2470: 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c  thin first and l
2480: 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d  ast validity tim
2490: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74  e.. *.Check that
24a0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
24b0: 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68   is issued by th
24c0: 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69  e issuer certifi
24d0: 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09  cate issuer.. *.
24e0: 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61  Check the revoca
24f0: 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20  tion status for 
2500: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65  each certificate
2510: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76  .. *.Check the v
2520: 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67  alidity of the g
2530: 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65  iven CRL and the
2540: 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e   cert revocation
2550: 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63   status.. *.Chec
2560: 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f  k the policies o
2570: 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66  f all the certif
2580: 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67  icates. *. * Arg
2590: 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f  s. *.preverify_o
25a0: 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  k indicates whet
25b0: 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63  her the certific
25c0: 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ate verification
25d0: 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e   passed (1) or n
25e0: 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73  ot (0). *. * Res
25f0: 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62  ults:. *.A callb
2600: 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65  ack bound to the
2610: 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75   socket may retu
2620: 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20  rn one of:. *.  
2630: 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74    0...- the cert
2640: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65  ificate is deeme
2650: 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20  d invalid, send 
2660: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09  verification. *.
2670: 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65  ...  failure ale
2680: 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20  rt to peer, and 
2690: 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68  terminate handsh
26a0: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09  ake.. *.    1...
26b0: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  - the certificat
26c0: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69  e is deemed vali
26d0: 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  d, continue with
26e0: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
26f0: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09     empty string.
2700: 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63  - no change to c
2710: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64  ertificate valid
2720: 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65  ation. *. * Side
2730: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
2740: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
2750: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
2760: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
2770: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
2780: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
2790: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
27a0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
27b0: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *. *---------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
2800: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79  tatic int.Verify
2810: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c  Callback(int ok,
2820: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20   X509_STORE_CTX 
2830: 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f  *ctx) {.    Tcl_
2840: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
2850: 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28   SSL   *ssl..= (
2860: 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f  SSL*)X509_STORE_
2870: 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28  CTX_get_ex_data(
2880: 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f  ctx, SSL_get_ex_
2890: 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f  data_X509_STORE_
28a0: 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20  CTX_idx());.    
28b0: 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58  X509  *cert..= X
28c0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
28d0: 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63  t_current_cert(c
28e0: 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a  tx);.    State *
28f0: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
2900: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64  e*)SSL_get_app_d
2910: 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63  ata(ssl);.    Tc
2920: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2930: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
2940: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70  erp;.    int dep
2950: 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  th..= X509_STORE
2960: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64  _CTX_get_error_d
2970: 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69  epth(ctx);.    i
2980: 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53  nt err..= X509_S
2990: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
29a0: 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70  or(ctx);..    dp
29b0: 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25  rintf("Verify: %
29c0: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66  d", ok);..    if
29d0: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
29e0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
29f0: 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65  LL) {..if (state
2a00: 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53  Ptr->vflags & SS
2a10: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
2a20: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
2a30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b  ..    return ok;
2a40: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
2a50: 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20  return 1;..}.   
2a60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
2a70: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
2a80: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  l */.    cmdPtr 
2a90: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
2aa0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  bj(statePtr->vcm
2ab0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
2ac0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2ad0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2ae0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2af0: 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29  j("verify", -1))
2b00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2b10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2b20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
2b30: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2b40: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
2b50: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
2b60: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
2b70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2b80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2b90: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
2ba0: 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a 20  ntObj(depth));. 
2bb0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2bc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2bd0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f  rp, cmdPtr, Tls_
2be0: 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72  NewX509Obj(inter
2bf0: 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 54  p, cert));.    T
2c00: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2c10: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2c20: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
2c30: 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20  ntObj(ok));.    
2c40: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c50: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2c60: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   cmdPtr,..Tcl_Ne
2c70: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
2c80: 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  *)X509_verify_ce
2c90: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
2ca0: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  err), -1));..   
2cb0: 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20   /* Prevent I/O 
2cc0: 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69  while callback i
2cd0: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f  s in progress */
2ce0: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72  .    /* statePtr
2cf0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
2d00: 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a  CL_CALLBACK; */.
2d10: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
2d20: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
2d30: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
2d40: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
2d50: 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c     ok = EvalCall
2d60: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2d70: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2d80: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2d90: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
2da0: 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e     /* statePtr->
2db0: 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54  flags &= ~(TLS_T
2dc0: 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f  CL_CALLBACK); */
2dd0: 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b  .    return(ok);
2de0: 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20  ./* By default, 
2df0: 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69  leave verificati
2e00: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f  on unchanged. */
2e10: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2e60: 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d  . * Tls_Error --
2e70: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  . *. *.Calls cal
2e80: 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74 20  lback with list 
2e90: 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a  of errors.. *. *
2ea0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
2eb0: 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20  *.The err field 
2ec0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  of the currently
2ed0: 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65   operative State
2ee0: 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20   is set. *.  to 
2ef0: 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62  a string describ
2f00: 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f  ing the SSL nego
2f10: 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20  tiation failure 
2f20: 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  reason. *. *----
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2f70: 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72   */.void.Tls_Err
2f80: 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  or(State *stateP
2f90: 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 7b  tr, char *msg) {
2fa0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
2fb0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
2fc0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
2fd0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c  Tcl_Obj *cmdPtr,
2fe0: 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 75   *listPtr;.    u
2ff0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72  nsigned long err
3000: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
3010: 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20  err = msg;..    
3020: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
3030: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
3040: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
3050: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
3060: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20  )..return;..    
3070: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
3080: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20  d to eval */.   
3090: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
30a0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
30b0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
30c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
30d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
30e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
30f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65  _NewStringObj("e
3100: 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20  rror", -1));.   
3110: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3120: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3130: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
3140: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3150: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
3160: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
3170: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66  f), -1));.    if
3180: 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b   (msg != NULL) {
3190: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
31a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
31b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
31c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c  ewStringObj(msg,
31d0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c   -1));..    } el
31e0: 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54 63  se if ((msg = Tc
31f0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
3200: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  bj(Tcl_GetObjRes
3210: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c  ult(interp), NUL
3220: 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  L)) != NULL) {..
3230: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3240: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3250: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3260: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d  StringObj(msg, -
3270: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  1));..    } else
3280: 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63   {..listPtr = Tc
3290: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
32a0: 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28  NULL);..while ((
32b0: 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72  err = ERR_get_er
32c0: 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09  ror()) != 0) {..
32d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
32e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
32f0: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63  erp, listPtr, Tc
3300: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45  l_NewStringObj(E
3310: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f  RR_reason_error_
3320: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29  string(err), -1)
3330: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f  );..}..Tcl_ListO
3340: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3350: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3360: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a  listPtr);.    }.
3370: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
3380: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
3390: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
33a0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
33b0: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
33c0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
33d0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
33e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
33f0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  cmdPtr);.}.../*.
3400: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3440: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c  -----. *. * KeyL
3450: 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  ogCallback --. *
3460: 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76  . *.Write receiv
3470: 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c  ed key data to l
3480: 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53  og file.. *. * S
3490: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
34a0: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
34f0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c  /.void KeyLogCal
3500: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
3510: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72  *ssl, const char
3520: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68   *line) {.    ch
3530: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76  ar *str = getenv
3540: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b  (SSLKEYLOGFILE);
3550: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a  .    FILE *fd;..
3560: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
3570: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
3580: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70  str) {..fd = fop
3590: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66  en(str, "a");..f
35a0: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e  printf(fd, "%s\n
35b0: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65  ",line);..fclose
35c0: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a  (fd);.    }.}...
35d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50  --------. *. * P
3620: 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b  assword Callback
3630: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
3640: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64   when a password
3650: 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e   is needed to un
3660: 70 61 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d  pack RSA and PEM
3670: 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61 6c 73 20   keys.. *.Evals 
3680: 61 6e 79 20 62 6f 75 6e 64 20 70 61 73 73 77 6f  any bound passwo
3690: 72 64 20 73 63 72 69 70 74 20 61 6e 64 20 72 65  rd script and re
36a0: 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74  turns the result
36b0: 20 61 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77   as. *.the passw
36c0: 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20 2a 0a 20  ord string.. *. 
36d0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3710: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
3720: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c  int.PasswordCall
3730: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20  back(char *buf, 
3740: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 76 65  int size, int ve
3750: 72 69 66 79 2c 20 76 6f 69 64 20 2a 75 64 61 74  rify, void *udat
3760: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  a) {.    State *
3770: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
3780: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20  e *) udata;.    
3790: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
37a0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
37b0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
37c0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
37d0: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64  int code;..    d
37e0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
37f0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ;..    /* If no 
3800: 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 65  callback, use de
3810: 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a  fault callback *
3820: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
3830: 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20  tr->password == 
3840: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c  NULL) {..if (Tcl
3850: 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20  _EvalEx(interp, 
3860: 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c  "tls::password",
3870: 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c   -1, TCL_EVAL_GL
3880: 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29  OBAL) == TCL_OK)
3890: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65   {..    char *re
38a0: 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c  t = (char *) Tcl
38b0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
38c0: 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73  (interp);..    s
38d0: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
38e0: 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b   (size_t) size);
38f0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e  ..    return (in
3900: 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09  t)strlen(ret);..
3910: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65  } else {..    re
3920: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20  turn -1;..}.    
3930: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
3940: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
3950: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
3960: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
3970: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  j(statePtr->pass
3980: 77 6f 72 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  word);..    Tcl_
3990: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
39a0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
39b0: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
39c0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
39d0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
39e0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 61 6e  Eval callback an
39f0: 64 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b  d success for ok
3a00: 2c 20 61 62 6f 72 74 20 66 6f 72 20 65 72 72 6f  , abort for erro
3a10: 72 2c 20 63 6f 6e 74 69 6e 75 65 20 66 6f 72 20  r, continue for 
3a20: 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20  continue */.    
3a30: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3a40: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f  (cmdPtr);.    co
3a50: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  de = Tcl_EvalObj
3a60: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  Ex(interp, cmdPt
3a70: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  r, TCL_EVAL_GLOB
3a80: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  AL);.    if (cod
3a90: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23  e != TCL_OK) {.#
3aa0: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
3ab0: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
3ac0: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
3ad0: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
3ae0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
3af0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
3b00: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
3b10: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
3b20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
3b30: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3b40: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
3b50: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
3b60: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
3b70: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28  ePtr);..    if (
3b80: 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20  code == TCL_OK) 
3b90: 7b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28  {..char *ret = (
3ba0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53  char *) Tcl_GetS
3bb0: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
3bc0: 72 70 29 3b 0a 09 69 66 20 28 73 74 72 6c 65 6e  rp);..if (strlen
3bd0: 28 72 65 74 29 20 3c 20 73 69 7a 65 20 2d 20 31  (ret) < size - 1
3be0: 29 20 7b 0a 09 20 20 20 20 73 74 72 6e 63 70 79  ) {..    strncpy
3bf0: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
3c00: 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20  _t) size);..    
3c10: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
3c20: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
3c30: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69  ;..    return (i
3c40: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a  nt)strlen(ret);.
3c50: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  .}.    }.    Tcl
3c60: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
3c70: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
3c80: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 76     return -1;..v
3c90: 65 72 69 66 79 20 3d 20 76 65 72 69 66 79 3b 0a  erify = verify;.
3ca0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
3cf0: 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62   * Session Callb
3d00: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20  ack for Clients 
3d10: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
3d20: 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69  when a new sessi
3d30: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  on is added to t
3d40: 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53  he cache. In TLS
3d50: 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79   1.3. *.this may
3d60: 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c   be received mul
3d70: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65  tiple times afte
3d80: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e  r the handshake.
3d90: 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20   For. *.earlier 
3da0: 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77  versions, this w
3db0: 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20  ill be received 
3dc0: 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73  during the hands
3dd0: 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73  hake.. *.This is
3de0: 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77   the preferred w
3df0: 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72  ay to obtain a r
3e00: 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e  esumable session
3e10: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
3e20: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
3e30: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
3e40: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
3e50: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
3e60: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
3e70: 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65   *.0 = error whe
3e80: 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20  re session will 
3e90: 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  be immediately r
3ea0: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
3eb0: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a  internal cache..
3ec0: 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77   *.1 = success w
3ed0: 68 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73  here app retains
3ee0: 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73   session in sess
3ef0: 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d  ion cache, and m
3f00: 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53  ust call SSL_SES
3f10: 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e  SION_free() when
3f20: 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   done.. *. *----
3f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3f70: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53   */.static int.S
3f80: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63  essionCallback(c
3f90: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53  onst SSL *ssl, S
3fa0: 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73  SL_SESSION *sess
3fb0: 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ion) {.    State
3fc0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
3fd0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
3fe0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
3ff0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
4000: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
4010: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
4020: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
4030: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  r;.    const uns
4040: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b  igned char *tick
4050: 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  et;.    const un
4060: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
4070: 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a  sion_id;.    siz
4080: 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e  e_t len2;.    un
4090: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b  signed int ulen;
40a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
40b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
40c0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
40d0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
40e0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
40f0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
4100: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
4110: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29  if (ssl == NULL)
4120: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
4130: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4140: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
4150: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
4160: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64   eval */.    cmd
4170: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
4180: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
4190: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
41a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
41b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
41c0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
41d0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69  StringObj("sessi
41e0: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  on", -1));..    
41f0: 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f  /* Session id */
4200: 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 20  .    session_id 
4210: 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  = SSL_SESSION_ge
4220: 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75  t_id(session, &u
4230: 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  len);.    Tcl_Li
4240: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4250: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4260: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
4270: 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69  rayObj(session_i
4280: 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b  d, (int) ulen));
4290: 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e  ..    /* Session
42a0: 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53   ticket */.    S
42b0: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
42c0: 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20  ticket(session, 
42d0: 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b  &ticket, &len2);
42e0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
42f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4300: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
4310: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
4320: 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20  j(ticket, (int) 
4330: 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  len2));..    /* 
4340: 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65  Lifetime - numbe
4350: 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  r of seconds */.
4360: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4370: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4380: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63  erp, cmdPtr,..Tc
4390: 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f  l_NewLongObj((lo
43a0: 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  ng) SSL_SESSION_
43b0: 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74  get_ticket_lifet
43c0: 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e  ime_hint(session
43d0: 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  )));..    /* Eva
43e0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
43f0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
4400: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
4410: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
4420: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
4430: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
4440: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
4450: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
4460: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a    return 0;.}...
4470: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
4480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41  --------. *. * A
44c0: 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  LPN Callback for
44d0: 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e   Servers and NPN
44e0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c   Callback for Cl
44f0: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50  ients --. *. *.P
4500: 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20  erform protocol 
4510: 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68  (http/1.1, h2, h
4520: 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69  3, etc.) selecti
4530: 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e  on for the. *.in
4540: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  coming connectio
4550: 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20  n. Called after 
4560: 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72  Hello and server
4570: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57   callbacks.. *.W
4580: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65  here 'out' is se
4590: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
45a0: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20  and 'in' is the 
45b0: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20  peer advertised 
45c0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  list.. *. * Resu
45d0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
45e0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
45f0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
4600: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
4610: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
4620: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
4630: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70  T_ERR_OK: ALPN p
4640: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
4650: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4660: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
4670: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
4680: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65  ERT_FATAL: There
4690: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20   was no overlap 
46a0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65  between the clie
46b0: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70  nt's. *.    supp
46c0: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68  lied list and th
46d0: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75  e server configu
46e0: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ration. The conn
46f0: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  ection will be a
4700: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54  borted.. *.SSL_T
4710: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
4720: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e   ALPN protocol n
4730: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67  ot selected, e.g
4740: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c  ., because no AL
4750: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63  PN. *.    protoc
4760: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72  ols are configur
4770: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e  ed for this conn
4780: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ection. The conn
4790: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
47a0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
47f0: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61  tatic int.ALPNCa
4800: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
4810: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73   *ssl, const uns
4820: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74  igned char **out
4830: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
4840: 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20  *outlen,..const 
4850: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69  unsigned char *i
4860: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  n, unsigned int 
4870: 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67  inlen, void *arg
4880: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
4890: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
48a0: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49  *)arg;.    Tcl_I
48b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
48c0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
48d0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
48e0: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
48f0: 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64  ode, res;..    d
4900: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
4910: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  ;..    if (ssl =
4920: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
4930: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
4940: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4950: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
4960: 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74    /* Select prot
4970: 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  ocol */.    if (
4980: 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f  SSL_select_next_
4990: 70 72 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65  proto(out, outle
49a0: 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  n, statePtr->pro
49b0: 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70  tos, statePtr->p
49c0: 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20  rotos_len,..in, 
49d0: 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53  inlen) == OPENSS
49e0: 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44  L_NPN_NEGOTIATED
49f0: 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f  ) {../* Match fo
4a00: 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53  und */..res = SS
4a10: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
4a20: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f  .    } else {../
4a30: 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f  * OPENSSL_NPN_NO
4a40: 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76  _OVERLAP = No ov
4a50: 65 72 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69  erlap, so use fi
4a60: 72 73 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c  rst item from cl
4a70: 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69  ient protocol li
4a80: 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c  st */..res = SSL
4a90: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
4aa0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  K;.    }..    if
4ab0: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
4ac0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
4ad0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65  LL) {..return re
4ae0: 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  s;.    }..    /*
4af0: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
4b00: 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63  to eval */.    c
4b10: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
4b20: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
4b30: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63  r->vcmd);.    Tc
4b40: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4b50: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4b60: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
4b70: 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20  ringObj("alpn", 
4b80: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
4b90: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4ba0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4bb0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
4bc0: 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a  Obj(*out, -1));.
4bd0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
4be0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
4bf0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
4c00: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
4c10: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
4c20: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
4c30: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
4c40: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
4c50: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
4c60: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
4c70: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d   else if (code =
4c80: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 1) {..res = SS
4c90: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
4ca0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
4cb0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
4cc0: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b  ERR_ALERT_FATAL;
4cd0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
4ce0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
4cf0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
4d00: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  res;.}.../*. *--
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d50: 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73  -. *. * Advertis
4d60: 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c  e Protocols Call
4d70: 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72  back for Next Pr
4d80: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69  otocol Negotiati
4d90: 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76  on (NPN) in Serv
4da0: 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a  erHello --. *. *
4db0: 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54  .called when a T
4dc0: 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 20  LS server needs 
4dd0: 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72  a list of suppor
4de0: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f  ted protocols fo
4df0: 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63  r Next. *.Protoc
4e00: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a  ol Negotiation..
4e10: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
4e20: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
4e30: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a  e effects:. *. *
4e40: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20   Return codes:. 
4e50: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
4e60: 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f  _OK: NPN protoco
4e70: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20  l selected. The 
4e80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
4e90: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
4ea0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e  EXT_ERR_NOACK: N
4eb0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  PN protocol not 
4ec0: 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f  selected. The co
4ed0: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
4ee0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
4ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
4f30: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a  .#ifdef USE_NPN.
4f40: 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61  static int.NPNCa
4f50: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
4f60: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73   *ssl, const uns
4f70: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74  igned char **out
4f80: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  , unsigned int *
4f90: 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72  outlen, void *ar
4fa0: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  g) {.    State *
4fb0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
4fc0: 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72  e*)arg;..    dpr
4fd0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
4fe0: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
4ff0: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e  NULL || arg == N
5000: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
5010: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5020: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
5030: 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73  /* Set protocols
5040: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20   list */.    if 
5050: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
5060: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f  s != NULL) {..*o
5070: 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70  ut = statePtr->p
5080: 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20  rotos;..*outlen 
5090: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  = statePtr->prot
50a0: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c  os_len;.    } el
50b0: 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c  se {..*out = NUL
50c0: 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b  L;..*outlen = 0;
50d0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
50e0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
50f0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
5100: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5110: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a  K;.}.#endif.../*
5120: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5160: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49  ------. *. * SNI
5170: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65   Callback for Se
5180: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50  rvers --. *. *.P
5190: 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69  erform server-si
51a0: 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  de SNI hostname 
51b0: 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20  selection after 
51c0: 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78  receiving SNI ex
51d0: 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c  tension. *.in Cl
51e0: 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c  ient Hello. Call
51f0: 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63  ed after hello c
5200: 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f  allback but befo
5210: 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b  re ALPN callback
5220: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
5230: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
5240: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
5250: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
5260: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
5270: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
5280: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
5290: 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61  R_OK: SNI hostna
52a0: 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e 20  me is accepted. 
52b0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
52c0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c  ontinues.. *.SSL
52d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
52e0: 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73  T_FATAL: SNI hos
52f0: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63  tname is not acc
5300: 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  epted. The conne
5310: 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20  ction. *.    is 
5320: 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74  aborted. Default
5330: 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53   for alert is SS
5340: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45  L_AD_UNRECOGNIZE
5350: 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54  D_NAME.. *.SSL_T
5360: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
5370: 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73  WARNING: SNI hos
5380: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63  tname is not acc
5390: 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61  epted, warning a
53a0: 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74  lert. *.    sent
53b0: 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20   (not supported 
53c0: 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65  in TLSv1.3). The
53d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
53e0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
53f0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20  SEXT_ERR_NOACK: 
5400: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  SNI hostname is 
5410: 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64  not accepted and
5420: 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65   not acknowledge
5430: 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69  d,. *.    e.g. i
5440: 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65  f SNI has not be
5450: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54  en configured. T
5460: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
5470: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54c0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
54d0: 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  .SNICallback(con
54e0: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74  st SSL *ssl, int
54f0: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61   *alert, void *a
5500: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
5510: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
5520: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c  te*)arg;.    Tcl
5530: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
5540: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
5550: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
5560: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
5570: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20   code, res;.    
5580: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65  char *servername
5590: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70   = NULL;..    dp
55a0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
55b0: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d  ..    if (ssl ==
55c0: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20   NULL || arg == 
55d0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
55e0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
55f0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
5600: 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66   /* Only works f
5610: 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 65  or TLS 1.2 and e
5620: 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 65  arlier */.    se
5630: 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67  rvername = SSL_g
5640: 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73  et_servername(ss
5650: 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59  l, TLSEXT_NAMETY
5660: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20  PE_host_name);. 
5670: 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61     if (!serverna
5680: 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65  me || servername
5690: 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09  [0] == '\0') {..
56a0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
56b0: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
56c0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74   }..    if (stat
56d0: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54  ePtr->vcmd == (T
56e0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
56f0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5700: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
5710: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
5720: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
5730: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
5740: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
5750: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
5760: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
5770: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5780: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
5790: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
57a0: 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20  "sni", -1));.   
57b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
57c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
57d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
57e0: 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65  wStringObj(serve
57f0: 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20  rname , -1));.. 
5800: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
5810: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
5820: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
5830: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
5840: 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61   if ((code = Eva
5850: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
5860: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
5870: 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73  tr)) > 1) {..res
5880: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
5890: 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3b  R_ALERT_WARNING;
58a0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41  ..*alert = SSL_A
58b0: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e  D_UNRECOGNIZED_N
58c0: 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70  AME; /* Not supp
58d0: 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33  orted by TLS 1.3
58e0: 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 69   */.    } else i
58f0: 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a  f (code == 1) {.
5900: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
5910: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20  T_ERR_OK;.    } 
5920: 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53  else {..res = SS
5930: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
5940: 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 72  RT_FATAL;..*aler
5950: 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43  t = SSL_AD_UNREC
5960: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a  OGNIZED_NAME; /*
5970: 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62   Not supported b
5980: 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20  y TLS 1.3 */.   
5990: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
59a0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
59b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b  .    return res;
59c0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5a10: 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20  . * ClientHello 
5a20: 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 61  Handshake Callba
5a30: 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d  ck for Servers -
5a40: 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 20  -. *. *.Used by 
5a50: 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 6e  server to examin
5a60: 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d  e the server nam
5a70: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e  e indication (SN
5a80: 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09  I) extension. *.
5a90: 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20  provided by the 
5aa0: 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  client in order 
5ab0: 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 70  to select an app
5ac0: 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 69  ropriate certifi
5ad0: 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 65  cate to. *.prese
5ae0: 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68  nt, and make oth
5af0: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  er configuration
5b00: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c   adjustments rel
5b10: 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 65  evant to that se
5b20: 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64  rver. *.name and
5b30: 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 69   its configurati
5b40: 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65  on. This include
5b50: 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 74  s swapping out t
5b60: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a  he associated. *
5b70: 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72  .SSL_CTX pointer
5b80: 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  , modifying the 
5b90: 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f 66  server's list of
5ba0: 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 76   permitted TLS v
5bb0: 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e  ersions,. *.chan
5bc0: 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27  ging the server'
5bd0: 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 6e  s cipher list in
5be0: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65   response to the
5bf0: 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 72   client's cipher
5c00: 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09 43   list, etc.. *.C
5c10: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e 49  alled before SNI
5c20: 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62 61   and ALPN callba
5c30: 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cks.. *. * Resul
5c40: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
5c50: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
5c60: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
5c70: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
5c80: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
5c90: 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54  s:. *.SSL_CLIENT
5ca0: 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 75  _HELLO_RETRY: su
5cb0: 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73 68  spend the handsh
5cc0: 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61 6e  ake, and the han
5cd0: 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e 20  dshake function 
5ce0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65  will return imme
5cf0: 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f 43  diately. *.SSL_C
5d00: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
5d10: 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72 6d  R: failure, term
5d20: 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  inate connection
5d30: 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20 65  . Set alert to e
5d40: 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53  rror code.. *.SS
5d50: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53  L_CLIENT_HELLO_S
5d60: 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 73 0a  UCCESS: success.
5d70: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5db0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
5dc0: 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c  tic int.HelloCal
5dd0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
5de0: 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74  *ssl, int *alert
5df0: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20  , void *arg) {. 
5e00: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
5e10: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67  tr = (State*)arg
5e20: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
5e30: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
5e40: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
5e50: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
5e60: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20  ;.    int code, 
5e70: 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  res;.    const c
5e80: 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b  har *servername;
5e90: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
5ea0: 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 20  ned char *p;.   
5eb0: 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d   size_t len, rem
5ec0: 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72  aining;..    dpr
5ed0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
5ee0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
5ef0: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f  r->vcmd == (Tcl_
5f00: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  Obj*)NULL) {..re
5f10: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
5f20: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20  HELLO_SUCCESS;. 
5f30: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73     } else if (ss
5f40: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  l == NULL || arg
5f50: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
5f60: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
5f70: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
5f80: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61  }..    /* Get na
5f90: 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  mes */.    if (!
5fa0: 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f  SSL_client_hello
5fb0: 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54  _get0_ext(ssl, T
5fc0: 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65  LSEXT_TYPE_serve
5fd0: 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d  r_name, &p, &rem
5fe0: 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69  aining) || remai
5ff0: 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61  ning <= 2) {..*a
6000: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c  lert = SSL_R_SSL
6010: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c  V3_ALERT_ILLEGAL
6020: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74  _PARAMETER;..ret
6030: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
6040: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
6050: 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
6060: 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  t the length of 
6070: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73  the supplied lis
6080: 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20  t of names. */. 
6090: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29     len = (*(p++)
60a0: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20   << 8);.    len 
60b0: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69  += *(p++);.    i
60c0: 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65  f (len + 2 != re
60d0: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65  maining) {..*ale
60e0: 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33  rt = SSL_R_SSLV3
60f0: 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50  _ALERT_ILLEGAL_P
6100: 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72  ARAMETER;..retur
6110: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
6120: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
6130: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20      remaining = 
6140: 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  len;..    /* The
6150: 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63   list in practic
6160: 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e  e only has a sin
6170: 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20  gle element, so 
6180: 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  we only consider
6190: 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20   the first one. 
61a0: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69  */.    if (remai
61b0: 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b  ning == 0 || *p+
61c0: 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45  + != TLSEXT_NAME
61d0: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20  TYPE_host_name) 
61e0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
61f0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
6200: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72  TERNAL_ERROR;..r
6210: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
6220: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
6230: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e    }.    remainin
6240: 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  g--;..    /* Now
6250: 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20   we can finally 
6260: 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74  pull out the byt
6270: 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65  e array with the
6280: 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65   actual hostname
6290: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d  . */.    if (rem
62a0: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09  aining <= 2) {..
62b0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54  *alert = SSL_R_T
62c0: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52  LSV1_ALERT_INTER
62d0: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75  NAL_ERROR;..retu
62e0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
62f0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6300: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b  .    len = (*(p+
6310: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65  +) << 8);.    le
6320: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20  n += *(p++);.   
6330: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72   if (len + 2 > r
6340: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c  emaining) {..*al
6350: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56  ert = SSL_R_TLSV
6360: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c  1_ALERT_INTERNAL
6370: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20  _ERROR;..return 
6380: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6390: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
63a0: 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65    remaining = le
63b0: 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d  n;.    servernam
63c0: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
63d0: 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  *)p;..    /* Cre
63e0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
63f0: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
6400: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
6410: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
6420: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
6430: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6440: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
6450: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
6460: 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29  Obj("hello", -1)
6470: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
6480: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
6490: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
64a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
64b0: 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 69 6e  (servername, (in
64c0: 74 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f  t) len));..    /
64d0: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
64e0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
64f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
6500: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20  cmdPtr);.    if 
6510: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c  ((code = EvalCal
6520: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
6530: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29  atePtr, cmdPtr))
6540: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53   > 1) {..res = S
6550: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6560: 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d  RETRY;..*alert =
6570: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45   SSL_R_TLSV1_ALE
6580: 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45  RT_USER_CANCELLE
6590: 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  D;.    } else if
65a0: 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09   (code == 1) {..
65b0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54  res = SSL_CLIENT
65c0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a  _HELLO_SUCCESS;.
65d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65      } else {..re
65e0: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  s = SSL_CLIENT_H
65f0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c  ELLO_ERROR;..*al
6600: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56  ert = SSL_R_TLSV
6610: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c  1_ALERT_INTERNAL
6620: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6630: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
6640: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
6650: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a  return res;.}...
6660: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6670: 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e  *****/./* Comman
6680: 64 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a  ds         */./*
6690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66a0: 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ***/../*. *-----
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
66f0: 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43  *. * CiphersObjC
6700: 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c  md -- list avail
6710: 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a  able ciphers. *.
6720: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
6730: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  e is invoked to 
6740: 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73  process the "tls
6750: 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61  ::ciphers" comma
6760: 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76  nd. *.to list av
6770: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c  ailable ciphers,
6780: 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74   based upon prot
6790: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20  ocol selected.. 
67a0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
67b0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
67c0: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a  result list.. *.
67d0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
67e0: 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61  . *.constructs a
67f0: 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20  nd destroys SSL 
6800: 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a  context (CTX). *
6810: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6850: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
6860: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72  c const char *pr
6870: 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22  otocols[] = {.."
6880: 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22  ssl2", "ssl3", "
6890: 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c  tls1", "tls1.1",
68a0: 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31   "tls1.2", "tls1
68b0: 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75  .3", NULL.};.enu
68c0: 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20  m protocol {.   
68d0: 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53   TLS_SSL2, TLS_S
68e0: 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54  SL3, TLS_TLS1, T
68f0: 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54  LS_TLS1_1, TLS_T
6900: 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f  LS1_2, TLS_TLS1_
6910: 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a  3, TLS_NONE.};..
6920: 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65  static int.Ciphe
6930: 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  rsObjCmd(ClientD
6940: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
6950: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6960: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
6970: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
6980: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  v[]) {.    Tcl_O
6990: 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c  bj *objPtr = NUL
69a0: 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  L;.    SSL_CTX *
69b0: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
69c0: 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b  SSL *ssl = NULL;
69d0: 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53  .    STACK_OF(SS
69e0: 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20  L_CIPHER) *sk;. 
69f0: 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66     char *cp, buf
6a00: 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e  [BUFSIZ];.    in
6a10: 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65  t index, verbose
6a20: 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72   = 0, use_suppor
6a30: 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70  ted = 0;..    dp
6a40: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
6a50: 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20  ..    if ((objc 
6a60: 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20  < 2) || (objc > 
6a70: 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67  4)) {..Tcl_Wrong
6a80: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
6a90: 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63  1, objv, "protoc
6aa0: 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75  ol ?verbose? ?su
6ab0: 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74  pported?");..ret
6ac0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6ad0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c     }.    if (Tcl
6ae0: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
6af0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
6b00: 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72  , protocols, "pr
6b10: 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64  otocol", 0, &ind
6b20: 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ex) != TCL_OK) {
6b30: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
6b40: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
6b50: 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20   ((objc > 2) && 
6b60: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
6b70: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
6b80: 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29  jv[2], &verbose)
6b90: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
6ba0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28  .    }.    if ((
6bc0: 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c  objc > 3) && Tcl
6bd0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
6be0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
6bf0: 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74  3], &use_support
6c00: 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ed) != TCL_OK) {
6c10: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
6c20: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  OR;.    }..    E
6c30: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
6c40: 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28  ;..    switch ((
6c50: 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e  enum protocol)in
6c60: 64 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53  dex) {..case TLS
6c70: 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53  _SSL2:.#if OPENS
6c80: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
6c90: 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c  R >= 0x10100000L
6ca0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53   || defined(NO_S
6cb0: 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL2) || defined(
6cc0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
6cd0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
6ce0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
6cf0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
6d00: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
6d10: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
6d20: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
6d30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
6d40: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
6d50: 43 54 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65  CTX_new(SSLv2_me
6d60: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a  thod()); break;.
6d70: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
6d80: 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e  _SSL3:.#if defin
6d90: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  ed(NO_SSL3) || d
6da0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
6db0: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
6dc0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
6dd0: 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  L3_METHOD)..    
6de0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6df0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
6e00: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
6e10: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
6e20: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
6e30: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6e40: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
6e50: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
6e60: 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29  w(SSLv3_method()
6e70: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
6e80: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a  ..case TLS_TLS1:
6e90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
6ea0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  TLS1) || defined
6eb0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
6ec0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
6ed0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54  NSSL_NO_TLS1_MET
6ee0: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70  HOD)..    Tcl_Ap
6ef0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6f00: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
6f10: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
6f20: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
6f30: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
6f40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
6f50: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20  else..    ctx = 
6f60: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76  SSL_CTX_new(TLSv
6f70: 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65  1_method()); bre
6f80: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
6f90: 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66   TLS_TLS1_1:.#if
6fa0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
6fb0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
6fc0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
6fd0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
6fe0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
6ff0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f  ETHOD)..    Tcl_
7000: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7010: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
7020: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
7030: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
7040: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
7050: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7060: 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20  .#else..    ctx 
7070: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c  = SSL_CTX_new(TL
7080: 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b  Sv1_1_method());
7090: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
70a0: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a  case TLS_TLS1_2:
70b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
70c0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e  TLS1_2) || defin
70d0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
70e0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
70f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7100: 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  _2_METHOD)..    
7110: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7120: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7130: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
7140: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
7150: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
7160: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7170: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7180: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
7190: 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64  w(TLSv1_2_method
71a0: 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  ()); break;.#end
71b0: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53  if..case TLS_TLS
71c0: 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  1_3:.#if defined
71d0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
71e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
71f0: 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54  O_TLS1_3)..    T
7200: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7210: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
7220: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
7230: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
7240: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
7250: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7260: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63  OR;.#else..    c
7270: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
7280: 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b 0a  (TLS_method());.
7290: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
72a0: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _min_proto_versi
72b0: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
72c0: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53  ERSION);..    SS
72d0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72  L_CTX_set_max_pr
72e0: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
72f0: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
7300: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65  ;..    break;.#e
7310: 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09  ndif..default:..
7320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7330: 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20  .    if (ctx == 
7340: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
7350: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7360: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c  , REASON(), NULL
7370: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7380: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
7390: 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63   ssl = SSL_new(c
73a0: 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c  tx);.    if (ssl
73b0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
73c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
73d0: 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20  terp, REASON(), 
73e0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
73f0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
7400: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7410: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20    }..    /* Use 
7420: 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61  list and order a
7430: 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20  s would be sent 
7440: 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f  in a ClientHello
7450: 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c   or all availabl
7460: 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20  e ciphers */.   
7470: 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74   if (use_support
7480: 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f  ed) {..sk = SSL_
7490: 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63  get1_supported_c
74a0: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20  iphers(ssl);.   
74b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20   } else {..sk = 
74c0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28  SSL_get_ciphers(
74d0: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ssl);.    }..   
74e0: 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29   if (sk != NULL)
74f0: 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65   {..if (!verbose
7500: 29 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20  ) {..    objPtr 
7510: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
7520: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  (0, NULL);..    
7530: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20  for (int i = 0; 
7540: 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  i < sk_SSL_CIPHE
7550: 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20  R_num(sk); i++) 
7560: 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49  {...const SSL_CI
7570: 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c  PHER *c = sk_SSL
7580: 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b  _CIPHER_value(sk
7590: 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d  , i);...if (c ==
75a0: 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b   NULL) continue;
75b0: 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61  ..../* cipher na
75c0: 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a  me or (NONE) */.
75d0: 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45  ..cp = SSL_CIPHE
75e0: 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09  R_get_name(c);..
75f0: 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29  .if (cp == NULL)
7600: 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69   break;...Tcl_Li
7610: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
7620: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
7630: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
7640: 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20  Obj(cp, -1));.. 
7650: 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a     }...} else {.
7660: 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63  .    objPtr = Tc
7670: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
7680: 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28  ",0);..    for (
7690: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73  int i = 0; i < s
76a0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d  k_SSL_CIPHER_num
76b0: 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63  (sk); i++) {...c
76c0: 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20  onst SSL_CIPHER 
76d0: 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48  *c = sk_SSL_CIPH
76e0: 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b  ER_value(sk, i);
76f0: 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c  ...if (c == NULL
7700: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f  ) continue;..../
7710: 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69  * textual descri
7720: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70  ption of the cip
7730: 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c  her */...if (SSL
7740: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
7750: 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65  ion(c, buf, size
7760: 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c  of(buf)) != NULL
7770: 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70  ) {...    Tcl_Ap
7780: 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72  pendToObj(objPtr
7790: 2c 20 62 75 66 2c 20 28 69 6e 74 29 20 73 74 72  , buf, (int) str
77a0: 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 65  len(buf));...} e
77b0: 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f  lse {...    Tcl_
77c0: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50  AppendToObj(objP
77d0: 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c  tr, "UNKNOWN\n",
77e0: 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a   8);...}..    }.
77f0: 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 70 70  .}..if (use_supp
7800: 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 73 6b  orted) {..    sk
7810: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 65  _SSL_CIPHER_free
7820: 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20  (sk);..}.    }. 
7830: 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29     SSL_free(ssl)
7840: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ;.    SSL_CTX_fr
7850: 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63  ee(ctx);..    Tc
7860: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
7870: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
7880: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
7890: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d  K;..clientData =
78a0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c   clientData;.}..
78b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
78c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
7900: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20  ProtocolsObjCmd 
7910: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c  -- list availabl
7920: 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20  e protocols. *. 
7930: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
7940: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70   is invoked to p
7950: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a  rocess the "tls:
7960: 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d  :protocols" comm
7970: 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61  and. *.to list a
7980: 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f  vailable protoco
7990: 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ls.. *. * Result
79a0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
79b0: 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74   Tcl result list
79c0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
79d0: 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ects:. *.none. *
79e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a20: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
7a30: 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f  c int.ProtocolsO
7a40: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
7a50: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
7a60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7a70: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
7a80: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
7a90: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
7aa0: 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70  *objPtr;..    dp
7ab0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
7ac0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
7ad0: 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 1) {..Tcl_Wron
7ae0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
7af0: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09   1, objv, "");..
7b00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7b10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
7b20: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
7b30: 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63  .    objPtr = Tc
7b40: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
7b50: 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e  NULL);..#if OPEN
7b60: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
7b70: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
7b80: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
7b90: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
7ba0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
7bb0: 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  2).    Tcl_ListO
7bc0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
7bd0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
7be0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7bf0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53  (protocols[TLS_S
7c00: 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  SL2], -1));.#end
7c10: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
7c20: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
7c30: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7c40: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
7c50: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
7c60: 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63  3_METHOD).    Tc
7c70: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7c80: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
7c90: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
7ca0: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
7cb0: 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29  s[TLS_SSL3], -1)
7cc0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
7cd0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
7ce0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
7cf0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20  SSL_NO_TLS1) && 
7d00: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
7d10: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29  _NO_TLS1_METHOD)
7d20: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
7d30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
7d40: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
7d50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
7d60: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53  rotocols[TLS_TLS
7d70: 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  1], -1));.#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 20 20  LS1_1_METHOD).  
7de0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
7df0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
7e00: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
7e10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
7e20: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31  ocols[TLS_TLS1_1
7e30: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
7e40: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
7e50: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
7e60: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7e70: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
7e80: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7e90: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_2_METHOD).   
7ea0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
7eb0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
7ec0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
7ed0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
7ee0: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d  cols[TLS_TLS1_2]
7ef0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
7f00: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
7f10: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
7f20: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7f30: 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69  S1_3).    Tcl_Li
7f40: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
7f50: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
7f60: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
7f70: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
7f80: 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b  S_TLS1_3], -1));
7f90: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c  .#endif..    Tcl
7fa0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
7fb0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20  terp, objPtr);. 
7fc0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
7fd0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
7fe0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a  clientData;.}...
7ff0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8030: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48  --------. *. * H
8040: 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d  andshakeObjCmd -
8050: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d  -. *. *.This com
8060: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20  mand is used to 
8070: 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74  verify whether t
8080: 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20  he handshake is 
8090: 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e  complete. *.or n
80a0: 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ot.. *. * Result
80b0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
80c0: 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d   Tcl result. 1 m
80d0: 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63  eans handshake c
80e0: 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73  omplete, 0 means
80f0: 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20   pending.. *. * 
8100: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
8110: 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e  .May force SSL n
8120: 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61  egotiation to ta
8130: 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d  ke place.. *. *-
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8180: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
8190: 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d  t HandshakeObjCm
81a0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
81b0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
81c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
81d0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
81e0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
81f0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
8200: 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  chan;        /* 
8210: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
8220: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
8230: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
8240: 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  ePtr;        /* 
8250: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72  client state for
8260: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20   ssl socket */. 
8270: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65     const char *e
8280: 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rrStr = NULL;.  
8290: 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20    int ret = 1;. 
82a0: 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a     int err = 0;.
82b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
82c0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
82d0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
82e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
82f0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
8300: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65   "channel");..re
8310: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
8320: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
8330: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
8340: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
8350: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
8360: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
8370: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
8380: 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  NULL), NULL);.  
8390: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
83a0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
83b0: 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  ) {..return(TCL_
83c0: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20  ERROR);.    }.. 
83d0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
83e0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
83f0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
8400: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
8410: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
8420: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
8430: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
8440: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
8450: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
8460: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
8470: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
8480: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
8490: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
84a0: 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22  (chan),..    "\"
84b0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
84c0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63  nel", NULL);..Tc
84d0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
84e0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48  nterp, "TLS", "H
84f0: 41 4e 44 53 48 41 4b 45 22 2c 20 22 43 48 41 4e  ANDSHAKE", "CHAN
8500: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
8510: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
8520: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
8530: 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  OR);.    }.    s
8540: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
8550: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
8560: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
8570: 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  an);..    dprint
8580: 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57  f("Calling Tls_W
8590: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b  aitForConnect");
85a0: 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57  .    ret = Tls_W
85b0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74  aitForConnect(st
85c0: 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29  atePtr, &err, 1)
85d0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 54  ;.    dprintf("T
85e0: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  ls_WaitForConnec
85f0: 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c  t returned: %i",
8600: 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28   ret);..    if (
8610: 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 74 61  ret < 0 && ((sta
8620: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
8630: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26  LS_TCL_ASYNC) &&
8640: 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29   (err == EAGAIN)
8650: 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41  )) {..dprintf("A
8660: 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72  sync set and err
8670: 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65   = EAGAIN");..re
8680: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73  t = 0;.    } els
8690: 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b  e if (ret < 0) {
86a0: 0a 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65  ..errStr = state
86b0: 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52  Ptr->err;..Tcl_R
86c0: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
86d0: 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e  p);..Tcl_SetErrn
86e0: 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65  o(err);...if (!e
86f0: 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74  rrStr || (*errSt
8700: 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20  r == 0)) {..    
8710: 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73  errStr = Tcl_Pos
8720: 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ixError(interp);
8730: 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64  ..}...Tcl_Append
8740: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8750: 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64  handshake failed
8760: 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68  : ", errStr, (ch
8770: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63  ar *) NULL);..Tc
8780: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
8790: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48  nterp, "TLS", "H
87a0: 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c  ANDSHAKE", "FAIL
87b0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
87c0: 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52  LL);..dprintf("R
87d0: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52  eturning TCL_ERR
87e0: 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b  OR with handshak
87f0: 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65  e failed: %s", e
8800: 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28  rrStr);..return(
8810: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
8820: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72  } else {..if (er
8830: 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64  r != 0) {..    d
8840: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65  printf("Got an e
8850: 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70  rror with a comp
8860: 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a  leted handshake:
8870: 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29   err = %i", err)
8880: 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20  ;..}..ret = 1;. 
8890: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
88a0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
88b0: 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22  _OK with data \"
88c0: 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20  %i\"", ret);.   
88d0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
88e0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
88f0: 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20  wIntObj(ret));. 
8900: 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b     return(TCL_OK
8910: 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d  );..clientData =
8920: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a   clientData;.}..
8930: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
8940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49  --------. *. * I
8980: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20  mportObjCmd --. 
8990: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
89a0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ure is invoked t
89b0: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73  o process the "s
89c0: 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20  sl" command. *. 
89d0: 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e  *.The ssl comman
89e0: 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65  d pushes SSL ove
89f0: 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65  r a (newly conne
8a00: 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74  cted) tcp socket
8a10: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
8a20: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
8a30: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
8a40: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
8a50: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20  .May modify the 
8a60: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49  behavior of an I
8a70: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  O channel.. *. *
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ac0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
8ad0: 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28  nt.ImportObjCmd(
8ae0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
8af0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
8b00: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
8b10: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
8b20: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
8b30: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
8b40: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e  an;../* The chan
8b50: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
8b60: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61  e on. */.    Sta
8b70: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f  te *statePtr;../
8b80: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66  * client state f
8b90: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f  or ssl socket */
8ba0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74  .    SSL_CTX *ct
8bb0: 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  x.        = NULL
8bc0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73  ;.    Tcl_Obj *s
8bd0: 63 72 69 70 74 09 20 20 20 20 20 20 20 20 3d 20  cript.        = 
8be0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
8bf0: 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20  j *password.    
8c00: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
8c10: 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 20 20  Tcl_Obj *vcmd.  
8c20: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
8c30: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70    Tcl_DString up
8c40: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
8c50: 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e  ation, upperChan
8c60: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70  nelBlocking, upp
8c70: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
8c80: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
8c90: 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20  OFChar;.    int 
8ca0: 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e  idx, len;.    in
8cb0: 74 20 66 6c 61 67 73 09 09 20 20 20 20 20 20 20  t flags..       
8cc0: 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b   = TLS_TCL_INIT;
8cd0: 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 09  .    int server.
8ce0: 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a  .        = 0;./*
8cf0: 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69   is connection i
8d00: 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f  ncoming or outgo
8d10: 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72  ing? */.    char
8d20: 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20   *keyfile.      
8d30: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68    = NULL;.    ch
8d40: 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20  ar *certfile.   
8d50: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
8d60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8d70: 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20  key  .= NULL;.  
8d80: 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20    int key_len   
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
8da0: 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  0;.    unsigned 
8db0: 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 20 20  char *cert      
8dc0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
8dd0: 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20  nt cert_len     
8de0: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a             = 0;.
8df0: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72      char *cipher
8e00: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  s.        = NULL
8e10: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
8e20: 65 72 73 75 69 74 65 73 09 20 20 20 20 20 20 20  ersuites.       
8e30: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61   = NULL;.    cha
8e40: 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20  r *CAfile.      
8e50: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68    = NULL;.    ch
8e60: 61 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 20  ar *CAdir..     
8e70: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
8e80: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20  har *DHparams.  
8e90: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
8ea0: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20    char *model.. 
8eb0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
8ec0: 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e     char *servern
8ed0: 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ame.        = NU
8ee0: 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20  LL;./* hostname 
8ef0: 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20  for Server Name 
8f00: 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  Indication */.  
8f10: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
8f20: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69   char *session_i
8f30: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  d = NULL;.    Tc
8f40: 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e  l_Obj *alpn..= N
8f50: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c  ULL;.    int ssl
8f60: 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b  2 = 0, ssl3 = 0;
8f70: 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20  .    int tls1 = 
8f80: 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74  1, tls1_1 = 1, t
8f90: 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f  ls1_2 = 1, tls1_
8fa0: 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70  3 = 1;.    int p
8fb0: 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20  roto = 0, level 
8fc0: 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65  = -1;.    int ve
8fd0: 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72  rify = 0, requir
8fe0: 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d  e = 0, request =
8ff0: 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   1, post_handsha
9000: 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72  ke = 0;..    dpr
9010: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
9020: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
9030: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
9040: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65  10100000L && !de
9050: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
9060: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e  _SSL2) && !defin
9070: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64  ed(NO_SSL2) && d
9080: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
9090: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
90a0: 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  S1) && defined(N
90b0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66  O_TLS1_1) && def
90c0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
90d0: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
90e0: 53 31 5f 33 29 0a 20 20 20 20 73 73 6c 32 20 3d  S1_3).    ssl2 =
90f0: 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21   1;.#endif.#if !
9100: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
9110: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
9120: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26  ined(NO_SSL3) &&
9130: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
9140: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
9150: 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e 65 64  TLS1) && defined
9160: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64  (NO_TLS1_1) && d
9170: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
9180: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
9190: 54 4c 53 31 5f 33 29 0a 20 20 20 20 73 73 6c 33  TLS1_3).    ssl3
91a0: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 1;.#endif.#if
91b0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
91c0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
91d0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20  NSSL_NO_TLS1).  
91e0: 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64    tls1 = 0;.#end
91f0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
9200: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
9210: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
9220: 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31  TLS1_1).    tls1
9230: 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  _1 = 0;.#endif.#
9240: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
9250: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
9260: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
9270: 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d  _2).    tls1_2 =
9280: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
9290: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
92a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
92b0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
92c0: 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a      tls1_3 = 0;.
92d0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28  #endif..    if (
92e0: 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
92f0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
9300: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
9310: 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73  channel ?options
9320: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
9330: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
9340: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
9350: 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20  or();..    chan 
9360: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
9370: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
9380: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
9390: 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55  jv[1], NULL), NU
93a0: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
93b0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
93c0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
93d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
93e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
93f0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
9400: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
9410: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
9420: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
9430: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a  Channel(chan);..
9440: 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32      for (idx = 2
9450: 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64  ; idx < objc; id
9460: 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70  x++) {..char *op
9470: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
9480: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64  gFromObj(objv[id
9490: 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20  x], NULL);...if 
94a0: 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a  (opt[0] != '-').
94b0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50  .    break;...OP
94c0: 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c  TOBJ("-alpn", al
94d0: 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  pn);..OPTSTR("-c
94e0: 61 64 69 72 22 2c 20 43 41 64 69 72 29 3b 0a 09  adir", CAdir);..
94f0: 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22  OPTSTR("-cafile"
9500: 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42  , CAfile);..OPTB
9510: 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72  YTE("-cert", cer
9520: 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f  t, cert_len);..O
9530: 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65  PTSTR("-certfile
9540: 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f  ", certfile);..O
9550: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c  PTSTR("-cipher",
9560: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53   ciphers);..OPTS
9570: 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63  TR("-ciphers", c
9580: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52  iphers);..OPTSTR
9590: 28 22 2d 63 69 70 68 65 72 73 75 69 74 65 73 22  ("-ciphersuites"
95a0: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 3b  , ciphersuites);
95b0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61  ..OPTOBJ("-comma
95c0: 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f  nd", script);..O
95d0: 50 54 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73  PTSTR("-dhparams
95e0: 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f  ", DHparams);..O
95f0: 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b  PTBYTE("-key", k
9600: 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f  ey, key_len);..O
9610: 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22  PTSTR("-keyfile"
9620: 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54  , keyfile);..OPT
9630: 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f  STR("-model", mo
9640: 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  del);..OPTOBJ("-
9650: 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77  password", passw
9660: 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  ord);..OPTBOOL("
9670: 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22  -post_handshake"
9680: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  , post_handshake
9690: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65  );..OPTBOOL("-re
96a0: 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 74 29  quest", request)
96b0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71  ;..OPTBOOL("-req
96c0: 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b  uire", require);
96d0: 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72  ..OPTINT("-secur
96e0: 69 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c  itylevel", level
96f0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65  );..OPTBOOL("-se
9700: 72 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a  rver", server);.
9710: 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72  .OPTSTR("-server
9720: 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d  name", servernam
9730: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65  e);..OPTSTR("-se
9740: 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69  ssion_id", sessi
9750: 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c  on_id);..OPTBOOL
9760: 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b  ("-ssl2", ssl2);
9770: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33  ..OPTBOOL("-ssl3
9780: 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f  ", ssl3);..OPTBO
9790: 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31  OL("-tls1", tls1
97a0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
97b0: 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a  s1.1", tls1_1);.
97c0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e  .OPTBOOL("-tls1.
97d0: 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50  2", tls1_2);..OP
97e0: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c  TBOOL("-tls1.3",
97f0: 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42   tls1_3);..OPTOB
9800: 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d  J("-validatecomm
9810: 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50  and", vcmd);..OP
9820: 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63  TOBJ("-vcmd", vc
9830: 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f  md);...OPTBAD("o
9840: 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20  ption", "-alpn, 
9850: 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c  -cadir, -cafile,
9860: 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c   -cert, -certfil
9870: 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70  e, -cipher, -cip
9880: 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d  hersuites, -comm
9890: 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20  and, -dhparams, 
98a0: 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20  -key, -keyfile, 
98b0: 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72  -model, -passwor
98c0: 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61  d, -post_handsha
98d0: 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72  ke, -request, -r
98e0: 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74  equire, -securit
98f0: 79 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c  ylevel, -server,
9900: 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73   -servername, -s
9910: 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32  ession_id, -ssl2
9920: 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20  , -ssl3, -tls1, 
9930: 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32  -tls1.1, -tls1.2
9940: 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76  , -tls1.3, or -v
9950: 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29  alidatecommand")
9960: 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
9970: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
9980: 69 66 20 28 72 65 71 75 65 73 74 29 09 09 76 65  if (request)..ve
9990: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49  rify |= SSL_VERI
99a0: 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c  FY_CLIENT_ONCE |
99b0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52   SSL_VERIFY_PEER
99c0: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73  ;.    if (reques
99d0: 74 20 26 26 20 72 65 71 75 69 72 65 29 09 76 65  t && require).ve
99e0: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49  rify |= SSL_VERI
99f0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45  FY_FAIL_IF_NO_PE
9a00: 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20  ER_CERT;.    if 
9a10: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
9a20: 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69  _handshake).veri
9a30: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
9a40: 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b  _POST_HANDSHAKE;
9a50: 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20  .    if (verify 
9a60: 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 3d 20  == 0)..verify = 
9a70: 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b  SSL_VERIFY_NONE;
9a80: 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ..    proto |= (
9a90: 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  ssl2 ? TLS_PROTO
9aa0: 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20  _SSL2 : 0);.    
9ab0: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f  proto |= (ssl3 ?
9ac0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20   TLS_PROTO_SSL3 
9ad0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
9ae0: 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50  |= (tls1 ? TLS_P
9af0: 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a  ROTO_TLS1 : 0);.
9b00: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
9b10: 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_1 ? TLS_PROTO
9b20: 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20  _TLS1_1 : 0);.  
9b30: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
9b40: 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _2 ? TLS_PROTO_T
9b50: 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20  LS1_2 : 0);.    
9b60: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33  proto |= (tls1_3
9b70: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
9b80: 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  1_3 : 0);..    /
9b90: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20  * reset to NULL 
9ba0: 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20  if blank string 
9bb0: 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20  provided */.    
9bc0: 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65  if (cert && !*ce
9bd0: 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65 72  rt)..        cer
9be0: 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  t.        = NULL
9bf0: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26  ;.    if (key &&
9c00: 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20   !*key)..       
9c10: 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e   key.        = N
9c20: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72  ULL;.    if (cer
9c30: 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66  tfile && !*certf
9c40: 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 72  ile)         cer
9c50: 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20  tfile.= NULL;.  
9c60: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26    if (keyfile &&
9c70: 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79   !*keyfile)..key
9c80: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
9c90: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70  ULL;.    if (cip
9ca0: 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72  hers && !*cipher
9cb0: 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68 65  s).        ciphe
9cc0: 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  rs.        = NUL
9cd0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  L;.    if (ciphe
9ce0: 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 70  rsuites && !*cip
9cf0: 68 65 72 73 75 69 74 65 73 29 20 63 69 70 68 65  hersuites) ciphe
9d00: 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c  rsuites    = NUL
9d10: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c  L;.    if (CAfil
9d20: 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20  e && !*CAfile). 
9d30: 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 20         CAfile.  
9d40: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
9d50: 20 20 69 66 20 28 43 41 64 69 72 20 26 26 20 21    if (CAdir && !
9d60: 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 20 20  *CAdir).        
9d70: 43 41 64 69 72 09 20 20 20 20 20 20 20 20 3d 20  CAdir.        = 
9d80: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48  NULL;.    if (DH
9d90: 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61  params && !*DHpa
9da0: 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48  rams).        DH
9db0: 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20  params        = 
9dc0: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65  NULL;..    /* ne
9dd0: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20  w SSL state */. 
9de0: 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28     statePtr..= (
9df0: 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63  State *) ckalloc
9e00: 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65  ((unsigned) size
9e10: 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20  of(State));.    
9e20: 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c  memset(statePtr,
9e30: 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65   0, sizeof(State
9e40: 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74  ));..    statePt
9e50: 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73  r->flags.= flags
9e60: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
9e70: 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b  interp.= interp;
9e80: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76  .    statePtr->v
9e90: 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a  flags.= verify;.
9ea0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72      statePtr->er
9eb0: 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20  r.= "";..    /* 
9ec0: 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20  allocate script 
9ed0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70  */.    if (scrip
9ee0: 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  t) {..(void) Tcl
9ef0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
9f00: 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b  j(script, &len);
9f10: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20  ..if (len) {..  
9f20: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c    statePtr->call
9f30: 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09  back = script;..
9f40: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
9f50: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63  ount(statePtr->c
9f60: 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20  allback);..}.   
9f70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63   }..    /* alloc
9f80: 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a  ate password */.
9f90: 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64      if (password
9fa0: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f  ) {..(void) Tcl_
9fb0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9fc0: 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29  (password, &len)
9fd0: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20  ;..if (len) {.. 
9fe0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73     statePtr->pas
9ff0: 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64  sword = password
a000: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
a010: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
a020: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a  ->password);..}.
a030: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c      }..    /* al
a040: 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20  locate validate 
a050: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69  command */.    i
a060: 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69  f (vcmd) {..(voi
a070: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
a080: 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c  FromObj(vcmd, &l
a090: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b  en);..if (len) {
a0a0: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
a0b0: 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20  vcmd = vcmd;..  
a0c0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
a0d0: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  nt(statePtr->vcm
a0e0: 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  d);..}.    }..  
a0f0: 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e    if (model != N
a100: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65  ULL) {..int mode
a110: 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d  ;../* Get the "m
a120: 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f  odel" context */
a130: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74  ..chan = Tcl_Get
a140: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
a150: 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09  model, &mode);..
a160: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
a170: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
a180: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  {..    Tls_Free(
a190: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
a1a0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
a1b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
a1c0: 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65  /*.. * Make sure
a1d0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
a1e0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
a1f0: 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20  el.. */..chan = 
a200: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
a210: 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63  l(chan);..if (Tc
a220: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
a230: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
a240: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
a250: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a260: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
a270: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
a280: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
a290: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
a2a0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
a2b0: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  l", NULL);..    
a2c0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
a2d0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
a2e0: 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e  "IMPORT", "CHANN
a2f0: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
a300: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
a310: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
a320: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
a330: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
a340: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78  L_ERROR;..}..ctx
a350: 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c   = ((State *)Tcl
a360: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
a370: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e  nceData(chan))->
a380: 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ctx;.    } else 
a390: 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43 54  {..if ((ctx = CT
a3a0: 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c  X_Init(statePtr,
a3b0: 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20   server, proto, 
a3c0: 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c  keyfile, certfil
a3d0: 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65  e, key, cert, ke
a3e0: 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 63 65 72 74  y_len,..    cert
a3f0: 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66  _len, CAdir, CAf
a400: 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69  ile, ciphers, ci
a410: 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65  phersuites, leve
a420: 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d  l, DHparams)) ==
a430: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c   NULL) {..    Tl
a440: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
a450: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
a460: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a470: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
a480: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20  statePtr->ctx = 
a490: 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ctx;..    /*.   
a4a0: 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d    * We need to m
a4b0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
a4c0: 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20  e channel works 
a4d0: 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74  in binary (for t
a4e0: 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70  he.     * encryp
a4f0: 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20  tion not to get 
a500: 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20  goofed up)..    
a510: 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20   * We only want 
a520: 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75  to adjust the bu
a530: 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76  ffering in pre-v
a540: 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72  2 channels, wher
a550: 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68  e.     * each ch
a560: 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61  annel in the sta
a570: 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74  ck maintained it
a580: 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20  s own buffers.. 
a590: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44      */.    Tcl_D
a5a0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
a5b0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
a5c0: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ion);.    Tcl_DS
a5d0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
a5e0: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
a5f0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
a600: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
a610: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
a620: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
a630: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
a640: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  coding);.    Tcl
a650: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
a660: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
a670: 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70  "-eofchar", &upp
a680: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
a690: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
a6a0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
a6b0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f  rp, chan, "-enco
a6c0: 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61  ding", &upperCha
a6d0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
a6e0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
a6f0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
a700: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74  chan, "-translat
a710: 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ion", &upperChan
a720: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b  nelTranslation);
a730: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
a740: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
a750: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69  , chan, "-blocki
a760: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ng", &upperChann
a770: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20  elBlocking);.   
a780: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
a790: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
a7a0: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
a7b0: 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20  n", "binary");. 
a7c0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
a7d0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
a7e0: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
a7f0: 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20  ", "true");.    
a800: 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69  dprintf("Consumi
a810: 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25  ng Tcl channel %
a820: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  s", Tcl_GetChann
a830: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20  elName(chan));. 
a840: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c     statePtr->sel
a850: 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61  f = Tcl_StackCha
a860: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73  nnel(interp, Tls
a870: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20  _ChannelType(), 
a880: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
a890: 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44  tePtr, (TCL_READ
a8a0: 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41  ABLE | TCL_WRITA
a8b0: 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20  BLE), chan);.   
a8c0: 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 65   dprintf("Create
a8d0: 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20  d channel named 
a8e0: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  %s", Tcl_GetChan
a8f0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
a900: 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66  ->self));.    if
a910: 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66   (statePtr->self
a920: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
a930: 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20  ) NULL) {../*.. 
a940: 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f  * No use of Tcl_
a950: 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62  EventuallyFree b
a960: 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62  ecause no possib
a970: 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e  le Tcl_Preserve.
a980: 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28  .. */..Tls_Free(
a990: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
a9a0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  r);..return TCL_
a9b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
a9c0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
a9d0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
a9e0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
a9f0: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54  -translation", T
aa00: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
aa10: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
aa20: 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20  nslation));.    
aa30: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
aa40: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
aa50: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65  tePtr->self, "-e
aa60: 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53  ncoding", Tcl_DS
aa70: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
aa80: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
aa90: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ));.    Tcl_SetC
aaa0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
aab0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
aac0: 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c  elf, "-eofchar",
aad0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
aae0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
aaf0: 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63  OFChar));.    Tc
ab00: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
ab10: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
ab20: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f  Ptr->self, "-blo
ab30: 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  cking", Tcl_DStr
ab40: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
ab50: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29  hannelBlocking))
ab60: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
ab70: 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74   SSL Initializat
ab80: 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ion.     */.    
ab90: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20  statePtr->ssl = 
aba0: 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72  SSL_new(statePtr
abb0: 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28  ->ctx);.    if (
abc0: 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20  !statePtr->ssl) 
abd0: 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72  {../* SSL librar
abe0: 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f  y error */..Tcl_
abf0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ac00: 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63  erp, "couldn't c
ac10: 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73  onstruct ssl ses
ac20: 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28  sion: ", REASON(
ac30: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
ac40: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
ac50: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
ac60: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
ac70: 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45  , "INIT", "FAILE
ac80: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
ac90: 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63  L);..Tls_Free((c
aca0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
acb0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
acc0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
acd0: 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76  /* Set host serv
ace0: 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69  er name */.    i
acf0: 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b  f (servername) {
ad00: 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65  ../* Sets the se
ad10: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61  rver name indica
ad20: 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c  tion (SNI) in Cl
ad30: 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73  ientHello extens
ad40: 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52  ion */../* Per R
ad50: 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d  FC 6066, hostnam
ad60: 65 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63  e is a ASCII enc
ad70: 6f 64 65 64 20 73 74 72 69 6e 67 2e 20 2a 2f 0a  oded string. */.
ad80: 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c  .if (!SSL_set_tl
ad90: 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73  sext_host_name(s
ada0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65  tatePtr->ssl, se
adb0: 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71  rvername) && req
adc0: 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c  uire) {..    Tcl
add0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ade0: 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54  terp, "setting T
adf0: 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74  LS host name ext
ae00: 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20  ension failed", 
ae10: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
ae20: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
ae30: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
ae40: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
ae50: 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  SNI", "FAILED", 
ae60: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
ae70: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
ae80: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
ae90: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
aea0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
aeb0: 20 43 6f 6e 66 69 67 75 72 65 20 73 65 72 76 65   Configure serve
aec0: 72 20 68 6f 73 74 20 6e 61 6d 65 20 63 68 65 63  r host name chec
aed0: 6b 73 20 69 6e 20 74 68 65 20 53 53 4c 20 63 6c  ks in the SSL cl
aee0: 69 65 6e 74 2e 20 53 65 74 20 44 4e 53 20 68 6f  ient. Set DNS ho
aef0: 73 74 6e 61 6d 65 20 74 6f 0a 09 20 20 20 6e 61  stname to..   na
af00: 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74  me for peer cert
af10: 69 66 69 63 61 74 65 20 63 68 65 63 6b 73 2e 20  ificate checks. 
af20: 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 68 61  SSL_set1_host ha
af30: 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a  s limitations. *
af40: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31  /..if (!SSL_add1
af50: 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e  _host(statePtr->
af60: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  ssl, servername)
af70: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
af80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
af90: 2c 20 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68  , "setting DNS h
afa0: 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22  ost name failed"
afb0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
afc0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
afd0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
afe0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
aff0: 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41   "HOSTNAME", "FA
b000: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
b010: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
b020: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
b030: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
b040: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b050: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
b060: 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20   Resume session 
b070: 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65  id */.    if (se
b080: 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c  ssion_id && strl
b090: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c  en(session_id) <
b0a0: 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54  = SSL_MAX_SID_CT
b0b0: 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20  X_LENGTH) {../* 
b0c0: 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28  SSL_set_session(
b0d0: 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53  ) */..if (!SSL_S
b0e0: 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63  ESSION_set1_id_c
b0f0: 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73  ontext(SSL_get_s
b100: 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d  ession(statePtr-
b110: 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69  >ssl), session_i
b120: 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  d, (unsigned int
b130: 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e  ) strlen(session
b140: 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63  _id))) {..    Tc
b150: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b160: 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73  nterp, "Resume s
b170: 65 73 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73  ession id ", ses
b180: 73 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65  sion_id, " faile
b190: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
b1a0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
b1b0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
b1c0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
b1d0: 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46  ", "SESSION", "F
b1e0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
b1f0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20   NULL);.        
b200: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
b210: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
b220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
b230: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b240: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  }.    }..    if 
b250: 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e  (alpn) {../* Con
b260: 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20  vert a TCL list 
b270: 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d  into a protocol-
b280: 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72  list in wire-for
b290: 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64  mat */..unsigned
b2a0: 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a   char *protos, *
b2b0: 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  p;..unsigned int
b2c0: 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b   protos_len = 0;
b2d0: 0a 09 69 6e 74 20 69 2c 20 6c 65 6e 2c 20 63 6e  ..int i, len, cn
b2e0: 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69  t;..Tcl_Obj **li
b2f0: 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69  st;...if (Tcl_Li
b300: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
b310: 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26  (interp, alpn, &
b320: 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54  cnt, &list) != T
b330: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c  CL_OK) {..    Tl
b340: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
b350: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
b360: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b370: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
b380: 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72  ine the memory r
b390: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20  equired for the 
b3a0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f  protocol-list */
b3b0: 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
b3c0: 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20  < cnt; i++) {.. 
b3d0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
b3e0: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c  FromObj(list[i],
b3f0: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20   &len);..    if 
b400: 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09  (len > 255) {...
b410: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b420: 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70  (interp, "ALPN p
b430: 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f  rotocol name too
b440: 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29   long", (char *)
b450: 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65   NULL);...Tcl_Se
b460: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
b470: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
b480: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49  T", "ALPN", "FAI
b490: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
b4a0: 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65  ULL);...Tls_Free
b4b0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
b4c0: 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  tr);...return TC
b4d0: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
b4e0: 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20  .    protos_len 
b4f0: 2b 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a  += 1 + len;..}..
b500: 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f  ./* Build the co
b510: 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d  mplete protocol-
b520: 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20  list */..protos 
b530: 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73  = ckalloc(protos
b540: 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f  _len);../* proto
b550: 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73  col-lists consis
b560: 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74  t of 8-bit lengt
b570: 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 65  h-prefixed, byte
b580: 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72   strings */..for
b590: 20 28 69 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f   (i = 0, p = pro
b5a0: 74 6f 73 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b  tos; i < cnt; i+
b5b0: 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a  +) {..    char *
b5c0: 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  str = Tcl_GetStr
b5d0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b  ingFromObj(list[
b5e0: 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20  i], &len);..    
b5f0: 2a 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20 20 20  *p++ = len;..   
b600: 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20   memcpy(p, str, 
b610: 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20  len);..    p += 
b620: 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c  len;..}.../* SSL
b630: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73  _set_alpn_protos
b640: 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66   makes a copy of
b650: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69   the protocol-li
b660: 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20  st */../* Note: 
b670: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72  This functions r
b680: 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74 75  everses the retu
b690: 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74  rn value convent
b6a0: 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f  ion */..if (SSL_
b6b0: 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28  set_alpn_protos(
b6c0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70  statePtr->ssl, p
b6d0: 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65  rotos, protos_le
b6e0: 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  n)) {..    Tcl_A
b6f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b700: 72 70 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73  rp, "failed to s
b710: 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c  et ALPN protocol
b720: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  s", (char *) NUL
b730: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
b740: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
b750: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
b760: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c  ", "ALPN", "FAIL
b770: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
b780: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
b790: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
b7a0: 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72  ePtr);..    ckfr
b7b0: 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20  ee(protos);..   
b7c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b7d0: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65  R;..}.../* Store
b7e0: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20   protocols list 
b7f0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72  */..statePtr->pr
b800: 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09  otos = protos;..
b810: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
b820: 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65  _len = protos_le
b830: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  n;.    } else {.
b840: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
b850: 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65  s = NULL;..state
b860: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20  Ptr->protos_len 
b870: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
b880: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61  /*.     * SSL Ca
b890: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a  llbacks.     */.
b8a0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f      SSL_set_app_
b8b0: 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73  data(statePtr->s
b8c0: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  sl, (void *)stat
b8d0: 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20  ePtr);./* point 
b8e0: 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20  back to us */.  
b8f0: 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79    SSL_set_verify
b900: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
b910: 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61  verify, VerifyCa
b920: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c  llback);.    SSL
b930: 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61  _set_info_callba
b940: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ck(statePtr->ssl
b950: 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b  , InfoCallback);
b960: 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63  ..    /* Callbac
b970: 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20  k for observing 
b980: 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65  protocol message
b990: 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45  s */.#ifndef OPE
b9a0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43  NSSL_NO_SSL_TRAC
b9b0: 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53  E.    /* void SS
b9c0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61  L_CTX_set_msg_ca
b9d0: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65  llback_arg(state
b9e0: 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20  Ptr->ctx, (void 
b9f0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  *)statePtr);.   
ba00: 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65   void SSL_CTX_se
ba10: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73  t_msg_callback(s
ba20: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65  tatePtr->ctx, Me
ba30: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20  ssageCallback); 
ba40: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d  */.    SSL_set_m
ba50: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28  sg_callback_arg(
ba60: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28  statePtr->ssl, (
ba70: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
ba80: 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73  ;.    SSL_set_ms
ba90: 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  g_callback(state
baa0: 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67  Ptr->ssl, Messag
bab0: 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64  eCallback);.#end
bac0: 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  if..    /* Creat
bad0: 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49  e Tcl_Channel BI
bae0: 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20  O Handler */.   
baf0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
bb00: 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73  .= BIO_new_tcl(s
bb10: 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43  tatePtr, BIO_NOC
bb20: 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65  LOSE);.    state
bb30: 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e  Ptr->bio.= BIO_n
bb40: 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b  ew(BIO_f_ssl());
bb50: 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72  ..    if (server
bb60: 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63  ) {../* Server c
bb70: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c  allbacks */..SSL
bb80: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f  _CTX_set_tlsext_
bb90: 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73  servername_arg(s
bba0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76  tatePtr->ctx, (v
bbb0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
bbc0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c  ..SSL_CTX_set_tl
bbd0: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f  sext_servername_
bbe0: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
bbf0: 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62  r->ctx, SNICallb
bc00: 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ack);..SSL_CTX_s
bc10: 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f  et_client_hello_
bc20: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
bc30: 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c  , HelloCallback,
bc40: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
bc50: 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74  r);..if (statePt
bc60: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c  r->protos != NUL
bc70: 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54  L) {..    SSL_CT
bc80: 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63  X_set_alpn_selec
bc90: 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  t_cb(statePtr->c
bca0: 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b  tx, ALPNCallback
bcb0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
bcc0: 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f  tr);.#ifdef USE_
bcd0: 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73  NPN..    if (tls
bce0: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31  1_2 == 0 && tls1
bcf0: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c  _3 == 0) {...SSL
bd00: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72  _CTX_set_next_pr
bd10: 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f  otos_advertised_
bd20: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
bd30: 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28  , NPNCallback, (
bd40: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
bd50: 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  ;..    }.#endif.
bd60: 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73  .}.../* Enable s
bd70: 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65  erver to send ce
bd80: 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65 72  rt request after
bd90: 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20   handshake (TLS 
bda0: 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a  1.3 only) */../*
bdb0: 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 69   A write operati
bdc0: 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61  on must take pla
bdd0: 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 69  ce for the Certi
bde0: 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20 74  ficate Request t
bdf0: 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f  o be..   sent to
be00: 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69   the client, thi
be10: 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69  s can be done wi
be20: 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68  th SSL_do_handsh
be30: 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72  ake(). */..if (r
be40: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68  equest && post_h
be50: 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20  andshake) {..   
be60: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65   SSL_verify_clie
be70: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  nt_post_handshak
be80: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
be90: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 73 65  ;..}.../* Set se
bea0: 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74  rver mode */..st
beb0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
bec0: 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b   TLS_TCL_SERVER;
bed0: 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74  ..SSL_set_accept
bee0: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d  _state(statePtr-
bef0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  >ssl);.    } els
bf00: 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63  e {../* Client c
bf10: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64  allbacks */.#ifd
bf20: 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28  ef USE_NPN..if (
bf30: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
bf40: 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31   != NULL && tls1
bf50: 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f  _2 == 0 && tls1_
bf60: 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 53  3 == 0) {..    S
bf70: 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f  SL_CTX_set_next_
bf80: 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28  proto_select_cb(
bf90: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41  statePtr->ctx, A
bfa0: 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  LPNCallback, (vo
bfb0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
bfc0: 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53  .}.#endif.../* S
bfd0: 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a  ession caching *
bfe0: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73  /..SSL_CTX_set_s
bff0: 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64  ession_cache_mod
c000: 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  e(statePtr->ctx,
c010: 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
c020: 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53  CLIENT | SSL_SES
c030: 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52  S_CACHE_NO_INTER
c040: 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c  NAL_STORE);..SSL
c050: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65  _CTX_sess_set_ne
c060: 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  w_cb(statePtr->c
c070: 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62  tx, SessionCallb
c080: 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c  ack);.../* Enabl
c090: 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65  e post handshake
c0a0: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   Authentication 
c0b0: 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31  extension. TLS 1
c0c0: 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74  .3 only, not htt
c0d0: 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71  p/2. */..if (req
c0e0: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e  uest && post_han
c0f0: 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53  dshake) {..    S
c100: 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64  SL_set_post_hand
c110: 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74 65  shake_auth(state
c120: 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d  Ptr->ssl, 1);..}
c130: 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74  .../* Set client
c140: 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65   mode */..SSL_se
c150: 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28  t_connect_state(
c160: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
c170: 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65      }.    SSL_se
c180: 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e  t_bio(statePtr->
c190: 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70  ssl, statePtr->p
c1a0: 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e  _bio, statePtr->
c1b0: 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f  p_bio);.    BIO_
c1c0: 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72  set_ssl(statePtr
c1d0: 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d  ->bio, statePtr-
c1e0: 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53  >ssl, BIO_NOCLOS
c1f0: 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  E);..    /*.    
c200: 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e   * End of SSL In
c210: 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64  it.     */.    d
c220: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
c230: 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68  g %s", Tcl_GetCh
c240: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
c250: 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20  tr->self));.    
c260: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
c270: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54  terp, (char *) T
c280: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
c290: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
c2a0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
c2b0: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
c2c0: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
c2d0: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
c2e0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
c2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
c330: 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d   * UnimportObjCm
c340: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
c350: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
c360: 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74  oked to remove t
c370: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
c380: 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a  el filter.. *. *
c390: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
c3a0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
c3b0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
c3c0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d  ffects:. *.May m
c3d0: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69  odify the behavi
c3e0: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e  or of an IO chan
c3f0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
c400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
c440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69  /.static int.Uni
c450: 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65  mportObjCmd(Clie
c460: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
c470: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
c480: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
c490: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
c4a0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
c4b0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09  l_Channel chan;.
c4c0: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20  ./* The channel 
c4d0: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e  to set a mode on
c4e0: 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74  . */..    dprint
c4f0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
c500: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29    if (objc != 2)
c510: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
c520: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
c530: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29  objv, "channel")
c540: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
c550: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
c560: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
c570: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
c580: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c590: 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  [1]), NULL);.   
c5a0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
c5b0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
c5c0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
c5d0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
c5e0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
c5f0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
c600: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
c610: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
c620: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
c630: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28  chan);..    if (
c640: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
c650: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
c660: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
c670: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
c680: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
c690: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
c6a0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
c6b0: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f  chan),..."\": no
c6c0: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
c6d0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  , NULL);..    Tc
c6e0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
c6f0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55  nterp, "TLS", "U
c700: 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e  NIMPORT", "CHANN
c710: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
c720: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
c730: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
c740: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
c750: 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61   (Tcl_UnstackCha
c760: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61  nnel(interp, cha
c770: 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29  n) == TCL_ERROR)
c780: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
c790: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
c7a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
c7b0: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
c7c0: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a  ientData;.}.../*
c7d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c810: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58  ------. *. * CTX
c820: 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75  _Init -- constru
c830: 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73  ct a SSL_CTX ins
c840: 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75  tance. *. * Resu
c850: 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20  lts:. *.A valid 
c860: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65  SSL_CTX instance
c870: 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20   or NULL.. *. * 
c880: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
c890: 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20  .constructs SSL 
c8a0: 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a  context (CTX). *
c8b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
c8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
c900: 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f  c SSL_CTX *.CTX_
c910: 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74  Init(State *stat
c920: 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76  ePtr, int isServ
c930: 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63  er, int proto, c
c940: 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68  har *keyfile, ch
c950: 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20  ar *certfile,.  
c960: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c970: 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63  *key, unsigned c
c980: 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b  har *cert, int k
c990: 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74  ey_len, int cert
c9a0: 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69  _len, char *CAdi
c9b0: 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66  r,.    char *CAf
c9c0: 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65  ile, char *ciphe
c9d0: 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72  rs, char *cipher
c9e0: 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65  suites, int leve
c9f0: 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d  l, char *DHparam
ca00: 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  s) {.    Tcl_Int
ca10: 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74  erp *interp = st
ca20: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
ca30: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
ca40: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c   = NULL;.    Tcl
ca50: 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20  _DString ds;.   
ca60: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31   Tcl_DString ds1
ca70: 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20  ;.    int off = 
ca80: 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f  0;.    int load_
ca90: 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20  private_key;.   
caa0: 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f   const SSL_METHO
cab0: 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20  D *method;..    
cac0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
cad0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f  );..    if (!pro
cae0: 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  to) {..Tcl_Appen
caf0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
cb00: 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63  "no valid protoc
cb10: 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 4e 55  ol selected", NU
cb20: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
cb30: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  L;.    }..    /*
cb40: 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74   create SSL cont
cb50: 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53  ext */.#if OPENS
cb60: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
cb70: 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c  R >= 0x10100000L
cb80: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53   || defined(NO_S
cb90: 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL2) || defined(
cba0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
cbb0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
cbc0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
cbd0: 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f  O_SSL2)) {..Tcl_
cbe0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
cbf0: 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f  erp, "SSL2 proto
cc00: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
cc10: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  d", NULL);..retu
cc20: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
cc30: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
cc40: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65  d(NO_SSL3) || de
cc50: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
cc60: 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45  _SSL3).    if (E
cc70: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
cc80: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b  S_PROTO_SSL3)) {
cc90: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
cca0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33  lt(interp, "SSL3
ccb0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
ccc0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
ccd0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
cce0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
ccf0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
cd00: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
cd10: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20  SSL_NO_TLS1).   
cd20: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
cd30: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
cd40: 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  S1)) {..Tcl_Appe
cd50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
cd60: 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63   "TLS 1.0 protoc
cd70: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
cd80: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
cd90: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
cda0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
cdb0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  (NO_TLS1_1) || d
cdc0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
cdd0: 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66  O_TLS1_1).    if
cde0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
cdf0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
ce00: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  1)) {..Tcl_Appen
ce10: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ce20: 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f  "TLS 1.1 protoco
ce30: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
ce40: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
ce50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
ce60: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
ce70: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
ce80: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
ce90: 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20  _TLS1_2).    if 
cea0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
ceb0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
cec0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
ced0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
cee0: 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c  TLS 1.2 protocol
cef0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
cf00: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
cf10: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
cf20: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
cf30: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66  O_TLS1_3) || def
cf40: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
cf50: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28  TLS1_3).    if (
cf60: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
cf70: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
cf80: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
cf90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
cfa0: 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.3 protocol 
cfb0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
cfc0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
cfd0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
cfe0: 66 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70  f..    switch (p
cff0: 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e  roto) {.#if OPEN
d000: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
d010: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
d020: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
d030: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
d040: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
d050: 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  2).    case TLS_
d060: 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74  PROTO_SSL2:..met
d070: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
d080: 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65   SSLv2_server_me
d090: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63  thod() : SSLv2_c
d0a0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
d0b0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
d0c0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
d0d0: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
d0e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
d0f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d100: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45  ENSSL_NO_SSL3_ME
d110: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
d120: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09  LS_PROTO_SSL3:..
d130: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
d140: 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72  r ? SSLv3_server
d150: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76  _method() : SSLv
d160: 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  3_client_method(
d170: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
d180: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
d190: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
d1a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d1b0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
d1c0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d1d0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
d1e0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
d1f0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
d200: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72  rver ? TLSv1_ser
d210: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
d220: 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  LSv1_client_meth
d230: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
d240: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
d250: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
d260: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
d270: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  _NO_TLS1_1) && !
d280: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d290: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44  NO_TLS1_1_METHOD
d2a0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
d2b0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65  ROTO_TLS1_1:..me
d2c0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
d2d0: 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72  ? TLSv1_1_server
d2e0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76  _method() : TLSv
d2f0: 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  1_1_client_metho
d300: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
d310: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
d320: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
d330: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d340: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
d350: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d360: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
d370: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
d380: 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74  OTO_TLS1_2:..met
d390: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
d3a0: 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f   TLSv1_2_server_
d3b0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
d3c0: 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  _2_client_method
d3d0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
d3e0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
d3f0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
d400: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d410: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61  O_TLS1_3).    ca
d420: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
d430: 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65  1_3:../* Use the
d440: 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20   generic method 
d450: 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  and constraint r
d460: 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65  ange after conte
d470: 78 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f  xt is created */
d480: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
d490: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72  ver ? TLS_server
d4a0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f  _method() : TLS_
d4b0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
d4c0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
d4d0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a      default:../*
d4e0: 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65   Negotiate highe
d4f0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c  st available SSL
d500: 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a  /TLS version */.
d510: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
d520: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f  er ? TLS_server_
d530: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63  method() : TLS_c
d540: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
d550: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
d560: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
d570: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
d580: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
d590: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d5a0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20  L_NO_SSL2)..off 
d5b0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
d5c0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
d5d0: 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  2)   ? 0 : SSL_O
d5e0: 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e  P_NO_SSLv2);.#en
d5f0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
d600: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
d610: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d620: 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28  _SSL3)..off |= (
d630: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
d640: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20  LS_PROTO_SSL3)  
d650: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
d660: 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a  _SSLv3);.#endif.
d670: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
d680: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
d690: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d6a0: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  1)..off |= (ENAB
d6b0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d6c0: 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30  ROTO_TLS1)   ? 0
d6d0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
d6e0: 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v1);.#endif.#if 
d6f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
d700: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
d710: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d720: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  1)..off |= (ENAB
d730: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d740: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30  ROTO_TLS1_1) ? 0
d750: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
d760: 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69  v1_1);.#endif.#i
d770: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
d780: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
d790: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d7a0: 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  1_2)..off |= (EN
d7b0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
d7c0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f  _PROTO_TLS1_2) ?
d7d0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54   0 : SSL_OP_NO_T
d7e0: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a  LSv1_2);.#endif.
d7f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
d800: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
d810: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d820: 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28  LS1_3)..off |= (
d830: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
d840: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
d850: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
d860: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69  _TLSv1_3);.#endi
d870: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  f..break;.    }.
d880: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
d890: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78  rror();..    ctx
d8a0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d   = SSL_CTX_new(m
d8b0: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28  ethod);.    if (
d8c0: 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28  !ctx) {..return(
d8d0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  NULL);.    }..  
d8e0: 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c    if (getenv(SSL
d8f0: 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09  KEYLOGFILE)) {..
d900: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c  SSL_CTX_set_keyl
d910: 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c  og_callback(ctx,
d920: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29   KeyLogCallback)
d930: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65  ;.    }..#if !de
d940: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
d950: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d960: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
d970: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d      if (proto ==
d980: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d990: 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  3) {..SSL_CTX_se
d9a0: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73  t_min_proto_vers
d9b0: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
d9c0: 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43  VERSION);..SSL_C
d9d0: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f  TX_set_max_proto
d9e0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
d9f0: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  S1_3_VERSION);. 
da00: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
da10: 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72   /* Force cipher
da20: 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72   selection order
da30: 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20   by server */.  
da40: 20 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29    if (!isServer)
da50: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
da60: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c  options(ctx, SSL
da70: 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45  _OP_CIPHER_SERVE
da80: 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20  R_PREFERENCE);. 
da90: 20 20 20 7d 0a 0a 20 20 20 20 53 53 4c 5f 43 54     }..    SSL_CT
daa0: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63  X_set_app_data(c
dab0: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72  tx, (void*)inter
dac0: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20  p);./* remember 
dad0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
dae0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
daf0: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
db00: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20  SSL_OP_ALL);./* 
db10: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b  all SSL bug work
db20: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53  arounds */.    S
db30: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
db40: 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f  ns(ctx, off);../
db50: 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63  * disable protoc
db60: 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23  ol versions */.#
db70: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
db80: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
db90: 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f  101000L.    SSL_
dba0: 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78  CTX_set_mode(ctx
dbb0: 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f  , SSL_MODE_AUTO_
dbc0: 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c  RETRY);./* handl
dbd0: 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73  e new handshakes
dbe0: 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20   in background. 
dbf0: 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e  On by default in
dc00: 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20   OpenSSL 1.1.1. 
dc10: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53  */.#endif.    SS
dc20: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63  L_CTX_sess_set_c
dc30: 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31  ache_size(ctx, 1
dc40: 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  28);..    /* Set
dc50: 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69   user defined ci
dc60: 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75  phers, cipher su
dc70: 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69  ites, and securi
dc80: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ty level */.    
dc90: 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20  if ((ciphers != 
dca0: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54  NULL) && !SSL_CT
dcb0: 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73  X_set_cipher_lis
dcc0: 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29  t(ctx, ciphers))
dcd0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
dce0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
dcf0: 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64  t ciphers failed
dd00: 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65  : No valid ciphe
dd10: 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  rs", (char *) NU
dd20: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  LL);..SSL_CTX_fr
dd30: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e  ee(ctx);..return
dd40: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
dd50: 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74   if ((ciphersuit
dd60: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21  es != NULL) && !
dd70: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68  SSL_CTX_set_ciph
dd80: 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69  ersuites(ctx, ci
dd90: 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09  phersuites)) {..
dda0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ddb0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69  (interp, "Set ci
ddc0: 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c  pher suites fail
ddd0: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70  ed: No valid cip
dde0: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20  hers", (char *) 
ddf0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
de00: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
de10: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
de20: 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72      /* Set secur
de30: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  ity level */.   
de40: 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20   if (level > -1 
de50: 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a  && level < 6) {.
de60: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75  ./* SSL_set_secu
de70: 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53  rity_level */..S
de80: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72  SL_CTX_set_secur
de90: 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c  ity_level(ctx, l
dea0: 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  evel);.    }..  
deb0: 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61    /* set some ca
dec0: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53  llbacks */.    S
ded0: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
dee0: 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78  lt_passwd_cb(ctx
def0: 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61  , PasswordCallba
df00: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  ck);.    SSL_CTX
df10: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73  _set_default_pas
df20: 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28  swd_cb_userdata(
df30: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
df40: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
df50: 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65  read a Diffie-He
df60: 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73  llman parameters
df70: 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68   file, or use th
df80: 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a  e built-in one *
df90: 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c  /.#ifdef OPENSSL
dfa0: 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44  _NO_DH.    if (D
dfb0: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29  Hparams != NULL)
dfc0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
dfd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48  sult(interp, "DH
dfe0: 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f   parameter suppo
dff0: 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rt not available
e000: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
e010: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
e020: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
e030: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  ULL;.    }.#else
e040: 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a  .    {..DH* dh;.
e050: 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d  .if (DHparams !=
e060: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49   NULL) {..    BI
e070: 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c  O *bio;..    Tcl
e080: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
e090: 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49  );..    bio = BI
e0a0: 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44  O_new_file(F2N(D
e0b0: 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22  Hparams, &ds), "
e0c0: 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62  r");..    if (!b
e0d0: 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72  io) {...Tcl_DStr
e0e0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09  ingFree(&ds);...
e0f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e100: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20  (interp, "Could 
e110: 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61  not find DH para
e120: 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63  meters file", (c
e130: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
e140: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
e150: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
e160: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64  ;..    }...    d
e170: 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f  h = PEM_read_bio
e180: 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e  _DHparams(bio, N
e190: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
e1a0: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ;..    BIO_free(
e1b0: 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44  bio);..    Tcl_D
e1c0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
e1d0: 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b  ..    if (!dh) {
e1e0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
e1f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75  ult(interp, "Cou
e200: 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70  ld not read DH p
e210: 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66  arameters from f
e220: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ile", (char *) N
e230: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
e240: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
e250: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
e260: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
e270: 64 68 20 3d 20 67 65 74 5f 64 68 50 61 72 61 6d  dh = get_dhParam
e280: 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58  s();..}..SSL_CTX
e290: 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c  _set_tmp_dh(ctx,
e2a0: 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 64   dh);..DH_free(d
e2b0: 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  h);.    }.#endif
e2c0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72  ..    /* set our
e2d0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
e2e0: 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65      load_private
e2f0: 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  _key = 0;.    if
e300: 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55   (certfile != NU
e310: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
e320: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54  ate_key = 1;...T
e330: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
e340: 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43  ds);...if (SSL_C
e350: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61  TX_use_certifica
e360: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  te_file(ctx, F2N
e370: 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c  (certfile, &ds),
e380: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
e390: 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20  M) <= 0) {..    
e3a0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
e3b0: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41  &ds);..    Tcl_A
e3c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e3d0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
e3e0: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66  et certificate f
e3f0: 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c  ile ", certfile,
e400: 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52   ": ",....     R
e410: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
e420: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
e430: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e440: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
e450: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  L;..}.    } else
e460: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c   if (cert != NUL
e470: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61  L) {..load_priva
e480: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20  te_key = 1;..if 
e490: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
e4a0: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74  tificate_ASN1(ct
e4b0: 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72  x, cert_len, cer
e4c0: 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20  t) <= 0) {..    
e4d0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
e4e0: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41  &ds);..    Tcl_A
e4f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e500: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
e510: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20  et certificate: 
e520: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f  ",....     REASO
e530: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
e540: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
e550: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
e560: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
e570: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
e580: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72  certfile = (char
e590: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75  *)X509_get_defau
e5a0: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a  lt_cert_file();.
e5b0: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
e5c0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
e5d0: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65  le(ctx, certfile
e5e0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
e5f0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20  EM) <= 0) {.#if 
e600: 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  0..    Tcl_DStri
e610: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
e620: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
e630: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
e640: 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c  le to use defaul
e650: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
e660: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
e670: 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45  ": ",....     RE
e680: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
e690: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
e6a0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
e6b0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
e6c0: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20  ;.#endif..}.    
e6d0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  }..    /* set ou
e6e0: 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f  r private key */
e6f0: 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72  .    if (load_pr
e700: 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66  ivate_key) {..if
e710: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c   (keyfile == NUL
e720: 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c  L && key == NULL
e730: 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65  ) {..    keyfile
e740: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a   = certfile;..}.
e750: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d  ..if (keyfile !=
e760: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a   NULL) {..    /*
e770: 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65   get the private
e780: 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
e790: 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66  with this certif
e7a0: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66  icate */..    if
e7b0: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c   (keyfile == NUL
e7c0: 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d  L) {...keyfile =
e7d0: 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20   certfile;..    
e7e0: 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f  }...    if (SSL_
e7f0: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b  CTX_use_PrivateK
e800: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  ey_file(ctx, F2N
e810: 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20  (keyfile, &ds), 
e820: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
e830: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f  ) <= 0) {...Tcl_
e840: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
e850: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65  ;.../* flush the
e860: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63   passphrase whic
e870: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  h might be left 
e880: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
e890: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
e8a0: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54  (interp, NULL, T
e8b0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63  CL_STATIC);...Tc
e8c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e8d0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
e8e0: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79  o set public key
e8f0: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65   file ", keyfile
e900: 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20  , " ",....      
e910: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68     REASON(), (ch
e920: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
e930: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
e940: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
e950: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
e960: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
e970: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  );...} else if (
e980: 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  key != NULL) {..
e990: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f      if (SSL_CTX_
e9a0: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41  use_PrivateKey_A
e9b0: 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41  SN1(EVP_PKEY_RSA
e9c0: 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c  , ctx, key,key_l
e9d0: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63  en) <= 0) {...Tc
e9e0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e9f0: 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74  s);.../* flush t
ea00: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68  he passphrase wh
ea10: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66  ich might be lef
ea20: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
ea30: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  */...Tcl_SetResu
ea40: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c  lt(interp, NULL,
ea50: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09   TCL_STATIC);...
ea60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ea70: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
ea80: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b   to set public k
ea90: 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  ey: ", REASON(),
eaa0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
eab0: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
eac0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
ead0: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ULL;..    }..}..
eae0: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74  /* Now we know t
eaf0: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65  hat a key and ce
eb00: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74  rt have been set
eb10: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65   against.. * the
eb20: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a   SSL context */.
eb30: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68  .if (!SSL_CTX_ch
eb40: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28  eck_private_key(
eb50: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ctx)) {..    Tcl
eb60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
eb70: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b  terp, "private k
eb80: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
eb90: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  h the certificat
eba0: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09  e public key",..
ebb0: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20  ..     (char *) 
ebc0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
ebd0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
ebe0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
ebf0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
ec00: 2a 20 53 65 74 20 76 65 72 69 66 69 63 61 74 69  * Set verificati
ec10: 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63  on CAs */.    Tc
ec20: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
ec30: 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  s);.    Tcl_DStr
ec40: 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20  ingInit(&ds1);. 
ec50: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
ec60: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61  load_verify_loca
ec70: 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43  tions(ctx, F2N(C
ec80: 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e  Afile, &ds), F2N
ec90: 28 43 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c  (CAdir, &ds1)) |
eca0: 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f  |..!SSL_CTX_set_
ecb0: 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70  default_verify_p
ecc0: 61 74 68 73 28 63 74 78 29 29 20 7b 0a 23 69 66  aths(ctx)) {.#if
ecd0: 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46   0..Tcl_DStringF
ece0: 72 65 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44  ree(&ds);..Tcl_D
ecf0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29  StringFree(&ds1)
ed00: 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72  ;../* Don't curr
ed10: 65 6e 74 6c 79 20 63 61 72 65 20 69 66 20 74 68  ently care if th
ed20: 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c  is fails */..Tcl
ed30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ed40: 74 65 72 70 2c 20 22 53 53 4c 20 64 65 66 61 75  terp, "SSL defau
ed50: 6c 74 20 76 65 72 69 66 79 20 70 61 74 68 73 3a  lt verify paths:
ed60: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63   ", REASON(), (c
ed70: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
ed80: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
ed90: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
eda0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
edb0: 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75    /* https://sou
edc0: 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74  rceforge.net/p/t
edd0: 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20  ls/bugs/57/ */. 
ede0: 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20     /* XXX:TODO: 
edf0: 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70  Let the user sup
ee00: 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20  ply values here 
ee10: 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74  instead of somet
ee20: 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73  hing that exists
ee30: 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   on the filesyst
ee40: 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41  em */.    if (CA
ee50: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
ee60: 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e  .STACK_OF(X509_N
ee70: 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20  AME) *certNames 
ee80: 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e  = SSL_load_clien
ee90: 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41  t_CA_file(F2N(CA
eea0: 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66  file, &ds));..if
eeb0: 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e   (certNames != N
eec0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  ULL) {..    SSL_
eed0: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43  CTX_set_client_C
eee0: 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74  A_list(ctx, cert
eef0: 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d  Names);..}.    }
ef00: 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
ef10: 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20  gFree(&ds);.    
ef20: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
ef30: 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72  &ds1);.    retur
ef40: 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  n ctx;.}.../*. *
ef50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef90: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73  ---. *. * Status
efa0: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e  ObjCmd -- return
efb0: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72   certificate for
efc0: 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e   connected peer.
efd0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
efe0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
eff0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
f000: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
f010: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
f020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
f060: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53   */.static int.S
f070: 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65  tatusObjCmd(Clie
f080: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
f090: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
f0a0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
f0b0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
f0c0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74  objv[]) {.    St
f0d0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20  ate *statePtr;. 
f0e0: 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20     X509 *peer;. 
f0f0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
f100: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  tr;.    Tcl_Chan
f110: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68  nel chan;.    ch
f120: 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  ar *channelName,
f130: 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69   *ciphers;.    i
f140: 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt mode;.    con
f150: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
f160: 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73   *proto;.    uns
f170: 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20  igned int len;. 
f180: 20 20 20 69 6e 74 20 6e 69 64 3b 0a 0a 20 20 20     int nid;..   
f190: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
f1a0: 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20  ");..    switch 
f1b0: 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 65 20 32  (objc) {..case 2
f1c0: 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61  :..    channelNa
f1d0: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
f1e0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
f1f0: 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62  ], NULL);..    b
f200: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 33 3a 0a  reak;...case 3:.
f210: 09 20 20 20 20 69 66 20 28 21 73 74 72 63 6d 70  .    if (!strcmp
f220: 20 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 20   (Tcl_GetString 
f230: 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63  (objv[1]), "-loc
f240: 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 6e 6e 65  al")) {...channe
f250: 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  lName = Tcl_GetS
f260: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
f270: 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 09 62  v[2], NULL);...b
f280: 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20  reak;..    }..  
f290: 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 2d 74    /* else fall-t
f2a0: 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f 0a 23 69  hrough ... */.#i
f2b0: 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43  f defined(__GNUC
f2c0: 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74 74 72 69  __)..    __attri
f2d0: 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74 68 72 6f  bute__((fallthro
f2e0: 75 67 68 29 29 3b 0a 23 65 6e 64 69 66 0a 09 64  ugh));.#endif..d
f2f0: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c  efault:..    Tcl
f300: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
f310: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
f320: 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c  ?-local? channel
f330: 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ");..    return 
f340: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
f350: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
f360: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
f370: 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  rp, channelName,
f380: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20   &mode);.    if 
f390: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
f3a0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
f3b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f3c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4d  ;.    }.    /* M
f3d0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
f3e0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
f3f0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
f400: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
f410: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
f420: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ;.    if (Tcl_Ge
f430: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
f440: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
f450: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f  lType()) {..Tcl_
f460: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f470: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
f480: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
f490: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
f4a0: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c  ..."\": not a TL
f4b0: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
f4c0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
f4d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
f4e0: 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43  S", "STATUS", "C
f4f0: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
f500: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
f510: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
f520: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
f530: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61   statePtr = (Sta
f540: 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61  te *) Tcl_GetCha
f550: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
f560: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  (chan);..    /* 
f570: 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20  Get certificate 
f580: 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66  for peer or self
f590: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63   */.    if (objc
f5a0: 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d   == 2) {..peer =
f5b0: 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65   SSL_get_peer_ce
f5c0: 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50  rtificate(stateP
f5d0: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20  tr->ssl);.    } 
f5e0: 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53  else {..peer = S
f5f0: 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61  SL_get_certifica
f600: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
f610: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  );.    }.    if 
f620: 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72  (peer) {..objPtr
f630: 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62   = Tls_NewX509Ob
f640: 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b  j(interp, peer);
f650: 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29  ..if (objc == 2)
f660: 20 7b 20 58 35 30 39 5f 66 72 65 65 28 70 65 65   { X509_free(pee
f670: 72 29 3b 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65  r); }.    } else
f680: 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c   {..objPtr = Tcl
f690: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
f6a0: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ULL);.    }..   
f6b0: 20 2f 2a 20 50 65 65 72 20 63 65 72 74 20 63 68   /* Peer cert ch
f6c0: 61 69 6e 20 28 63 6c 69 65 6e 74 20 6f 6e 6c 79  ain (client only
f6d0: 29 20 2a 2f 0a 20 20 20 20 53 54 41 43 4b 5f 4f  ) */.    STACK_O
f6e0: 46 28 58 35 30 39 29 2a 20 73 73 6c 5f 63 65 72  F(X509)* ssl_cer
f6f0: 74 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65  ts = SSL_get_pee
f700: 72 5f 63 65 72 74 5f 63 68 61 69 6e 28 73 74 61  r_cert_chain(sta
f710: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
f720: 20 69 66 20 28 21 70 65 65 72 20 26 26 20 28 73   if (!peer && (s
f730: 73 6c 5f 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c  sl_certs == NULL
f740: 20 7c 7c 20 73 6b 5f 58 35 30 39 5f 6e 75 6d 28   || sk_X509_num(
f750: 73 73 6c 5f 63 65 72 74 73 29 20 3d 3d 20 30 29  ssl_certs) == 0)
f760: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  ) {..Tcl_SetErro
f770: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
f780: 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22  LS", "STATUS", "
f790: 43 45 52 54 49 46 49 43 41 54 45 22 2c 20 28 63  CERTIFICATE", (c
f7a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
f7b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f7c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
f7d0: 65 65 72 20 6e 61 6d 65 20 66 72 6f 6d 20 63 65  eer name from ce
f7e0: 72 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69  rt */.    Tcl_Li
f7f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f800: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
f810: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
f820: 4f 62 6a 28 22 70 65 65 72 6e 61 6d 65 22 2c 20  Obj("peername", 
f830: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
f840: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f850: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
f860: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
f870: 4f 62 6a 28 53 53 4c 5f 67 65 74 30 5f 70 65 65  Obj(SSL_get0_pee
f880: 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  rname(statePtr->
f890: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  ssl), -1));..   
f8a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f8b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f8c0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
f8d0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 62 69 74  wStringObj("sbit
f8e0: 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  s", -1));.    Tc
f8f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f900: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
f910: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e  bjPtr, Tcl_NewIn
f920: 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70  tObj(SSL_get_cip
f930: 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74  her_bits(statePt
f940: 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b  r->ssl, NULL)));
f950: 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20  ..    ciphers = 
f960: 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63  (char*)SSL_get_c
f970: 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ipher(statePtr->
f980: 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 28 63  ssl);.    if ((c
f990: 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20  iphers != NULL) 
f9a0: 26 26 20 28 73 74 72 63 6d 70 28 63 69 70 68 65  && (strcmp(ciphe
f9b0: 72 73 2c 20 22 28 4e 4f 4e 45 29 22 29 20 21 3d  rs, "(NONE)") !=
f9c0: 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74   0)) {..Tcl_List
f9d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f9e0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f9f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
fa00: 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 29  j("cipher", -1))
fa10: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
fa20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
fa30: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
fa40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 69 70  NewStringObj(cip
fa50: 68 65 72 73 2c 20 2d 31 29 29 3b 0a 20 20 20 20  hers, -1));.    
fa60: 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  }..    /* Verify
fa70: 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66   the X509 certif
fa80: 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20  icate presented 
fa90: 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20  by the peer */. 
faa0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
fab0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
fac0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
fad0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65  NewStringObj("ve
fae0: 72 69 66 69 63 61 74 69 6f 6e 22 2c 20 2d 31 29  rification", -1)
faf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
fb00: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
fb10: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a  interp, objPtr,.
fb20: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  .Tcl_NewStringOb
fb30: 6a 28 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  j(X509_verify_ce
fb40: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
fb50: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72  SSL_get_verify_r
fb60: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
fb70: 73 73 6c 29 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  ssl)), -1));..  
fb80: 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20    /* Report the 
fb90: 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f  selected protoco
fba0: 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  l as a result of
fbb0: 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e   the negotiation
fbc0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30   */.    SSL_get0
fbd0: 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73  _alpn_selected(s
fbe0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70  tatePtr->ssl, &p
fbf0: 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  roto, &len);.   
fc00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
fc10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
fc20: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
fc30: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e  wStringObj("alpn
fc40: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
fc50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
fc60: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
fc70: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
fc80: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70  ingObj((char *)p
fc90: 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 29  roto, (int) len)
fca0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
fcb0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
fcc0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
fcd0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
fce0: 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29  ("protocol", -1)
fcf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
fd00: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
fd10: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
fd20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
fd30: 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e  (SSL_get_version
fd40: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
fd50: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 56   -1));..    /* V
fd60: 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41  alid for non-RSA
fd70: 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54   signature and T
fd80: 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 54 63  LS 1.3 */.    Tc
fd90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
fda0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
fdb0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
fdc0: 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e 61 74 75  ringObj("signatu
fdd0: 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22  reHashAlgorithm"
fde0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28  , -1));.    if (
fdf0: 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 53 53 4c 5f  objc == 2 ? SSL_
fe00: 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75  get_peer_signatu
fe10: 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d  re_nid(statePtr-
fe20: 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 53 53  >ssl, &nid) : SS
fe30: 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f  L_get_signature_
fe40: 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
fe50: 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 63 6c  l, &nid)) {..Tcl
fe60: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
fe70: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
fe80: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
fe90: 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c  ingObj(OBJ_nid2l
fea0: 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20  n(nid), -1));.  
feb0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f    } else {..Tcl_
fec0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
fed0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
fee0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
fef0: 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a  ngObj("", -1));.
ff00: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69      }.    Tcl_Li
ff10: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ff20: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
ff30: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
ff40: 4f 62 6a 28 22 73 69 67 6e 61 74 75 72 65 5f 74  Obj("signature_t
ff50: 79 70 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ype", -1));.    
ff60: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20  if (objc == 2 ? 
ff70: 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67  SSL_get_peer_sig
ff80: 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28  nature_type_nid(
ff90: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
ffa0: 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73  nid) : SSL_get_s
ffb0: 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69  ignature_type_ni
ffc0: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  d(statePtr->ssl,
ffd0: 20 26 6e 69 64 29 29 20 7b 0a 09 54 63 6c 5f 4c   &nid)) {..Tcl_L
ffe0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
fff0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
10000 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
10010 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e 28  gObj(OBJ_nid2ln(
10020 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  nid), -1));.    
10030 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69  } else {..Tcl_Li
10040 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10050 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
10060 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10070 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 20 20  Obj("", -1));.  
10080 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74    }..    Tcl_Set
10090 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
100a0 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
100b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
100c0 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
100d0 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ntData;.}.../*. 
100e0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
100f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10120 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65  ----. *. * Conne
10130 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20  ctionInfoObjCmd 
10140 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63  -- return connec
10150 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f  tion info from O
10160 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65  penSSL.. *. * Re
10170 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74  sults:. *.A list
10180 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69   of connection i
10190 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nfo.  *. *------
101a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
101e0 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f  /..static int Co
101f0 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
10200 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
10210 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
10220 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
10230 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
10240 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
10250 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
10260 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63   chan;../* The c
10270 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
10280 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  mode on. */.    
10290 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
102a0 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74  ../* client stat
102b0 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
102c0 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
102d0 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 63 6f 6e  *objPtr;.    con
102e0 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20  st SSL *ssl;.   
102f0 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45   const SSL_CIPHE
10300 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63  R *cipher;.    c
10310 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e  onst SSL_SESSION
10320 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63   *session;.    c
10330 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
10340 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 6c  ar *proto;.    l
10350 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69  ong mode;..    i
10360 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
10370 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
10380 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
10390 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
103a0 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
103b0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68  );.    }..    ch
103c0 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
103d0 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
103e0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
103f0 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c  (objv[1], NULL),
10400 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
10410 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
10420 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
10430 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
10440 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10450 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
10460 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
10470 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
10480 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
10490 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
104a0 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
104b0 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
104c0 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
104d0 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
104e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
104f0 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
10500 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
10510 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
10520 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
10530 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
10540 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
10550 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
10560 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54   "TLS", "CONNECT
10570 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ION", "CHANNEL",
10580 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
10590 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
105a0 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
105b0 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74      }..    objPt
105c0 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
105d0 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  bj(0, NULL);..  
105e0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
105f0 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74  info */.    stat
10600 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
10610 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
10620 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
10630 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74  ;.    ssl = stat
10640 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69  ePtr->ssl;.    i
10650 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20  f (ssl != NULL) 
10660 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  {../* connection
10670 20 73 74 61 74 65 20 2a 2f 0a 09 54 63 6c 5f 4c   state */..Tcl_L
10680 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10690 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
106a0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
106b0 67 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 2d 31  gObj("state", -1
106c0 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
106d0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
106e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
106f0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
10700 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f  SL_state_string_
10710 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b  long(ssl), -1));
10720 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65  .../* Get SNI re
10730 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20 6e  quested server n
10740 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  ame */..Tcl_List
10750 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10760 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10770 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10780 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20  j("servername", 
10790 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
107a0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
107b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
107c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
107d0 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e  (SSL_get_servern
107e0 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f  ame(ssl, TLSEXT_
107f0 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61  NAMETYPE_host_na
10800 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20  me), -1));.../* 
10810 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a  Get protocol */.
10820 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10830 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10840 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10850 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74  wStringObj("prot
10860 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63  ocol", -1));..Tc
10870 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10880 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10890 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
108a0 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f  ringObj(SSL_get_
108b0 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31  version(ssl), -1
108c0 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74  ));.../* Renegot
108d0 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a  iation allowed *
108e0 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
108f0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10900 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10910 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65  NewStringObj("re
10920 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 2d 31  negotiation", -1
10930 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
10940 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10950 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
10960 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a  l_NewStringObj(.
10970 09 20 20 20 20 53 53 4c 5f 67 65 74 5f 73 65 63  .    SSL_get_sec
10980 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f  ure_renegotiatio
10990 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 20 3f  n_support(ssl) ?
109a0 20 22 73 75 70 70 6f 72 74 65 64 22 20 3a 20 22   "supported" : "
109b0 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
109c0 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73  -1));.../* Get s
109d0 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
109e0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
109f0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10a00 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10a10 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63  ewStringObj("sec
10a20 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 2d 31 29  uritylevel", -1)
10a30 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
10a40 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10a50 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
10a60 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67  _NewIntObj(SSL_g
10a70 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65  et_security_leve
10a80 6c 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 53  l(ssl)));.../* S
10a90 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09  ession info */..
10aa0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10ab0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10ac0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
10ad0 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69  StringObj("sessi
10ae0 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31 29 29  on_reused", -1))
10af0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
10b00 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10b10 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10b20 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53  NewBooleanObj(SS
10b30 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64  L_session_reused
10b40 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 49 73  (ssl)));.../* Is
10b50 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a   server info */.
10b60 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10b70 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10b80 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10b90 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 73 5f 73  wStringObj("is_s
10ba0 65 72 76 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54  erver", -1));..T
10bb0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10bc0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10bd0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  objPtr, Tcl_NewB
10be0 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 69 73  ooleanObj(SSL_is
10bf0 5f 73 65 72 76 65 72 28 73 73 6c 29 29 29 3b 0a  _server(ssl)));.
10c00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69      }..    /* Ci
10c10 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  pher info */.   
10c20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65   cipher = SSL_ge
10c30 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72  t_current_cipher
10c40 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63  (ssl);.    if (c
10c50 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  ipher != NULL) {
10c60 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49  ..char buf[BUFSI
10c70 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62  Z] = {0};..int b
10c80 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a  its, alg_bits;..
10c90 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10ca0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10cb0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10cc0 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68  wStringObj("ciph
10cd0 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  er", -1));..Tcl_
10ce0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10cf0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10d00 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10d10 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52  ngObj(SSL_CIPHER
10d20 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72  _get_name(cipher
10d30 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ), -1));..Tcl_Li
10d40 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10d50 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
10d60 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10d70 4f 62 6a 28 22 73 74 61 6e 64 61 72 64 5f 6e 61  Obj("standard_na
10d80 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  me", -1));..Tcl_
10d90 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10da0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10db0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10dc0 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52  ngObj(SSL_CIPHER
10dd0 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63  _standard_name(c
10de0 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09  ipher), -1));...
10df0 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45  bits = SSL_CIPHE
10e00 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65  R_get_bits(ciphe
10e10 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09  r, &alg_bits);..
10e20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10e30 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10e40 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
10e50 53 74 72 69 6e 67 4f 62 6a 28 22 62 69 74 73 22  StringObj("bits"
10e60 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
10e70 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10e80 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10e90 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
10ea0 62 69 74 73 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  bits));..Tcl_Lis
10eb0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10ec0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10ed0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10ee0 62 6a 28 22 73 65 63 72 65 74 5f 62 69 74 73 22  bj("secret_bits"
10ef0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
10f00 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10f10 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10f20 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
10f30 61 6c 67 5f 62 69 74 73 29 29 3b 0a 09 2f 2a 20  alg_bits));../* 
10f40 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75  alg_bits is actu
10f50 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69  al key secret bi
10f60 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20  ts. If use bits 
10f70 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f  and secret (algo
10f80 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66  rithm) bits diff
10f90 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74  er,..   the rest
10fa0 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65   of the bits are
10fb0 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72   fixed, i.e. for
10fc0 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20   limited export 
10fd0 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20  ciphers (bits < 
10fe0 35 36 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  56) */..Tcl_List
10ff0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11000 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11010 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11020 6a 28 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c  j("min_version",
11030 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
11040 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11050 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11060 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11070 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  j(SSL_CIPHER_get
11080 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29  _version(cipher)
11090 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74  , -1));.../* Get
110a0 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69   OpenSSL-specifi
110b0 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49  c ID, not IANA I
110c0 44 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  D */..Tcl_ListOb
110d0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
110e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
110f0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11100 22 69 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  "id", -1));..Tcl
11110 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11120 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11130 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  jPtr, Tcl_NewInt
11140 4f 62 6a 28 28 69 6e 74 29 20 53 53 4c 5f 43 49  Obj((int) SSL_CI
11150 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68  PHER_get_id(ciph
11160 65 72 29 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c  er)));...if (SSL
11170 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
11180 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c  ion(cipher, buf,
11190 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d   sizeof(buf)) !=
111a0 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63   NULL) {..    Tc
111b0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
111c0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
111d0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
111e0 72 69 6e 67 4f 62 6a 28 22 64 65 73 63 72 69 70  ringObj("descrip
111f0 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20  tion", -1));..  
11200 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
11210 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11220 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11230 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c  ewStringObj(buf,
11240 20 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a   -1));..}.    }.
11250 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
11260 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73  info */.    sess
11270 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65  ion = SSL_get_se
11280 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20  ssion(ssl);.    
11290 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e  if (session != N
112a0 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e  ULL) {..const un
112b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63  signed char *tic
112c0 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  ket;..size_t len
112d0 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  2;..unsigned int
112e0 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e   ulen;..const un
112f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
11300 73 69 6f 6e 5f 69 64 3b 0a 09 63 68 61 72 20 62  sion_id;..char b
11310 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41  uffer[SSL_MAX_MA
11320 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d  STER_KEY_LENGTH]
11330 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
11340 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
11350 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
11360 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f  of the ALPN nego
11370 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f  tiation */..SSL_
11380 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70  SESSION_get0_alp
11390 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69  n_selected(sessi
113a0 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e  on, &proto, &len
113b0 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  2);..Tcl_ListObj
113c0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
113d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
113e0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
113f0 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63  alpn", -1));..Tc
11400 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11410 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
11420 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
11430 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
11440 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e  proto, (int) len
11450 32 29 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74  2));.../* Report
11460 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72   the selected pr
11470 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75  otocol as a resu
11480 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65  lt of the NPN ne
11490 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66  gotiation */.#if
114a0 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c  def USE_NPN..SSL
114b0 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f  _get0_next_proto
114c0 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c  _negotiated(ssl,
114d0 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b   &proto, &ulen);
114e0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
114f0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11500 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11510 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 70 6e  ewStringObj("npn
11520 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
11530 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
11540 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
11550 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
11560 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74  Obj((char *)prot
11570 6f 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b  o, (int) ulen));
11580 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73  .#endif.../* Res
11590 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a  umable session *
115a0 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
115b0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
115c0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
115d0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65  NewStringObj("re
115e0 73 75 6d 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a  sumable", -1));.
115f0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11600 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11610 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11620 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 53 45 53 53  wIntObj(SSL_SESS
11630 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65  ION_is_resumable
11640 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f  (session)));.../
11650 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20  * Session start 
11660 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69  time (seconds si
11670 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 54  nce epoch) */..T
11680 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11690 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
116a0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
116b0 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 72 74 5f  tringObj("start_
116c0 74 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63  time", -1));..Tc
116d0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
116e0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
116f0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f  bjPtr, Tcl_NewLo
11700 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f  ngObj(SSL_SESSIO
11710 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69  N_get_time(sessi
11720 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65  on)));.../* Time
11730 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f  out value - SSL_
11740 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20  CTX_get_timeout 
11750 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a  (in seconds) */.
11760 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11770 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11780 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11790 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65  wStringObj("time
117a0 6f 75 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  out", -1));..Tcl
117b0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
117c0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
117d0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e  jPtr, Tcl_NewLon
117e0 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e  gObj(SSL_SESSION
117f0 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73  _get_timeout(ses
11800 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65  sion)));.../* Se
11810 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66  ssion ticket lif
11820 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73  etime hint (in s
11830 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f  econds) */..Tcl_
11840 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11850 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11860 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11870 6e 67 4f 62 6a 28 22 6c 69 66 65 74 69 6d 65 22  ngObj("lifetime"
11880 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
11890 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
118a0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
118b0 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a  , Tcl_NewLongObj
118c0 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  (SSL_SESSION_get
118d0 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65  _ticket_lifetime
118e0 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29  _hint(session)))
118f0 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69  ;.../* Session i
11900 64 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64  d */..session_id
11910 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
11920 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26  et_id(session, &
11930 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74  ulen);..Tcl_List
11940 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11950 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11960 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11970 6a 28 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20  j("session_id", 
11980 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
11990 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
119a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
119b0 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
119c0 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20  Obj(session_id, 
119d0 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 09  (int) ulen));...
119e0 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
119f0 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20  t - client only 
11a00 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  */..SSL_SESSION_
11a10 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
11a20 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
11a30 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  en2);..Tcl_ListO
11a40 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11a50 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11a60 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11a70 28 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74  ("session_ticket
11a80 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
11a90 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
11aa0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
11ab0 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
11ac0 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28  rayObj(ticket, (
11ad0 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f  int) len2));.../
11ae0 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74  * Ticket app dat
11af0 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f  a */..SSL_SESSIO
11b00 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70  N_get0_ticket_ap
11b10 70 64 61 74 61 28 73 65 73 73 69 6f 6e 2c 20 26  pdata(session, &
11b20 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a  ticket, &len2);.
11b30 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11b40 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11b50 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11b60 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 69 63 6b  wStringObj("tick
11b70 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 2d 31  et_app_data", -1
11b80 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
11b90 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11ba0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
11bb0 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
11bc0 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20  j(ticket, (int) 
11bd0 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 47 65 74  len2));.../* Get
11be0 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09   master key */..
11bf0 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49  len2 = SSL_SESSI
11c00 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65  ON_get_master_ke
11c10 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65  y(session, buffe
11c20 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45  r, SSL_MAX_MASTE
11c30 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09  R_KEY_LENGTH);..
11c40 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11c50 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11c60 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
11c70 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 73 74 65  StringObj("maste
11c80 72 5f 6b 65 79 22 2c 20 2d 31 29 29 3b 0a 09 54  r_key", -1));..T
11c90 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11ca0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11cb0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  objPtr, Tcl_NewB
11cc0 79 74 65 41 72 72 61 79 4f 62 6a 28 62 75 66 66  yteArrayObj(buff
11cd0 65 72 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29  er, (int) len2))
11ce0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11cf0 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f  Compression info
11d00 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20   */.    if (ssl 
11d10 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65  != NULL) {.#ifde
11d20 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52  f HAVE_SSL_COMPR
11d30 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f  ESSION..const CO
11d40 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c  MP_METHOD *comp,
11d50 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20   *expn;..comp = 
11d60 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
11d70 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29  compression(ssl)
11d80 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65  ;..expn = SSL_ge
11d90 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73  t_current_expans
11da0 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f  ion(ssl);...Tcl_
11db0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11dc0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11dd0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11de0 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69  ngObj("compressi
11df0 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  on", -1));..Tcl_
11e00 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11e10 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11e20 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11e30 6e 67 4f 62 6a 28 63 6f 6d 70 20 3f 20 53 53 4c  ngObj(comp ? SSL
11e40 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63  _COMP_get_name(c
11e50 6f 6d 70 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d  omp) : "NONE", -
11e60 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
11e70 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11e80 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11e90 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11ea0 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29  "expansion", -1)
11eb0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
11ec0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11ed0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11ee0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 65 78  _NewStringObj(ex
11ef0 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65  pn ? SSL_COMP_ge
11f00 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22  t_name(expn) : "
11f10 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6c  NONE", -1));.#el
11f20 73 65 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  se..Tcl_ListObjA
11f30 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11f40 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11f50 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
11f60 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29  ompression", -1)
11f70 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
11f80 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11f90 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11fa0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e  _NewStringObj("N
11fb0 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ONE", -1));..Tcl
11fc0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11fd0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11fe0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11ff0 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f  ingObj("expansio
12000 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  n", -1));..Tcl_L
12010 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12020 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
12030 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
12040 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29  gObj("NONE", -1)
12050 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
12060 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69  .    /* Server i
12070 6e 66 6f 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20  nfo */.    mode 
12080 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65  = SSL_CTX_get_se
12090 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65  ssion_cache_mode
120a0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b  (statePtr->ctx);
120b0 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 20  .    if (mode & 
120c0 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f  SSL_SESS_CACHE_O
120d0 46 46 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22  FF) {..proto = "
120e0 6f 66 66 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65  off";.    } else
120f0 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f   if (mode & SSL_
12100 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e  SESS_CACHE_CLIEN
12110 54 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 63  T) {..proto = "c
12120 6c 69 65 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c  lient";.    } el
12130 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
12140 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52  L_SESS_CACHE_SER
12150 56 45 52 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20  VER) {..proto = 
12160 22 73 65 72 76 65 72 22 3b 0a 20 20 20 20 7d 20  "server";.    } 
12170 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20  else if (mode & 
12180 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42  SSL_SESS_CACHE_B
12190 4f 54 48 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20  OTH) {..proto = 
121a0 22 62 6f 74 68 22 3b 0a 20 20 20 20 7d 20 65 6c  "both";.    } el
121b0 73 65 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 75  se {..proto = "u
121c0 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 20  nknown";.    }. 
121d0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
121e0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
121f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
12200 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65  NewStringObj("se
12210 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65  ssion_cache_mode
12220 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
12230 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12240 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
12250 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
12260 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 2c 20 2d 31  ingObj(proto, -1
12270 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  ));..    Tcl_Set
12280 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
12290 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
122a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
122b0 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
122c0 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ntData;.}.../*. 
122d0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
122e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
122f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12310 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69  ----. *. * Versi
12320 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  onObjCmd -- retu
12330 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e  rn version strin
12340 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a  g from OpenSSL..
12350 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
12360 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
12370 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
12380 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
12390 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
123a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
123e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65  */.static int.Ve
123f0 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65  rsionObjCmd(Clie
12400 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
12410 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
12420 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
12430 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
12440 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
12450 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a  l_Obj *objPtr;..
12460 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
12470 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50  led");..    objP
12480 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  tr = Tcl_NewStri
12490 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45  ngObj(OPENSSL_VE
124a0 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b  RSION_TEXT, -1);
124b0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
124c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
124d0 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75  jPtr);..    retu
124e0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65  rn TCL_OK;..clie
124f0 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
12500 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a  ata;..objc = obj
12510 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b  c;..objv = objv;
12520 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
12530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
12570 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d  . * MiscObjCmd -
12580 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a  - misc commands.
12590 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
125a0 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
125b0 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
125c0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
125d0 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
125e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
125f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
12620 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69  */.static int.Mi
12630 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  scObjCmd(ClientD
12640 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
12650 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12660 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
12670 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
12680 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69  v[]) {.    stati
12690 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
126a0 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72  mmands [] = { "r
126b0 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e  eq", "strreq", N
126c0 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20  ULL };.    enum 
126d0 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c  command { C_REQ,
126e0 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d   C_STRREQ, C_DUM
126f0 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d  MY };.    int cm
12700 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68  d, isStr;.    ch
12710 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d  ar buffer[16384]
12720 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
12730 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
12740 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
12750 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12760 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
12770 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61  , "subcommand ?a
12780 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  rgs?");..return 
12790 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
127a0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
127b0 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
127c0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f  erp, objv[1], co
127d0 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64  mmands, "command
127e0 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43  ", 0,&cmd) != TC
127f0 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
12800 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
12810 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
12820 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73  error();..    is
12830 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f  Str = (cmd == C_
12840 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69  STRREQ);.    swi
12850 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61  tch ((enum comma
12860 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65  nd) cmd) {..case
12870 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f   C_REQ:..case C_
12880 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45  STRREQ: {..    E
12890 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55  VP_PKEY *pkey=NU
128a0 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63  LL;..    X509 *c
128b0 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58  ert=NULL;..    X
128c0 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e  509_NAME *name=N
128d0 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62  ULL;..    Tcl_Ob
128e0 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20  j **listv;..    
128f0 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20  int listc,i;... 
12900 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c     BIO *out=NULL
12910 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f  ;...    char *k_
12920 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b  C="",*k_ST="",*k
12930 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b  _L="",*k_O="",*k
12940 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c  _OU="",*k_CN="",
12950 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20  *k_Email="";..  
12960 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a    char *keyout,*
12970 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20  pemout,*str;..  
12980 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65    int keysize,se
12990 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b  rial=0,days=365;
129a0 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
129b0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
129c0 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20  x30000000L..    
129d0 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55  BIGNUM *bne = NU
129e0 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73  LL;..    RSA *rs
129f0 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a  a = NULL;.#else.
12a00 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54  .    EVP_PKEY_CT
12a10 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23  X *ctx = NULL;.#
12a20 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28  endif...    if (
12a30 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a  (objc<5) || (obj
12a40 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72  c>6)) {...Tcl_Wr
12a50 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
12a60 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79  p, 2, objv, "key
12a70 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72  size keyfile cer
12a80 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a  tfile ?info?");.
12a90 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
12aa0 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  OR;..    }...   
12ab0 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46   if (Tcl_GetIntF
12ac0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
12ad0 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65  bjv[2], &keysize
12ae0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
12af0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
12b00 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b  R;..    }..    k
12b10 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72  eyout=Tcl_GetStr
12b20 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20  ing(objv[3]);.. 
12b30 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65     pemout=Tcl_Ge
12b40 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29  tString(objv[4])
12b50 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72  ;..    if (isStr
12b60 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72  ) {...Tcl_SetVar
12b70 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22  (interp,keyout,"
12b80 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56  ",0);...Tcl_SetV
12b90 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74  ar(interp,pemout
12ba0 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a  ,"",0);..    }..
12bb0 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36  .    if (objc>=6
12bc0 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69  ) {...if (Tcl_Li
12bd0 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
12be0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d  (interp, objv[5]
12bf0 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69  ,....&listc, &li
12c00 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  stv) != TCL_OK) 
12c10 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  {...    return T
12c20 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09  CL_ERROR;...}...
12c30 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 21  .if ((listc%2) !
12c40 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c  = 0) {...    Tcl
12c50 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
12c60 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c  p,"Information l
12c70 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 76  ist must have ev
12c80 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  en number of arg
12c90 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09  uments",NULL);..
12ca0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12cb0 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72  ERROR;...}...for
12cc0 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20   (i=0; i<listc; 
12cd0 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74  i+=2) {...    st
12ce0 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  r=Tcl_GetString(
12cf0 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20  listv[i]);...   
12d00 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
12d10 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09  "days")==0) {...
12d20 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46  .if (Tcl_GetIntF
12d30 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69  romObj(interp,li
12d40 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21  stv[i+1],&days)!
12d50 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20  =TCL_OK)....    
12d60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12d70 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
12d80 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73  f (strcmp(str,"s
12d90 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09  erial")==0) {...
12da0 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46  .if (Tcl_GetIntF
12db0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69  romObj(interp,li
12dc0 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c  stv[i+1],&serial
12dd0 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20  )!=TCL_OK)....  
12de0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12df0 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  OR;...    } else
12e00 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
12e10 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "C")==0) {....k_
12e20 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  C=Tcl_GetString(
12e30 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
12e40 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
12e50 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d  rcmp(str,"ST")==
12e60 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c  0) {....k_ST=Tcl
12e70 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
12e80 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
12e90 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
12ea0 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09  str,"L")==0) {..
12eb0 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72  ..k_L=Tcl_GetStr
12ec0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
12ed0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
12ee0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22   (strcmp(str,"O"
12ef0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54  )==0) {....k_O=T
12f00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
12f10 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
12f20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
12f30 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20  p(str,"OU")==0) 
12f40 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65  {....k_OU=Tcl_Ge
12f50 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
12f60 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
12f70 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
12f80 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09  ,"CN")==0) {....
12f90 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69  k_CN=Tcl_GetStri
12fa0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
12fb0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
12fc0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61  (strcmp(str,"Ema
12fd0 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  il")==0) {....k_
12fe0 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72  Email=Tcl_GetStr
12ff0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
13000 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ...    } else {.
13010 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
13020 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e  (interp,"Unknown
13030 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c   parameter",NULL
13040 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c  );....return TCL
13050 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a  _ERROR;...    }.
13060 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20  ..}..    }..#if 
13070 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
13080 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
13090 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20  000L..    bne = 
130a0 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72  BN_new();..    r
130b0 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a  sa = RSA_new();.
130c0 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f  .    pkey = EVP_
130d0 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20  PKEY_new();..   
130e0 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c   if (bne == NULL
130f0 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20   || rsa == NULL 
13100 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20  || pkey == NULL 
13110 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28  || !BN_set_word(
13120 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09  bne,RSA_F4) ||..
13130 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b  .!RSA_generate_k
13140 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69  ey_ex(rsa, keysi
13150 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c  ze, bne, NULL) |
13160 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69  | !EVP_PKEY_assi
13170 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61  gn_RSA(pkey, rsa
13180 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  )) {...EVP_PKEY_
13190 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a  free(pkey);.../*
131a0 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20   RSA_free(rsa); 
131b0 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45  freed by EVP_PKE
131c0 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66  Y_free */...BN_f
131d0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a  ree(bne);.#else.
131e0 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f  .    pkey = EVP_
131f0 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65  RSA_gen((unsigne
13200 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b  d int) keysize);
13210 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f  ..    ctx = EVP_
13220 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65  PKEY_CTX_new(pke
13230 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66  y,NULL);..    if
13240 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c   (pkey == NULL |
13250 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  | ctx == NULL ||
13260 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65   !EVP_PKEY_keyge
13270 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09  n_init(ctx) ||..
13280 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73  .!EVP_PKEY_CTX_s
13290 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69  et_rsa_keygen_bi
132a0 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29  ts(ctx, keysize)
132b0 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65   || !EVP_PKEY_ke
132c0 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29  ygen(ctx, &pkey)
132d0 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66  ) {...EVP_PKEY_f
132e0 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50  ree(pkey);...EVP
132f0 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63  _PKEY_CTX_free(c
13300 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63  tx);.#endif...Tc
13310 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
13320 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61  rp,"Error genera
13330 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79  ting private key
13340 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72  ",NULL);...retur
13350 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
13360 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20    } else {...if 
13370 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20  (isStr) {...    
13380 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  out=BIO_new(BIO_
13390 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20  s_mem());...    
133a0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72  PEM_write_bio_Pr
133b0 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65  ivateKey(out,pke
133c0 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55  y,NULL,NULL,0,NU
133d0 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  LL,NULL);...    
133e0 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62  i=BIO_read(out,b
133f0 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66  uffer,sizeof(buf
13400 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69  fer)-1);...    i
13410 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a  =(i<0) ? 0 : i;.
13420 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d  ..    buffer[i]=
13430 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f  '\0';...    Tcl_
13440 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65  SetVar(interp,ke
13450 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a  yout,buffer,0);.
13460 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28  ..    BIO_flush(
13470 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  out);...    BIO_
13480 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65  free(out);...} e
13490 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  lse {...    out=
134a0 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69  BIO_new(BIO_s_fi
134b0 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f  le());...    BIO
134c0 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28  _write_filename(
134d0 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20  out,keyout);... 
134e0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
134f0 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  _PrivateKey(out,
13500 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30  pkey,NULL,NULL,0
13510 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ,NULL,NULL);... 
13520 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f     /* PEM_write_
13530 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65  bio_RSAPrivateKe
13540 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c  y(out, rsa, NULL
13550 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c  , NULL, 0, NULL,
13560 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20   NULL); */...   
13570 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75   BIO_free_all(ou
13580 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28  t);.. .}....if (
13590 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29  (cert=X509_new()
135a0 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20  )==NULL) {...   
135b0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
135c0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e  nterp,"Error gen
135d0 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 63  erating certific
135e0 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c  ate request",NUL
135f0 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b  L);...    EVP_PK
13600 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23  EY_free(pkey);.#
13610 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
13620 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
13630 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e  000000L...    BN
13640 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64  _free(bne);.#end
13650 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28  if...    return(
13660 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a  TCL_ERROR);...}.
13670 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73  ...X509_set_vers
13680 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41  ion(cert,2);...A
13690 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28  SN1_INTEGER_set(
136a0 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e  X509_get_serialN
136b0 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 69  umber(cert),seri
136c0 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69  al);...X509_gmti
136d0 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d  me_adj(X509_getm
136e0 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29  _notBefore(cert)
136f0 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69  ,0);...X509_gmti
13700 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d  me_adj(X509_getm
13710 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c  _notAfter(cert),
13720 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64  (long)60*60*24*d
13730 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74  ays);...X509_set
13740 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65  _pubkey(cert,pke
13750 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39  y);....name=X509
13760 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d  _get_subject_nam
13770 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39  e(cert);....X509
13780 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
13790 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c  by_txt(name,"C",
137a0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
137b0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
137c0 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20  har *) k_C, -1, 
137d0 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
137e0 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
137f0 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20  _txt(name,"ST", 
13800 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
13810 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
13820 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20  ar *) k_ST, -1, 
13830 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
13840 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
13850 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d  _txt(name,"L", M
13860 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
13870 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
13880 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31  r *) k_L, -1, -1
13890 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
138a0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
138b0 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53  xt(name,"O", MBS
138c0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
138d0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
138e0 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20  *) k_O, -1, -1, 
138f0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
13900 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
13910 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54  (name,"OU", MBST
13920 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
13930 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13940 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20  ) k_OU, -1, -1, 
13950 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
13960 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
13970 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54  (name,"CN", MBST
13980 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
13990 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
139a0 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20  ) k_CN, -1, -1, 
139b0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
139c0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
139d0 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d  (name,"Email", M
139e0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
139f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
13a00 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31  r *) k_Email, -1
13a10 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30  , -1, 0);....X50
13a20 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61  9_set_subject_na
13a30 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a  me(cert,name);..
13a40 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e  ..if (!X509_sign
13a50 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73  (cert,pkey,EVP_s
13a60 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20  ha256())) {...  
13a70 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 74    X509_free(cert
13a80 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45  );...    EVP_PKE
13a90 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69  Y_free(pkey);.#i
13aa0 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
13ab0 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
13ac0 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f  00000L...    BN_
13ad0 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69  free(bne);.#endi
13ae0 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52  f...    Tcl_SetR
13af0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
13b00 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74  ror signing cert
13b10 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a  ificate",NULL);.
13b20 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
13b30 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69  _ERROR;...}....i
13b40 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20  f (isStr) {...  
13b50 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49    out=BIO_new(BI
13b60 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20  O_s_mem());...  
13b70 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f    PEM_write_bio_
13b80 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a  X509(out,cert);.
13b90 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64  ..    i=BIO_read
13ba0 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65  (out,buffer,size
13bb0 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09  of(buffer)-1);..
13bc0 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30  .    i=(i<0) ? 0
13bd0 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66   : i;...    buff
13be0 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20  er[i]='\0';...  
13bf0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
13c00 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65  erp,pemout,buffe
13c10 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  r,0);...    BIO_
13c20 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20  flush(out);...  
13c30 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b    BIO_free(out);
13c40 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
13c50 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49    out=BIO_new(BI
13c60 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20  O_s_file());... 
13c70 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c     BIO_write_fil
13c80 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74  ename(out,pemout
13c90 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
13ca0 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c  te_bio_X509(out,
13cb0 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f  cert);...    BIO
13cc0 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a  _free_all(out);.
13cd0 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65  ..}....X509_free
13ce0 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b  (cert);...EVP_PK
13cf0 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23  EY_free(pkey);.#
13d00 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
13d10 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
13d20 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65  000000L...BN_fre
13d30 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09  e(bne);.#endif..
13d40 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b      }..}..break;
13d50 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62  .    default:..b
13d60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13d70 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
13d80 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
13d90 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a  entData;.}.../**
13da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13db0 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20  **/./* Init     
13dc0 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a          */./****
13dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13de0 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
13df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
13e30 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a  * Tls_Free --. *
13e40 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
13e50 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65  re cleans up whe
13e60 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  n a SSL socket b
13e70 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09  ased channel. *.
13e80 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74  is closed and it
13e90 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
13ea0 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a  t falls below 1.
13eb0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
13ec0 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.none. *. * Sid
13ed0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72  e effects:. *.Fr
13ee0 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74  ees all the stat
13ef0 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
13f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
13f40 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61  oid.Tls_Free(cha
13f50 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20  r *blockPtr) {. 
13f60 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
13f70 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c  tr = (State *)bl
13f80 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72  ockPtr;..    dpr
13f90 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
13fa0 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73  .    Tls_Clean(s
13fb0 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b  tatePtr);.    ck
13fc0 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a  free(blockPtr);.
13fd0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
13fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
14020 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a   * Tls_Clean --.
14030 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
14040 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77  dure cleans up w
14050 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74  hen a SSL socket
14060 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20   based channel. 
14070 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  *.is closed and 
14080 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
14090 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20  unt falls below 
140a0 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a  1.  This should.
140b0 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e   *.be called syn
140c0 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68  chronously by th
140d0 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74  e CloseProc, not
140e0 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74   in the. *.Event
140f0 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61  uallyFree callba
14100 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ck.. *. * Result
14110 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.none. *. *
14120 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
14130 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20  *.Frees all the 
14140 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  state. *. *-----
14150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
14190 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61  */.void Tls_Clea
141a0 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  n(State *statePt
141b0 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66  r) {.    dprintf
141c0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
141d0 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65   /*.     * we're
141e0 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74   assuming here t
141f0 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65  hat we're single
14200 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a  -threaded.     *
14210 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
14220 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63  tr->timer != (Tc
14230 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
14240 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74  LL) {..Tcl_Delet
14250 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74  eTimerHandler(st
14260 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a  atePtr->timer);.
14270 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  .statePtr->timer
14280 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a   = NULL;.    }..
14290 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
142a0 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66  ->protos) {..ckf
142b0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72  ree(statePtr->pr
142c0 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72  otos);..statePtr
142d0 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b  ->protos = NULL;
142e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
142f0 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a  tatePtr->bio) {.
14300 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61  ./* This will ca
14310 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e  ll SSL_shutdown.
14320 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a   Bug 1414045 */.
14330 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72  .dprintf("BIO_fr
14340 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61  ee_all(%p)", sta
14350 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49  tePtr->bio);..BI
14360 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65  O_free_all(state
14370 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74  Ptr->bio);..stat
14380 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c  ePtr->bio = NULL
14390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
143a0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b  statePtr->ssl) {
143b0 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66  ..dprintf("SSL_f
143c0 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50  ree(%p)", stateP
143d0 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66  tr->ssl);..SSL_f
143e0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ree(statePtr->ss
143f0 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73  l);..statePtr->s
14400 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  sl = NULL;.    }
14410 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
14420 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43  r->ctx) {..SSL_C
14430 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  TX_free(statePtr
14440 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74  ->ctx);..statePt
14450 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  r->ctx = NULL;. 
14460 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
14470 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
14480 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
14490 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63  ount(statePtr->c
144a0 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65  allback);..state
144b0 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20  Ptr->callback = 
144c0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
144d0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61  if (statePtr->pa
144e0 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44  ssword) {..Tcl_D
144f0 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ecrRefCount(stat
14500 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b  ePtr->password);
14510 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  ..statePtr->pass
14520 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  word = NULL;.   
14530 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
14540 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63  Ptr->vcmd) {..Tc
14550 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
14560 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a  tatePtr->vcmd);.
14570 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  .statePtr->vcmd 
14580 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  = NULL;.    }.. 
14590 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
145a0 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  rning");.}.../*.
145b0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
145c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145f0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
14600 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Init --. *. *.Th
14610 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20  is is a package 
14620 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70  initialization p
14630 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20  rocedure, which 
14640 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20  is called. *.by 
14650 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61  Tcl when this pa
14660 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61  ckage is to be a
14670 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72  dded to an inter
14680 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  preter.. *. * Re
14690 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66  sults:  Ssl conf
146a0 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65  igured and loade
146b0 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  d. *. * Side eff
146c0 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65  ects:. *. create
146d0 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64   the ssl command
146e0 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c  , initialize ssl
146f0 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d   context. *. *--
14700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14740 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20  -. */.DLLEXPORT 
14750 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c  int Tls_Init(Tcl
14760 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
14770 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
14780 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69  r tlsTclInitScri
14790 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64  pt[] = {.#includ
147a0 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30  e "tls.tcl.h"..0
147b0 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20  x00.    };..    
147c0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
147d0 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
147e0 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  * We only suppor
147f0 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 6e 65 77  t Tcl 8.4 or new
14800 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69  er.     */.    i
14810 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f 54  f (.#ifdef USE_T
14820 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f 49 6e  CL_STUBS..Tcl_In
14830 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20  itStubs(interp, 
14840 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c 73 65 0a  "8.4", 0).#else.
14850 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28  .Tcl_PkgRequire(
14860 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 22  interp, "Tcl", "
14870 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e 64 69 66  8.4-", 0).#endif
14880 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  .. == NULL) {..r
14890 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
148a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
148b0 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d  TlsLibInit(0) !=
148c0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f   TCL_OK) {..Tcl_
148d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
148e0 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20  erp, "could not 
148f0 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c  initialize SSL l
14900 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a  ibrary", NULL);.
14910 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
14920 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  R;.    }..    Tc
14930 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
14940 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
14950 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65  :ciphers", Ciphe
14960 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  rsObjCmd, (Clien
14970 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
14980 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
14990 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
149a0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
149b0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f  interp, "tls::co
149c0 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65  nnection", Conne
149d0 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c  ctionInfoObjCmd,
149e0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
149f0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
14a00 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
14a10 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
14a20 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
14a30 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c  tls::handshake",
14a40 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
14a50 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
14a60 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
14a70 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
14a80 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
14a90 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
14aa0 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49  "tls::import", I
14ab0 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c  mportObjCmd, (Cl
14ac0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
14ad0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
14ae0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
14af0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
14b00 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
14b10 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d  :unimport", Unim
14b20 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  portObjCmd, (Cli
14b30 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
14b40 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
14b50 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
14b60 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
14b70 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
14b80 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f  status", StatusO
14b90 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
14ba0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
14bb0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
14bc0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
14bd0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
14be0 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69  erp, "tls::versi
14bf0 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43  on", VersionObjC
14c00 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
14c10 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
14c20 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
14c30 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
14c40 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
14c50 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d  , "tls::misc", M
14c60 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  iscObjCmd, (Clie
14c70 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
14c80 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
14c90 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
14ca0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
14cb0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70  (interp, "tls::p
14cc0 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f  rotocols", Proto
14cd0 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  colsObjCmd, (Cli
14ce0 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
14cf0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
14d00 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66  ) NULL);..    if
14d10 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c   (interp) {..Tcl
14d20 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c  _Eval(interp, tl
14d30 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 3b  sTclInitScript);
14d40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
14d50 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  rn(Tcl_PkgProvid
14d60 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 22 2c  e(interp, "tls",
14d70 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
14d80 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ));.}../*. *----
14d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14dc0 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61  --*. *. *.Tls_Sa
14dd0 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09  feInit --. *. *.
14de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e10 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72  *. *.Standard pr
14e20 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 64  ocedure required
14e30 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49   by 'load'.. *.I
14e40 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20  nitializes this 
14e50 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20  extension for a 
14e60 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72  safe interpreter
14e70 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *.-----------
14e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ea0 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64  -----*. *. *.Sid
14eb0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41  e effects:. *..A
14ec0 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a  s of 'Tls_Init'.
14ed0 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a   *. *.Result:. *
14ee0 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  ..A standard Tcl
14ef0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a   error code.. *.
14f00 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
14f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f30 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c  --------*. */.DL
14f40 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f  LEXPORT int Tls_
14f50 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
14f60 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20  erp *interp) {. 
14f70 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
14f80 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
14f90 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70  (Tls_Init(interp
14fa0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ));.}../*. *----
14fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fe0 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62  --*. *. *.TlsLib
14ff0 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d  Init --. *. *.--
15000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15030 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53   *.Initializes S
15040 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20  SL library once 
15050 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a  per application.
15060 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
15070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15090 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20  ---*. *. *.Side 
150a0 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69  effects:. *..ini
150b0 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62  tializes SSL lib
150c0 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c  rary. *. *.Resul
150d0 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20  t:. *..none. *. 
150e0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
150f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15110 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61  -------*. */.sta
15120 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e  tic int TlsLibIn
15130 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c  it(int uninitial
15140 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69  ize) {.    stati
15150 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65  c int initialize
15160 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73  d = 0;.    int s
15170 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  tatus = TCL_OK;.
15180 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
15190 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
151a0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
151b0 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20  ADS).    size_t 
151c0 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69  num_locks;.#endi
151d0 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69  f..    if (unini
151e0 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28  tialize) {..if (
151f0 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  !initialized) {.
15200 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73  .    dprintf("As
15210 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c  ked to uninitial
15220 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20  ize, but we are 
15230 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22  not initialized"
15240 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 28  );...    return(
15250 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70  TCL_OK);..}...dp
15260 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
15270 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a  uninitialize");.
15280 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
15290 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
152a0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
152b0 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78  EADS)..Tcl_Mutex
152c0 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  Lock(&init_mx);.
152d0 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09  ..if (locks) {..
152e0 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b      free(locks);
152f0 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55  ..    locks = NU
15300 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f  LL;..    locksCo
15310 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64  unt = 0;..}.#end
15320 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20  if..initialized 
15330 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 0;..#if define
15340 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
15350 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
15360 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f  L_THREADS)..Tcl_
15370 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69  MutexUnlock(&ini
15380 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  t_mx);.#endif...
15390 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a  return(TCL_OK);.
153a0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69      }..    if (i
153b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64  nitialized) {..d
153c0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20  printf("Called, 
153d0 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64  but using cached
153e0 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72   value");..retur
153f0 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20 7d  n(status);.    }
15400 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
15410 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65  alled");..#if de
15420 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
15430 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
15440 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20  d(TCL_THREADS). 
15450 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b     Tcl_MutexLock
15460 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64  (&init_mx);.#end
15470 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a  if.    initializ
15480 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66  ed = 1;..#if def
15490 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
154a0 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
154b0 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
154c0 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b    num_locks = 1;
154d0 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20  .    locksCount 
154e0 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b  = (int) num_lock
154f0 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d  s;.    locks = m
15500 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f  alloc(sizeof(*lo
15510 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73  cks) * num_locks
15520 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f  );.    memset(lo
15530 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  cks, 0, sizeof(*
15540 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63  locks) * num_loc
15550 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ks);.#endif..   
15560 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42   /* Initialize B
15570 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e  OTH libcrypto an
15580 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20  d libssl. */.   
15590 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73   OPENSSL_init_ss
155a0 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c  l(OPENSSL_INIT_L
155b0 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20  OAD_SSL_STRINGS 
155c0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c  | OPENSSL_INIT_L
155d0 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e  OAD_CRYPTO_STRIN
155e0 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e  GS..| OPENSSL_IN
155f0 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45  IT_ADD_ALL_CIPHE
15600 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49  RS | OPENSSL_INI
15610 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54  T_ADD_ALL_DIGEST
15620 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42  S, NULL);..    B
15630 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c  IO_new_tcl(NULL,
15640 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20   0);..#if 0.    
15650 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f  /*.     * XXX:TO
15660 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20  DO: Remove this 
15670 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65  code and replace
15680 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 6b   it with a check
15690 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75  .     * for enou
156a0 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64  gh entropy and d
156b0 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65  o not try to cre
156c0 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20  ate our own.    
156d0 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72   * terrible entr
156e0 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  opy.     */.    
156f0 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74  /*.     * Seed t
15700 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  he random number
15710 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68   generator in th
15720 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20  e SSL library,. 
15730 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20      * using the 
15740 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75  do/while constru
15750 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  ct because of th
15760 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68  e bug note in th
15770 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c  e.     * OpenSSL
15780 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77   FAQ at http://w
15790 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73  ww.openssl.org/s
157a0 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23  upport/faq.html#
157b0 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20  USER1.     *.   
157c0 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20    * The crux of 
157d0 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
157e0 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f  hat Solaris 7 do
157f0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20  es not have a.  
15800 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d     * /dev/random
15810 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d   or /dev/urandom
15820 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 61   device so it ca
15830 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75  nnot gather enou
15840 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70  gh.     * entrop
15850 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f  y from the RAND_
15860 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20  seed() when TLS 
15870 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20  initializes and 
15880 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74  refuses.     * t
15890 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61  o go further. Ea
158a0 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
158b0 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65  f OpenSSL carrie
158c0 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e  d on regardless.
158d0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61  .     */.    sra
158e0 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  nd((unsigned int
158f0 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a  ) time((time_t *
15900 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f  ) NULL));.    do
15910 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20   {..for (i = 0; 
15920 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09  i < 16; i++) {..
15930 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20      rnd_seed[i] 
15940 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 35  = 1 + (char) (25
15950 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41  5.0 * rand()/(RA
15960 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d  ND_MAX+1.0));..}
15970 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f  ..RAND_seed(rnd_
15980 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64  seed, sizeof(rnd
15990 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77  _seed));.    } w
159a0 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75  hile (RAND_statu
159b0 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69  s() != 1);.#endi
159c0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  f..#if defined(O
159d0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
159e0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
159f0 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74  HREADS)..Tcl_Mut
15a00 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d  exUnlock(&init_m
15a10 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74  x);.#endif...ret
15a20 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a     urn(status);.}.