Hex Artifact Content

Artifact 4969f5a74bde19692602f9da043551dec89b60e959b09d492967f81c9f132614:


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 20 3d 20 30 3b 0a 0a 20 20  ode, ok = 0;..  
0bd0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
0be0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
0bf0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
0c00: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
0c10: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
0c20: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
0c30: 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73  ack with success
0c40: 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72   for ok or retur
0c50: 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20  n value 1, fail 
0c60: 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74  for error or ret
0c70: 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20  urn value 0 */. 
0c80: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
0c90: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
0ca0: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  code = Tcl_EvalO
0cb0: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64  bjEx(interp, cmd
0cc0: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  Ptr, TCL_EVAL_GL
0cd0: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  OBAL);.    if (c
0ce0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode == TCL_OK) {
0cf0: 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c  ../* Check resul
0d00: 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c  t for return val
0d10: 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a  ue */..Tcl_Obj *
0d20: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  result = Tcl_Get
0d30: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
0d40: 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d  );..if (result =
0d50: 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65  = NULL || Tcl_Ge
0d60: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
0d70: 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29  rp, result, &ok)
0d80: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
0d90: 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20     ok = 1;..}.  
0da0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45    } else {../* E
0db0: 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68  rror - reject th
0dc0: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  e certificate */
0dd0: 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f  .#if (TCL_MAJOR_
0de0: 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26  VERSION == 8) &&
0df0: 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53   (TCL_MINOR_VERS
0e00: 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61  ION < 6)..Tcl_Ba
0e10: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e  ckgroundError(in
0e20: 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63  terp);.#else..Tc
0e30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65  l_BackgroundExce
0e40: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f  ption(interp, co
0e50: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
0e60: 7d 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  }..    Tcl_Relea
0e70: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0e80: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54  statePtr);.    T
0e90: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0ea0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
0eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a  .    return ok;.
0ec0: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0f10: 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20   * InfoCallback 
0f20: 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72  --. *. *.Monitor
0f30: 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  s SSL connection
0f40: 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52   process. *. * R
0f50: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
0f60: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0f70: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
0f80: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
0f90: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d). *. *--------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
0fe0: 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f  static void.Info
0ff0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
1000: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65  SL *ssl, int whe
1010: 72 65 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a 20  re, int ret) {. 
1020: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
1030: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
1040: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
1050: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
1060: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1070: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
1080: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
1090: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
10a0: 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72  har *major; char
10b0: 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70   *minor;..    dp
10c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
10d0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
10e0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
10f0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a  (Tcl_Obj*)NULL).
1100: 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66  .return;..    if
1110: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1120: 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54  _HANDSHAKE_START
1130: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
1140: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
1150: 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20   = "start";.    
1160: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  } else if (where
1170: 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48   & SSL_CB_HANDSH
1180: 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a  AKE_DONE) {..maj
1190: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
11a0: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65  ;..minor = "done
11b0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ";.    } else {.
11c0: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c  .if (where & SSL
11d0: 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f  _CB_ALERT)..majo
11e0: 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c  r = "alert";..el
11f0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
1200: 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d  SL_ST_CONNECT).m
1210: 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22  ajor = "connect"
1220: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1230: 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50  e & SSL_ST_ACCEP
1240: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63  T)..major = "acc
1250: 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09  ept";..else.....
1260: 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e  major = "unknown
1270: 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26  ";...if (where &
1280: 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d   SSL_CB_READ)..m
1290: 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09  inor = "read";..
12a0: 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26  else if (where &
12b0: 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09   SSL_CB_WRITE)..
12c0: 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b  minor = "write";
12d0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
12e0: 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09   & SSL_CB_LOOP).
12f0: 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b  .minor = "loop";
1300: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1310: 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09   & SSL_CB_EXIT).
1320: 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b  .minor = "exit";
1330: 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72  ..else.....minor
1340: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20   = "unknown";.  
1350: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
1360: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
1370: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
1380: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
1390: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
13a0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c  llback);.    Tcl
13b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
13d0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
13e0: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d  ingObj("info", -
13f0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
1400: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1410: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1420: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1430: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
1440: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
1450: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
1460: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1470: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1480: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1490: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14a0: 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20  major, -1));.   
14b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
14e0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72  wStringObj(minor
14f0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20  , -1));..    if 
1500: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1510: 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69  ALERT) {..Tcl_Li
1520: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1530: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1540: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1550: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65  tringObj(SSL_ale
1560: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c  rt_desc_string_l
1570: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a  ong(ret), -1));.
1580: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
1590: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
15a0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
15b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
15c0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73  SSL_alert_type_s
15d0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c  tring_long(ret),
15e0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73   -1));.    } els
15f0: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  e {..Tcl_ListObj
1600: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1610: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1620: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1630: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74  Obj(SSL_state_st
1640: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20  ring_long(ssl), 
1650: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
1660: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1670: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
1680: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1690: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20  ("info", -1));. 
16a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61     }..    /* Eva
16b0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
16c0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
16d0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
16e0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
16f0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
1700: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
1710: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1720: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
1730: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
1780: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
1790: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f   --. *. *.Monito
17a0: 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20  rs SSL protocol 
17b0: 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52  messages. *. * R
17c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
17d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
17e0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
17f0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
1800: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d). *. *--------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
1850: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f  #ifndef OPENSSL_
1860: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61  NO_SSL_TRACE.sta
1870: 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65  tic void.Message
1880: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69  Callback(int wri
1890: 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f  te_p, int versio
18a0: 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74  n, int content_t
18b0: 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ype, const void 
18c0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e  *buf, size_t len
18d0: 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64  , SSL *ssl, void
18e0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
18f0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
1900: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
1910: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1920: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
1930: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
1940: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
1950: 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65  char *ver, *type
1960: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a  ;.    BIO *bio;.
1970: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
1980: 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66  15000];.    buff
1990: 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20  er[0] = 0;..    
19a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
19b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
19c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
19d0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
19e0: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20  )..return;..    
19f0: 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20  switch(version) 
1a00: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  {.#if OPENSSL_VE
1a10: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
1a20: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
1a30: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
1a40: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
1a50: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
1a60: 20 63 61 73 65 20 53 53 4c 32 5f 56 45 52 53 49   case SSL2_VERSI
1a70: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76  ON:..ver = "SSLv
1a80: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  2";..break;.#end
1a90: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
1aa0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
1ab0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
1ac0: 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53  SSL3).    case S
1ad0: 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  SL3_VERSION:..ve
1ae0: 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72  r = "SSLv3";..br
1af0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
1b00: 63 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f  case TLS1_VERSIO
1b10: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31  N:..ver = "TLSv1
1b20: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1b30: 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49  ase TLS1_1_VERSI
1b40: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76  ON:..ver = "TLSv
1b50: 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  1.1";..break;.  
1b60: 20 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45    case TLS1_2_VE
1b70: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1b80: 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.2";..break;
1b90: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33  .    case TLS1_3
1ba0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1bb0: 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65   "TLSv1.3";..bre
1bc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a  ak;.    case 0:.
1bd0: 20 20 20 20 20 20 20 20 76 65 72 20 3d 20 22 6e          ver = "n
1be0: 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  one";..break;.  
1bf0: 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 72 20    default:..ver 
1c00: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72  = "unknown";..br
1c10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1c20: 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e 74 5f  switch (content_
1c30: 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73 65  type) {.    case
1c40: 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 52 3a   SSL3_RT_HEADER:
1c50: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64 65 72  ..type = "Header
1c60: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
1c70: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1c80: 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54  RT_INNER_CONTENT
1c90: 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22  _TYPE:..type = "
1ca0: 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79  Inner Content Ty
1cb0: 70 65 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65  pe";.        bre
1cc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ak;.    case SSL
1cd0: 33 5f 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48  3_RT_CHANGE_CIPH
1ce0: 45 52 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d  ER_SPEC:..type =
1cf0: 20 22 43 68 61 6e 67 65 20 43 69 70 68 65 72 22   "Change Cipher"
1d00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d20: 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d  T_ALERT:..type =
1d30: 20 22 41 6c 65 72 74 22 3b 0a 20 20 20 20 20 20   "Alert";.      
1d40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d50: 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48  e SSL3_RT_HANDSH
1d60: 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61  AKE:..type = "Ha
1d70: 6e 64 73 68 61 6b 65 22 3b 0a 20 20 20 20 20 20  ndshake";.      
1d80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d90: 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43  e SSL3_RT_APPLIC
1da0: 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70  ATION_DATA:..typ
1db0: 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a  e = "App Data";.
1dc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1dd0: 20 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54     case DTLS1_RT
1de0: 5f 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70  _HEARTBEAT:..typ
1df0: 65 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b  e = "Heartbeat";
1e00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1e10: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79      default:..ty
1e20: 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  pe = "unknown";.
1e30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65      }..    /* Ne
1e40: 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  eds compile time
1e50: 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d   option "enable-
1e60: 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20  ssl-trace". */. 
1e70: 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49     if ((bio = BI
1e80: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
1e90: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ))) != NULL) {..
1ea0: 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63  int n;..SSL_trac
1eb0: 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69  e(write_p, versi
1ec0: 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65  on, content_type
1ed0: 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c  , buf, len, ssl,
1ee0: 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09   (void *)bio);..
1ef0: 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f  n = BIO_read(bio
1f00: 2c 20 62 75 66 66 65 72 2c 20 6d 69 6e 28 42 49  , buffer, min(BI
1f10: 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 2c 20  O_pending(bio), 
1f20: 31 34 39 39 39 29 29 3b 0a 09 6e 20 3d 20 28 6e  14999));..n = (n
1f30: 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75  <0) ? 0 : n;..bu
1f40: 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76  ffer[n] = 0;..(v
1f50: 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69  oid)BIO_flush(bi
1f60: 6f 29 3b 0a 20 09 42 49 4f 5f 66 72 65 65 28 62  o);. .BIO_free(b
1f70: 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 2f  io);.   }..    /
1f80: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
1f90: 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20   to eval */.    
1fa0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
1fb0: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
1fc0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20  tr->callback);. 
1fd0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1fe0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1ff0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2000: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65  NewStringObj("me
2010: 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20  ssage", -1));.  
2020: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2030: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2040: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
2050: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2060: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
2070: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
2080: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
2090: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
20a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
20b0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
20c0: 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 5f 70  tringObj(write_p
20d0: 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 65 63   ? "Sent" : "Rec
20e0: 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20  eived", -1));.  
20f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2100: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2110: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2120: 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 72 2c  ewStringObj(ver,
2130: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2140: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2150: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2160: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2170: 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 29 3b  gObj(type, -1));
2180: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2190: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
21a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
21b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62  l_NewStringObj(b
21c0: 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a 20 20  uffer, -1));..  
21d0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
21e0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
21f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
2200: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
2210: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
2220: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
2230: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
2240: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
2250: 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c  Ptr);.}.#endif..
2260: 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
22b0: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d  VerifyCallback -
22c0: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73  -. *. *.Monitors
22d0: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65   SSL certificate
22e0: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63   validation proc
22f0: 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e  ess. Used to con
2300: 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61  trol the. *.beha
2310: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53  vior when the SS
2320: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c  L_VERIFY_PEER fl
2330: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
2340: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65  is called. *.whe
2350: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63  never a certific
2360: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64  ate is inspected
2370: 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61   or decided inva
2380: 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f 72 0a  lid. Called for.
2390: 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 69 63   *.each certific
23a0: 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 74 20  ate in the cert 
23b0: 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65  chain.. *. * Che
23c0: 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 66 69 63  cks:. *.certific
23d0: 61 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65  ate chain is che
23e0: 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69  cked starting wi
23f0: 74 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e  th the deepest n
2400: 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09  esting level. *.
2410: 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63    (the root CA c
2420: 65 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20  ertificate) and 
2430: 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f  worked upward to
2440: 20 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74   the peer's cert
2450: 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20  ificate.. *.All 
2460: 73 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76  signatures are v
2470: 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69  alid, current ti
2480: 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72  me is within fir
2490: 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69  st and last vali
24a0: 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68  dity time.. *.Ch
24b0: 65 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72  eck that the cer
24c0: 74 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75  tificate is issu
24d0: 65 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72  ed by the issuer
24e0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73   certificate iss
24f0: 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68  uer.. *.Check th
2500: 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61  e revocation sta
2510: 74 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72  tus for each cer
2520: 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65  tificate.. *.Che
2530: 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20  ck the validity 
2540: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c  of the given CRL
2550: 20 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65   and the cert re
2560: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e  vocation status.
2570: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f  . *.Check the po
2580: 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68  licies of all th
2590: 65 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20  e certificates. 
25a0: 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65  *. * Args. *.pre
25b0: 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61  verify_ok indica
25c0: 74 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20  tes whether the 
25d0: 63 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69  certificate veri
25e0: 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20  fication passed 
25f0: 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20  (1) or not (0). 
2600: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
2610: 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e  .A callback boun
2620: 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20  d to the socket 
2630: 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f  may return one o
2640: 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20  f:. *.    0...- 
2650: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
2660: 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69  is deemed invali
2670: 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61  d, send verifica
2680: 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69  tion. *....  fai
2690: 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65  lure alert to pe
26a0: 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74  er, and terminat
26b0: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09  e handshake.. *.
26c0: 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65      1...- the ce
26d0: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65  rtificate is dee
26e0: 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69  med valid, conti
26f0: 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61  nue with handsha
2700: 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79  ke.. *.    empty
2710: 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61   string.- no cha
2720: 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61  nge to certifica
2730: 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a  te validation. *
2740: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
2750: 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65  :. *.The err fie
2760: 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ld of the curren
2770: 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74  tly operative St
2780: 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20  ate is set. *.  
2790: 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63  to a string desc
27a0: 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e  ribing the SSL n
27b0: 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75  egotiation failu
27c0: 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d  re reason. *. *-
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 2d 2d 2d 2d 2d 2d  ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2810: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
2820: 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  t.VerifyCallback
2830: 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54  (int ok, X509_ST
2840: 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a  ORE_CTX *ctx) {.
2850: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
2860: 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a  Ptr;.    SSL   *
2870: 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30  ssl..= (SSL*)X50
2880: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f  9_STORE_CTX_get_
2890: 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c  ex_data(ctx, SSL
28a0: 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30  _get_ex_data_X50
28b0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28  9_STORE_CTX_idx(
28c0: 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63  ));.    X509  *c
28d0: 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52  ert..= X509_STOR
28e0: 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e  E_CTX_get_curren
28f0: 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20  t_cert(ctx);.   
2900: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
2910: 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67  .= (State*)SSL_g
2920: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29  et_app_data(ssl)
2930: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
2940: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
2950: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
2960: 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35   int depth..= X5
2970: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
2980: 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78  _error_depth(ctx
2990: 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09  );.    int err..
29a0: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58  = X509_STORE_CTX
29b0: 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b  _get_error(ctx);
29c0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56  ..    dprintf("V
29d0: 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 3b  erify: %d", ok);
29e0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
29f0: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
2a00: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69  _Obj*)NULL) {..i
2a10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c  f (statePtr->vfl
2a20: 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59  ags & SSL_VERIFY
2a30: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
2a40: 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65  _CERT) {..    re
2a50: 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65  turn ok;..} else
2a60: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31   {..    return 1
2a70: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
2a80: 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c  if (cert == NULL
2a90: 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29   || ssl == NULL)
2aa0: 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20   {..return 0;.  
2ab0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
2ac0: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
2ad0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
2ae0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
2af0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
2b00: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
2b10: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2b20: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2b30: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2b40: 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29  bj("verify", -1)
2b50: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2b60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2b70: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
2b80: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  .Tcl_NewStringOb
2b90: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
2ba0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
2bb0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
2bc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2bd0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2be0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2bf0: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a  IntObj(depth));.
2c00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2c10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2c20: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73  erp, cmdPtr, Tls
2c30: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
2c40: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20  rp, cert));.    
2c50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2c70: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2c80: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20  IntObj(ok));.   
2c90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2ca0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2cb0: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
2cc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
2cd0: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63  r*)X509_verify_c
2ce0: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
2cf0: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  (err), -1));..  
2d00: 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f    /* Prevent I/O
2d10: 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20   while callback 
2d20: 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a  is in progress *
2d30: 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74  /.    /* statePt
2d40: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
2d50: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f  TCL_CALLBACK; */
2d60: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
2d70: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
2d80: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
2d90: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2da0: 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c      ok = EvalCal
2db0: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
2dc0: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
2dd0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
2de0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
2df0: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d      /* statePtr-
2e00: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f  >flags &= ~(TLS_
2e10: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a  TCL_CALLBACK); *
2e20: 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29  /.    return(ok)
2e30: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c  ;./* By default,
2e40: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74   leave verificat
2e50: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a  ion unchanged. *
2e60: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  /.}.../*. *-----
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2eb0: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d  *. * Tls_Error -
2ec0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  -. *. *.Calls ca
2ed0: 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74  llback with list
2ee0: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20   of errors.. *. 
2ef0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2f00: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64   *.The err field
2f10: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c   of the currentl
2f20: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74  y operative Stat
2f30: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f  e is set. *.  to
2f40: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69   a string descri
2f50: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67  bing the SSL neg
2f60: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  otiation failure
2f70: 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d   reason. *. *---
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72  . */.void.Tls_Er
2fd0: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65  ror(State *state
2fe0: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20  Ptr, char *msg) 
2ff0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
3000: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
3010: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
3020: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
3030: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20  , *listPtr;.    
3040: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72  unsigned long er
3050: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  r;.    statePtr-
3060: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20  >err = msg;..   
3070: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3080: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
3090: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
30a0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
30b0: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20  L)..return;..   
30c0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
30d0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
30e0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
30f0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
3100: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
3110: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3120: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3130: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3140: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
3150: 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20  error", -1));.  
3160: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3170: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3180: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
3190: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
31a0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
31b0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
31c0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69  lf), -1));.    i
31d0: 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20  f (msg != NULL) 
31e0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
31f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3200: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3210: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67  NewStringObj(msg
3220: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65  , -1));..    } e
3230: 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54  lse if ((msg = T
3240: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3250: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
3260: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55  sult(interp), NU
3270: 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  LL)) != NULL) {.
3280: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
3290: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
32a0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
32b0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20  wStringObj(msg, 
32c0: 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73  -1));..    } els
32d0: 65 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54  e {..listPtr = T
32e0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
32f0: 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28   NULL);..while (
3300: 28 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65  (err = ERR_get_e
3310: 72 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a  rror()) != 0) {.
3320: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3330: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3340: 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54  terp, listPtr, T
3350: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3360: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72  ERR_reason_error
3370: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31  _string(err), -1
3380: 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74  ));..}..Tcl_List
3390: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
33a0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
33b0: 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d   listPtr);.    }
33c0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
33d0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
33e0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
33f0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
3400: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
3410: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
3420: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
3430: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3440: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a  (cmdPtr);.}.../*
3450: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3490: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79  ------. *. * Key
34a0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  LogCallback --. 
34b0: 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69  *. *.Write recei
34c0: 76 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20  ved key data to 
34d0: 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20  log file.. *. * 
34e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
34f0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3540: 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61  */.void KeyLogCa
3550: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
3560: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61   *ssl, const cha
3570: 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63  r *line) {.    c
3580: 68 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e  har *str = geten
3590: 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29  v(SSLKEYLOGFILE)
35a0: 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a  ;.    FILE *fd;.
35b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
35c0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
35d0: 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f  (str) {..fd = fo
35e0: 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09  pen(str, "a");..
35f0: 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c  fprintf(fd, "%s\
3600: 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73  n",line);..fclos
3610: 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c  e(fd);.    }.}..
3620: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
3670: 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63  Password Callbac
3680: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  k --. *. *.Calle
3690: 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72  d when a passwor
36a0: 64 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20  d for a private 
36b0: 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72  key loading/stor
36c0: 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72  ing a PEM. *.cer
36d0: 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e  tificate with en
36e0: 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20  cryption. Evals 
36f0: 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20  callback script 
3700: 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74  and returns. *.t
3710: 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65  he result as the
3720: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
3730: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52   in buf.. *. * R
3740: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
3750: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3760: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
3770: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
3780: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  d). *. * Returns
3790: 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69  :. *.Password si
37a0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d  ze in bytes or -
37b0: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  1 for an error..
37c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
3810: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64  tic int.Password
3820: 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62  Callback(char *b
3830: 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e  uf, int size, in
3840: 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a  t rwflag, void *
3850: 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61  udata) {.    Sta
3860: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
3870: 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a  State *) udata;.
3880: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
3890: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
38a0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
38b0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
38c0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20      int code;.. 
38d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
38e0: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ed");..    /* If
38f0: 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73   no callback, us
3900: 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61  e default callba
3910: 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  ck */.    if (st
3920: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
3930: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20   == NULL) {..if 
3940: 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65  (Tcl_EvalEx(inte
3950: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f  rp, "tls::passwo
3960: 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41  rd", -1, TCL_EVA
3970: 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c  L_GLOBAL) == TCL
3980: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72  _OK) {..    char
3990: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29   *ret = (char *)
39a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
39b0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20  sult(interp);.. 
39c0: 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20     strncpy(buf, 
39d0: 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69  ret, (size_t) si
39e0: 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  ze);..    return
39f0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74   (int)strlen(ret
3a00: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
3a10: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a    return -1;..}.
3a20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
3a30: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
3a40: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
3a50: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
3a60: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
3a70: 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54  password);.    T
3a80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3a90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3aa0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3ab0: 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f  tringObj("passwo
3ac0: 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  rd", -1));.    T
3ad0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3ae0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3af0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
3b00: 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a  ntObj(rwflag));.
3b10: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3b20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3b30: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3b40: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29  _NewIntObj(size)
3b50: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
3b60: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
3b70: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  ) interp);.    T
3b80: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
3b90: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
3ba0: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  r);..    /* Eval
3bb0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
3bc0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
3bd0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
3be0: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63  );.    code = Tc
3bf0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
3c00: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f  rp, cmdPtr, TCL_
3c10: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
3c20: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43    if (code != TC
3c30: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c  L_OK) {.#if (TCL
3c40: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d  _MAJOR_VERSION =
3c50: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e  = 8) && (TCL_MIN
3c60: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a  OR_VERSION < 6).
3c70: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
3c80: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65  rror(interp);.#e
3c90: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f  lse..Tcl_Backgro
3ca0: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74  undException(int
3cb0: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64  erp, code);.#end
3cc0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  if.    }.    Tcl
3cd0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
3ce0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  dPtr);..    Tcl_
3cf0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
3d00: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
3d10: 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65  .    /* If succe
3d20: 73 73 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b  ssful, pass back
3d30: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
3d40: 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66   and truncate if
3d50: 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20   too long */.   
3d60: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c   if (code == TCL
3d70: 5f 4f 4b 29 20 7b 0a 09 69 6e 74 20 6c 65 6e 3b  _OK) {..int len;
3d80: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63  ..char *ret = (c
3d90: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74  har *) Tcl_GetSt
3da0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
3db0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
3dc0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  erp), &len);..if
3dd0: 20 28 6c 65 6e 20 3e 20 73 69 7a 65 2d 31 29 20   (len > size-1) 
3de0: 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 73 69 7a  {..    len = siz
3df0: 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79  e-1;..}..strncpy
3e00: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
3e10: 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c  _t) len);..buf[l
3e20: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c  en] = '\0';..Tcl
3e30: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
3e40: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09  Data) interp);..
3e50: 72 65 74 75 72 6e 28 6c 65 6e 29 3b 0a 20 20 20  return(len);.   
3e60: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61   }.    Tcl_Relea
3e70: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
3e80: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
3e90: 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  urn -1;.}.../*. 
3ea0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ee0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69  ----. *. * Sessi
3ef0: 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  on Callback for 
3f00: 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a  Clients --. *. *
3f10: 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e  .Called when a n
3f20: 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64  ew session is ad
3f30: 64 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65  ded to the cache
3f40: 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09  . In TLS 1.3. *.
3f50: 74 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65  this may be rece
3f60: 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  ived multiple ti
3f70: 6d 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61  mes after the ha
3f80: 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09  ndshake. For. *.
3f90: 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  earlier versions
3fa0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72  , this will be r
3fb0: 65 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74  eceived during t
3fc0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a  he handshake.. *
3fd0: 09 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65  .This is the pre
3fe0: 66 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62  ferred way to ob
3ff0: 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65  tain a resumable
4000: 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20   session.. *. * 
4010: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
4020: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
4030: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
4040: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
4050: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
4060: 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65   codes:. *.0 = e
4070: 72 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69  rror where sessi
4080: 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64  on will be immed
4090: 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66  iately removed f
40a0: 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  rom the internal
40b0: 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73   cache.. *.1 = s
40c0: 75 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70  uccess where app
40d0: 20 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e   retains session
40e0: 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68   in session cach
40f0: 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c  e, and must call
4100: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65   SSL_SESSION_fre
4110: 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20  e() when done.. 
4120: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
4170: 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61  ic int.SessionCa
4180: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
4190: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49   *ssl, SSL_SESSI
41a0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20  ON *session) {. 
41b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
41c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
41d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
41e0: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
41f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4200: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
4210: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
4220: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
4230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4240: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20  ar *ticket;.    
4250: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4260: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b  har *session_id;
4270: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32  .    size_t len2
4280: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
4290: 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70  nt ulen;..    dp
42a0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
42b0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
42c0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
42d0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
42e0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
42f0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
4300: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20   } else if (ssl 
4310: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
4320: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
4330: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
4340: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
4350: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f  mmand to eval */
4360: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
4370: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
4380: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
4390: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  k);.    Tcl_List
43a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
43b0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
43c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
43d0: 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29  j("session", -1)
43e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
43f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4400: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
4410: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
4420: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
4430: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
4440: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
4450: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
4460: 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  id */.    sessio
4470: 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  n_id = SSL_SESSI
4480: 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f  ON_get_id(sessio
4490: 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54  n, &ulen);.    T
44a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
44b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
44c0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
44d0: 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73  yteArrayObj(sess
44e0: 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c  ion_id, (int) ul
44f0: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  en));..    /* Se
4500: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a  ssion ticket */.
4510: 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f      SSL_SESSION_
4520: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
4530: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
4540: 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  en2);.    Tcl_Li
4550: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4560: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4570: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
4580: 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28  rayObj(ticket, (
4590: 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20  int) len2));..  
45a0: 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20    /* Lifetime - 
45b0: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
45c0: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73  s */.    Tcl_Lis
45d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
45e0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
45f0: 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62  ,..Tcl_NewLongOb
4600: 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53  j((long) SSL_SES
4610: 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f  SION_get_ticket_
4620: 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65  lifetime_hint(se
4630: 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f  ssion)));..    /
4640: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
4650: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
4660: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4670: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
4680: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
4690: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
46a0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
46b0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
46c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
46d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4720: 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63  . * ALPN Callbac
4730: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e  k for Servers an
4740: 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66  d NPN Callback f
4750: 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a  or Clients --. *
4760: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74  . *.Perform prot
4770: 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20  ocol (http/1.1, 
4780: 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65  h2, h3, etc.) se
4790: 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a  lection for the.
47a0: 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e   *.incoming conn
47b0: 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61  ection. Called a
47c0: 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73  fter Hello and s
47d0: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e  erver callbacks.
47e0: 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20  . *.Where 'out' 
47f0: 69 73 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  is selected prot
4800: 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73  ocol and 'in' is
4810: 20 74 68 65 20 70 65 65 72 20 61 64 76 65 72 74   the peer advert
4820: 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  ised list.. *. *
4830: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
4840: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
4850: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
4860: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
4870: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ned). *. * Retur
4880: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f  n codes:. *.SSL_
4890: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41  TLSEXT_ERR_OK: A
48a0: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  LPN protocol sel
48b0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
48c0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
48d0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
48e0: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20  RR_ALERT_FATAL: 
48f0: 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65  There was no ove
4900: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 68 65  rlap between the
4910: 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20   client's. *.   
4920: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61   supplied list a
4930: 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 63 6f  nd the server co
4940: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65  nfiguration. The
4950: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
4960: 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09   be aborted.. *.
4970: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
4980: 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f  OACK: ALPN proto
4990: 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64  col not selected
49a0: 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20  , e.g., because 
49b0: 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70  no ALPN. *.    p
49c0: 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e  rotocols are con
49d0: 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73  figured for this
49e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65   connection. The
49f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
4a00: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  inues.. *. *----
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4a50: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41   */.static int.A
4a60: 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  LPNCallback(cons
4a70: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73  t SSL *ssl, cons
4a80: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4a90: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20  **out, unsigned 
4aa0: 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63  char *outlen,..c
4ab0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4ac0: 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64  ar *in, unsigned
4ad0: 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64   int inlen, void
4ae0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
4af0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
4b00: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
4b10: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4b20: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
4b30: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
4b40: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
4b50: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a  int code, res;..
4b60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
4b70: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
4b80: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  ssl == NULL || a
4b90: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  rg == NULL) {..r
4ba0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
4bb0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
4bc0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  }..    /* Select
4bd0: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20   protocol */.   
4be0: 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f   if (SSL_select_
4bf0: 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20  next_proto(out, 
4c00: 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72  outlen, statePtr
4c10: 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50  ->protos, stateP
4c20: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a  tr->protos_len,.
4c30: 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f  .in, inlen) == O
4c40: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54  PENSSL_NPN_NEGOT
4c50: 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74  IATED) {../* Mat
4c60: 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73  ch found */..res
4c70: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
4c80: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
4c90: 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e   {../* OPENSSL_N
4ca0: 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20  PN_NO_OVERLAP = 
4cb0: 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75  No overlap, so u
4cc0: 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 66 72  se first item fr
4cd0: 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63  om client protoc
4ce0: 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20  ol list */..res 
4cf0: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4d00: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
4d10: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
4d20: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62  >vcmd == (Tcl_Ob
4d30: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
4d40: 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20  rn res;.    }.. 
4d50: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4d60: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
4d70: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
4d80: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
4d90: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
4da0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4db0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4dc0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
4dd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c  NewStringObj("al
4de0: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  pn", -1));.    T
4df0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4e00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4e10: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
4e20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
4e30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
4e40: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
4e50: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
4e60: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4e70: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4e80: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
4e90: 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29  ngObj(*out, -1))
4ea0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
4eb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4ec0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
4ed0: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
4ee0: 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45  (res == SSL_TLSE
4ef0: 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20  XT_ERR_OK));..  
4f00: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
4f10: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
4f20: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
4f30: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
4f40: 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c  if ((code = Eval
4f50: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
4f60: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
4f70: 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20  r)) > 1) {..res 
4f80: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4f90: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c  _NOACK;.    } el
4fa0: 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31  se if (code == 1
4fb0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
4fc0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
4fd0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
4fe0: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4ff0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20  _ALERT_FATAL;.  
5000: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
5010: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
5020: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
5030: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5080: 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50  *. * Advertise P
5090: 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63  rotocols Callbac
50a0: 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f  k for Next Proto
50b0: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20  col Negotiation 
50c0: 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48  (NPN) in ServerH
50d0: 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61  ello --. *. *.ca
50e0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20  lled when a TLS 
50f0: 73 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c  server needs a l
5100: 69 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64  ist of supported
5110: 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e   protocols for N
5120: 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20  ext. *.Protocol 
5130: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a  Negotiation.. *.
5140: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
5150: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
5160: 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65  ffects:. *. * Re
5170: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
5180: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5190: 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73  : NPN protocol s
51a0: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e  elected. The con
51b0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
51c0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
51d0: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20  _ERR_NOACK: NPN 
51e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c  protocol not sel
51f0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
5200: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
5210: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69  ---------. */.#i
5260: 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61  fdef USE_NPN.sta
5270: 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62  tic int.NPNCallb
5280: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
5290: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  sl, const unsign
52a0: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75  ed char **out, u
52b0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74  nsigned int *out
52c0: 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  len, void *arg) 
52d0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
52e0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
52f0: 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  arg;..    dprint
5300: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
5310: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
5320: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c  L || arg == NULL
5330: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
5340: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
5350: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5360: 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69  Set protocols li
5370: 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  st */.    if (st
5380: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21  atePtr->protos !
5390: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20  = NULL) {..*out 
53a0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  = statePtr->prot
53b0: 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73  os;..*outlen = s
53c0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f  tatePtr->protos_
53d0: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  len;.    } else 
53e0: 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a  {..*out = NULL;.
53f0: 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72  .*outlen = 0;..r
5400: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5410: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
5420: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c  }.    return SSL
5430: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
5440: 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a  }.#endif.../*. *
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5490: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61  ---. *. * SNI Ca
54a0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65  llback for Serve
54b0: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66  rs --. *. *.Perf
54c0: 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20  orm server-side 
54d0: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c  SNI hostname sel
54e0: 65 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63  ection after rec
54f0: 65 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e  eiving SNI exten
5500: 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e  sion. *.in Clien
5510: 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20  t Hello. Called 
5520: 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c  after hello call
5530: 62 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20  back but before 
5540: 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  ALPN callback.. 
5550: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
5560: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
5570: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
5580: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
5590: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
55a0: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
55b0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
55c0: 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  K: SNI hostname 
55d0: 69 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65  is accepted. The
55e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
55f0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
5600: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
5610: 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61  ATAL: SNI hostna
5620: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74  me is not accept
5630: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
5640: 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f  on. *.    is abo
5650: 72 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f  rted. Default fo
5660: 72 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41  r alert is SSL_A
5670: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e  D_UNRECOGNIZED_N
5680: 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  AME.. *.SSL_TLSE
5690: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52  XT_ERR_ALERT_WAR
56a0: 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61  NING: SNI hostna
56b0: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74  me is not accept
56c0: 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72  ed, warning aler
56d0: 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e  t. *.    sent (n
56e0: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20  ot supported in 
56f0: 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f  TLSv1.3). The co
5700: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
5710: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es.. *.SSL_TLSEX
5720: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49  T_ERR_NOACK: SNI
5730: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
5740: 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f   accepted and no
5750: 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a  t acknowledged,.
5760: 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53   *.    e.g. if S
5770: 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  NI has not been 
5780: 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20  configured. The 
5790: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
57a0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nues.. *. *-----
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
57f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e  */.static int.SN
5800: 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  ICallback(const 
5810: 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61  SSL *ssl, int *a
5820: 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29  lert, void *arg)
5830: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
5840: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
5850: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  )arg;.    Tcl_In
5860: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
5870: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
5880: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
5890: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
58a0: 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 68 61  de, res;.    cha
58b0: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20  r *servername = 
58c0: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e  NULL;..    dprin
58d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
58e0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
58f0: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c  LL || arg == NUL
5900: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
5910: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5920: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
5930: 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   Only works for 
5940: 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c  TLS 1.2 and earl
5950: 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65  ier */.    serve
5960: 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f  rname = SSL_get_
5970: 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20  servername(ssl, 
5980: 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f  TLSEXT_NAMETYPE_
5990: 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20  host_name);.    
59a0: 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20  if (!servername 
59b0: 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d  || servername[0]
59c0: 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74   == '\0') {..ret
59d0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
59e0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
59f0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
5a00: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f  r->vcmd == (Tcl_
5a10: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  Obj*)NULL) {..re
5a20: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5a30: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ERR_OK;.    }.. 
5a40: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
5a50: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
5a60: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
5a70: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
5a80: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
5a90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5aa0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5ab0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5ac0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e  NewStringObj("sn
5ad0: 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  i", -1));.    Tc
5ae0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5af0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5b00: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
5b10: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
5b20: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
5b30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
5b40: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5b50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5b60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5b70: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5b80: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20  gObj(servername 
5b90: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
5ba0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
5bb0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
5bc0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
5bd0: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28  dPtr);.    if ((
5be0: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62  code = EvalCallb
5bf0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
5c00: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e  ePtr, cmdPtr)) >
5c10: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
5c20: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
5c30: 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65  T_WARNING;..*ale
5c40: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45  rt = SSL_AD_UNRE
5c50: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f  COGNIZED_NAME; /
5c60: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  * Not supported 
5c70: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20  by TLS 1.3 */.  
5c80: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64    } else if (cod
5c90: 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d  e == 1) {..res =
5ca0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5cb0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  OK;.    } else {
5cc0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
5cd0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
5ce0: 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  AL;..*alert = SS
5cf0: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45  L_AD_UNRECOGNIZE
5d00: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73  D_NAME; /* Not s
5d10: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20  upported by TLS 
5d20: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  1.3 */.    }.   
5d30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5d40: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72  t(cmdPtr);.    r
5d50: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f  eturn res;.}.../
5d60: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c  -------. *. * Cl
5db0: 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68  ientHello Handsh
5dc0: 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ake Callback for
5dd0: 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20   Servers --. *. 
5de0: 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72  *.Used by server
5df0: 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20   to examine the 
5e00: 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69  server name indi
5e10: 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74  cation (SNI) ext
5e20: 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64  ension. *.provid
5e30: 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74  ed by the client
5e40: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c   in order to sel
5e50: 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ect an appropria
5e60: 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74  te certificate t
5e70: 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e  o. *.present, an
5e80: 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e  d make other con
5e90: 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73  figuration adjus
5ea0: 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20  tments relevant 
5eb0: 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20  to that server. 
5ec0: 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63  *.name and its c
5ed0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68  onfiguration. Th
5ee0: 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70  is includes swap
5ef0: 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73  ping out the ass
5f00: 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43  ociated. *.SSL_C
5f10: 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69  TX pointer, modi
5f20: 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72  fying the server
5f30: 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69  's list of permi
5f40: 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e  tted TLS version
5f50: 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74  s,. *.changing t
5f60: 68 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68  he server's ciph
5f70: 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f  er list in respo
5f80: 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  nse to the clien
5f90: 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c  t's cipher list,
5fa0: 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20   etc.. *.Called 
5fb0: 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41  before SNI and A
5fc0: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  LPN callbacks.. 
5fd0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
5fe0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
5ff0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
6000: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
6010: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
6020: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
6030: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6040: 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20  _RETRY: suspend 
6050: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61  the handshake, a
6060: 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  nd the handshake
6070: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
6080: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
6090: 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f  y. *.SSL_CLIENT_
60a0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69  HELLO_ERROR: fai
60b0: 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20  lure, terminate 
60c0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20  connection. Set 
60d0: 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63  alert to error c
60e0: 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45  ode.. *.SSL_CLIE
60f0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53  NT_HELLO_SUCCESS
6100: 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d  : success. *. *-
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6150: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
6160: 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28  t.HelloCallback(
6170: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20  const SSL *ssl, 
6180: 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64  int *alert, void
6190: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
61a0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
61b0: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
61c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
61d0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
61e0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
61f0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
6200: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20  int code, res;. 
6210: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73     const char *s
6220: 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63  ervername;.    c
6230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
6240: 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f  ar *p;.    size_
6250: 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67  t len, remaining
6260: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
6270: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
6280: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
6290: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
62a0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
62b0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
62c0: 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65  SUCCESS;.    } e
62d0: 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 28  lse if (ssl == (
62e0: 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c  const SSL *)NULL
62f0: 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69 64   || arg == (void
6300: 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75   *)NULL) {..retu
6310: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
6320: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6330: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d  ..    /* Get nam
6340: 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53  es */.    if (!S
6350: 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f  SL_client_hello_
6360: 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c  get0_ext(ssl, TL
6370: 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72  SEXT_TYPE_server
6380: 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61  _name, &p, &rema
6390: 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e  ining) || remain
63a0: 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c  ing <= 2) {..*al
63b0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56  ert = SSL_R_SSLV
63c0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f  3_ALERT_ILLEGAL_
63d0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75  PARAMETER;..retu
63e0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
63f0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6400: 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
6410: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
6420: 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74  he supplied list
6430: 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20   of names. */.  
6440: 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20    len = (*(p++) 
6450: 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b  << 8);.    len +
6460: 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66  = *(p++);.    if
6470: 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d   (len + 2 != rem
6480: 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72  aining) {..*aler
6490: 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f  t = SSL_R_SSLV3_
64a0: 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41  ALERT_ILLEGAL_PA
64b0: 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e  RAMETER;..return
64c0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
64d0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  O_ERROR;.    }. 
64e0: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c     remaining = l
64f0: 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  en;..    /* The 
6500: 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 65  list in practice
6510: 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67   only has a sing
6520: 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77  le element, so w
6530: 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20  e only consider 
6540: 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a  the first one. *
6550: 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e  /.    if (remain
6560: 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b  ing == 0 || *p++
6570: 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54   != TLSEXT_NAMET
6580: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b  YPE_host_name) {
6590: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
65a0: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54  _TLSV1_ALERT_INT
65b0: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65  ERNAL_ERROR;..re
65c0: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
65d0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
65e0: 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67   }.    remaining
65f0: 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  --;..    /* Now 
6600: 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70  we can finally p
6610: 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65  ull out the byte
6620: 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20   array with the 
6630: 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e  actual hostname.
6640: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61   */.    if (rema
6650: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a  ining <= 2) {..*
6660: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6670: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e  SV1_ALERT_INTERN
6680: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72  AL_ERROR;..retur
6690: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
66a0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
66b0: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b      len = (*(p++
66c0: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e  ) << 8);.    len
66d0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20   += *(p++);.    
66e0: 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65  if (len + 2 > re
66f0: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65  maining) {..*ale
6700: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6710: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f  _ALERT_INTERNAL_
6720: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53  ERROR;..return S
6730: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6740: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6750: 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e   remaining = len
6760: 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65  ;.    servername
6770: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
6780: 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  )p;..    /* Crea
6790: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
67a0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
67b0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
67c0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
67d0: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
67e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
67f0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
6800: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6810: 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29  bj("hello", -1))
6820: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
6830: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
6840: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
6850: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
6860: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
6870: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
6880: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
6890: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
68a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
68b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
68c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72  NewStringObj(ser
68d0: 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 29 20 6c  vername, (int) l
68e0: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  en));..    /* Ev
68f0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
6900: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
6910: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
6920: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
6930: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
6940: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
6950: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
6960: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  ) {..res = SSL_C
6970: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52  LIENT_HELLO_RETR
6980: 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  Y;..*alert = SSL
6990: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55  _R_TLSV1_ALERT_U
69a0: 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20  SER_CANCELLED;. 
69b0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f     } else if (co
69c0: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20  de == 1) {..res 
69d0: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
69e0: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20  LO_SUCCESS;.    
69f0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
6a00: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6a10: 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20  _ERROR;..*alert 
6a20: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6a30: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6a40: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  OR;.    }.    Tc
6a50: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
6a60: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
6a70: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  rn res;.}.../***
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a90: 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20  */./* Commands  
6aa0: 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
6ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
6ac0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
6b10: 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d   CiphersObjCmd -
6b20: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  - list available
6b30: 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54   ciphers. *. *.T
6b40: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
6b50: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
6b60: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69  ess the "tls::ci
6b70: 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20  phers" command. 
6b80: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61  *.to list availa
6b90: 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73  ble ciphers, bas
6ba0: 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c  ed upon protocol
6bb0: 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a   selected.. *. *
6bc0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
6bd0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
6be0: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53  lt list.. *. * S
6bf0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
6c00: 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64  constructs and d
6c10: 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74  estroys SSL cont
6c20: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d  ext (CTX). *. *-
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c70: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  --. */.static co
6c80: 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63  nst char *protoc
6c90: 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32  ols[] = {.."ssl2
6ca0: 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31  ", "ssl3", "tls1
6cb0: 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c  ", "tls1.1", "tl
6cc0: 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c  s1.2", "tls1.3",
6cd0: 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72   NULL.};.enum pr
6ce0: 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53  otocol {.    TLS
6cf0: 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c  _SSL2, TLS_SSL3,
6d00: 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54   TLS_TLS1, TLS_T
6d10: 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f  LS1_1, TLS_TLS1_
6d20: 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54  2, TLS_TLS1_3, T
6d30: 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74  LS_NONE.};..stat
6d40: 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62  ic int.CiphersOb
6d50: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
6d60: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
6d70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
6d80: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
6d90: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
6da0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
6db0: 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  objPtr = NULL;. 
6dc0: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20     SSL_CTX *ctx 
6dd0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20  = NULL;.    SSL 
6de0: 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *ssl = NULL;.   
6df0: 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49   STACK_OF(SSL_CI
6e00: 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63  PHER) *sk;.    c
6e10: 68 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46  har *cp, buf[BUF
6e20: 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e  SIZ];.    int in
6e30: 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30  dex, verbose = 0
6e40: 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20  , use_supported 
6e50: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  = 0;.    const S
6e60: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f  SL_METHOD *metho
6e70: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
6e80: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
6e90: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c  if ((objc < 2) |
6ea0: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a  | (objc > 4)) {.
6eb0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
6ec0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
6ed0: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65  v, "protocol ?ve
6ee0: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65  rbose? ?supporte
6ef0: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  d?");..return TC
6f00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
6f10: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
6f20: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
6f30: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74  p, objv[1], prot
6f40: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c  ocols, "protocol
6f50: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d  ", 0, &index) !=
6f60: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
6f70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6f80: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a    }.    if ((obj
6f90: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65  c > 2) && Tcl_Ge
6fa0: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
6fb0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
6fc0: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43   &verbose) != TC
6fd0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
6fe0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6ff0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
7000: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   3) && Tcl_GetBo
7010: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
7020: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75  erp, objv[3], &u
7030: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d  se_supported) !=
7040: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
7050: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7060: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
7070: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
7080: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70   switch ((enum p
7090: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b  rotocol)index) {
70a0: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a  ..case TLS_SSL2:
70b0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
70c0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30  SION_NUMBER >= 0
70d0: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65  x10100000L || de
70e0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c  fined(NO_SSL2) |
70f0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7100: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20  L_NO_SSL2)..    
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: 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d  method = SSLv2_m
7190: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
71a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
71b0: 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e  _SSL3:.#if defin
71c0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  ed(NO_SSL3) || d
71d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
71e0: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
71f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
7200: 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  L3_METHOD)..    
7210: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7220: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7230: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
7240: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
7250: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
7260: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7270: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7280: 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d  method = SSLv3_m
7290: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
72a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
72b0: 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e  _TLS1:.#if defin
72c0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
72d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
72e0: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
72f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7300: 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  S1_METHOD)..    
7310: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7320: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7330: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
7340: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
7350: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
7360: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7370: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7380: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d  method = TLSv1_m
7390: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
73a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
73b0: 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66  _TLS1_1:.#if def
73c0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
73d0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
73e0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  SL_NO_TLS1_1) ||
73f0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7400: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f  _NO_TLS1_1_METHO
7410: 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  D)..    Tcl_Appe
7420: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7430: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
7440: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
7450: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
7460: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
7470: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
7480: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d  se..    method =
7490: 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28   TLSv1_1_method(
74a0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
74b0: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f  ..case TLS_TLS1_
74c0: 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  2:.#if defined(N
74d0: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
74e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
74f0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e  TLS1_2) || defin
7500: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7510: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20  S1_2_METHOD)..  
7520: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
7530: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
7540: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
7550: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
7560: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
7570: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7580: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
7590: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31    method = TLSv1
75a0: 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  _2_method(); bre
75b0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
75c0: 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66   TLS_TLS1_3:.#if
75d0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
75e0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
75f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
7600: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
7610: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7620: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
7630: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
7640: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
7650: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
7660: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
7670: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20  e..    method = 
7680: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20  TLS_method();.. 
7690: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
76a0: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
76b0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
76c0: 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f  SION);..    SSL_
76d0: 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74  CTX_set_max_prot
76e0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
76f0: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
7700: 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64  .    break;.#end
7710: 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20  if..default:..  
7720: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d    method = TLS_m
7730: 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62 72  ethod();..    br
7740: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
7750: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
7760: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69  w(method);.    i
7770: 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20  f (ctx == NULL) 
7780: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
7790: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53  ult(interp, REAS
77a0: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ON(), NULL);..re
77b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
77c0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d      }..    ssl =
77d0: 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20   SSL_new(ctx);. 
77e0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
77f0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
7800: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7810: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
7820: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
7830: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tx);..return TCL
7840: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
7850: 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61     /* Use list a
7860: 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c  nd order as woul
7870: 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43  d be sent in a C
7880: 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c  lientHello or al
7890: 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68  l available ciph
78a0: 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75  ers */.    if (u
78b0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a  se_supported) {.
78c0: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73  .sk = SSL_get1_s
78d0: 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73  upported_ciphers
78e0: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  (ssl);.    } els
78f0: 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65  e {..sk = SSL_ge
7900: 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a  t_ciphers(ssl);.
7910: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
7920: 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66  k != NULL) {..if
7930: 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20   (!verbose) {.. 
7940: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
7950: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
7960: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69  LL);..    for (i
7970: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
7980: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28  _SSL_CIPHER_num(
7990: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f  sk); i++) {...co
79a0: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a  nst SSL_CIPHER *
79b0: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  c = sk_SSL_CIPHE
79c0: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a  R_value(sk, i);.
79d0: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29  ..if (c == NULL)
79e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a   continue;..../*
79f0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20   cipher name or 
7a00: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d  (NONE) */...cp =
7a10: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
7a20: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63  name(c);...if (c
7a30: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b  p == NULL) break
7a40: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
7a50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
7a60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
7a70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70  _NewStringObj(cp
7a80: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a  , -1));..    }..
7a90: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f  .} else {..    o
7aa0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53  bjPtr = Tcl_NewS
7ab0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a  tringObj("",0);.
7ac0: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20  .    for (int i 
7ad0: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f  = 0; i < sk_SSL_
7ae0: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20  CIPHER_num(sk); 
7af0: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53  i++) {...const S
7b00: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73  SL_CIPHER *c = s
7b10: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
7b20: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20  ue(sk, i);...if 
7b30: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74  (c == NULL) cont
7b40: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74  inue;..../* text
7b50: 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ual description 
7b60: 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f  of the cipher */
7b70: 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45  ...if (SSL_CIPHE
7b80: 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c  R_description(c,
7b90: 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66   buf, sizeof(buf
7ba0: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  )) != NULL) {...
7bb0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f      Tcl_AppendTo
7bc0: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c  Obj(objPtr, buf,
7bd0: 20 28 69 6e 74 29 20 73 74 72 6c 65 6e 28 62 75   (int) strlen(bu
7be0: 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  f));...} else {.
7bf0: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
7c00: 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55  ToObj(objPtr, "U
7c10: 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09  NKNOWN\n", 8);..
7c20: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66  .}..    }..}..if
7c30: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   (use_supported)
7c40: 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43   {..    sk_SSL_C
7c50: 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a  IPHER_free(sk);.
7c60: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c  .}.    }.    SSL
7c70: 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20  _free(ssl);.    
7c80: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
7c90: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  );..    Tcl_SetO
7ca0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
7cb0: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
7cc0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
7cd0: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
7ce0: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d30: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63  ---. *. * Protoc
7d40: 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73  olsObjCmd -- lis
7d50: 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74  t available prot
7d60: 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73  ocols. *. *.This
7d70: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
7d80: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73  voked to process
7d90: 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f   the "tls::proto
7da0: 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  cols" command. *
7db0: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62  .to list availab
7dc0: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a  le protocols.. *
7dd0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
7de0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
7df0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20  esult list.. *. 
7e00: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
7e10: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.none. *. *---
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e60: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
7e70: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28  ProtocolsObjCmd(
7e80: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
7e90: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
7ea0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
7eb0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
7ec0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
7ed0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
7ee0: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
7ef0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
7f00: 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b  if (objc != 1) {
7f10: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
7f20: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
7f30: 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e  jv, "");..return
7f40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7f50: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
7f60: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f  _error();..    o
7f70: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
7f80: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
7f90: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
7fa0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
7fb0: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
7fc0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
7fd0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
7fe0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
7ff0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8000: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8010: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
8020: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
8030: 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20  cols[TLS_SSL2], 
8040: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  -1));.#endif.#if
8050: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
8060: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
8070: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20  PENSSL_NO_SSL3) 
8080: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8090: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48  SSL_NO_SSL3_METH
80a0: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  OD).    Tcl_List
80b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
80c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
80d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
80e0: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
80f0: 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  SSL3], -1));.#en
8100: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
8110: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  (NO_TLS1) && !de
8120: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8130: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
8140: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8150: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54  S1_METHOD).    T
8160: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
8170: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
8180: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
8190: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
81a0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31  ls[TLS_TLS1], -1
81b0: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
81c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
81d0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
81e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
81f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8200: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f  ENSSL_NO_TLS1_1_
8210: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f  METHOD).    Tcl_
8220: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8230: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
8240: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
8250: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
8260: 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29  TLS_TLS1_1], -1)
8270: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
8280: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
8290: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
82a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
82b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
82c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d  NSSL_NO_TLS1_2_M
82d0: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
82e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
82f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
8300: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8310: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8320: 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29  LS_TLS1_2], -1))
8330: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8340: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
8350: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8360: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
8370: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8380: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8390: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
83a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
83b0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
83c0: 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  _3], -1));.#endi
83d0: 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  f..    Tcl_SetOb
83e0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
83f0: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
8400: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
8410: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
8420: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Data;.}.../*. *-
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8470: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61  --. *. * Handsha
8480: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  keObjCmd --. *. 
8490: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  *.This command i
84a0: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79  s used to verify
84b0: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e   whether the han
84c0: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65  dshake is comple
84d0: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a  te. *.or not.. *
84e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
84f0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
8500: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68  esult. 1 means h
8510: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74  andshake complet
8520: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69  e, 0 means pendi
8530: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ng.. *. * Side e
8540: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66  ffects:. *.May f
8550: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61  orce SSL negotia
8560: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61  tion to take pla
8570: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ce.. *. *-------
8580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
85c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64  .static int Hand
85d0: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65  shakeObjCmd(Clie
85e0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
85f0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
8600: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
8610: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
8620: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
8630: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20  l_Channel chan; 
8640: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
8650: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
8660: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53  ode on. */.    S
8670: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20  tate *statePtr; 
8680: 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74         /* client
8690: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
86a0: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e  ocket */.    con
86b0: 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20  st char *errStr 
86c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
86d0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  ret = 1;.    int
86e0: 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64   err = 0;..    d
86f0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
8700: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
8710: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
8720: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
8730: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
8740: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54  nel");..return(T
8750: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
8760: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
8770: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68  error();..    ch
8780: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
8790: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
87a0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
87b0: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c  (objv[1], NULL),
87c0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
87d0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
87e0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
87f0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
8800: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8810: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
8820: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
8830: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
8840: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
8850: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
8860: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
8870: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
8880: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
8890: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
88a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
88b0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
88c0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
88d0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
88e0: 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
88f0: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
8900: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
8910: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
8920: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
8930: 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20  KE", "CHANNEL", 
8940: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72  "INVALID", (char
8950: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
8960: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
8970: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74     }.    statePt
8980: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c  r = (State *)Tcl
8990: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
89a0: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a  nceData(chan);..
89b0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
89c0: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72  ling Tls_WaitFor
89d0: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72  Connect");.    r
89e0: 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72  et = Tls_WaitFor
89f0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72  Connect(statePtr
8a00: 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20  , &err, 1);.    
8a10: 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69  dprintf("Tls_Wai
8a20: 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75  tForConnect retu
8a30: 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b  rned: %i", ret);
8a40: 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20  ..    if (ret < 
8a50: 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d  0 && ((statePtr-
8a60: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
8a70: 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20  _ASYNC) && (err 
8a80: 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09  == EAGAIN))) {..
8a90: 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73  dprintf("Async s
8aa0: 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47  et and err = EAG
8ab0: 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b  AIN");..ret = 0;
8ac0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
8ad0: 72 65 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 53  ret < 0) {..errS
8ae0: 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65  tr = statePtr->e
8af0: 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65  rr;..Tcl_ResetRe
8b00: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54  sult(interp);..T
8b10: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29  cl_SetErrno(err)
8b20: 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20  ;...if (!errStr 
8b30: 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30  || (*errStr == 0
8b40: 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72  )) {..    errStr
8b50: 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f   = Tcl_PosixErro
8b60: 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09  r(interp);..}...
8b70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8b80: 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68  (interp, "handsh
8b90: 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65  ake failed: ", e
8ba0: 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20  rrStr, (char *) 
8bb0: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
8bc0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
8bd0: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
8be0: 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  KE", "FAILED", (
8bf0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
8c00: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
8c10: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74  ng TCL_ERROR wit
8c20: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c  h handshake fail
8c30: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29  ed: %s", errStr)
8c40: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ;..return(TCL_ER
8c50: 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ROR);.    } else
8c60: 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30   {..if (err != 0
8c70: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
8c80: 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77  ("Got an error w
8c90: 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20  ith a completed 
8ca0: 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d  handshake: err =
8cb0: 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09   %i", err);..}..
8cc0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ret = 1;.    }..
8cd0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74      dprintf("Ret
8ce0: 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69  urning TCL_OK wi
8cf0: 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c  th data \"%i\"",
8d00: 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53   ret);.    Tcl_S
8d10: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
8d20: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
8d30: 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74  j(ret));.    ret
8d40: 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c  urn(TCL_OK);..cl
8d50: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
8d60: 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  tData;.}../*. *-
8d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8db0: 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f  --. *. * ImportO
8dc0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
8dd0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
8de0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
8df0: 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f  ess the "ssl" co
8e00: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20  mmand. *. *.The 
8e10: 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68  ssl command push
8e20: 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e  es SSL over a (n
8e30: 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20  ewly connected) 
8e40: 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a  tcp socket. *. *
8e50: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
8e60: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
8e70: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
8e80: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d  ffects:. *.May m
8e90: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69  odify the behavi
8ea0: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e  or of an IO chan
8eb0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8f00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70  /.static int.Imp
8f10: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  ortObjCmd(Client
8f20: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
8f30: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8f40: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
8f50: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
8f60: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
8f70: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
8f80: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
8f90: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
8fa0: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
8fb0: 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65  atePtr;../* clie
8fc0: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
8fd0: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53   socket */.    S
8fe0: 53 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20  SL_CTX *ctx.    
8ff0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9000: 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09  Tcl_Obj *script.
9010: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9020: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73      Tcl_Obj *pas
9030: 73 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d 20  sword.        = 
9040: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
9050: 6a 20 2a 76 63 6d 64 09 20 20 20 20 20 20 20 20  j *vcmd.        
9060: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
9070: 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61  DString upperCha
9080: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c  nnelTranslation,
9090: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f   upperChannelBlo
90a0: 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e  cking, upperChan
90b0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70  nelEncoding, upp
90c0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
90d0: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c  ;.    int idx, l
90e0: 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  en;.    int flag
90f0: 73 09 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53  s..        = TLS
9100: 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69  _TCL_INIT;.    i
9110: 6e 74 20 73 65 72 76 65 72 09 09 20 20 20 20 20  nt server..     
9120: 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f     = 0;./* is co
9130: 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e  nnection incomin
9140: 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a  g or outgoing? *
9150: 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66  /.    char *keyf
9160: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
9170: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65  LL;.    char *ce
9180: 72 74 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  rtfile.        =
9190: 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67   NULL;.    unsig
91a0: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09  ned char *key  .
91b0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
91c0: 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20  key_len         
91d0: 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20          = 0;.   
91e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
91f0: 63 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e  cert         = N
9200: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 72  ULL;.    int cer
9210: 74 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20  t_len           
9220: 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68       = 0;.    ch
9230: 61 72 20 2a 63 69 70 68 65 72 73 09 20 20 20 20  ar *ciphers.    
9240: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9250: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74  char *ciphersuit
9260: 65 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  es.        = NUL
9270: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66  L;.    char *CAf
9280: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
9290: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41  LL;.    char *CA
92a0: 64 69 72 09 09 20 20 20 20 20 20 20 20 3d 20 4e  dir..        = N
92b0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44  ULL;.    char *D
92c0: 48 70 61 72 61 6d 73 09 20 20 20 20 20 20 20 20  Hparams.        
92d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
92e0: 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 20   *model..       
92f0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61   = NULL;.    cha
9300: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20  r *servername.  
9310: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a        = NULL;./*
9320: 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65   hostname for Se
9330: 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61  rver Name Indica
9340: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  tion */.    cons
9350: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
9360: 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55  *session_id = NU
9370: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
9380: 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20  *alpn..= NULL;. 
9390: 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c     int ssl2 = 0,
93a0: 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69   ssl3 = 0;.    i
93b0: 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73  nt tls1 = 1, tls
93c0: 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20  1_1 = 1, tls1_2 
93d0: 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b  = 1, tls1_3 = 1;
93e0: 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d  .    int proto =
93f0: 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a   0, level = -1;.
9400: 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d      int verify =
9410: 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c   0, require = 0,
9420: 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f   request = 1, po
9430: 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30  st_handshake = 0
9440: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
9450: 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 4f  Called");..#if O
9460: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
9470: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
9480: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28  00L && !defined(
9490: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
94a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
94b0: 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65 64  SSL2) && defined
94c0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66  (NO_SSL3) && def
94d0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26  ined(NO_TLS1) &&
94e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
94f0: 5f 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  _1) && defined(N
9500: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66  O_TLS1_2) && def
9510: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a  ined(NO_TLS1_3).
9520: 20 20 20 20 73 73 6c 32 20 3d 20 31 3b 0a 23 65      ssl2 = 1;.#e
9530: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
9540: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
9550: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  3) && !defined(N
9560: 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66 69 6e  O_SSL3) && defin
9570: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64  ed(NO_SSL2) && d
9580: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
9590: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
95a0: 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65 64  S1_1) && defined
95b0: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 64  (NO_TLS1_2) && d
95c0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
95d0: 29 0a 20 20 20 20 73 73 6c 33 20 3d 20 31 3b 0a  ).    ssl3 = 1;.
95e0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
95f0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
9600: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
9610: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31  O_TLS1).    tls1
9620: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
9630: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
9640: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
9650: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
9660: 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30  ).    tls1_1 = 0
9670: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
9680: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
9690: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
96a0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20  SL_NO_TLS1_2).  
96b0: 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65    tls1_2 = 0;.#e
96c0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
96d0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
96e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
96f0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c  O_TLS1_3).    tl
9700: 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66  s1_3 = 0;.#endif
9710: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c  ..    if (objc <
9720: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
9730: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
9740: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
9750: 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09  l ?options?");..
9760: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9770: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
9780: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
9790: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
97a0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
97b0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
97c0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
97d0: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20   NULL), NULL);. 
97e0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
97f0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
9800: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
9810: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
9820: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
9830: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
9840: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
9850: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
9860: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
9870: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f  l(chan);..    fo
9880: 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20  r (idx = 2; idx 
9890: 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b  < objc; idx++) {
98a0: 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63  ..char *opt = Tc
98b0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
98c0: 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55  bj(objv[idx], NU
98d0: 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30  LL);...if (opt[0
98e0: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62  ] != '-')..    b
98f0: 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22  reak;...OPTOBJ("
9900: 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09  -alpn", alpn);..
9910: 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c  OPTSTR("-cadir",
9920: 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52   CAdir);..OPTSTR
9930: 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69  ("-cafile", CAfi
9940: 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d  le);..OPTBYTE("-
9950: 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72  cert", cert, cer
9960: 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28  t_len);..OPTSTR(
9970: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72  "-certfile", cer
9980: 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28  tfile);..OPTSTR(
9990: 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65  "-cipher", ciphe
99a0: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  rs);..OPTSTR("-c
99b0: 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73  iphers", ciphers
99c0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70  );..OPTSTR("-cip
99d0: 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68  hersuites", ciph
99e0: 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f  ersuites);..OPTO
99f0: 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73  BJ("-command", s
9a00: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28  cript);..OPTSTR(
9a10: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70  "-dhparams", DHp
9a20: 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45  arams);..OPTBYTE
9a30: 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65  ("-key", key, ke
9a40: 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28  y_len);..OPTSTR(
9a50: 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66  "-keyfile", keyf
9a60: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ile);..OPTSTR("-
9a70: 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a  model", model);.
9a80: 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f  .OPTOBJ("-passwo
9a90: 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a  rd", password);.
9aa0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f  .OPTBOOL("-post_
9ab0: 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74  handshake", post
9ac0: 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50  _handshake);..OP
9ad0: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22  TBOOL("-request"
9ae0: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54  , request);..OPT
9af0: 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c  BOOL("-require",
9b00: 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49   require);..OPTI
9b10: 4e 54 28 22 2d 73 65 63 75 72 69 74 79 6c 65 76  NT("-securitylev
9b20: 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50  el", level);..OP
9b30: 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c  TBOOL("-server",
9b40: 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54   server);..OPTST
9b50: 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c  R("-servername",
9b60: 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f   servername);..O
9b70: 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f  PTSTR("-session_
9b80: 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29  id", session_id)
9b90: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c  ;..OPTBOOL("-ssl
9ba0: 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42  2", ssl2);..OPTB
9bb0: 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c  OOL("-ssl3", ssl
9bc0: 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74  3);..OPTBOOL("-t
9bd0: 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50  ls1", tls1);..OP
9be0: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c  TBOOL("-tls1.1",
9bf0: 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f   tls1_1);..OPTBO
9c00: 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c  OL("-tls1.2", tl
9c10: 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  s1_2);..OPTBOOL(
9c20: 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f  "-tls1.3", tls1_
9c30: 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61  3);..OPTOBJ("-va
9c40: 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20  lidatecommand", 
9c50: 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  vcmd);..OPTOBJ("
9c60: 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a  -vcmd", vcmd);..
9c70: 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22  .OPTBAD("option"
9c80: 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72  , "-alpn, -cadir
9c90: 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74  , -cafile, -cert
9ca0: 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69  , -certfile, -ci
9cb0: 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69  pher, -ciphersui
9cc0: 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d  tes, -command, -
9cd0: 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20  dhparams, -key, 
9ce0: 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c  -keyfile, -model
9cf0: 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f  , -password, -po
9d00: 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72  st_handshake, -r
9d10: 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65  equest, -require
9d20: 2c 20 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c  , -securitylevel
9d30: 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76  , -server, -serv
9d40: 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e  ername, -session
9d50: 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c  _id, -ssl2, -ssl
9d60: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e  3, -tls1, -tls1.
9d70: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73  1, -tls1.2, -tls
9d80: 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74  1.3, or -validat
9d90: 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65  ecommand");...re
9da0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9db0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65      }.    if (re
9dc0: 71 75 65 73 74 29 09 09 76 65 72 69 66 79 20 7c  quest)..verify |
9dd0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49  = SSL_VERIFY_CLI
9de0: 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56  ENT_ONCE | SSL_V
9df0: 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20  ERIFY_PEER;.    
9e00: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72  if (request && r
9e10: 65 71 75 69 72 65 29 09 76 65 72 69 66 79 20 7c  equire).verify |
9e20: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49  = SSL_VERIFY_FAI
9e30: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52  L_IF_NO_PEER_CER
9e40: 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65  T;.    if (reque
9e50: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
9e60: 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20  hake).verify |= 
9e70: 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f  SSL_VERIFY_POST_
9e80: 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69  HANDSHAKE;.    i
9e90: 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09  f (verify == 0).
9ea0: 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45  .verify = SSL_VE
9eb0: 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20  RIFY_NONE;..    
9ec0: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f  proto |= (ssl2 ?
9ed0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20   TLS_PROTO_SSL2 
9ee0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
9ef0: 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50  |= (ssl3 ? TLS_P
9f00: 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a  ROTO_SSL3 : 0);.
9f10: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
9f20: 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  s1 ? TLS_PROTO_T
9f30: 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  LS1 : 0);.    pr
9f40: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f  oto |= (tls1_1 ?
9f50: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
9f60: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  1 : 0);.    prot
9f70: 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54  o |= (tls1_2 ? T
9f80: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20  LS_PROTO_TLS1_2 
9f90: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
9fa0: 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53  |= (tls1_3 ? TLS
9fb0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20  _PROTO_TLS1_3 : 
9fc0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65  0);..    /* rese
9fd0: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61  t to NULL if bla
9fe0: 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64  nk string provid
9ff0: 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65  ed */.    if (ce
a000: 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20  rt && !*cert).. 
a010: 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20         cert.    
a020: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a030: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79  if (key && !*key
a040: 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20  )..        key. 
a050: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a060: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20     if (certfile 
a070: 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20  && !*certfile)  
a080: 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09         certfile.
a090: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a0a0: 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79  keyfile && !*key
a0b0: 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20  file)..keyfile. 
a0c0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a0d0: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26     if (ciphers &
a0e0: 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20  & !*ciphers).   
a0f0: 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20       ciphers.   
a100: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
a110: 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65   if (ciphersuite
a120: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69  s && !*ciphersui
a130: 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65  tes) ciphersuite
a140: 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  s    = NULL;.   
a150: 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21   if (CAfile && !
a160: 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20  *CAfile).       
a170: 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20   CAfile.        
a180: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a190: 43 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72  CAdir && !*CAdir
a1a0: 29 09 20 20 20 20 20 20 20 20 43 41 64 69 72 09  ).        CAdir.
a1b0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a1c0: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
a1d0: 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09   && !*DHparams).
a1e0: 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73          DHparams
a1f0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a200: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20  .    /* new SSL 
a210: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61  state */.    sta
a220: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20  tePtr..= (State 
a230: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69  *) ckalloc((unsi
a240: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61  gned) sizeof(Sta
a250: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  te));.    memset
a260: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69  (statePtr, 0, si
a270: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20  zeof(State));.. 
a280: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
a290: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs.= flags;.    
a2a0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
a2b0: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73  .= interp;.    s
a2c0: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09  tatePtr->vflags.
a2d0: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74  = verify;.    st
a2e0: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22  atePtr->err.= ""
a2f0: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  ;..    /* alloca
a300: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20  te script */.   
a310: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09   if (script) {..
a320: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
a330: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69  ringFromObj(scri
a340: 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  pt, &len);..if (
a350: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
a360: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
a370: 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63   script;..    Tc
a380: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
a390: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
a3a0: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  k);..}.    }..  
a3b0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61    /* allocate pa
a3c0: 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66  ssword */.    if
a3d0: 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28   (password) {..(
a3e0: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72  void) Tcl_GetStr
a3f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77  ingFromObj(passw
a400: 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ord, &len);..if 
a410: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
a420: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
a430: 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20  = password;..   
a440: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
a450: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
a460: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  word);..}.    }.
a470: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
a480: 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e   validate comman
a490: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d  d */.    if (vcm
a4a0: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  d) {..(void) Tcl
a4b0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a4c0: 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09  j(vcmd, &len);..
a4d0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
a4e0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
a4f0: 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f   vcmd;..    Tcl_
a500: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
a510: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d  tePtr->vcmd);..}
a520: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
a530: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b  model != NULL) {
a540: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20  ..int mode;../* 
a550: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20  Get the "model" 
a560: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e  context */..chan
a570: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
a580: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c  l(interp, model,
a590: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68   &mode);..if (ch
a5a0: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
a5b0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20  el) NULL) {..   
a5c0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
a5d0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
a5e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a5f0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  ROR;..}.../*.. *
a600: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
a610: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
a620: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a  most channel.. *
a630: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  /..chan = Tcl_Ge
a640: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
a650: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43  );..if (Tcl_GetC
a660: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
a670: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
a680: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63  ype()) {..    Tc
a690: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a6a0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
a6b0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
a6c0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
a6d0: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
a6e0: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  TLS channel", NU
a6f0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
a700: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
a710: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
a720: 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  T", "CHANNEL", "
a730: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
a740: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
a750: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
a760: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
a770: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a780: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53  R;..}..ctx = ((S
a790: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
a7a0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
a7b0: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20  a(chan))->ctx;. 
a7c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
a7d0: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74  ((ctx = CTX_Init
a7e0: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65  (statePtr, serve
a7f0: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c  r, proto, keyfil
a800: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79  e, certfile, key
a810: 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c  , cert, key_len,
a820: 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20  ..    cert_len, 
a830: 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63  CAdir, CAfile, c
a840: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 73 75  iphers, ciphersu
a850: 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70  ites, level, DHp
a860: 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29  arams)) == NULL)
a870: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65   {..    Tls_Free
a880: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
a890: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
a8a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
a8b0: 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50     }..    stateP
a8c0: 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a  tr->ctx = ctx;..
a8d0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65      /*.     * We
a8e0: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
a8f0: 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e  re that the chan
a900: 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e  nel works in bin
a910: 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20  ary (for the.   
a920: 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e    * encryption n
a930: 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64  ot to get goofed
a940: 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20   up)..     * We 
a950: 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a  only want to adj
a960: 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e  ust the bufferin
a970: 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e  g in pre-v2 chan
a980: 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20  nels, where.    
a990: 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20   * each channel 
a9a0: 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69  in the stack mai
a9b0: 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20  ntained its own 
a9c0: 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f  buffers..     */
a9d0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
a9e0: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
a9f0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
aa00: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
aa10: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
aa20: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20  lBlocking);.    
aa30: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
aa40: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
aa50: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  Char);.    Tcl_D
aa60: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
aa70: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
aa80: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
aa90: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
aaa0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63  rp, chan, "-eofc
aab0: 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e  har", &upperChan
aac0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
aad0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
aae0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
aaf0: 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c  an, "-encoding",
ab00: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e   &upperChannelEn
ab10: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  coding);.    Tcl
ab20: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
ab30: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
ab40: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20  "-translation", 
ab50: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
ab60: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54  nslation);.    T
ab70: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
ab80: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
ab90: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26  , "-blocking", &
aba0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
abb0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53  king);.    Tcl_S
abc0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
abd0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
abe0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62  translation", "b
abf0: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c  inary");.    Tcl
ac00: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
ac10: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
ac20: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72  "-blocking", "tr
ac30: 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  ue");.    dprint
ac40: 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c  f("Consuming Tcl
ac50: 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63   channel %s", Tc
ac60: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
ac70: 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61  (chan));.    sta
ac80: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63  tePtr->self = Tc
ac90: 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69  l_StackChannel(i
aca0: 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e  nterp, Tls_Chann
acb0: 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e  elType(), (Clien
acc0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c  tData) statePtr,
acd0: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c   (TCL_READABLE |
ace0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20   TCL_WRITABLE), 
acf0: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e  chan);.    dprin
ad00: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e  tf("Created chan
ad10: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54  nel named %s", T
ad20: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
ad30: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
ad40: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74  ));.    if (stat
ad50: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
ad60: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
ad70: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75  ) {../*.. * No u
ad80: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75  se of Tcl_Eventu
ad90: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65  allyFree because
ada0: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c   no possible Tcl
adb0: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a  _Preserve... */.
adc0: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20  .Tls_Free((char 
add0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72  *) statePtr);..r
ade0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
adf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
ae00: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
ae10: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
ae20: 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73  r->self, "-trans
ae30: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74  lation", Tcl_DSt
ae40: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
ae50: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
ae60: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  on));.    Tcl_Se
ae70: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
ae80: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
ae90: 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e  >self, "-encodin
aea0: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  g", Tcl_DStringV
aeb0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
aec0: 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20  elEncoding));.  
aed0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
aee0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
aef0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
af00: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44  -eofchar", Tcl_D
af10: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
af20: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
af30: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ));.    Tcl_SetC
af40: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
af50: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
af60: 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22  elf, "-blocking"
af70: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
af80: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
af90: 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20  Blocking));..   
afa0: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49   /*.     * SSL I
afb0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
afc0: 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50     */.    stateP
afd0: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65  tr->ssl = SSL_ne
afe0: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  w(statePtr->ctx)
aff0: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65  ;.    if (!state
b000: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20  Ptr->ssl) {../* 
b010: 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f  SSL library erro
b020: 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64  r */..Tcl_Append
b030: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b040: 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75  couldn't constru
b050: 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20  ct ssl session: 
b060: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  ", REASON(), (ch
b070: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b080: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
b090: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b0a0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49  , "IMPORT", "INI
b0b0: 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  T", "FAILED", (c
b0c0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54  har *) NULL);..T
b0d0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
b0e0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74   statePtr);..ret
b0f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b100: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
b110: 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d   host server nam
b120: 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72  e */.    if (ser
b130: 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53  vername) {../* S
b140: 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e  ets the server n
b150: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28  ame indication (
b160: 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65  SNI) in ClientHe
b170: 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f  llo extension */
b180: 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36  ../* Per RFC 606
b190: 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61  6, hostname is a
b1a0: 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73   ASCII encoded s
b1b0: 74 72 69 6e 67 2e 20 2a 2f 0a 09 69 66 20 28 21  tring. */..if (!
b1c0: 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68  SSL_set_tlsext_h
b1d0: 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74  ost_name(statePt
b1e0: 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61  r->ssl, serverna
b1f0: 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20  me) && require) 
b200: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
b210: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b220: 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73  "setting TLS hos
b230: 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e  t name extension
b240: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20   failed", (char 
b250: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b260: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b270: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b280: 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20  IMPORT", "SNI", 
b290: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b2a0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b2b0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
b2c0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
b2d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b2e0: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 66 69  R;..}.../* Confi
b2f0: 67 75 72 65 20 73 65 72 76 65 72 20 68 6f 73 74  gure server host
b300: 20 6e 61 6d 65 20 63 68 65 63 6b 73 20 69 6e 20   name checks in 
b310: 74 68 65 20 53 53 4c 20 63 6c 69 65 6e 74 2e 20  the SSL client. 
b320: 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65  Set DNS hostname
b330: 20 74 6f 0a 09 20 20 20 6e 61 6d 65 20 66 6f 72   to..   name for
b340: 20 70 65 65 72 20 63 65 72 74 69 66 69 63 61 74   peer certificat
b350: 65 20 63 68 65 63 6b 73 2e 20 53 53 4c 5f 73 65  e checks. SSL_se
b360: 74 31 5f 68 6f 73 74 20 68 61 73 20 6c 69 6d 69  t1_host has limi
b370: 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20  tations. */..if 
b380: 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28  (!SSL_add1_host(
b390: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73  statePtr->ssl, s
b3a0: 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20  ervername)) {.. 
b3b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
b3c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74  ult(interp, "set
b3d0: 74 69 6e 67 20 44 4e 53 20 68 6f 73 74 20 6e 61  ting DNS host na
b3e0: 6d 65 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61  me failed", (cha
b3f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
b400: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
b410: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
b420: 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54   "IMPORT", "HOST
b430: 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c  NAME", "FAILED",
b440: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
b450: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
b460: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
b470: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
b480: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
b490: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d   }..    /* Resum
b4a0: 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a  e session id */.
b4b0: 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f      if (session_
b4c0: 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73  id && strlen(ses
b4d0: 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f  sion_id) <= SSL_
b4e0: 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47  MAX_SID_CTX_LENG
b4f0: 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65  TH) {../* SSL_se
b500: 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09  t_session() */..
b510: 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e  if (!SSL_SESSION
b520: 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74  _set1_id_context
b530: 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e  (SSL_get_session
b540: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
b550: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e   session_id, (un
b560: 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c  signed int) strl
b570: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29  en(session_id)))
b580: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
b590: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b5a0: 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e   "Resume session
b5b0: 20 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69   id ", session_i
b5c0: 64 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 63  d, " failed", (c
b5d0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
b5e0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
b5f0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
b600: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45  ", "IMPORT", "SE
b610: 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22  SSION", "FAILED"
b620: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b630: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c  ;.            Tl
b640: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
b650: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20  statePtr);.     
b660: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
b670: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
b680: 7d 0a 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29  }..    if (alpn)
b690: 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61   {../* Convert a
b6a0: 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61   TCL list into a
b6b0: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69   protocol-list i
b6c0: 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f  n wire-format */
b6d0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
b6e0: 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e  *protos, *p;..un
b6f0: 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f  signed int proto
b700: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74 20  s_len = 0;..int 
b710: 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54 63  i, len, cnt;..Tc
b720: 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09  l_Obj **list;...
b730: 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  if (Tcl_ListObjG
b740: 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72  etElements(inter
b750: 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26  p, alpn, &cnt, &
b760: 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  list) != TCL_OK)
b770: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65   {..    Tls_Free
b780: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
b790: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
b7a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
b7b0: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  ./* Determine th
b7c0: 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65  e memory require
b7d0: 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63  d for the protoc
b7e0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20  ol-list */..for 
b7f0: 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b  (i = 0; i < cnt;
b800: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c   i++) {..    Tcl
b810: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
b820: 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29  j(list[i], &len)
b830: 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e  ;..    if (len >
b840: 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70   255) {...Tcl_Ap
b850: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b860: 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f  p, "ALPN protoco
b870: 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22  l name too long"
b880: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b890: 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  ;...Tcl_SetError
b8a0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
b8b0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41  S", "IMPORT", "A
b8c0: 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  LPN", "FAILED", 
b8d0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
b8e0: 09 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72  ..Tls_Free((char
b8f0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b900: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
b910: 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70  R;..    }..    p
b920: 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b  rotos_len += 1 +
b930: 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75   len;..}.../* Bu
b940: 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ild the complete
b950: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a   protocol-list *
b960: 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c  /..protos = ckal
b970: 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b  loc(protos_len);
b980: 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69  ../* protocol-li
b990: 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38  sts consist of 8
b9a0: 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66  -bit length-pref
b9b0: 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e  ixed, byte strin
b9c0: 67 73 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20  gs */..for (i = 
b9d0: 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 69  0, p = protos; i
b9e0: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09   < cnt; i++) {..
b9f0: 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20      char *str = 
ba00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ba10: 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c  mObj(list[i], &l
ba20: 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d  en);..    *p++ =
ba30: 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70   len;..    memcp
ba40: 79 28 70 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a  y(p, str, len);.
ba50: 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09  .    p += len;..
ba60: 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61  }.../* SSL_set_a
ba70: 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73  lpn_protos makes
ba80: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
ba90: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
baa0: 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66  ./* Note: This f
bab0: 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 73 65  unctions reverse
bac0: 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  s the return val
bad0: 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f  ue convention */
bae0: 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c  ..if (SSL_set_al
baf0: 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50  pn_protos(stateP
bb00: 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c  tr->ssl, protos,
bb10: 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a   protos_len)) {.
bb20: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
bb30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 66  esult(interp, "f
bb40: 61 69 6c 65 64 20 74 6f 20 73 65 74 20 41 4c 50  ailed to set ALP
bb50: 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63  N protocols", (c
bb60: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
bb70: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
bb80: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
bb90: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c  ", "IMPORT", "AL
bba0: 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  PN", "FAILED", (
bbb0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
bbc0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
bbd0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
bbe0: 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f  ..    ckfree(pro
bbf0: 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72  tos);..    retur
bc00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
bc10: 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f  ../* Store proto
bc20: 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74  cols list */..st
bc30: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d  atePtr->protos =
bc40: 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50   protos;..stateP
bc50: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d  tr->protos_len =
bc60: 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20   protos_len;.   
bc70: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65   } else {..state
bc80: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55  Ptr->protos = NU
bc90: 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  LL;..statePtr->p
bca0: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20  rotos_len = 0;. 
bcb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
bcc0: 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b    * SSL Callback
bcd0: 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 53  s.     */.    SS
bce0: 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73  L_set_app_data(s
bcf0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76  tatePtr->ssl, (v
bd00: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
bd10: 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74  ./* point back t
bd20: 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  o us */.    SSL_
bd30: 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 65  set_verify(state
bd40: 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79  Ptr->ssl, verify
bd50: 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  , VerifyCallback
bd60: 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 69  );.    SSL_set_i
bd70: 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  nfo_callback(sta
bd80: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f  tePtr->ssl, Info
bd90: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20  Callback);..    
bda0: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  /* Callback for 
bdb0: 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f 63  observing protoc
bdc0: 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23  ol messages */.#
bdd0: 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e  ifndef OPENSSL_N
bde0: 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 20  O_SSL_TRACE.    
bdf0: 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f  /* void SSL_CTX_
be00: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
be10: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63  _arg(statePtr->c
be20: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
be30: 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 20  ePtr);.    void 
be40: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f  SSL_CTX_set_msg_
be50: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
be60: 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 43  r->ctx, MessageC
be70: 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20  allback); */.   
be80: 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c   SSL_set_msg_cal
be90: 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50  lback_arg(stateP
bea0: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a  tr->ssl, (void *
beb0: 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20  )statePtr);.    
bec0: 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  SSL_set_msg_call
bed0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73  back(statePtr->s
bee0: 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  sl, MessageCallb
bef0: 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ack);.#endif..  
bf00: 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f    /* Create Tcl_
bf10: 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64  Channel BIO Hand
bf20: 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  ler */.    state
bf30: 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f  Ptr->p_bio.= BIO
bf40: 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74  _new_tcl(statePt
bf50: 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b  r, BIO_NOCLOSE);
bf60: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62  .    statePtr->b
bf70: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f  io.= BIO_new(BIO
bf80: 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20  _f_ssl());..    
bf90: 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f  if (server) {../
bfa0: 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63  * Server callbac
bfb0: 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  ks */..SSL_CTX_s
bfc0: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72  et_tlsext_server
bfd0: 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74  name_arg(statePt
bfe0: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29  r->ctx, (void *)
bff0: 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f  statePtr);..SSL_
c000: 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73  CTX_set_tlsext_s
c010: 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61  ervername_callba
c020: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ck(statePtr->ctx
c030: 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a  , SNICallback);.
c040: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69  .SSL_CTX_set_cli
c050: 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61  ent_hello_cb(sta
c060: 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c  tePtr->ctx, Hell
c070: 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  oCallback, (void
c080: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 69   *)statePtr);..i
c090: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
c0a0: 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tos != NULL) {..
c0b0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
c0c0: 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73  alpn_select_cb(s
c0d0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c  tatePtr->ctx, AL
c0e0: 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  PNCallback, (voi
c0f0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23  d *)statePtr);.#
c100: 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20  ifdef USE_NPN.. 
c110: 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d     if (tls1_2 ==
c120: 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20   0 && tls1_3 == 
c130: 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73  0) {...SSL_CTX_s
c140: 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61  et_next_protos_a
c150: 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 74 61  dvertised_cb(sta
c160: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43  tePtr->ctx, NPNC
c170: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
c180: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20  )statePtr);..   
c190: 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f   }.#endif..}.../
c1a0: 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72 20  * Enable server 
c1b0: 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65 71  to send cert req
c1c0: 75 65 73 74 20 61 66 74 65 72 20 68 61 6e 64 73  uest after hands
c1d0: 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e  hake (TLS 1.3 on
c1e0: 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69  ly) */../* A wri
c1f0: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73  te operation mus
c200: 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f 72  t take place for
c210: 20 74 68 65 20 43 65 72 74 69 66 69 63 61 74 65   the Certificate
c220: 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a 09   Request to be..
c230: 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20 63     sent to the c
c240: 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e 20  lient, this can 
c250: 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53 4c  be done with SSL
c260: 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e  _do_handshake().
c270: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74   */..if (request
c280: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
c290: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76  ke) {..    SSL_v
c2a0: 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73  erify_client_pos
c2b0: 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74  t_handshake(stat
c2c0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a  ePtr->ssl);..}..
c2d0: 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d  ./* Set server m
c2e0: 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72  ode */..statePtr
c2f0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
c300: 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f  CL_SERVER;..SSL_
c310: 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65  set_accept_state
c320: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
c330: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f  .    } else {../
c340: 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63  * Client callbac
c350: 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45  ks */.#ifdef USE
c360: 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50  _NPN..if (stateP
c370: 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55  tr->protos != NU
c380: 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20  LL && tls1_2 == 
c390: 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30  0 && tls1_3 == 0
c3a0: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  ) {..    SSL_CTX
c3b0: 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f  _set_next_proto_
c3c0: 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50  select_cb(stateP
c3d0: 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c  tr->ctx, ALPNCal
c3e0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
c3f0: 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e  tatePtr);..}.#en
c400: 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  dif.../* Session
c410: 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c   caching */..SSL
c420: 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e  _CTX_set_session
c430: 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74  _cache_mode(stat
c440: 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53  ePtr->ctx, SSL_S
c450: 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54  ESS_CACHE_CLIENT
c460: 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   | SSL_SESS_CACH
c470: 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54  E_NO_INTERNAL_ST
c480: 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ORE);..SSL_CTX_s
c490: 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73  ess_set_new_cb(s
c4a0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65  tatePtr->ctx, Se
c4b0: 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a  ssionCallback);.
c4c0: 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74  ../* Enable post
c4d0: 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65   handshake Authe
c4e0: 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73  ntication extens
c4f0: 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c  ion. TLS 1.3 onl
c500: 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a  y, not http/2. *
c510: 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26  /..if (request &
c520: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  & post_handshake
c530: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74  ) {..    SSL_set
c540: 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f  _post_handshake_
c550: 61 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73  auth(statePtr->s
c560: 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  sl, 1);..}.../* 
c570: 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20  Set client mode 
c580: 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e  */..SSL_set_conn
c590: 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 50  ect_state(stateP
c5a0: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a  tr->ssl);.    }.
c5b0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28      SSL_set_bio(
c5c0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73  statePtr->ssl, s
c5d0: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20  tatePtr->p_bio, 
c5e0: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29  statePtr->p_bio)
c5f0: 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73  ;.    BIO_set_ss
c600: 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c  l(statePtr->bio,
c610: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20   statePtr->ssl, 
c620: 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20  BIO_NOCLOSE);.. 
c630: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64     /*.     * End
c640: 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20   of SSL Init.   
c650: 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66    */.    dprintf
c660: 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c  ("Returning %s",
c670: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
c680: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
c690: 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  lf));.    Tcl_Se
c6a0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
c6b0: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
c6c0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
c6d0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c  ePtr->self), TCL
c6e0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20  _VOLATILE);..   
c6f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
c700: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
c710: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a  ientData;.}.../*
c720: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
c730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c760: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69  ------. *. * Uni
c770: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20  mportObjCmd --. 
c780: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
c790: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ure is invoked t
c7a0: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70  o remove the top
c7b0: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c  most channel fil
c7c0: 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ter.. *. * Resul
c7d0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
c7e0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
c7f0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
c800: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20  :. *.May modify 
c810: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
c820: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20  an IO channel.. 
c830: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
c840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c870: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
c880: 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f  ic int.UnimportO
c890: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
c8a0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
c8b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
c8c0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
c8d0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
c8e0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
c8f0: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
c900: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
c910: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a   a mode on. */..
c920: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
c930: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
c940: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
c950: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
c960: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
c970: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74  "channel");..ret
c980: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c990: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d     }..    chan =
c9a0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
c9b0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
c9c0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
c9d0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
c9e0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
c9f0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
ca00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ca10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
ca20: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
ca30: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
ca40: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
ca50: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
ca60: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
ca70: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ..    if (Tcl_Ge
ca80: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
ca90: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
caa0: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f  lType()) {..Tcl_
cab0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
cac0: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
cad0: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
cae0: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
caf0: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c  ..."\": not a TL
cb00: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
cb10: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
cb20: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
cb30: 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52   "TLS", "UNIMPOR
cb40: 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  T", "CHANNEL", "
cb50: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
cb60: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
cb70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
cb80: 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   }..    if (Tcl_
cb90: 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69  UnstackChannel(i
cba0: 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20  nterp, chan) == 
cbb0: 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65  TCL_ERROR) {..re
cbc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
cbd0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72      }..    retur
cbe0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
cbf0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
cc00: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ta;.}.../*. *---
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc50: 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20  . *. * CTX_Init 
cc60: 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53  -- construct a S
cc70: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a  SL_CTX instance.
cc80: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
cc90: 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54  *.A valid SSL_CT
cca0: 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55  X instance or NU
ccb0: 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  LL.. *. * Side e
ccc0: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74  ffects:. *.const
ccd0: 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78  ructs SSL contex
cce0: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d  t (CTX). *. *---
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd30: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f  . */.static SSL_
cd40: 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53  CTX *.CTX_Init(S
cd50: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
cd60: 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e  int isServer, in
cd70: 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b  t proto, char *k
cd80: 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65  eyfile, char *ce
cd90: 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69  rtfile,.    unsi
cda0: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20  gned char *key, 
cdb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
cdc0: 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e  ert, int key_len
cdd0: 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20  , int cert_len, 
cde0: 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 20  char *CAdir,.   
cdf0: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63   char *CAfile, c
ce00: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68  har *ciphers, ch
ce10: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73  ar *ciphersuites
ce20: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61  , int level, cha
ce30: 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20  r *DHparams) {. 
ce40: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
ce50: 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72  nterp = statePtr
ce60: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53  ->interp;.    SS
ce70: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c  L_CTX *ctx = NUL
ce80: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  L;.    Tcl_DStri
ce90: 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44  ng ds;.    Tcl_D
cea0: 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20  String ds1;.    
ceb0: 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20  int off = 0;.   
cec0: 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74   int load_privat
ced0: 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74  e_key;.    const
cee0: 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74   SSL_METHOD *met
cef0: 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  hod;..    dprint
cf00: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
cf10: 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a    if (!proto) {.
cf20: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
cf30: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61  t(interp, "no va
cf40: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  lid protocol sel
cf50: 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  ected", NULL);..
cf60: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
cf70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74   }..    /* creat
cf80: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f  e SSL context */
cf90: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
cfa0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30  SION_NUMBER >= 0
cfb0: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65  x10100000L || de
cfc0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c  fined(NO_SSL2) |
cfd0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
cfe0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69  L_NO_SSL2).    i
cff0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
d000: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  , TLS_PROTO_SSL2
d010: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
d020: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d030: 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  SSL2 protocol no
d040: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
d050: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d060: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
d070: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53  #if defined(NO_S
d080: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL3) || defined(
d090: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
d0a0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
d0b0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d0c0: 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f  O_SSL3)) {..Tcl_
d0d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d0e0: 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f  erp, "SSL3 proto
d0f0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
d100: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  d", NULL);..retu
d110: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
d120: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
d130: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
d140: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d150: 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45  _TLS1).    if (E
d160: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d170: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b  S_PROTO_TLS1)) {
d180: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d190: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
d1a0: 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.0 protocol not
d1b0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
d1c0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
d1d0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
d1e0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
d1f0: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
d200: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d210: 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  _1).    if (ENAB
d220: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d230: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a  ROTO_TLS1_1)) {.
d240: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d250: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
d260: 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .1 protocol not 
d270: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
d280: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
d290: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
d2a0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
d2b0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
d2c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d2d0: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  2).    if (ENABL
d2e0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
d2f0: 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09  OTO_TLS1_2)) {..
d300: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d310: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
d320: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  2 protocol not s
d330: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
d340: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d350: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
d360: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
d370: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
d380: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
d390: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d3a0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d3b0: 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54  TO_TLS1_3)) {..T
d3c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d3d0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33  interp, "TLS 1.3
d3e0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
d3f0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
d400: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
d410: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
d420: 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20   switch (proto) 
d430: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  {.#if OPENSSL_VE
d440: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
d450: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
d460: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
d470: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d480: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
d490: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
d4a0: 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  SSL2:..method = 
d4b0: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32  isServer ? SSLv2
d4c0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
d4d0: 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f   : SSLv2_client_
d4e0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
d4f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
d500: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
d510: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d520: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  SL_NO_SSL3) && !
d530: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d540: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a  NO_SSL3_METHOD).
d550: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
d560: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64  TO_SSL3:..method
d570: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53   = isServer ? SS
d580: 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  Lv3_server_metho
d590: 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65  d() : SSLv3_clie
d5a0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
d5b0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
d5c0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
d5d0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d5e0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26  ENSSL_NO_TLS1) &
d5f0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d600: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f  SL_NO_TLS1_METHO
d610: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  D).    case TLS_
d620: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74  PROTO_TLS1:..met
d630: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
d640: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65   TLSv1_server_me
d650: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63  thod() : TLSv1_c
d660: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
d670: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
d680: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
d690: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
d6a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
d6b0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
d6c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d6d0: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_1_METHOD).    
d6e0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
d6f0: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d  LS1_1:..method =
d700: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
d710: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  1_1_server_metho
d720: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c  d() : TLSv1_1_cl
d730: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
d740: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
d750: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
d760: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
d770: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d780: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
d790: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d7a0: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  _2_METHOD).    c
d7b0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
d7c0: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  S1_2:..method = 
d7d0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31  isServer ? TLSv1
d7e0: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  _2_server_method
d7f0: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69  () : TLSv1_2_cli
d800: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
d810: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
d820: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
d830: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
d840: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d850: 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  _3).    case TLS
d860: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09  _PROTO_TLS1_3:..
d870: 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72  /* Use the gener
d880: 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f  ic method and co
d890: 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61  nstraint range a
d8a0: 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20  fter context is 
d8b0: 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68  created */..meth
d8c0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
d8d0: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  TLS_server_metho
d8e0: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74  d() : TLS_client
d8f0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
d900: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65  k;.#endif.    de
d910: 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74  fault:../* Negot
d920: 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61  iate highest ava
d930: 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76  ilable SSL/TLS v
d940: 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f  ersion */..metho
d950: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
d960: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  LS_server_method
d970: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f  () : TLS_client_
d980: 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50  method();.#if OP
d990: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
d9a0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
d9b0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
d9c0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
d9d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
d9e0: 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  SL2)..off |= (EN
d9f0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
da00: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f  _PROTO_SSL2)   ?
da10: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53   0 : SSL_OP_NO_S
da20: 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69  SLv2);.#endif.#i
da30: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
da40: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
da50: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
da60: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
da70: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
da80: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a  TO_SSL3)   ? 0 :
da90: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33   SSL_OP_NO_SSLv3
daa0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
dab0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
dac0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
dad0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66  SSL_NO_TLS1)..of
dae0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
daf0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
db00: 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c  LS1)   ? 0 : SSL
db10: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23  _OP_NO_TLSv1);.#
db20: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
db30: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  ed(NO_TLS1_1) &&
db40: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
db50: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66  L_NO_TLS1_1)..of
db60: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
db70: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
db80: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_1) ? 0 : SSL
db90: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b  _OP_NO_TLSv1_1);
dba0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
dbb0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
dbc0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
dbd0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09  SSL_NO_TLS1_2)..
dbe0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
dbf0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
dc00: 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53  _TLS1_2) ? 0 : S
dc10: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32  SL_OP_NO_TLSv1_2
dc20: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
dc30: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
dc40: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dc50: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
dc60: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
dc70: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
dc80: 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a  TO_TLS1_3) ? 0 :
dc90: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
dca0: 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65  _3);.#endif..bre
dcb0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  ak;.    }..    E
dcc0: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
dcd0: 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c  ;..    ctx = SSL
dce0: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29  _CTX_new(method)
dcf0: 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20  ;.    if (!ctx) 
dd00: 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  {..return(NULL);
dd10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
dd20: 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47  getenv(SSLKEYLOG
dd30: 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54  FILE)) {..SSL_CT
dd40: 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c  X_set_keylog_cal
dd50: 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f  lback(ctx, KeyLo
dd60: 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  gCallback);.    
dd70: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
dd80: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
dd90: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
dda0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66  O_TLS1_3).    if
ddb0: 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50   (proto == TLS_P
ddc0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09  ROTO_TLS1_3) {..
ddd0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f  SSL_CTX_set_min_
dde0: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
ddf0: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f  x, TLS1_3_VERSIO
de00: 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  N);..SSL_CTX_set
de10: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
de20: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
de30: 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23  ERSION);.    }.#
de40: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f  endif..    /* Fo
de50: 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63  rce cipher selec
de60: 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65  tion order by se
de70: 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28  rver */.    if (
de80: 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53  !isServer) {..SS
de90: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
dea0: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49  s(ctx, SSL_OP_CI
deb0: 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46  PHER_SERVER_PREF
dec0: 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a  ERENCE);.    }..
ded0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
dee0: 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76  app_data(ctx, (v
def0: 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a  oid*)interp);./*
df00: 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e   remember the in
df10: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20  terpreter */.   
df20: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74   SSL_CTX_set_opt
df30: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50  ions(ctx, SSL_OP
df40: 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53  _ALL);./* all SS
df50: 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64  L bug workaround
df60: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  s */.    SSL_CTX
df70: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
df80: 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61  , off);../* disa
df90: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72  ble protocol ver
dfa0: 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45  sions */.#if OPE
dfb0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
dfc0: 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 30  BER < 0x10101000
dfd0: 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  L.    SSL_CTX_se
dfe0: 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f  t_mode(ctx, SSL_
dff0: 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29  MODE_AUTO_RETRY)
e000: 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20  ;./* handle new 
e010: 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61  handshakes in ba
e020: 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20  ckground. On by 
e030: 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53  default in OpenS
e040: 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e  SL 1.1.1. */.#en
e050: 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  dif.    SSL_CTX_
e060: 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73  sess_set_cache_s
e070: 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a  ize(ctx, 128);..
e080: 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20      /* Set user 
e090: 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c  defined ciphers,
e0a0: 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c 20   cipher suites, 
e0b0: 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65 76  and security lev
e0c0: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63  el */.    if ((c
e0d0: 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20  iphers != NULL) 
e0e0: 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f  && !SSL_CTX_set_
e0f0: 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c  cipher_list(ctx,
e100: 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 54 63   ciphers)) {..Tc
e110: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e120: 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68  nterp, "Set ciph
e130: 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76  ers failed: No v
e140: 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28  alid ciphers", (
e150: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
e160: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
e170: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
e180: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28  .    }.    if ((
e190: 63 69 70 68 65 72 73 75 69 74 65 73 20 21 3d 20  ciphersuites != 
e1a0: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54  NULL) && !SSL_CT
e1b0: 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69 74  X_set_ciphersuit
e1c0: 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 73 75  es(ctx, ciphersu
e1d0: 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70  ites)) {..Tcl_Ap
e1e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e1f0: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 20 73  p, "Set cipher s
e200: 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f  uites failed: No
e210: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c   valid ciphers",
e220: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
e230: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
e240: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
e250: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  L;.    }..    /*
e260: 20 53 65 74 20 73 65 63 75 72 69 74 79 20 6c 65   Set security le
e270: 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c  vel */.    if (l
e280: 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76  evel > -1 && lev
e290: 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53  el < 6) {../* SS
e2a0: 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c  L_set_security_l
e2b0: 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  evel */..SSL_CTX
e2c0: 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65  _set_security_le
e2d0: 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b  vel(ctx, level);
e2e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73  .    }..    /* s
e2f0: 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b  et some callback
e300: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  s */.    SSL_CTX
e310: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73  _set_default_pas
e320: 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73  swd_cb(ctx, Pass
e330: 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  wordCallback);. 
e340: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64     SSL_CTX_set_d
e350: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62  efault_passwd_cb
e360: 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 28  _userdata(ctx, (
e370: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
e380: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61  ;..    /* read a
e390: 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20   Diffie-Hellman 
e3a0: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c  parameters file,
e3b0: 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 6c   or use the buil
e3c0: 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64  t-in one */.#ifd
e3d0: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48  ef OPENSSL_NO_DH
e3e0: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d  .    if (DHparam
e3f0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  s != NULL) {..Tc
e400: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e410: 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d  nterp, "DH param
e420: 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74  eter support not
e430: 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68   available", (ch
e440: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
e450: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e460: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
e470: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b     }.#else.    {
e480: 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44  ..DH* dh;..if (D
e490: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29  Hparams != NULL)
e4a0: 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f   {..    BIO *bio
e4b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ;..    Tcl_DStri
e4c0: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20  ngInit(&ds);..  
e4d0: 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f    bio = BIO_new_
e4e0: 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d  file(F2N(DHparam
e4f0: 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09  s, &ds), "r");..
e500: 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a      if (!bio) {.
e510: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
e520: 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70  e(&ds);...Tcl_Ap
e530: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e540: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69  p, "Could not fi
e550: 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73  nd DH parameters
e560: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29   file", (char *)
e570: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
e580: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
e590: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
e5a0: 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45   }...    dh = PE
e5b0: 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72  M_read_bio_DHpar
e5c0: 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e  ams(bio, NULL, N
e5d0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ULL, NULL);..   
e5e0: 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a   BIO_free(bio);.
e5f0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
e600: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20  Free(&ds);..    
e610: 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c  if (!dh) {...Tcl
e620: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e630: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74  terp, "Could not
e640: 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74   read DH paramet
e650: 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20  ers from file", 
e660: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
e670: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
e680: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
e690: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c  LL;..    }..} el
e6a0: 73 65 20 7b 0a 09 20 20 20 20 64 68 20 3d 20 67  se {..    dh = g
e6b0: 65 74 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a 09  et_dhParams();..
e6c0: 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74  }..SSL_CTX_set_t
e6d0: 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a  mp_dh(ctx, dh);.
e6e0: 09 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 20  .DH_free(dh);.  
e6f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
e700: 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69  /* set our certi
e710: 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f  ficate */.    lo
e720: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d  ad_private_key =
e730: 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74   0;.    if (cert
e740: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
e750: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65  .load_private_ke
e760: 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 74  y = 1;...Tcl_DSt
e770: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a  ringInit(&ds);..
e780: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
e790: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c  _certificate_fil
e7a0: 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66  e(ctx, F2N(certf
e7b0: 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46  ile, &ds), SSL_F
e7c0: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20  ILETYPE_PEM) <= 
e7d0: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53  0) {..    Tcl_DS
e7e0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
e7f0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e800: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
e810: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72  nable to set cer
e820: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c  tificate file ",
e830: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c   certfile, ": ",
e840: 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28  ....     REASON(
e850: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
e860: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
e870: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20  free(ctx);..    
e880: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a  return NULL;..}.
e890: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
e8a0: 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ert != NULL) {..
e8b0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
e8c0: 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43   = 1;..if (SSL_C
e8d0: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61  TX_use_certifica
e8e0: 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 72  te_ASN1(ctx, cer
e8f0: 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20  t_len, cert) <= 
e900: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53  0) {..    Tcl_DS
e910: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
e920: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e930: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
e940: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72  nable to set cer
e950: 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 09  tificate: ",....
e960: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28       REASON(), (
e970: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
e980: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
e990: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
e9a0: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20  rn NULL;..}.    
e9b0: 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69  } else {..certfi
e9c0: 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39  le = (char*)X509
e9d0: 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72  _get_default_cer
e9e0: 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28  t_file();...if (
e9f0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74  SSL_CTX_use_cert
ea00: 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78  ificate_file(ctx
ea10: 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f  , certfile, SSL_
ea20: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d  FILETYPE_PEM) <=
ea30: 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20   0) {.#if 0..   
ea40: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
ea50: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
ea60: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ea70: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
ea80: 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74  use default cert
ea90: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20  ificate file ", 
eaa0: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a  certfile, ": ",.
eab0: 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29  ...     REASON()
eac0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
ead0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
eae0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
eaf0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64  eturn NULL;.#end
eb00: 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  if..}.    }..   
eb10: 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76   /* set our priv
eb20: 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69  ate key */.    i
eb30: 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  f (load_private_
eb40: 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66  key) {..if (keyf
eb50: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b  ile == NULL && k
eb60: 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  ey == NULL) {.. 
eb70: 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72     keyfile = cer
eb80: 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28  tfile;..}...if (
eb90: 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  keyfile != NULL)
eba0: 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74   {..    /* get t
ebb0: 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61  he private key a
ebc0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
ebd0: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20  his certificate 
ebe0: 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66  */..    if (keyf
ebf0: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile == NULL) {..
ec00: 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66  .keyfile = certf
ec10: 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ile;..    }...  
ec20: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73    if (SSL_CTX_us
ec30: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c  e_PrivateKey_fil
ec40: 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69  e(ctx, F2N(keyfi
ec50: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49  le, &ds), SSL_FI
ec60: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
ec70: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  ) {...Tcl_DStrin
ec80: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a  gFree(&ds);.../*
ec90: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70   flush the passp
eca0: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68  hrase which migh
ecb0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  t be left in the
ecc0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c   result */...Tcl
ecd0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
ece0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41  p, NULL, TCL_STA
ecf0: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65  TIC);...Tcl_Appe
ed00: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ed10: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
ed20: 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20  public key file 
ed30: 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c  ", keyfile, " ",
ed40: 0a 09 09 09 20 20 20 20 20 20 20 20 20 52 45 41  ....         REA
ed50: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
ed60: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
ed70: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
ed80: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
ed90: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
eda0: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d  ngFree(&ds);...}
edb0: 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d   else if (key !=
edc0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66   NULL) {..    if
edd0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72   (SSL_CTX_use_Pr
ede0: 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56  ivateKey_ASN1(EV
edf0: 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c  P_PKEY_RSA, ctx,
ee00: 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d   key,key_len) <=
ee10: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72   0) {...Tcl_DStr
ee20: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09  ingFree(&ds);...
ee30: 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73  /* flush the pas
ee40: 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69  sphrase which mi
ee50: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74  ght be left in t
ee60: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54  he result */...T
ee70: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
ee80: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53  erp, NULL, TCL_S
ee90: 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70  TATIC);...Tcl_Ap
eea0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
eeb0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
eec0: 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c  t public key: ",
eed0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
eee0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c   *) NULL);...SSL
eef0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
ef00: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09  ..return NULL;..
ef10: 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77      }..}../* Now
ef20: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20   we know that a 
ef30: 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 76  key and cert hav
ef40: 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e  e been set again
ef50: 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63  st.. * the SSL c
ef60: 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21  ontext */..if (!
ef70: 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72  SSL_CTX_check_pr
ef80: 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20  ivate_key(ctx)) 
ef90: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
efa0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
efb0: 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f 65  "private key doe
efc0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
efd0: 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62 6c  certificate publ
efe0: 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 20  ic key",....    
eff0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
f000: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
f010: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
f020: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20  turn NULL;..}.  
f030: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
f040: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 43 41 73  verification CAs
f050: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72   */.    Tcl_DStr
f060: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20  ingInit(&ds);.  
f070: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
f080: 74 28 26 64 73 31 29 3b 0a 20 20 20 20 69 66 20  t(&ds1);.    if 
f090: 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76  (!SSL_CTX_load_v
f0a0: 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28  erify_locations(
f0b0: 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c  ctx, F2N(CAfile,
f0c0: 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72   &ds), F2N(CAdir
f0d0: 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53  , &ds1)) ||..!SS
f0e0: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
f0f0: 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63  t_verify_paths(c
f100: 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63  tx)) {.#if 0..Tc
f110: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f120: 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  s);..Tcl_DString
f130: 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20  Free(&ds1);../* 
f140: 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20  Don't currently 
f150: 63 61 72 65 20 69 66 20 74 68 69 73 20 66 61 69  care if this fai
f160: 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e  ls */..Tcl_Appen
f170: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f180: 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72  "SSL default ver
f190: 69 66 79 20 70 61 74 68 73 3a 20 22 2c 20 52 45  ify paths: ", RE
f1a0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
f1b0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58   NULL);..SSL_CTX
f1c0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
f1d0: 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  urn NULL;.#endif
f1e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 68  .    }..    /* h
f1f0: 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72  ttps://sourcefor
f200: 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67  ge.net/p/tls/bug
f210: 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20  s/57/ */.    /* 
f220: 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68  XXX:TODO: Let th
f230: 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61  e user supply va
f240: 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61  lues here instea
f250: 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74  d of something t
f260: 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68  hat exists on th
f270: 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a  e filesystem */.
f280: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 21      if (CAfile !
f290: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 43 4b  = NULL) {..STACK
f2a0: 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a  _OF(X509_NAME) *
f2b0: 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f  certNames = SSL_
f2c0: 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66  load_client_CA_f
f2d0: 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20  ile(F2N(CAfile, 
f2e0: 26 64 73 29 29 3b 0a 09 69 66 20 28 63 65 72 74  &ds));..if (cert
f2f0: 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  Names != NULL) {
f300: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
f310: 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74  t_client_CA_list
f320: 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29  (ctx, certNames)
f330: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
f340: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
f350: 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  &ds);.    Tcl_DS
f360: 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b  tringFree(&ds1);
f370: 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b  .    return ctx;
f380: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
f390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
f3d0: 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64  . * StatusObjCmd
f3e0: 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69   -- return certi
f3f0: 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65  ficate for conne
f400: 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a  cted peer.. *. *
f410: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
f420: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
f430: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
f440: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
f450: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
f460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
f4a0: 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f  atic int.StatusO
f4b0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
f4c0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
f4d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
f4e0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
f4f0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
f500: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
f510: 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30  tatePtr;.    X50
f520: 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c  9 *peer;.    Tcl
f530: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20  _Obj *objPtr;.  
f540: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
f550: 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68  an;.    char *ch
f560: 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68  annelName, *ciph
f570: 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64  ers;.    int mod
f580: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
f590: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74  igned char *prot
f5a0: 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  o;.    unsigned 
f5b0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74  int len;.    int
f5c0: 20 6e 69 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e   nid;..    dprin
f5d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
f5e0: 20 20 20 73 77 69 74 63 68 20 28 6f 62 6a 63 29     switch (objc)
f5f0: 20 7b 0a 09 63 61 73 65 20 32 3a 0a 09 20 20 20   {..case 2:..   
f600: 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54   channelName = T
f610: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
f620: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c  Obj(objv[1], NUL
f630: 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  L);..    break;.
f640: 0a 09 63 61 73 65 20 33 3a 0a 09 20 20 20 20 69  ..case 3:..    i
f650: 66 20 28 21 73 74 72 63 6d 70 20 28 54 63 6c 5f  f (!strcmp (Tcl_
f660: 47 65 74 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b  GetString (objv[
f670: 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20  1]), "-local")) 
f680: 7b 0a 09 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20  {...channelName 
f690: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f6a0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
f6b0: 4e 55 4c 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a  NULL);...break;.
f6c0: 09 20 20 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65  .    }..    /* e
f6d0: 6c 73 65 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68  lse fall-through
f6e0: 20 2e 2e 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69   ... */.#if defi
f6f0: 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 20  ned(__GNUC__).. 
f700: 20 20 20 5f 5f 61 74 74 72 69 62 75 74 65 5f 5f     __attribute__
f710: 28 28 66 61 6c 6c 74 68 72 6f 75 67 68 29 29 3b  ((fallthrough));
f720: 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74  .#endif..default
f730: 3a 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  :..    Tcl_Wrong
f740: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
f750: 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61  1, objv, "?-loca
f760: 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 20  l? channel");.. 
f770: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f780: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
f790: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
f7a0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68  annel(interp, ch
f7b0: 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65  annelName, &mode
f7c0: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
f7d0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
f7e0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
f7f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f800: 7d 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  }.    /* Make su
f810: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
f820: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
f830: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
f840: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
f850: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
f860: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
f870: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
f880: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
f890: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
f8a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f8b0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
f8c0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
f8d0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
f8e0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
f8f0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63  nel", NULL);..Tc
f900: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
f910: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53  nterp, "TLS", "S
f920: 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c  TATUS", "CHANNEL
f930: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
f940: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
f950: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f960: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65  .    }.    state
f970: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
f980: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
f990: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
f9a0: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65  ;..    /* Get ce
f9b0: 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 65  rtificate for pe
f9c0: 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20  er or self */.  
f9d0: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29    if (objc == 2)
f9e0: 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67   {..peer = SSL_g
f9f0: 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63  et_peer_certific
fa00: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
fa10: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  l);.    } else {
fa20: 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74  ..peer = SSL_get
fa30: 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61  _certificate(sta
fa40: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
fa50: 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35   }.    /* Get X5
fa60: 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69  09 certificate i
fa70: 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  nfo */.    if (p
fa80: 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d  eer) {..objPtr =
fa90: 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28   Tls_NewX509Obj(
faa0: 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09  interp, peer);..
fab0: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b  if (objc == 2) {
fac0: 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28  ..    X509_free(
fad0: 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72  peer);..    peer
fae0: 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20   = NULL;..}.    
faf0: 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72  } else {..objPtr
fb00: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
fb10: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  j(0, NULL);.    
fb20: 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 63  }..    /* Peer c
fb30: 65 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65 6e  ert chain (clien
fb40: 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 53  t only) */.    S
fb50: 54 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20 73  TACK_OF(X509)* s
fb60: 73 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f 67  sl_certs = SSL_g
fb70: 65 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68 61  et_peer_cert_cha
fb80: 69 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  in(statePtr->ssl
fb90: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 5f 63  );.    if (ssl_c
fba0: 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  erts == NULL || 
fbb0: 73 6b 5f 58 35 30 39 5f 6e 75 6d 28 73 73 6c 5f  sk_X509_num(ssl_
fbc0: 63 65 72 74 73 29 20 3d 3d 20 30 29 20 7b 0a 09  certs) == 0) {..
fbd0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
fbe0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
fbf0: 22 53 54 41 54 55 53 22 2c 20 22 43 45 52 54 49  "STATUS", "CERTI
fc00: 46 49 43 41 54 45 22 2c 20 28 63 68 61 72 20 2a  FICATE", (char *
fc10: 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 49 6e  ) NULL);..Tcl_In
fc20: 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 50 74  crRefCount(objPt
fc30: 72 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  r);..Tcl_DecrRef
fc40: 43 6f 75 6e 74 28 6f 62 6a 50 74 72 29 3b 0a 09  Count(objPtr);..
fc50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fc60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fc70: 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  Peer name */.   
fc80: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
fc90: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
fca0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
fcb0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72  wStringObj("peer
fcc0: 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20  name", -1));.   
fcd0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
fce0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
fcf0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
fd00: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67  wStringObj(SSL_g
fd10: 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61  et0_peername(sta
fd20: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29  tePtr->ssl), -1)
fd30: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
fd40: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fd50: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fd60: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
fd70: 6a 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29 3b  j("sbits", -1));
fd80: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
fd90: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
fda0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
fdb0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f  l_NewIntObj(SSL_
fdc0: 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28  get_cipher_bits(
fdd0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e  statePtr->ssl, N
fde0: 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63 69 70  ULL)));..    cip
fdf0: 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53  hers = (char*)SS
fe00: 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61  L_get_cipher(sta
fe10: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
fe20: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d   if ((ciphers !=
fe30: 20 4e 55 4c 4c 29 20 26 26 20 28 73 74 72 63 6d   NULL) && (strcm
fe40: 70 28 63 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e  p(ciphers, "(NON
fe50: 45 29 22 29 20 21 3d 20 30 29 29 20 7b 0a 09 54  E)") != 0)) {..T
fe60: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
fe70: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
fe80: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
fe90: 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72  tringObj("cipher
fea0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
feb0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
fec0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
fed0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
fee0: 4f 62 6a 28 63 69 70 68 65 72 73 2c 20 2d 31 29  Obj(ciphers, -1)
fef0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
ff00: 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39   Verify the X509
ff10: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65   certificate pre
ff20: 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65  sented by the pe
ff30: 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69  er */.    Tcl_Li
ff40: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ff50: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
ff60: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
ff70: 4f 62 6a 28 22 76 65 72 69 66 79 52 65 73 75 6c  Obj("verifyResul
ff80: 74 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  t", -1));.    Tc
ff90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
ffa0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
ffb0: 62 6a 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53  bjPtr,..Tcl_NewS
ffc0: 74 72 69 6e 67 4f 62 6a 28 58 35 30 39 5f 76 65  tringObj(X509_ve
ffd0: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f  rify_cert_error_
ffe0: 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76  string(SSL_get_v
fff0: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61  erify_result(sta
10000 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31  tePtr->ssl)), -1
10010 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69  ));..    /* Veri
10020 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 54  fy mode */.    T
10030 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10040 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10050 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
10060 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79  tringObj("verify
10070 4d 6f 64 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20  Mode", -1));.   
10080 20 2f 2a 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f   /* SSL_CTX_get_
10090 76 65 72 69 66 79 5f 6d 6f 64 65 28 63 74 78 29  verify_mode(ctx)
100a0 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53   */.    mode = S
100b0 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f  SL_get_verify_mo
100c0 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  de(statePtr->ssl
100d0 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20  );.    if (mode 
100e0 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f  && SSL_VERIFY_NO
100f0 4e 45 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f  NE) {..Tcl_ListO
10100 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10110 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10120 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10130 28 22 6e 6f 6e 65 22 2c 20 2d 31 29 29 3b 0a 20  ("none", -1));. 
10140 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
10150 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72  _Obj *listObjPtr
10160 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
10170 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  j(0, NULL);..if 
10180 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
10190 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20  IFY_PEER) {..   
101a0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
101b0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
101c0 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
101d0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
101e0 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  peer", -1));..}.
101f0 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
10200 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f  _VERIFY_FAIL_IF_
10210 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a  NO_PEER_CERT) {.
10220 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
10230 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10240 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72  terp, listObjPtr
10250 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10260 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70  bj("fail if no p
10270 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b  eer cert", -1));
10280 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  ..}..if (mode &&
10290 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45   SSL_VERIFY_CLIE
102a0 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20  NT_ONCE) {..    
102b0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
102c0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
102d0 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c   listObjPtr, Tcl
102e0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
102f0 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29  lient once", -1)
10300 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20  );..}..if (mode 
10310 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f  && SSL_VERIFY_PO
10320 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a  ST_HANDSHAKE) {.
10330 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
10340 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10350 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72  terp, listObjPtr
10360 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10370 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61  bj("post handsha
10380 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54  ke", -1));..}..T
10390 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
103a0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
103b0 6f 62 6a 50 74 72 2c 20 6c 69 73 74 4f 62 6a 50  objPtr, listObjP
103c0 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  tr);.    }..    
103d0 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64  /* Verify mode d
103e0 65 70 74 68 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  epth */.    Tcl_
103f0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10400 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10410 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10420 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 44 65 70  ngObj("verifyDep
10430 74 68 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 2f  th", -1));.    /
10440 2a 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 76 65  * SSL_CTX_get_ve
10450 72 69 66 79 5f 64 65 70 74 68 28 63 74 78 29 20  rify_depth(ctx) 
10460 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  */.    Tcl_ListO
10470 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10480 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10490 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53  Tcl_NewIntObj(SS
104a0 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70  L_get_verify_dep
104b0 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  th(statePtr->ssl
104c0 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70  )));..    /* Rep
104d0 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
104e0 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
104f0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67  esult of the neg
10500 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  otiation */.    
10510 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65  SSL_get0_alpn_se
10520 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d  lected(statePtr-
10530 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c  >ssl, &proto, &l
10540 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  en);.    Tcl_Lis
10550 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10560 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10570 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10580 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b  bj("alpn", -1));
10590 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
105a0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
105b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
105c0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
105d0 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69  char *)proto, (i
105e0 6e 74 29 20 6c 65 6e 29 29 3b 0a 20 20 20 20 54  nt) len));.    T
105f0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10600 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10610 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
10620 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63  tringObj("protoc
10630 6f 6c 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ol", -1));.    T
10640 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10650 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10660 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
10670 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74  tringObj(SSL_get
10680 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74  _version(statePt
10690 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a  r->ssl), -1));..
106a0 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72      /* Valid for
106b0 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75   non-RSA signatu
106c0 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a  re and TLS 1.3 *
106d0 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  /.    Tcl_ListOb
106e0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
106f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
10700 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10710 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c  "signatureHashAl
10720 67 6f 72 69 74 68 6d 22 2c 20 2d 31 29 29 3b 0a  gorithm", -1));.
10730 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20      if (objc == 
10740 32 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  2 ? SSL_get_peer
10750 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73  _signature_nid(s
10760 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e  tatePtr->ssl, &n
10770 69 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73 69  id) : SSL_get_si
10780 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
10790 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
107a0 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
107b0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
107c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
107d0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f  l_NewStringObj(O
107e0 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20  BJ_nid2ln(nid), 
107f0 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  -1));.    } else
10800 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
10810 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10820 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
10830 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22  _NewStringObj(""
10840 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20  , -1));.    }.  
10850 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10860 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10870 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10880 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67  ewStringObj("sig
10890 6e 61 74 75 72 65 54 79 70 65 22 2c 20 2d 31 29  natureType", -1)
108a0 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  );.    if (objc 
108b0 3d 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74 5f 70  == 2 ? SSL_get_p
108c0 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79  eer_signature_ty
108d0 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d  pe_nid(statePtr-
108e0 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 53 53  >ssl, &nid) : SS
108f0 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f  L_get_signature_
10900 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74  type_nid(statePt
10910 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b  r->ssl, &nid)) {
10920 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
10930 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10940 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10950 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f  ewStringObj(OBJ_
10960 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29  nid2ln(nid), -1)
10970 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
10980 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10990 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
109a0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
109b0 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d  wStringObj("", -
109c0 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  1));.    }..    
109d0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
109e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
109f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10a00 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  _OK;..clientData
10a10 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
10a20 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
10a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
10a70 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f  * ConnectionInfo
10a80 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e  ObjCmd -- return
10a90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f   connection info
10aa0 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20   from OpenSSL.. 
10ab0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
10ac0 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65  .A list of conne
10ad0 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20  ction info.  *. 
10ae0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
10af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b20 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
10b30 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49   int ConnectionI
10b40 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  nfoObjCmd(Client
10b50 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
10b60 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10b70 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
10b80 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
10b90 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
10ba0 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
10bb0 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
10bc0 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
10bd0 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
10be0 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65  atePtr;../* clie
10bf0 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
10c00 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54   socket */.    T
10c10 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20  cl_Obj *objPtr, 
10c20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f  *listPtr;.    co
10c30 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20  nst SSL *ssl;.  
10c40 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48    const SSL_CIPH
10c50 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20  ER *cipher;.    
10c60 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f  const SSL_SESSIO
10c70 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20  N *session;.    
10c80 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 20  long mode;..    
10c90 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
10ca0 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
10cb0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
10cc0 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
10cd0 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
10ce0 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  R);.    }..    c
10cf0 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
10d00 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
10d10 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10d20 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29  j(objv[1], NULL)
10d30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
10d40 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
10d50 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
10d60 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
10d70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10d80 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
10d90 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
10da0 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
10db0 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
10dc0 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
10dd0 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
10de0 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
10df0 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
10e00 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
10e10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10e20 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
10e30 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
10e40 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
10e50 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74  ),..    "\": not
10e60 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
10e70 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74   NULL);..Tcl_Set
10e80 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
10e90 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43  , "TLS", "CONNEC
10ea0 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22  TION", "CHANNEL"
10eb0 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
10ec0 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
10ed0 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
10ee0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50  .    }..    objP
10ef0 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
10f00 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  Obj(0, NULL);.. 
10f10 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
10f20 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61   info */.    sta
10f30 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
10f40 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  )Tcl_GetChannelI
10f50 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
10f60 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61  );.    ssl = sta
10f70 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20  tePtr->ssl;.    
10f80 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29  if (ssl != NULL)
10f90 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f   {../* connectio
10fa0 6e 20 73 74 61 74 65 20 2a 2f 0a 09 54 63 6c 5f  n state */..Tcl_
10fb0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10fc0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10fd0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10fe0 6e 67 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 2d  ngObj("state", -
10ff0 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
11000 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11010 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11020 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11030 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67  SSL_state_string
11040 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29  _long(ssl), -1))
11050 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72  ;.../* Get SNI r
11060 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20  equested server 
11070 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  name */..Tcl_Lis
11080 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11090 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
110a0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
110b0 62 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 22 2c  bj("servername",
110c0 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
110d0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
110e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
110f0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11100 6a 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72  j(SSL_get_server
11110 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54  name(ssl, TLSEXT
11120 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e  _NAMETYPE_host_n
11130 61 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a  ame), -1));.../*
11140 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f   Get protocol */
11150 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
11160 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11170 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11180 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f  ewStringObj("pro
11190 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09 54  tocol", -1));..T
111a0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
111b0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
111c0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
111d0 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74  tringObj(SSL_get
111e0 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d  _version(ssl), -
111f0 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f  1));.../* Renego
11200 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20  tiation allowed 
11210 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  */..Tcl_ListObjA
11220 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11230 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11240 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72  _NewStringObj("r
11250 65 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 2d  enegotiation", -
11260 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
11270 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11280 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11290 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
112a0 0a 09 20 20 20 20 53 53 4c 5f 67 65 74 5f 73 65  ..    SSL_get_se
112b0 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69  cure_renegotiati
112c0 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 20  on_support(ssl) 
112d0 3f 20 22 73 75 70 70 6f 72 74 65 64 22 20 3a 20  ? "supported" : 
112e0 22 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c  "not supported",
112f0 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20   -1));.../* Get 
11300 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a  security level *
11310 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
11320 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11330 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11340 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65  NewStringObj("se
11350 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 2d 31  curitylevel", -1
11360 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
11370 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11380 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
11390 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f  l_NewIntObj(SSL_
113a0 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76  get_security_lev
113b0 65 6c 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20  el(ssl)));.../* 
113c0 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  Session info */.
113d0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
113e0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
113f0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11400 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73  wStringObj("sess
11410 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31 29  ion_reused", -1)
11420 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
11430 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11440 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11450 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53  _NewBooleanObj(S
11460 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65  SL_session_reuse
11470 64 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 49  d(ssl)));.../* I
11480 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f  s server info */
11490 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
114a0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
114b0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
114c0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 73 5f  ewStringObj("is_
114d0 73 65 72 76 65 72 22 2c 20 2d 31 29 29 3b 0a 09  server", -1));..
114e0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
114f0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11500 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
11510 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 69  BooleanObj(SSL_i
11520 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 29 3b  s_server(ssl)));
11530 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
11540 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20  ipher info */.  
11550 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67    cipher = SSL_g
11560 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65  et_current_ciphe
11570 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  r(ssl);.    if (
11580 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20  cipher != NULL) 
11590 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 53  {..char buf[BUFS
115a0 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20  IZ] = {0};..int 
115b0 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a  bits, alg_bits;.
115c0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
115d0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
115e0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
115f0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70  ewStringObj("cip
11600 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  her", -1));..Tcl
11610 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11620 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11630 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11640 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45  ingObj(SSL_CIPHE
11650 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65  R_get_name(ciphe
11660 72 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  r), -1));..Tcl_L
11670 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11680 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
11690 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
116a0 67 4f 62 6a 28 22 73 74 61 6e 64 61 72 64 5f 6e  gObj("standard_n
116b0 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ame", -1));..Tcl
116c0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
116d0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
116e0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
116f0 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45  ingObj(SSL_CIPHE
11700 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28  R_standard_name(
11710 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a  cipher), -1));..
11720 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48  .bits = SSL_CIPH
11730 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68  ER_get_bits(ciph
11740 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a  er, &alg_bits);.
11750 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11760 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11770 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11780 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 72  wStringObj("secr
11790 65 74 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a  et_bits", -1));.
117a0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
117b0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
117c0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
117d0 77 49 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a  wIntObj(bits));.
117e0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
117f0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11800 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11810 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 67 6f  wStringObj("algo
11820 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 2d 31 29  rithm_bits", -1)
11830 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
11840 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11850 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11860 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6c 67 5f 62  _NewIntObj(alg_b
11870 69 74 73 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62  its));../* alg_b
11880 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65  its is actual ke
11890 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49  y secret bits. I
118a0 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73  f use bits and s
118b0 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d  ecret (algorithm
118c0 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09  ) bits differ,..
118d0 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74     the rest of t
118e0 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65  he bits are fixe
118f0 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69  d, i.e. for limi
11900 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65  ted export ciphe
11910 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a  rs (bits < 56) *
11920 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
11930 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11940 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11950 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69  NewStringObj("mi
11960 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 29  n_version", -1))
11970 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
11980 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11990 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
119a0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c  NewStringObj(SSL
119b0 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73  _CIPHER_get_vers
119c0 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29  ion(cipher), -1)
119d0 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e  );.../* Get Open
119e0 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c  SSL-specific ID,
119f0 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a   not IANA ID */.
11a00 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11a10 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11a20 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11a30 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 64 22 2c  wStringObj("id",
11a40 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
11a50 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11a60 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11a70 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28   Tcl_NewIntObj((
11a80 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f  int) SSL_CIPHER_
11a90 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 29  get_id(cipher)))
11aa0 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48  ;...if (SSL_CIPH
11ab0 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63  ER_description(c
11ac0 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65  ipher, buf, size
11ad0 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c  of(buf)) != NULL
11ae0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
11af0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11b00 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
11b10 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11b20 62 6a 28 22 64 65 73 63 72 69 70 74 69 6f 6e 22  bj("description"
11b30 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 63 6c  , -1));..    Tcl
11b40 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11b50 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11b60 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11b70 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29  ingObj(buf, -1))
11b80 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
11b90 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20  /* Session info 
11ba0 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d  */.    session =
11bb0 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e   SSL_get_session
11bc0 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73  (ssl);.    if (s
11bd0 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20  ession != NULL) 
11be0 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  {..const unsigne
11bf0 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a  d char *ticket;.
11c00 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75  .size_t len2;..u
11c10 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e  nsigned int ulen
11c20 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ;..const unsigne
11c30 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f  d char *session_
11c40 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63 68 61  id, *proto;..cha
11c50 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58  r buffer[SSL_MAX
11c60 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47  _MASTER_KEY_LENG
11c70 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74  TH];.../* Report
11c80 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72   the selected pr
11c90 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75  otocol as a resu
11ca0 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e  lt of the ALPN n
11cb0 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53  egotiation */..S
11cc0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
11cd0 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65  alpn_selected(se
11ce0 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26  ssion, &proto, &
11cf0 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74  len2);..Tcl_List
11d00 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11d10 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11d20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11d30 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a  j("alpn", -1));.
11d40 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11d50 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11d60 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11d70 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
11d80 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20   *)proto, (int) 
11d90 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 52 65 70  len2));.../* Rep
11da0 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
11db0 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
11dc0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e  esult of the NPN
11dd0 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
11de0 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
11df0 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72  SSL_get0_next_pr
11e00 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73  oto_negotiated(s
11e10 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65  sl, &proto, &ule
11e20 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  n);..Tcl_ListObj
11e30 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11e40 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
11e50 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
11e60 6e 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  npn", -1));..Tcl
11e70 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11e80 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11e90 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11ea0 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70  ingObj((char *)p
11eb0 72 6f 74 6f 2c 20 28 69 6e 74 29 20 75 6c 65 6e  roto, (int) ulen
11ec0 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  ));.#endif.../* 
11ed0 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f  Resumable sessio
11ee0 6e 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  n */..Tcl_ListOb
11ef0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11f00 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11f10 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11f20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 2d 31 29  "resumable", -1)
11f30 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
11f40 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11f50 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11f60 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 53  _NewIntObj(SSL_S
11f70 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61  ESSION_is_resuma
11f80 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a  ble(session)));.
11f90 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61  ../* Session sta
11fa0 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73  rt time (seconds
11fb0 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f   since epoch) */
11fc0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
11fd0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11fe0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11ff0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61  ewStringObj("sta
12000 72 74 5f 74 69 6d 65 22 2c 20 2d 31 29 29 3b 0a  rt_time", -1));.
12010 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
12020 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12030 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
12040 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53  wLongObj(SSL_SES
12050 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65  SION_get_time(se
12060 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 54  ssion)));.../* T
12070 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53  imeout value - S
12080 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f  SL_CTX_get_timeo
12090 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20  ut (in seconds) 
120a0 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  */..Tcl_ListObjA
120b0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
120c0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
120d0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74  _NewStringObj("t
120e0 69 6d 65 6f 75 74 22 2c 20 2d 31 29 29 3b 0a 09  imeout", -1));..
120f0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12100 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12110 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
12120 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53  LongObj(SSL_SESS
12130 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28  ION_get_timeout(
12140 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a  session)));.../*
12150 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20   Session ticket 
12160 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69  lifetime hint (i
12170 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54  n seconds) */..T
12180 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12190 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
121a0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
121b0 74 72 69 6e 67 4f 62 6a 28 22 6c 69 66 65 74 69  tringObj("lifeti
121c0 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  me", -1));..Tcl_
121d0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
121e0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
121f0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67  Ptr, Tcl_NewLong
12200 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  Obj(SSL_SESSION_
12210 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74  get_ticket_lifet
12220 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e  ime_hint(session
12230 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  )));.../* Sessio
12240 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61  n id - TLSv1.2 a
12250 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f  nd below only */
12260 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53  ..session_id = S
12270 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69  SL_SESSION_get_i
12280 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e  d(session, &ulen
12290 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
122a0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
122b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
122c0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
122d0 65 73 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29 29  ession_id", -1))
122e0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
122f0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12300 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
12310 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
12320 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74  session_id, (int
12330 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 53  ) ulen));.../* S
12340 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  ession context *
12350 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
12360 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
12370 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73  _id_context(sess
12380 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 63  ion, &ulen);..Tc
12390 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
123a0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
123b0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
123c0 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e  ringObj("session
123d0 5f 63 6f 6e 74 65 78 74 22 2c 20 2d 31 29 29 3b  _context", -1));
123e0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
123f0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
12400 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
12410 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73  ewByteArrayObj(s
12420 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29  ession_id, (int)
12430 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65   ulen));.../* Se
12440 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63  ssion ticket - c
12450 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53  lient only */..S
12460 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
12470 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20  ticket(session, 
12480 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b  &ticket, &len2);
12490 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
124a0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
124b0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
124c0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73  ewStringObj("ses
124d0 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 2d 31  sion_ticket", -1
124e0 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
124f0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
12500 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
12510 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
12520 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20  j(ticket, (int) 
12530 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 54 69 63  len2));.../* Tic
12540 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a  ket app data */.
12550 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  .SSL_SESSION_get
12560 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61  0_ticket_appdata
12570 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65  (session, &ticke
12580 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f  t, &len2);..Tcl_
12590 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
125a0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
125b0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
125c0 6e 67 4f 62 6a 28 22 74 69 63 6b 65 74 5f 61 70  ngObj("ticket_ap
125d0 70 5f 64 61 74 61 22 2c 20 2d 31 29 29 3b 0a 09  p_data", -1));..
125e0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
125f0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12600 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
12610 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63  ByteArrayObj(tic
12620 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29  ket, (int) len2)
12630 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74  );.../* Get mast
12640 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20  er key */..len2 
12650 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  = SSL_SESSION_ge
12660 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73  t_master_key(ses
12670 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53  sion, buffer, SS
12680 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59  L_MAX_MASTER_KEY
12690 5f 4c 45 4e 47 54 48 29 3b 0a 09 54 63 6c 5f 4c  _LENGTH);..Tcl_L
126a0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
126b0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
126c0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
126d0 67 4f 62 6a 28 22 6d 61 73 74 65 72 5f 6b 65 79  gObj("master_key
126e0 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
126f0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12700 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
12710 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
12720 72 61 79 4f 62 6a 28 62 75 66 66 65 72 2c 20 28  rayObj(buffer, (
12730 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 20 20 20  int) len2));.   
12740 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72   }..    /* Compr
12750 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ession info */. 
12760 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55     if (ssl != NU
12770 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56  LL) {.#ifdef HAV
12780 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f  E_SSL_COMPRESSIO
12790 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45  N..const COMP_ME
127a0 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70  THOD *comp, *exp
127b0 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67  n;..comp = SSL_g
127c0 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72  et_current_compr
127d0 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78  ession(ssl);..ex
127e0 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72  pn = SSL_get_cur
127f0 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73  rent_expansion(s
12800 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f  sl);...Tcl_ListO
12810 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12820 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12830 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12840 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20  ("compression", 
12850 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
12860 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12870 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12880 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12890 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50  (comp ? SSL_COMP
128a0 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20  _get_name(comp) 
128b0 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a  : "NONE", -1));.
128c0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
128d0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
128e0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
128f0 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61  wStringObj("expa
12900 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54  nsion", -1));..T
12910 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12920 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
12930 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
12940 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e 20 3f 20  tringObj(expn ? 
12950 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d  SSL_COMP_get_nam
12960 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f 4e 45 22  e(expn) : "NONE"
12970 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65 0a 09 54  , -1));.#else..T
12980 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12990 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
129a0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
129b0 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65  tringObj("compre
129c0 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54  ssion", -1));..T
129d0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
129e0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
129f0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
12a00 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c  tringObj("NONE",
12a10 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
12a20 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12a30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12a40 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12a50 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 2d  j("expansion", -
12a60 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
12a70 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
12a80 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
12a90 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12aa0 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23 65  "NONE", -1));.#e
12ab0 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
12ac0 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a  /* Server info *
12ad0 2f 0a 20 20 20 20 7b 0a 09 6d 6f 64 65 20 3d 20  /.    {..mode = 
12ae0 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73  SSL_CTX_get_sess
12af0 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73  ion_cache_mode(s
12b00 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09  tatePtr->ctx);..
12b10 63 68 61 72 20 2a 6d 73 67 3b 0a 09 0a 09 69 66  char *msg;....if
12b20 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
12b30 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09  S_CACHE_OFF) {..
12b40 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b      msg = "off";
12b50 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64  ..} else if (mod
12b60 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  e & SSL_SESS_CAC
12b70 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20  HE_CLIENT) {..  
12b80 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22    msg = "client"
12b90 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f  ;..} else if (mo
12ba0 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41  de & SSL_SESS_CA
12bb0 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20  CHE_SERVER) {.. 
12bc0 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72     msg = "server
12bd0 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d  ";..} else if (m
12be0 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
12bf0 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20  ACHE_BOTH) {..  
12c00 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a    msg = "both";.
12c10 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d  .} else {..    m
12c20 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  sg = "unknown";.
12c30 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  .}..Tcl_ListObjA
12c40 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
12c50 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
12c60 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
12c70 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64  ession_cache_mod
12c80 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  e", -1));..Tcl_L
12c90 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12ca0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
12cb0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
12cc0 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a  gObj(msg, -1));.
12cd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41      }..    /* CA
12ce0 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20   List */.    /* 
12cf0 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c  IF not a server,
12d00 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74   same as SSL_get
12d10 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20  0_peer_CA_list. 
12d20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 61  If server same a
12d30 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c  s SSL_CTX_get_cl
12d40 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a  ient_CA_list */.
12d50 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63      listPtr = Tc
12d60 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
12d70 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b  NULL);.    STACK
12d80 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a  _OF(X509_NAME) *
12d90 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20  ca_list;.    if 
12da0 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f  ((ca_list = SSL_
12db0 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69  get_client_CA_li
12dc0 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c  st(ssl)) != NULL
12dd0 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72  ) {..char buffer
12de0 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28  [BUFSIZ];..for (
12df0 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73  int i = 0; i < s
12e00 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28  k_X509_NAME_num(
12e10 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b  ca_list); i++) {
12e20 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20  ..    X509_NAME 
12e30 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f  *name = sk_X509_
12e40 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69  NAME_value(ca_li
12e50 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20  st, i);..    if 
12e60 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f  (name) {...X509_
12e70 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d  NAME_oneline(nam
12e80 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49  e, buffer, BUFSI
12e90 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62  Z);...Tcl_ListOb
12ea0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
12eb0 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20  nterp, listPtr, 
12ec0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12ed0 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09  (buffer, -1));..
12ee0 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20      }..}.    }. 
12ef0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
12f00 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12f10 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
12f20 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 61  NewStringObj("ca
12f30 4c 69 73 74 22 2c 20 2d 31 29 29 3b 0a 20 20 20  List", -1));.   
12f40 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
12f50 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12f60 2c 20 6f 62 6a 50 74 72 2c 20 6c 69 73 74 50 74  , objPtr, listPt
12f70 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  r);..    Tcl_Set
12f80 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
12f90 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
12fa0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
12fb0 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
12fc0 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ntData;.}.../*. 
12fd0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
12fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13010 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69  ----. *. * Versi
13020 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  onObjCmd -- retu
13030 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e  rn version strin
13040 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a  g from OpenSSL..
13050 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
13060 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
13070 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
13080 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
13090 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
130a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
130e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65  */.static int.Ve
130f0 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65  rsionObjCmd(Clie
13100 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
13110 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
13120 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
13130 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
13140 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
13150 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a  l_Obj *objPtr;..
13160 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
13170 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50  led");..    objP
13180 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  tr = Tcl_NewStri
13190 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45  ngObj(OPENSSL_VE
131a0 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b  RSION_TEXT, -1);
131b0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
131c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
131d0 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75  jPtr);..    retu
131e0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65  rn TCL_OK;..clie
131f0 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
13200 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a  ata;..objc = obj
13210 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b  c;..objv = objv;
13220 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
13230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
13270 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d  . * MiscObjCmd -
13280 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a  - misc commands.
13290 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
132a0 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
132b0 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
132c0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
132d0 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
132e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
13320 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69  */.static int.Mi
13330 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  scObjCmd(ClientD
13340 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
13350 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13360 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
13370 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
13380 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69  v[]) {.    stati
13390 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
133a0 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72  mmands [] = { "r
133b0 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e  eq", "strreq", N
133c0 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20  ULL };.    enum 
133d0 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c  command { C_REQ,
133e0 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d   C_STRREQ, C_DUM
133f0 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d  MY };.    int cm
13400 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68  d, isStr;.    ch
13410 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d  ar buffer[16384]
13420 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
13430 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
13440 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
13450 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
13460 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
13470 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61  , "subcommand ?a
13480 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  rgs?");..return 
13490 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
134a0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
134b0 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
134c0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f  erp, objv[1], co
134d0 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64  mmands, "command
134e0 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43  ", 0,&cmd) != TC
134f0 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
13500 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13510 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
13520 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73  error();..    is
13530 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f  Str = (cmd == C_
13540 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69  STRREQ);.    swi
13550 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61  tch ((enum comma
13560 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65  nd) cmd) {..case
13570 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f   C_REQ:..case C_
13580 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45  STRREQ: {..    E
13590 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55  VP_PKEY *pkey=NU
135a0 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63  LL;..    X509 *c
135b0 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58  ert=NULL;..    X
135c0 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e  509_NAME *name=N
135d0 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62  ULL;..    Tcl_Ob
135e0 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20  j **listv;..    
135f0 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20  int listc,i;... 
13600 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c     BIO *out=NULL
13610 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f  ;...    char *k_
13620 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b  C="",*k_ST="",*k
13630 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b  _L="",*k_O="",*k
13640 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c  _OU="",*k_CN="",
13650 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20  *k_Email="";..  
13660 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a    char *keyout,*
13670 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20  pemout,*str;..  
13680 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65    int keysize,se
13690 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b  rial=0,days=365;
136a0 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
136b0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
136c0 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20  x30000000L..    
136d0 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55  BIGNUM *bne = NU
136e0 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73  LL;..    RSA *rs
136f0 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a  a = NULL;.#else.
13700 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54  .    EVP_PKEY_CT
13710 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23  X *ctx = NULL;.#
13720 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28  endif...    if (
13730 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a  (objc<5) || (obj
13740 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72  c>6)) {...Tcl_Wr
13750 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
13760 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79  p, 2, objv, "key
13770 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72  size keyfile cer
13780 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a  tfile ?info?");.
13790 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
137a0 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  OR;..    }...   
137b0 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46   if (Tcl_GetIntF
137c0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
137d0 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65  bjv[2], &keysize
137e0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
137f0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
13800 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b  R;..    }..    k
13810 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72  eyout=Tcl_GetStr
13820 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20  ing(objv[3]);.. 
13830 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65     pemout=Tcl_Ge
13840 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29  tString(objv[4])
13850 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72  ;..    if (isStr
13860 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72  ) {...Tcl_SetVar
13870 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22  (interp,keyout,"
13880 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56  ",0);...Tcl_SetV
13890 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74  ar(interp,pemout
138a0 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a  ,"",0);..    }..
138b0 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36  .    if (objc>=6
138c0 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69  ) {...if (Tcl_Li
138d0 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
138e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d  (interp, objv[5]
138f0 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69  ,....&listc, &li
13900 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  stv) != TCL_OK) 
13910 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  {...    return T
13920 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09  CL_ERROR;...}...
13930 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 21  .if ((listc%2) !
13940 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c  = 0) {...    Tcl
13950 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
13960 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c  p,"Information l
13970 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 76  ist must have ev
13980 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  en number of arg
13990 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09  uments",NULL);..
139a0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
139b0 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72  ERROR;...}...for
139c0 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20   (i=0; i<listc; 
139d0 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74  i+=2) {...    st
139e0 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  r=Tcl_GetString(
139f0 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20  listv[i]);...   
13a00 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
13a10 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09  "days")==0) {...
13a20 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46  .if (Tcl_GetIntF
13a30 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69  romObj(interp,li
13a40 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21  stv[i+1],&days)!
13a50 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20  =TCL_OK)....    
13a60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13a70 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
13a80 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73  f (strcmp(str,"s
13a90 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09  erial")==0) {...
13aa0 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46  .if (Tcl_GetIntF
13ab0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69  romObj(interp,li
13ac0 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c  stv[i+1],&serial
13ad0 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20  )!=TCL_OK)....  
13ae0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13af0 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  OR;...    } else
13b00 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
13b10 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "C")==0) {....k_
13b20 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  C=Tcl_GetString(
13b30 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13b40 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13b50 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d  rcmp(str,"ST")==
13b60 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c  0) {....k_ST=Tcl
13b70 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
13b80 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
13b90 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
13ba0 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09  str,"L")==0) {..
13bb0 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72  ..k_L=Tcl_GetStr
13bc0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
13bd0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
13be0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22   (strcmp(str,"O"
13bf0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54  )==0) {....k_O=T
13c00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
13c10 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
13c20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
13c30 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20  p(str,"OU")==0) 
13c40 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65  {....k_OU=Tcl_Ge
13c50 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
13c60 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
13c70 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
13c80 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09  ,"CN")==0) {....
13c90 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69  k_CN=Tcl_GetStri
13ca0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
13cb0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
13cc0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61  (strcmp(str,"Ema
13cd0 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  il")==0) {....k_
13ce0 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72  Email=Tcl_GetStr
13cf0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
13d00 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ...    } else {.
13d10 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
13d20 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e  (interp,"Unknown
13d30 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c   parameter",NULL
13d40 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c  );....return TCL
13d50 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a  _ERROR;...    }.
13d60 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20  ..}..    }..#if 
13d70 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
13d80 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
13d90 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20  000L..    bne = 
13da0 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72  BN_new();..    r
13db0 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a  sa = RSA_new();.
13dc0 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f  .    pkey = EVP_
13dd0 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20  PKEY_new();..   
13de0 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c   if (bne == NULL
13df0 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20   || rsa == NULL 
13e00 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20  || pkey == NULL 
13e10 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28  || !BN_set_word(
13e20 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09  bne,RSA_F4) ||..
13e30 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b  .!RSA_generate_k
13e40 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69  ey_ex(rsa, keysi
13e50 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c  ze, bne, NULL) |
13e60 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69  | !EVP_PKEY_assi
13e70 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61  gn_RSA(pkey, rsa
13e80 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  )) {...EVP_PKEY_
13e90 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a  free(pkey);.../*
13ea0 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20   RSA_free(rsa); 
13eb0 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45  freed by EVP_PKE
13ec0 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66  Y_free */...BN_f
13ed0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a  ree(bne);.#else.
13ee0 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f  .    pkey = EVP_
13ef0 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65  RSA_gen((unsigne
13f00 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b  d int) keysize);
13f10 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f  ..    ctx = EVP_
13f20 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65  PKEY_CTX_new(pke
13f30 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66  y,NULL);..    if
13f40 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c   (pkey == NULL |
13f50 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  | ctx == NULL ||
13f60 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65   !EVP_PKEY_keyge
13f70 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09  n_init(ctx) ||..
13f80 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73  .!EVP_PKEY_CTX_s
13f90 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69  et_rsa_keygen_bi
13fa0 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29  ts(ctx, keysize)
13fb0 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65   || !EVP_PKEY_ke
13fc0 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29  ygen(ctx, &pkey)
13fd0 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66  ) {...EVP_PKEY_f
13fe0 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50  ree(pkey);...EVP
13ff0 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63  _PKEY_CTX_free(c
14000 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63  tx);.#endif...Tc
14010 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
14020 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61  rp,"Error genera
14030 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79  ting private key
14040 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72  ",NULL);...retur
14050 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
14060 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20    } else {...if 
14070 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20  (isStr) {...    
14080 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  out=BIO_new(BIO_
14090 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20  s_mem());...    
140a0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72  PEM_write_bio_Pr
140b0 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65  ivateKey(out,pke
140c0 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55  y,NULL,NULL,0,NU
140d0 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  LL,NULL);...    
140e0 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62  i=BIO_read(out,b
140f0 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66  uffer,sizeof(buf
14100 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69  fer)-1);...    i
14110 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a  =(i<0) ? 0 : i;.
14120 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d  ..    buffer[i]=
14130 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f  '\0';...    Tcl_
14140 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65  SetVar(interp,ke
14150 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a  yout,buffer,0);.
14160 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28  ..    BIO_flush(
14170 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  out);...    BIO_
14180 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65  free(out);...} e
14190 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  lse {...    out=
141a0 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69  BIO_new(BIO_s_fi
141b0 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f  le());...    BIO
141c0 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28  _write_filename(
141d0 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20  out,keyout);... 
141e0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
141f0 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  _PrivateKey(out,
14200 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30  pkey,NULL,NULL,0
14210 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ,NULL,NULL);... 
14220 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f     /* PEM_write_
14230 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65  bio_RSAPrivateKe
14240 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c  y(out, rsa, NULL
14250 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c  , NULL, 0, NULL,
14260 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20   NULL); */...   
14270 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75   BIO_free_all(ou
14280 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28  t);.. .}....if (
14290 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29  (cert=X509_new()
142a0 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20  )==NULL) {...   
142b0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
142c0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e  nterp,"Error gen
142d0 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 63  erating certific
142e0 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c  ate request",NUL
142f0 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b  L);...    EVP_PK
14300 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23  EY_free(pkey);.#
14310 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
14320 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
14330 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e  000000L...    BN
14340 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64  _free(bne);.#end
14350 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28  if...    return(
14360 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a  TCL_ERROR);...}.
14370 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73  ...X509_set_vers
14380 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41  ion(cert,2);...A
14390 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28  SN1_INTEGER_set(
143a0 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e  X509_get_serialN
143b0 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 69  umber(cert),seri
143c0 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69  al);...X509_gmti
143d0 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d  me_adj(X509_getm
143e0 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29  _notBefore(cert)
143f0 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69  ,0);...X509_gmti
14400 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d  me_adj(X509_getm
14410 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c  _notAfter(cert),
14420 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64  (long)60*60*24*d
14430 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74  ays);...X509_set
14440 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65  _pubkey(cert,pke
14450 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39  y);....name=X509
14460 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d  _get_subject_nam
14470 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39  e(cert);....X509
14480 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
14490 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c  by_txt(name,"C",
144a0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
144b0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
144c0 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20  har *) k_C, -1, 
144d0 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
144e0 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
144f0 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20  _txt(name,"ST", 
14500 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
14510 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
14520 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20  ar *) k_ST, -1, 
14530 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
14540 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
14550 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d  _txt(name,"L", M
14560 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
14570 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
14580 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31  r *) k_L, -1, -1
14590 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
145a0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
145b0 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53  xt(name,"O", MBS
145c0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
145d0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
145e0 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20  *) k_O, -1, -1, 
145f0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
14600 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
14610 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54  (name,"OU", MBST
14620 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
14630 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14640 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20  ) k_OU, -1, -1, 
14650 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
14660 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
14670 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54  (name,"CN", MBST
14680 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
14690 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
146a0 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20  ) k_CN, -1, -1, 
146b0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
146c0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
146d0 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d  (name,"Email", M
146e0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
146f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
14700 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31  r *) k_Email, -1
14710 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30  , -1, 0);....X50
14720 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61  9_set_subject_na
14730 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a  me(cert,name);..
14740 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e  ..if (!X509_sign
14750 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73  (cert,pkey,EVP_s
14760 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20  ha256())) {...  
14770 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 74    X509_free(cert
14780 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45  );...    EVP_PKE
14790 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69  Y_free(pkey);.#i
147a0 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
147b0 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
147c0 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f  00000L...    BN_
147d0 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69  free(bne);.#endi
147e0 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52  f...    Tcl_SetR
147f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
14800 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74  ror signing cert
14810 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a  ificate",NULL);.
14820 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
14830 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69  _ERROR;...}....i
14840 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20  f (isStr) {...  
14850 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49    out=BIO_new(BI
14860 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20  O_s_mem());...  
14870 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f    PEM_write_bio_
14880 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a  X509(out,cert);.
14890 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64  ..    i=BIO_read
148a0 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65  (out,buffer,size
148b0 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09  of(buffer)-1);..
148c0 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30  .    i=(i<0) ? 0
148d0 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66   : i;...    buff
148e0 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20  er[i]='\0';...  
148f0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
14900 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65  erp,pemout,buffe
14910 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  r,0);...    BIO_
14920 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20  flush(out);...  
14930 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b    BIO_free(out);
14940 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
14950 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49    out=BIO_new(BI
14960 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20  O_s_file());... 
14970 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c     BIO_write_fil
14980 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74  ename(out,pemout
14990 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
149a0 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c  te_bio_X509(out,
149b0 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f  cert);...    BIO
149c0 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a  _free_all(out);.
149d0 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65  ..}....X509_free
149e0 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b  (cert);...EVP_PK
149f0 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23  EY_free(pkey);.#
14a00 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
14a10 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
14a20 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65  000000L...BN_fre
14a30 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09  e(bne);.#endif..
14a40 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b      }..}..break;
14a50 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62  .    default:..b
14a60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14a70 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
14a80 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
14a90 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a  entData;.}.../**
14aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ab0 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20  **/./* Init     
14ac0 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a          */./****
14ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ae0 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
14af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
14b30 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a  * Tls_Free --. *
14b40 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
14b50 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65  re cleans up whe
14b60 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  n a SSL socket b
14b70 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09  ased channel. *.
14b80 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74  is closed and it
14b90 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
14ba0 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a  t falls below 1.
14bb0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
14bc0 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.none. *. * Sid
14bd0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72  e effects:. *.Fr
14be0 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74  ees all the stat
14bf0 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
14c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
14c40 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61  oid.Tls_Free(cha
14c50 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20  r *blockPtr) {. 
14c60 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
14c70 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c  tr = (State *)bl
14c80 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72  ockPtr;..    dpr
14c90 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
14ca0 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73  .    Tls_Clean(s
14cb0 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b  tatePtr);.    ck
14cc0 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a  free(blockPtr);.
14cd0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
14ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
14d20 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a   * Tls_Clean --.
14d30 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
14d40 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77  dure cleans up w
14d50 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74  hen a SSL socket
14d60 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20   based channel. 
14d70 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  *.is closed and 
14d80 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
14d90 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20  unt falls below 
14da0 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a  1.  This should.
14db0 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e   *.be called syn
14dc0 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68  chronously by th
14dd0 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74  e CloseProc, not
14de0 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74   in the. *.Event
14df0 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61  uallyFree callba
14e00 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ck.. *. * Result
14e10 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.none. *. *
14e20 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
14e30 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20  *.Frees all the 
14e40 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  state. *. *-----
14e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e70 2d 2d 2d 2d 2d 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 0a 20  --------------. 
14e90 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61  */.void Tls_Clea
14ea0 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  n(State *statePt
14eb0 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66  r) {.    dprintf
14ec0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
14ed0 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65   /*.     * we're
14ee0 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74   assuming here t
14ef0 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65  hat we're single
14f00 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a  -threaded.     *
14f10 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
14f20 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63  tr->timer != (Tc
14f30 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
14f40 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74  LL) {..Tcl_Delet
14f50 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74  eTimerHandler(st
14f60 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a  atePtr->timer);.
14f70 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  .statePtr->timer
14f80 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a   = NULL;.    }..
14f90 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
14fa0 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66  ->protos) {..ckf
14fb0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72  ree(statePtr->pr
14fc0 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72  otos);..statePtr
14fd0 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b  ->protos = NULL;
14fe0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
14ff0 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a  tatePtr->bio) {.
15000 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61  ./* This will ca
15010 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e  ll SSL_shutdown.
15020 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a   Bug 1414045 */.
15030 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72  .dprintf("BIO_fr
15040 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61  ee_all(%p)", sta
15050 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49  tePtr->bio);..BI
15060 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65  O_free_all(state
15070 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74  Ptr->bio);..stat
15080 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c  ePtr->bio = NULL
15090 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
150a0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b  statePtr->ssl) {
150b0 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66  ..dprintf("SSL_f
150c0 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50  ree(%p)", stateP
150d0 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66  tr->ssl);..SSL_f
150e0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ree(statePtr->ss
150f0 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73  l);..statePtr->s
15100 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  sl = NULL;.    }
15110 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
15120 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43  r->ctx) {..SSL_C
15130 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  TX_free(statePtr
15140 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74  ->ctx);..statePt
15150 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  r->ctx = NULL;. 
15160 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
15170 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
15180 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
15190 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63  ount(statePtr->c
151a0 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65  allback);..state
151b0 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20  Ptr->callback = 
151c0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
151d0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61  if (statePtr->pa
151e0 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44  ssword) {..Tcl_D
151f0 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ecrRefCount(stat
15200 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b  ePtr->password);
15210 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  ..statePtr->pass
15220 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  word = NULL;.   
15230 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
15240 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63  Ptr->vcmd) {..Tc
15250 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
15260 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a  tatePtr->vcmd);.
15270 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  .statePtr->vcmd 
15280 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  = NULL;.    }.. 
15290 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
152a0 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  rning");.}.../*.
152b0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
152c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152f0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
15300 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Init --. *. *.Th
15310 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20  is is a package 
15320 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70  initialization p
15330 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20  rocedure, which 
15340 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20  is called. *.by 
15350 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61  Tcl when this pa
15360 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61  ckage is to be a
15370 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72  dded to an inter
15380 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  preter.. *. * Re
15390 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66  sults:  Ssl conf
153a0 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65  igured and loade
153b0 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  d. *. * Side eff
153c0 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65  ects:. *. create
153d0 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64   the ssl command
153e0 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c  , initialize ssl
153f0 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d   context. *. *--
15400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15440 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20  -. */.DLLEXPORT 
15450 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c  int Tls_Init(Tcl
15460 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
15470 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
15480 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69  r tlsTclInitScri
15490 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64  pt[] = {.#includ
154a0 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30  e "tls.tcl.h"..0
154b0 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20  x00.    };..    
154c0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
154d0 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
154e0 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  * We only suppor
154f0 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 6e 65 77  t Tcl 8.4 or new
15500 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69  er.     */.    i
15510 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f 54  f (.#ifdef USE_T
15520 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f 49 6e  CL_STUBS..Tcl_In
15530 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20  itStubs(interp, 
15540 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c 73 65 0a  "8.4", 0).#else.
15550 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28  .Tcl_PkgRequire(
15560 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 22  interp, "Tcl", "
15570 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e 64 69 66  8.4-", 0).#endif
15580 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  .. == NULL) {..r
15590 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
155a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
155b0 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d  TlsLibInit(0) !=
155c0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f   TCL_OK) {..Tcl_
155d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
155e0 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20  erp, "could not 
155f0 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c  initialize SSL l
15600 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a  ibrary", NULL);.
15610 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
15620 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  R;.    }..    Tc
15630 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
15640 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
15650 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65  :ciphers", Ciphe
15660 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  rsObjCmd, (Clien
15670 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
15680 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
15690 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
156a0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
156b0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f  interp, "tls::co
156c0 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65  nnection", Conne
156d0 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c  ctionInfoObjCmd,
156e0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
156f0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15700 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15710 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15720 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15730 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c  tls::handshake",
15740 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
15750 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
15760 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
15770 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
15780 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15790 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
157a0 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49  "tls::import", I
157b0 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c  mportObjCmd, (Cl
157c0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
157d0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
157e0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
157f0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
15800 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
15810 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d  :unimport", Unim
15820 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  portObjCmd, (Cli
15830 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
15840 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
15850 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
15860 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
15870 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
15880 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f  status", StatusO
15890 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
158a0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
158b0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
158c0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
158d0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
158e0 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69  erp, "tls::versi
158f0 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43  on", VersionObjC
15900 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
15910 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
15920 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
15930 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
15940 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
15950 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d  , "tls::misc", M
15960 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  iscObjCmd, (Clie
15970 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
15980 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
15990 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
159a0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
159b0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70  (interp, "tls::p
159c0 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f  rotocols", Proto
159d0 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  colsObjCmd, (Cli
159e0 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
159f0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
15a00 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66  ) NULL);..    if
15a10 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c   (interp) {..Tcl
15a20 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c  _Eval(interp, tl
15a30 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 3b  sTclInitScript);
15a40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
15a50 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  rn(Tcl_PkgProvid
15a60 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 22 2c  e(interp, "tls",
15a70 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
15a80 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ));.}../*. *----
15a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ac0 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61  --*. *. *.Tls_Sa
15ad0 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09  feInit --. *. *.
15ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b10 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72  *. *.Standard pr
15b20 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 64  ocedure required
15b30 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49   by 'load'.. *.I
15b40 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20  nitializes this 
15b50 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20  extension for a 
15b60 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72  safe interpreter
15b70 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *.-----------
15b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ba0 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64  -----*. *. *.Sid
15bb0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41  e effects:. *..A
15bc0 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a  s of 'Tls_Init'.
15bd0 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a   *. *.Result:. *
15be0 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  ..A standard Tcl
15bf0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a   error code.. *.
15c00 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c30 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c  --------*. */.DL
15c40 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f  LEXPORT int Tls_
15c50 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
15c60 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20  erp *interp) {. 
15c70 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
15c80 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
15c90 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70  (Tls_Init(interp
15ca0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ));.}../*. *----
15cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ce0 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62  --*. *. *.TlsLib
15cf0 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d  Init --. *. *.--
15d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15d30 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53   *.Initializes S
15d40 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20  SL library once 
15d50 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a  per application.
15d60 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
15d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d90 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20  ---*. *. *.Side 
15da0 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69  effects:. *..ini
15db0 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62  tializes SSL lib
15dc0 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c  rary. *. *.Resul
15dd0 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20  t:. *..none. *. 
15de0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
15df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e10 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61  -------*. */.sta
15e20 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e  tic int TlsLibIn
15e30 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c  it(int uninitial
15e40 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69  ize) {.    stati
15e50 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65  c int initialize
15e60 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73  d = 0;.    int s
15e70 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  tatus = TCL_OK;.
15e80 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
15e90 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
15ea0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
15eb0 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20  ADS).    size_t 
15ec0 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69  num_locks;.#endi
15ed0 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69  f..    if (unini
15ee0 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28  tialize) {..if (
15ef0 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  !initialized) {.
15f00 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73  .    dprintf("As
15f10 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c  ked to uninitial
15f20 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20  ize, but we are 
15f30 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22  not initialized"
15f40 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 28  );...    return(
15f50 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70  TCL_OK);..}...dp
15f60 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
15f70 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a  uninitialize");.
15f80 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
15f90 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
15fa0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
15fb0 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78  EADS)..Tcl_Mutex
15fc0 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  Lock(&init_mx);.
15fd0 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09  ..if (locks) {..
15fe0 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b      free(locks);
15ff0 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55  ..    locks = NU
16000 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f  LL;..    locksCo
16010 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64  unt = 0;..}.#end
16020 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20  if..initialized 
16030 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 0;..#if define
16040 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
16050 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
16060 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f  L_THREADS)..Tcl_
16070 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69  MutexUnlock(&ini
16080 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  t_mx);.#endif...
16090 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a  return(TCL_OK);.
160a0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69      }..    if (i
160b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64  nitialized) {..d
160c0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20  printf("Called, 
160d0 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64  but using cached
160e0 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72   value");..retur
160f0 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20 7d  n(status);.    }
16100 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
16110 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65  alled");..#if de
16120 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
16130 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
16140 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20  d(TCL_THREADS). 
16150 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b     Tcl_MutexLock
16160 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64  (&init_mx);.#end
16170 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a  if.    initializ
16180 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66  ed = 1;..#if def
16190 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
161a0 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
161b0 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
161c0 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b    num_locks = 1;
161d0 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20  .    locksCount 
161e0 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b  = (int) num_lock
161f0 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d  s;.    locks = m
16200 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f  alloc(sizeof(*lo
16210 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73  cks) * num_locks
16220 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f  );.    memset(lo
16230 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  cks, 0, sizeof(*
16240 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63  locks) * num_loc
16250 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ks);.#endif..   
16260 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42   /* Initialize B
16270 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e  OTH libcrypto an
16280 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20  d libssl. */.   
16290 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73   OPENSSL_init_ss
162a0 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c  l(OPENSSL_INIT_L
162b0 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20  OAD_SSL_STRINGS 
162c0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c  | OPENSSL_INIT_L
162d0 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e  OAD_CRYPTO_STRIN
162e0 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e  GS..| OPENSSL_IN
162f0 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45  IT_ADD_ALL_CIPHE
16300 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49  RS | OPENSSL_INI
16310 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54  T_ADD_ALL_DIGEST
16320 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42  S, NULL);..    B
16330 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c  IO_new_tcl(NULL,
16340 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20   0);..#if 0.    
16350 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f  /*.     * XXX:TO
16360 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20  DO: Remove this 
16370 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65  code and replace
16380 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 6b   it with a check
16390 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75  .     * for enou
163a0 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64  gh entropy and d
163b0 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65  o not try to cre
163c0 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20  ate our own.    
163d0 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72   * terrible entr
163e0 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  opy.     */.    
163f0 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74  /*.     * Seed t
16400 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  he random number
16410 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68   generator in th
16420 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20  e SSL library,. 
16430 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20      * using the 
16440 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75  do/while constru
16450 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  ct because of th
16460 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68  e bug note in th
16470 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c  e.     * OpenSSL
16480 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77   FAQ at http://w
16490 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73  ww.openssl.org/s
164a0 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23  upport/faq.html#
164b0 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20  USER1.     *.   
164c0 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20    * The crux of 
164d0 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
164e0 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f  hat Solaris 7 do
164f0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20  es not have a.  
16500 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d     * /dev/random
16510 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d   or /dev/urandom
16520 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 61   device so it ca
16530 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75  nnot gather enou
16540 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70  gh.     * entrop
16550 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f  y from the RAND_
16560 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20  seed() when TLS 
16570 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20  initializes and 
16580 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74  refuses.     * t
16590 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61  o go further. Ea
165a0 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
165b0 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65  f OpenSSL carrie
165c0 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e  d on regardless.
165d0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61  .     */.    sra
165e0 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  nd((unsigned int
165f0 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a  ) time((time_t *
16600 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f  ) NULL));.    do
16610 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20   {..for (i = 0; 
16620 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09  i < 16; i++) {..
16630 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20      rnd_seed[i] 
16640 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 35  = 1 + (char) (25
16650 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41  5.0 * rand()/(RA
16660 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d  ND_MAX+1.0));..}
16670 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f  ..RAND_seed(rnd_
16680 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64  seed, sizeof(rnd
16690 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77  _seed));.    } w
166a0 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75  hile (RAND_statu
166b0 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69  s() != 1);.#endi
166c0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  f..#if defined(O
166d0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
166e0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
166f0 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74  HREADS)..Tcl_Mut
16700 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d  exUnlock(&init_m
16710 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74  x);.#endif...ret
16720 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a     urn(status);.}.