Hex Artifact Content

Artifact 6525346f21c20ef73b27de9c33df7c4a5dbd38b7ab57f28ccb71601cef4d3bb9:


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 28 54  sult(interp), (T
3270: 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 4c 4c 29 29  cl_Size *)NULL))
3280: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   != NULL) {..Tcl
3290: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
32a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
32b0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
32c0: 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29  ingObj(msg, -1))
32d0: 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
32e0: 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e  .listPtr = Tcl_N
32f0: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
3300: 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65 72 72  L);..while ((err
3310: 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72   = ERR_get_error
3320: 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 20  ()) != 0) {..   
3330: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3340: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3350: 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e  , listPtr, Tcl_N
3360: 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f  ewStringObj(ERR_
3370: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72  reason_error_str
3380: 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a  ing(err), -1));.
3390: 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  .}..Tcl_ListObjA
33a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
33b0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73  erp, cmdPtr, lis
33c0: 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  tPtr);.    }..  
33d0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
33e0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
33f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
3400: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
3410: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
3420: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
3430: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
3440: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
3450: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34a0: 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43  --. *. * KeyLogC
34b0: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
34c0: 09 57 72 69 74 65 20 72 65 63 65 69 76 65 64 20  .Write received 
34d0: 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 20  key data to log 
34e0: 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  file.. *. * Side
34f0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e   effects:. *.non
3500: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
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 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
3550: 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61  oid KeyLogCallba
3560: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
3570: 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c  l, const char *l
3580: 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20  ine) {.    char 
3590: 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53  *str = getenv(SS
35a0: 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20  LKEYLOGFILE);.  
35b0: 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20    FILE *fd;..   
35c0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
35d0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 72  ");..    if (str
35e0: 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28  ) {..fd = fopen(
35f0: 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 69  str, "a");..fpri
3600: 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c  ntf(fd, "%s\n",l
3610: 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64  ine);..fclose(fd
3620: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a  );.    }.}.../*.
3630: 20 2a 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 2d 2d 2d 2d 2d 2d 2d  ----------------
3670: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73  -----. *. * Pass
3680: 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d  word Callback --
3690: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68  . *. *.Called wh
36a0: 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 66 6f  en a password fo
36b0: 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 20  r a private key 
36c0: 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 6e 67 20  loading/storing 
36d0: 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 69 66 69  a PEM. *.certifi
36e0: 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 79 70  cate with encryp
36f0: 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c  tion. Evals call
3700: 62 61 63 6b 20 73 63 72 69 70 74 20 61 6e 64 20  back script and 
3710: 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 65 20 72  returns. *.the r
3720: 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 61 73  esult as the pas
3730: 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20  sword string in 
3740: 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  buf.. *. * Resul
3750: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
3760: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
3770: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
3780: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
3790: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
37a0: 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69  .Password size i
37b0: 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f  n bytes or -1 fo
37c0: 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20  r an error.. *. 
37d0: 2a 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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3810: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
3820: 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c  int.PasswordCall
3830: 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20  back(char *buf, 
3840: 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77  int size, int rw
3850: 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74  flag, void *udat
3860: 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  a) {.    State *
3870: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
3880: 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20  e *) udata;.    
3890: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
38a0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
38b0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
38c0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
38d0: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64  int code;..    d
38e0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
38f0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ;..    /* If no 
3900: 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 65  callback, use de
3910: 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a  fault callback *
3920: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
3930: 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20  tr->password == 
3940: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c  NULL) {..if (Tcl
3950: 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20  _EvalEx(interp, 
3960: 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c  "tls::password",
3970: 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c   -1, TCL_EVAL_GL
3980: 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29  OBAL) == TCL_OK)
3990: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65   {..    char *re
39a0: 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c  t = (char *) Tcl
39b0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
39c0: 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73  (interp);..    s
39d0: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
39e0: 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b   (size_t) size);
39f0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e  ..    return (in
3a00: 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09  t)strlen(ret);..
3a10: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65  } else {..    re
3a20: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20  turn -1;..}.    
3a30: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
3a40: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
3a50: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
3a60: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
3a70: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  j(statePtr->pass
3a80: 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  word);.    Tcl_L
3a90: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3aa0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3ab0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
3ac0: 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64 22 2c  gObj("password",
3ad0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
3ae0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3af0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3b00: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
3b10: 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20 20 20  j(rwflag));.    
3b20: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3b30: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3b40: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3b50: 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a  IntObj(size));..
3b60: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
3b70: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
3b80: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50  terp);.    Tcl_P
3b90: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
3ba0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
3bb0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
3bc0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
3bd0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
3be0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
3bf0: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76     code = Tcl_Ev
3c00: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
3c10: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c  cmdPtr, TCL_EVAL
3c20: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66  _GLOBAL);.    if
3c30: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b   (code != TCL_OK
3c40: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a  ) {.#if (TCL_MAJ
3c50: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29  OR_VERSION == 8)
3c60: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56   && (TCL_MINOR_V
3c70: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c  ERSION < 6)..Tcl
3c80: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
3c90: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a  (interp);.#else.
3ca0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
3cb0: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  xception(interp,
3cc0: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20   code);.#endif. 
3cd0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
3ce0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
3cf0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  );..    Tcl_Rele
3d00: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ase((ClientData)
3d10: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20   statePtr);..   
3d20: 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   /* If successfu
3d30: 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 61 73  l, pass back pas
3d40: 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64  sword string and
3d50: 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f   truncate if too
3d60: 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20   long */.    if 
3d70: 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29  (code == TCL_OK)
3d80: 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c 65 6e   {..Tcl_Size len
3d90: 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28  ;..char *ret = (
3da0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53  char *) Tcl_GetS
3db0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c  tringFromObj(Tcl
3dc0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
3dd0: 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69  terp), &len);..i
3de0: 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69  f (len > (Tcl_Si
3df0: 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20  ze) size-1) {.. 
3e00: 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69     len = (Tcl_Si
3e10: 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09  ze) size-1;..}..
3e20: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74  strncpy(buf, ret
3e30: 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b  , (size_t) len);
3e40: 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30  ..buf[len] = '\0
3e50: 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28  ';..Tcl_Release(
3e60: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74  (ClientData) int
3e70: 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 28 69  erp);..return((i
3e80: 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a  nt) len);.    }.
3e90: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
3ea0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74  (ClientData) int
3eb0: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  erp);.    return
3ec0: 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d   -1;.}.../*. *--
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f10: 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20  -. *. * Session 
3f20: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69  Callback for Cli
3f30: 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  ents --. *. *.Ca
3f40: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20  lled when a new 
3f50: 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64  session is added
3f60: 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49   to the cache. I
3f70: 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69  n TLS 1.3. *.thi
3f80: 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 65  s may be receive
3f90: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
3fa0: 20 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 73   after the hands
3fb0: 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72  hake. For. *.ear
3fc0: 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74  lier versions, t
3fd0: 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65  his will be rece
3fe0: 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 20  ived during the 
3ff0: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68  handshake.. *.Th
4000: 69 73 20 69 73 20 74 68 65 20 70 72 65 66 65 72  is is the prefer
4010: 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69  red way to obtai
4020: 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65  n a resumable se
4030: 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73  ssion.. *. * Res
4040: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
4050: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4060: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
4070: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
4080: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
4090: 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f  des:. *.0 = erro
40a0: 72 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20  r where session 
40b0: 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74  will be immediat
40c0: 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  ely removed from
40d0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
40e0: 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63  che.. *.1 = succ
40f0: 65 73 73 20 77 68 65 72 65 20 61 70 70 20 72 65  ess where app re
4100: 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e  tains session in
4110: 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20   session cache, 
4120: 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53  and must call SS
4130: 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29  L_SESSION_free()
4140: 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20   when done.. *. 
4150: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4190: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
41a0: 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62  int.SessionCallb
41b0: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
41c0: 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20  sl, SSL_SESSION 
41d0: 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20 20  *session) {.    
41e0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
41f0: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65  = (State*)SSL_ge
4200: 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20  t_app_data((SSL 
4210: 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f  *)ssl);.    Tcl_
4220: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
4230: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
4240: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
4250: 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73  cmdPtr;.    cons
4260: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4270: 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f 6e  *ticket;.    con
4280: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4290: 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20 20   *session_id;.  
42a0: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 20    size_t len2;. 
42b0: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
42c0: 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e  ulen;..    dprin
42d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
42e0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
42f0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
4300: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
4310: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
4320: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20  T_ERR_OK;.    } 
4330: 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20  else if (ssl == 
4340: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
4350: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
4360: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
4370: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
4380: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
4390: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
43a0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
43b0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
43c0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
43d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
43e0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
43f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
4400: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  session", -1));.
4410: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4420: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4430: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
4440: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
4450: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
4460: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
4470: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  self), -1));..  
4480: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20    /* Session id 
4490: 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69  */.    session_i
44a0: 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  d = SSL_SESSION_
44b0: 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20  get_id(session, 
44c0: 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  &ulen);.    Tcl_
44d0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
44e0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
44f0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
4500: 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e  ArrayObj(session
4510: 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  _id, (Tcl_Size) 
4520: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ulen));..    /* 
4530: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a  Session ticket *
4540: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f  /.    SSL_SESSIO
4550: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65  N_get0_ticket(se
4560: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20  ssion, &ticket, 
4570: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f  &len2);.    Tcl_
4580: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4590: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
45a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
45b0: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c  ArrayObj(ticket,
45c0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
45d0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65  ));..    /* Life
45e0: 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66  time - number of
45f0: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20   seconds */.    
4600: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4610: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4620: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   cmdPtr,..Tcl_Ne
4630: 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20  wLongObj((long) 
4640: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
4650: 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f  ticket_lifetime_
4660: 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b  hint(session)));
4670: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
4680: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
4690: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
46a0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
46b0: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
46c0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
46d0: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
46e0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
46f0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
4700: 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  turn 0;.}.../*. 
4710: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4750: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20  ----. *. * ALPN 
4760: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72  Callback for Ser
4770: 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c  vers and NPN Cal
4780: 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74  lback for Client
4790: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f  s --. *. *.Perfo
47a0: 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74  rm protocol (htt
47b0: 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65  p/1.1, h2, h3, e
47c0: 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66  tc.) selection f
47d0: 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69  or the. *.incomi
47e0: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43  ng connection. C
47f0: 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c  alled after Hell
4800: 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c  o and server cal
4810: 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65  lbacks.. *.Where
4820: 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74   'out' is select
4830: 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20  ed protocol and 
4840: 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 72  'in' is the peer
4850: 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 74   advertised list
4860: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
4870: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
4880: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
4890: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
48a0: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
48b0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
48c0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
48d0: 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f  R_OK: ALPN proto
48e0: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68  col selected. Th
48f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
4900: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54  tinues.. *.SSL_T
4910: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
4920: 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73  FATAL: There was
4930: 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77   no overlap betw
4940: 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73  een the client's
4950: 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64  . *.    supplied
4960: 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65   list and the se
4970: 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  rver configurati
4980: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  on. The connecti
4990: 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74  on will be abort
49a0: 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  ed.. *.SSL_TLSEX
49b0: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50  T_ERR_NOACK: ALP
49c0: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  N protocol not s
49d0: 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62  elected, e.g., b
49e0: 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20  ecause no ALPN. 
49f0: 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20  *.    protocols 
4a00: 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66  are configured f
4a10: 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  or this connecti
4a20: 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  on. The connecti
4a30: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
4a40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a80: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
4a90: 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61  c int.ALPNCallba
4aa0: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
4ab0: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  l, const unsigne
4ac0: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e  d char **out, un
4ad0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74  signed char *out
4ae0: 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69  len,..const unsi
4af0: 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75  gned char *in, u
4b00: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65  nsigned int inle
4b10: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  n, void *arg) {.
4b20: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
4b30: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
4b40: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
4b50: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
4b60: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
4b70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
4b80: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c  r;.    int code,
4b90: 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e   res;..    dprin
4ba0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
4bb0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
4bc0: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c  LL || arg == NUL
4bd0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
4be0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
4bf0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
4c00: 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c   Select protocol
4c10: 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f   */.    if (SSL_
4c20: 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74  select_next_prot
4c30: 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73  o(out, outlen, s
4c40: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c  tatePtr->protos,
4c50: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
4c60: 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65  s_len,..in, inle
4c70: 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50  n) == OPENSSL_NP
4c80: 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a  N_NEGOTIATED) {.
4c90: 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20  ./* Match found 
4ca0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c  */..res = SSL_TL
4cb0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
4cc0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50   } else {../* OP
4cd0: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45  ENSSL_NPN_NO_OVE
4ce0: 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61  RLAP = No overla
4cf0: 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 20  p, so use first 
4d00: 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74  item from client
4d10: 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a   protocol list *
4d20: 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  /..res = SSL_TLS
4d30: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
4d40: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
4d50: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20  atePtr->vcmd == 
4d60: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
4d70: 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20  {..return res;. 
4d80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
4d90: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
4da0: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
4db0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
4dc0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
4dd0: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
4de0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4df0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4e00: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
4e10: 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29  Obj("alpn", -1))
4e20: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
4e30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4e40: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
4e50: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
4e60: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
4e70: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
4e80: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
4e90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4ea0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4eb0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
4ec0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f 75  NewStringObj(*ou
4ed0: 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  t, -1));.    Tcl
4ee0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4ef0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
4f00: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  dPtr, Tcl_NewBoo
4f10: 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53  leanObj(res == S
4f20: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
4f30: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ));..    /* Eval
4f40: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
4f50: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
4f60: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
4f70: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65  );.    if ((code
4f80: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28   = EvalCallback(
4f90: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
4fa0: 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20  , cmdPtr)) > 1) 
4fb0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
4fc0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
4fd0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f     } else if (co
4fe0: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20  de == 1) {..res 
4ff0: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
5000: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
5010: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
5020: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
5030: 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  TAL;.    }.    T
5040: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
5050: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
5060: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn res;.}.../*.
5070: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50b0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65  -----. *. * Adve
50c0: 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20  rtise Protocols 
50d0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78  Callback for Nex
50e0: 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74  t Protocol Negot
50f0: 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20  iation (NPN) in 
5100: 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20  ServerHello --. 
5110: 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e  *. *.called when
5120: 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65   a TLS server ne
5130: 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75  eds a list of su
5140: 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c  pported protocol
5150: 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72  s for Next. *.Pr
5160: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69  otocol Negotiati
5170: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  on.. *. * Result
5180: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
5190: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
51a0: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
51b0: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s:. *.SSL_TLSEXT
51c0: 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f  _ERR_OK: NPN pro
51d0: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20  tocol selected. 
51e0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
51f0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c  ontinues.. *.SSL
5200: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5210: 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20  K: NPN protocol 
5220: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68  not selected. Th
5230: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
5240: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d  tinues.. *. *---
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5290: 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f  . */.#ifdef USE_
52a0: 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e  NPN.static int.N
52b0: 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  PNCallback(const
52c0: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74   SSL *ssl, const
52d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
52e0: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69  *out, unsigned i
52f0: 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64  nt *outlen, void
5300: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
5310: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
5320: 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20  State*)arg;..   
5330: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
5340: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c  ");..    if (ssl
5350: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20   == NULL || arg 
5360: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
5370: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
5380: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
5390: 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f      /* Set proto
53a0: 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20  cols list */.   
53b0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70   if (statePtr->p
53c0: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  rotos != NULL) {
53d0: 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74  ..*out = statePt
53e0: 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74  r->protos;..*out
53f0: 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  len = statePtr->
5400: 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20  protos_len;.    
5410: 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d  } else {..*out =
5420: 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20   NULL;..*outlen 
5430: 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  = 0;..return SSL
5440: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5450: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
5460: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5470: 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RR_OK;.}.#endif.
5480: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
54d0: 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f   SNI Callback fo
54e0: 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a  r Servers --. *.
54f0: 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65   *.Perform serve
5500: 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e  r-side SNI hostn
5510: 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66  ame selection af
5520: 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e  ter receiving SN
5530: 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69  I extension. *.i
5540: 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20  n Client Hello. 
5550: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c  Called after hel
5560: 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20  lo callback but 
5570: 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c  before ALPN call
5580: 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  back.. *. * Resu
5590: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
55a0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
55b0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
55c0: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
55d0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
55e0: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
55f0: 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f  T_ERR_OK: SNI ho
5600: 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74  stname is accept
5610: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
5620: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
5630: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
5640: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49  ALERT_FATAL: SNI
5650: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
5660: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63   accepted. The c
5670: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20  onnection. *.   
5680: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66   is aborted. Def
5690: 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69  ault for alert i
56a0: 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47  s SSL_AD_UNRECOG
56b0: 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53  NIZED_NAME.. *.S
56c0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
56d0: 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49  ERT_WARNING: SNI
56e0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
56f0: 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69   accepted, warni
5700: 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20  ng alert. *.    
5710: 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72  sent (not suppor
5720: 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e  ted in TLSv1.3).
5730: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
5740: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
5750: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5760: 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  CK: SNI hostname
5770: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
5780: 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c   and not acknowl
5790: 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e  edged,. *.    e.
57a0: 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f  g. if SNI has no
57b0: 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65  t been configure
57c0: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
57d0: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a  n continues.. *.
57e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
57f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5820: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
5830: 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b   int.SNICallback
5840: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
5850: 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69   int *alert, voi
5860: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
5870: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
5880: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20  (State*)arg;.   
5890: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
58a0: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
58b0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
58c0: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
58d0: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a   int code, res;.
58e0: 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72      char *server
58f0: 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  name = NULL;..  
5900: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
5910: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73  d");..    if (ss
5920: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  l == NULL || arg
5930: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
5940: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5950: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
5960: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72  .    /* Only wor
5970: 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61  ks for TLS 1.2 a
5980: 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20  nd earlier */.  
5990: 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53    servername = S
59a0: 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d  SL_get_servernam
59b0: 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41  e(ssl, TLSEXT_NA
59c0: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65  METYPE_host_name
59d0: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 76  );.    if (!serv
59e0: 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72  ername || server
59f0: 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29  name[0] == '\0')
5a00: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
5a10: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
5a20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
5a30: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
5a40: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
5a50: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
5a60: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
5a70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
5a80: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
5a90: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
5aa0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
5ab0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
5ac0: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
5ad0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5ae0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5af0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
5b00: 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b  Obj("sni", -1));
5b10: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
5b20: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
5b30: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
5b40: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
5b50: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
5b60: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
5b70: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
5b80: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5b90: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5ba0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
5bb0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76  ewStringObj(serv
5bc0: 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a  ername , -1));..
5bd0: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
5be0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
5bf0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5c00: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
5c10: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76    if ((code = Ev
5c20: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
5c30: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
5c40: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65  Ptr)) > 1) {..re
5c50: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
5c60: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47  RR_ALERT_WARNING
5c70: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
5c80: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f  AD_UNRECOGNIZED_
5c90: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70  NAME; /* Not sup
5ca0: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e  ported by TLS 1.
5cb0: 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20  3 */.    } else 
5cc0: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b  if (code == 1) {
5cd0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
5ce0: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
5cf0: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53   else {..res = S
5d00: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
5d10: 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65  ERT_FATAL;..*ale
5d20: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45  rt = SSL_AD_UNRE
5d30: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f  COGNIZED_NAME; /
5d40: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  * Not supported 
5d50: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20  by TLS 1.3 */.  
5d60: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
5d70: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
5d80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
5d90: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5de0: 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f  *. * ClientHello
5df0: 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62   Handshake Callb
5e00: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20  ack for Servers 
5e10: 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79  --. *. *.Used by
5e20: 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69   server to exami
5e30: 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61  ne the server na
5e40: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53  me indication (S
5e50: 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a  NI) extension. *
5e60: 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65  .provided by the
5e70: 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72   client in order
5e80: 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70   to select an ap
5e90: 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66  propriate certif
5ea0: 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73  icate to. *.pres
5eb0: 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74  ent, and make ot
5ec0: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  her configuratio
5ed0: 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65  n adjustments re
5ee0: 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73  levant to that s
5ef0: 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e  erver. *.name an
5f00: 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74  d its configurat
5f10: 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64  ion. This includ
5f20: 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20  es swapping out 
5f30: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
5f40: 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65  *.SSL_CTX pointe
5f50: 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  r, modifying the
5f60: 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f   server's list o
5f70: 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20  f permitted TLS 
5f80: 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61  versions,. *.cha
5f90: 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72  nging the server
5fa0: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69  's cipher list i
5fb0: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68  n response to th
5fc0: 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65  e client's ciphe
5fd0: 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09  r list, etc.. *.
5fe0: 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e  Called before SN
5ff0: 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62  I and ALPN callb
6000: 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  acks.. *. * Resu
6010: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
6020: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
6030: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
6040: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
6050: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
6060: 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  es:. *.SSL_CLIEN
6070: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73  T_HELLO_RETRY: s
6080: 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73  uspend the hands
6090: 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61  hake, and the ha
60a0: 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e  ndshake function
60b0: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d   will return imm
60c0: 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f  ediately. *.SSL_
60d0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
60e0: 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72  OR: failure, ter
60f0: 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f  minate connectio
6100: 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20  n. Set alert to 
6110: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53  error code.. *.S
6120: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6130: 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 73  SUCCESS: success
6140: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
6190: 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61  atic int.HelloCa
61a0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
61b0: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72   *ssl, int *aler
61c0: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  t, void *arg) {.
61d0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
61e0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
61f0: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
6200: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
6210: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
6220: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
6230: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c  r;.    int code,
6240: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20   res;.    const 
6250: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65  char *servername
6260: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
6270: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20  gned char *p;.  
6280: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65    size_t len, re
6290: 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70  maining;..    dp
62a0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
62b0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
62c0: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
62d0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  _Obj*)NULL) {..r
62e0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
62f0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a  _HELLO_SUCCESS;.
6300: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
6310: 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c  sl == (const SSL
6320: 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d   *)NULL || arg =
6330: 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20  = (void *)NULL) 
6340: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  {..return SSL_CL
6350: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
6360: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6370: 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  Get names */.   
6380: 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74   if (!SSL_client
6390: 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28  _hello_get0_ext(
63a0: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45  ssl, TLSEXT_TYPE
63b0: 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70  _server_name, &p
63c0: 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c  , &remaining) ||
63d0: 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29   remaining <= 2)
63e0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
63f0: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49  _R_SSLV3_ALERT_I
6400: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52  LLEGAL_PARAMETER
6410: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
6420: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
6430: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6440: 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67  Extract the leng
6450: 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  th of the suppli
6460: 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73  ed list of names
6470: 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28  . */.    len = (
6480: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20  *(p++) << 8);.  
6490: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b    len += *(p++);
64a0: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32  .    if (len + 2
64b0: 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b   != remaining) {
64c0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
64d0: 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c  _SSLV3_ALERT_ILL
64e0: 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a  EGAL_PARAMETER;.
64f0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
6500: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6510: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e      }.    remain
6520: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20  ing = len;..    
6530: 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70  /* The list in p
6540: 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73  ractice only has
6550: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e   a single elemen
6560: 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f  t, so we only co
6570: 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74  nsider the first
6580: 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20   one. */.    if 
6590: 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20  (remaining == 0 
65a0: 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58  || *p++ != TLSEX
65b0: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
65c0: 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20  name) {..*alert 
65d0: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
65e0: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
65f0: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  OR;..return SSL_
6600: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6610: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
6620: 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20  maining--;..    
6630: 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69  /* Now we can fi
6640: 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74  nally pull out t
6650: 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 69  he byte array wi
6660: 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f  th the actual ho
6670: 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69  stname. */.    i
6680: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20  f (remaining <= 
6690: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  2) {..*alert = S
66a0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
66b0: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b  _INTERNAL_ERROR;
66c0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
66d0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
66e0: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
66f0: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a   (*(p++) << 8);.
6700: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b      len += *(p++
6710: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b  );.    if (len +
6720: 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20   2 > remaining) 
6730: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
6740: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
6750: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72  TERNAL_ERROR;..r
6760: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
6770: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
6780: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e    }.    remainin
6790: 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72  g = len;.    ser
67a0: 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  vername = (const
67b0: 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20   char *)p;..    
67c0: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
67d0: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20  d to eval */.   
67e0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
67f0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
6800: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
6810: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6820: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
6830: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
6840: 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f  StringObj("hello
6850: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
6860: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6870: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
6880: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
6890: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
68a0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
68b0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
68c0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
68d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
68e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
68f0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
6900: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20  Obj(servername, 
6910: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29  (Tcl_Size) len))
6920: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
6930: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
6940: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
6950: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
6960: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d  .    if ((code =
6970: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
6980: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
6990: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a  cmdPtr)) > 1) {.
69a0: 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e  .res = SSL_CLIEN
69b0: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09  T_HELLO_RETRY;..
69c0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54  *alert = SSL_R_T
69d0: 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f  LSV1_ALERT_USER_
69e0: 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d  CANCELLED;.    }
69f0: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d   else if (code =
6a00: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 1) {..res = SS
6a10: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53  L_CLIENT_HELLO_S
6a20: 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c  UCCESS;.    } el
6a30: 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  se {..res = SSL_
6a40: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6a50: 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  OR;..*alert = SS
6a60: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
6a70: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a  INTERNAL_ERROR;.
6a80: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
6a90: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
6aa0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
6ab0: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a  es;.}.../*******
6ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
6ad0: 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20  * Commands      
6ae0: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
6af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
6b00: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b40: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70  ------. *. * Cip
6b50: 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69  hersObjCmd -- li
6b60: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70  st available cip
6b70: 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20  hers. *. *.This 
6b80: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
6b90: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
6ba0: 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72  the "tls::cipher
6bb0: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f  s" command. *.to
6bc0: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
6bd0: 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75  ciphers, based u
6be0: 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  pon protocol sel
6bf0: 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73  ected.. *. * Res
6c00: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
6c10: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c  ard Tcl result l
6c20: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ist.. *. * Side 
6c30: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73  effects:. *.cons
6c40: 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72  tructs and destr
6c50: 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  oys SSL context 
6c60: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  (CTX). *. *-----
6c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
6cb0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
6cc0: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b  char *protocols[
6cd0: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22  ] = {.."ssl2", "
6ce0: 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22  ssl3", "tls1", "
6cf0: 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32  tls1.1", "tls1.2
6d00: 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c  ", "tls1.3", NUL
6d10: 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63  L.};.enum protoc
6d20: 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c  ol {.    TLS_SSL
6d30: 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53  2, TLS_SSL3, TLS
6d40: 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f  _TLS1, TLS_TLS1_
6d50: 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54  1, TLS_TLS1_2, T
6d60: 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e  LS_TLS1_3, TLS_N
6d70: 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69  ONE.};..static i
6d80: 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  nt.CiphersObjCmd
6d90: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
6da0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
6db0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
6dc0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
6dd0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
6de0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
6df0: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  tr = NULL;.    S
6e00: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  SL_CTX *ctx = NU
6e10: 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c  LL;.    SSL *ssl
6e20: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41   = NULL;.    STA
6e30: 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52  CK_OF(SSL_CIPHER
6e40: 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20  ) *sk;.    char 
6e50: 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d  *cp, buf[BUFSIZ]
6e60: 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c  ;.    int index,
6e70: 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73   verbose = 0, us
6e80: 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b  e_supported = 0;
6e90: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d  .    const SSL_M
6ea0: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a  ETHOD *method;..
6eb0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
6ec0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
6ed0: 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f  (objc < 2) || (o
6ee0: 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c  bjc > 4)) {..Tcl
6ef0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6f00: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
6f10: 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73  protocol ?verbos
6f20: 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29  e? ?supported?")
6f30: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
6f40: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
6f50: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
6f60: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
6f70: 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c  bjv[1], protocol
6f80: 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30  s, "protocol", 0
6f90: 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c  , &index) != TCL
6fa0: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
6fb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6fc0: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20      if ((objc > 
6fd0: 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f  2) && Tcl_GetBoo
6fe0: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
6ff0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65  rp, objv[2], &ve
7000: 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b  rbose) != TCL_OK
7010: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
7020: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
7030: 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20   if ((objc > 3) 
7040: 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  && Tcl_GetBoolea
7050: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
7060: 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73   objv[3], &use_s
7070: 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c  upported) != TCL
7080: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
7090: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
70a0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
70b0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69  rror();..    swi
70c0: 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f  tch ((enum proto
70d0: 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61  col)index) {..ca
70e0: 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66  se TLS_SSL2:.#if
70f0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
7100: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31  _NUMBER >= 0x101
7110: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65  00000L || define
7120: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65  d(NO_SSL2) || de
7130: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7140: 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f  _SSL2)..    Tcl_
7150: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7160: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
7170: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
7180: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
7190: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
71a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
71b0: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
71c0: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f  od = SSLv2_metho
71d0: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
71e0: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c  if..case TLS_SSL
71f0: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  3:.#if defined(N
7200: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
7210: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
7220: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L3) || defined(O
7230: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d  PENSSL_NO_SSL3_M
7240: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f  ETHOD)..    Tcl_
7250: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7260: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
7270: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
7280: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
7290: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
72a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
72b0: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
72c0: 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f  od = SSLv3_metho
72d0: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
72e0: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53  if..case TLS_TLS
72f0: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  1:.#if defined(N
7300: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
7310: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7320: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  S1) || defined(O
7330: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d  PENSSL_NO_TLS1_M
7340: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f  ETHOD)..    Tcl_
7350: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7360: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
7370: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
7380: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
7390: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
73a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
73b0: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
73c0: 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f  od = TLSv1_metho
73d0: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
73e0: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53  if..case TLS_TLS
73f0: 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  1_1:.#if defined
7400: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  (NO_TLS1_1) || d
7410: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7420: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
7430: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7440: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09  TLS1_1_METHOD)..
7450: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
7460: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
7470: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
7480: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
7490: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
74a0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
74b0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
74c0: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53      method = TLS
74d0: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62  v1_1_method(); b
74e0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
74f0: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23  se TLS_TLS1_2:.#
7500: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
7510: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
7520: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7530: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
7540: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
7550: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63  _METHOD)..    Tc
7560: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7570: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73  nterp, protocols
7580: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74  [index], ": prot
7590: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
75a0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ed", NULL);..   
75b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
75c0: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65  R;.#else..    me
75d0: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d  thod = TLSv1_2_m
75e0: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
75f0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
7600: 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66  _TLS1_3:.#if def
7610: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
7620: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
7630: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20  SL_NO_TLS1_3).. 
7640: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7650: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
7660: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
7670: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7680: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
7690: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
76a0: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
76b0: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f     method = TLS_
76c0: 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 53  method();..    S
76d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70  SL_CTX_set_min_p
76e0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
76f0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
7700: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
7710: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
7720: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
7730: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20  3_VERSION);..   
7740: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
7750: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65  default:..    me
7760: 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f  thod = TLS_metho
7770: 64 28 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  d();..    break;
7780: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 20  .    }..    ctx 
7790: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65  = SSL_CTX_new(me
77a0: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 63  thod);.    if (c
77b0: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  tx == NULL) {..T
77c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
77d0: 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29  interp, REASON()
77e0: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
77f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7800: 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c  }..    ssl = SSL
7810: 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69  _new(ctx);.    i
7820: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20  f (ssl == NULL) 
7830: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
7840: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53  ult(interp, REAS
7850: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53  ON(), NULL);..SS
7860: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
7870: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7880: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
7890: 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f  * Use list and o
78a0: 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65  rder as would be
78b0: 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e   sent in a Clien
78c0: 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76  tHello or all av
78d0: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20  ailable ciphers 
78e0: 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73  */.    if (use_s
78f0: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20  upported) {..sk 
7900: 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f  = SSL_get1_suppo
7910: 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c  rted_ciphers(ssl
7920: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
7930: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69  .sk = SSL_get_ci
7940: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20  phers(ssl);.    
7950: 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d  }..    if (sk !=
7960: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76   NULL) {..if (!v
7970: 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f  erbose) {..    o
7980: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
7990: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
79a0: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69  ..    for (int i
79b0: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c   = 0; i < sk_SSL
79c0: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b  _CIPHER_num(sk);
79d0: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20   i++) {...const 
79e0: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20  SSL_CIPHER *c = 
79f0: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61  sk_SSL_CIPHER_va
7a00: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66  lue(sk, i);...if
7a10: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e   (c == NULL) con
7a20: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70  tinue;..../* cip
7a30: 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e  her name or (NON
7a40: 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c  E) */...cp = SSL
7a50: 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65  _CIPHER_get_name
7a60: 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d  (c);...if (cp ==
7a70: 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09   NULL) break;...
7a80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
7a90: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
7aa0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
7ab0: 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31  StringObj(cp, -1
7ac0: 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65  ));..    }...} e
7ad0: 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74  lse {..    objPt
7ae0: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
7af0: 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20  gObj("",0);..   
7b00: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
7b10: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48   i < sk_SSL_CIPH
7b20: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29  ER_num(sk); i++)
7b30: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43   {...const SSL_C
7b40: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53  IPHER *c = sk_SS
7b50: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73  L_CIPHER_value(s
7b60: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d  k, i);...if (c =
7b70: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65  = NULL) continue
7b80: 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20  ;..../* textual 
7b90: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
7ba0: 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69  he cipher */...i
7bb0: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65  f (SSL_CIPHER_de
7bc0: 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66  scription(c, buf
7bd0: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21  , sizeof(buf)) !
7be0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20  = NULL) {...    
7bf0: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28  Tcl_AppendToObj(
7c00: 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 54 63  objPtr, buf, (Tc
7c10: 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e 28 62  l_Size) strlen(b
7c20: 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  uf));...} else {
7c30: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ...    Tcl_Appen
7c40: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22  dToObj(objPtr, "
7c50: 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a  UNKNOWN\n", 8);.
7c60: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69  ..}..    }..}..i
7c70: 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64  f (use_supported
7c80: 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f  ) {..    sk_SSL_
7c90: 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b  CIPHER_free(sk);
7ca0: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53  ..}.    }.    SS
7cb0: 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20  L_free(ssl);.   
7cc0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
7cd0: 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  x);..    Tcl_Set
7ce0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
7cf0: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
7d00: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
7d10: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
7d20: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ntData;.}.../*. 
7d30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
7d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d70: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f  ----. *. * Proto
7d80: 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69  colsObjCmd -- li
7d90: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f  st available pro
7da0: 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69  tocols. *. *.Thi
7db0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
7dc0: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
7dd0: 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74  s the "tls::prot
7de0: 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20  ocols" command. 
7df0: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61  *.to list availa
7e00: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20  ble protocols.. 
7e10: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
7e20: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
7e30: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a  result list.. *.
7e40: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
7e50: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d  . *.none. *. *--
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ea0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
7eb0: 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64  .ProtocolsObjCmd
7ec0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
7ed0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
7ee0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
7ef0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
7f00: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
7f10: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
7f20: 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  tr;..    dprintf
7f30: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
7f40: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20   if (objc != 1) 
7f50: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
7f60: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
7f70: 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72  bjv, "");..retur
7f80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7f90: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
7fa0: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
7fb0: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
7fc0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
7fd0: 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  ;..#if OPENSSL_V
7fe0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
7ff0: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21  0x10100000L && !
8000: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
8010: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8020: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
8030: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
8040: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
8050: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
8060: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
8070: 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c  ocols[TLS_SSL2],
8080: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
8090: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
80a0: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
80b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
80c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
80d0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54  NSSL_NO_SSL3_MET
80e0: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  HOD).    Tcl_Lis
80f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8100: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8110: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8120: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
8130: 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65  _SSL3], -1));.#e
8140: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
8150: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
8160: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8170: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
8180: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
8190: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  LS1_METHOD).    
81a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
81b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
81c0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
81d0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
81e0: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d  ols[TLS_TLS1], -
81f0: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1));.#endif.#if 
8200: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
8210: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
8220: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
8230: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
8240: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
8250: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c  _METHOD).    Tcl
8260: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
8270: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
8280: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
8290: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
82a0: 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31  [TLS_TLS1_1], -1
82b0: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
82c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
82d0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
82e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
82f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8300: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f  ENSSL_NO_TLS1_2_
8310: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f  METHOD).    Tcl_
8320: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8330: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
8340: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
8350: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
8360: 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29  TLS_TLS1_2], -1)
8370: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
8380: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
8390: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
83a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
83b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
83c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
83d0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
83e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
83f0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53  rotocols[TLS_TLS
8400: 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  1_3], -1));.#end
8410: 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  if..    Tcl_SetO
8420: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
8430: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
8440: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
8450: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
8460: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
8470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84b0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68  ---. *. * Handsh
84c0: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  akeObjCmd --. *.
84d0: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20   *.This command 
84e0: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66  is used to verif
84f0: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61  y whether the ha
8500: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c  ndshake is compl
8510: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20  ete. *.or not.. 
8520: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
8530: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
8540: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20  result. 1 means 
8550: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65  handshake comple
8560: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64  te, 0 means pend
8570: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ing.. *. * Side 
8580: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
8590: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69  force SSL negoti
85a0: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c  ation to take pl
85b0: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ace.. *. *------
85c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8600: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e  /.static int Han
8610: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69  dshakeObjCmd(Cli
8620: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
8630: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
8640: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
8650: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
8660: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
8670: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
8680: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8690: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
86a0: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  mode on. */.    
86b0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
86c0: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e          /* clien
86d0: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
86e0: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f  socket */.    co
86f0: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72  nst char *errStr
8700: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
8710: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e   ret = 1;.    in
8720: 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20  t err = 0;..    
8730: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
8740: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
8750: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
8760: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
8770: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
8780: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28  nnel");..return(
8790: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
87a0: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
87b0: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
87c0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
87d0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
87e0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
87f0: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f  j(objv[1], (Tcl_
8800: 53 69 7a 65 20 2a 29 4e 55 4c 4c 29 2c 20 4e 55  Size *)NULL), NU
8810: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
8820: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
8830: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
8840: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
8850: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
8860: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
8870: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
8880: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
8890: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
88a0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
88b0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43      if (Tcl_GetC
88c0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
88d0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
88e0: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70  ype()) {..Tcl_Ap
88f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8900: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
8910: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
8920: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
8930: 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54      "\": not a T
8940: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  LS channel", NUL
8950: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
8960: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
8970: 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22  LS", "HANDSHAKE"
8980: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
8990: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
89a0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28   NULL);..return(
89b0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
89c0: 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d  }.    statePtr =
89d0: 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65   (State *)Tcl_Ge
89e0: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
89f0: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20  Data(chan);..   
8a00: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e   dprintf("Callin
8a10: 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  g Tls_WaitForCon
8a20: 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20  nect");.    ret 
8a30: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  = Tls_WaitForCon
8a40: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26  nect(statePtr, &
8a50: 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72  err, 1);.    dpr
8a60: 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f  intf("Tls_WaitFo
8a70: 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65  rConnect returne
8a80: 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20  d: %i", ret);.. 
8a90: 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26     if (ret < 0 &
8aa0: 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  & ((statePtr->fl
8ab0: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53  ags & TLS_TCL_AS
8ac0: 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20  YNC) && (err == 
8ad0: 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72  EAGAIN))) {..dpr
8ae0: 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20  intf("Async set 
8af0: 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e  and err = EAGAIN
8b00: 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20  ");..ret = 0;.  
8b10: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74    } else if (ret
8b20: 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65   < 0) {..long re
8b30: 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20  sult;..errStr = 
8b40: 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09  statePtr->err;..
8b50: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
8b60: 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65  interp);..Tcl_Se
8b70: 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69  tErrno(err);...i
8b80: 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a  f (!errStr || (*
8b90: 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a  errStr == 0)) {.
8ba0: 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63  .    errStr = Tc
8bb0: 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  l_PosixError(int
8bc0: 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41  erp);..}...Tcl_A
8bd0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8be0: 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66  rp, "handshake f
8bf0: 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72  ailed: ", errStr
8c00: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
8c10: 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d  ;..if ((result =
8c20: 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f   SSL_get_verify_
8c30: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
8c40: 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56  >ssl)) != X509_V
8c50: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  _OK) {..    Tcl_
8c60: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8c70: 65 72 70 2c 20 22 20 64 75 65 20 74 6f 3a 20 22  erp, " due to: "
8c80: 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  , X509_verify_ce
8c90: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
8ca0: 72 65 73 75 6c 74 29 2c 20 28 63 68 61 72 20 2a  result), (char *
8cb0: 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c  ) NULL);..}..Tcl
8cc0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
8cd0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41  terp, "TLS", "HA
8ce0: 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45  NDSHAKE", "FAILE
8cf0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
8d00: 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65  L);..dprintf("Re
8d10: 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f  turning TCL_ERRO
8d20: 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65  R with handshake
8d30: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72   failed: %s", er
8d40: 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54  rStr);..return(T
8d50: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
8d60: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72   else {..if (err
8d70: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70   != 0) {..    dp
8d80: 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72  rintf("Got an er
8d90: 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c  ror with a compl
8da0: 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20  eted handshake: 
8db0: 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b  err = %i", err);
8dc0: 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20  ..}..ret = 1;.  
8dd0: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
8de0: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f  ("Returning TCL_
8df0: 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25  OK with data \"%
8e00: 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20  i\"", ret);.    
8e10: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
8e20: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
8e30: 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20  IntObj(ret));.  
8e40: 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29    return(TCL_OK)
8e50: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
8e60: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f  clientData;.}../
8e70: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8eb0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d  -------. *. * Im
8ec0: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  portObjCmd --. *
8ed0: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
8ee0: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
8ef0: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73   process the "ss
8f00: 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a  l" command. *. *
8f10: 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64  .The ssl command
8f20: 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72   pushes SSL over
8f30: 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63   a (newly connec
8f40: 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a  ted) tcp socket.
8f50: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
8f60: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
8f70: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
8f80: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
8f90: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62  May modify the b
8fa0: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f  ehavior of an IO
8fb0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d   channel.. *. *-
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9000: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
9010: 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43  t.ImportObjCmd(C
9020: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
9030: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
9040: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
9050: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
9060: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
9070: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
9080: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
9090: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
90a0: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74   on. */.    Stat
90b0: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
90c0: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
90d0: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
90e0: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
90f0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9100: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63  .    Tcl_Obj *sc
9110: 72 69 70 74 09 20 20 20 20 20 20 20 20 3d 20 4e  ript.        = N
9120: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
9130: 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20 20   *password.     
9140: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54     = NULL;.    T
9150: 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 20 20 20  cl_Obj *vcmd.   
9160: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
9170: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70   Tcl_DString upp
9180: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
9190: 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e  tion, upperChann
91a0: 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65  elBlocking, uppe
91b0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
91c0: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  , upperChannelEO
91d0: 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69  FChar;.    int i
91e0: 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  dx;.    Tcl_Size
91f0: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c   len;.    int fl
9200: 61 67 73 09 09 20 20 20 20 20 20 20 20 3d 20 54  ags..        = T
9210: 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20  LS_TCL_INIT;.   
9220: 20 69 6e 74 20 73 65 72 76 65 72 09 09 20 20 20   int server..   
9230: 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20       = 0;./* is 
9240: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d  connection incom
9250: 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f  ing or outgoing?
9260: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65   */.    char *ke
9270: 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  yfile.        = 
9280: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9290: 63 65 72 74 66 69 6c 65 09 20 20 20 20 20 20 20  certfile.       
92a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73   = NULL;.    uns
92b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20  igned char *key 
92c0: 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63   .= NULL;.    Tc
92d0: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 20 20  l_Size key_len  
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d                 =
92f0: 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   0;.    unsigned
9300: 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 20   char *cert     
9310: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9320: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65  Tcl_Size cert_le
9330: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
9340: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
9350: 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20  ciphers.        
9360: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
9370: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 09 20   *ciphersuites. 
9380: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
9390: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09     char *CAfile.
93a0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
93b0: 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 09      char *CAdir.
93c0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
93d0: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72  .    char *DHpar
93e0: 61 6d 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ams.        = NU
93f0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f  LL;.    char *mo
9400: 64 65 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e  del..        = N
9410: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  ULL;.    char *s
9420: 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20  ervername.      
9430: 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73    = NULL;./* hos
9440: 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72  tname for Server
9450: 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e   Name Indication
9460: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
9470: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
9480: 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a  sion_id = NULL;.
9490: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70      Tcl_Obj *alp
94a0: 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  n..= NULL;.    i
94b0: 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c  nt ssl2 = 0, ssl
94c0: 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  3 = 0;.    int t
94d0: 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20  ls1 = 1, tls1_1 
94e0: 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c  = 1, tls1_2 = 1,
94f0: 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20   tls1_3 = 1;.   
9500: 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20   int proto = 0, 
9510: 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  level = -1;.    
9520: 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20  int verify = 0, 
9530: 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71  require = 0, req
9540: 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68  uest = 1, post_h
9550: 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20  andshake = 0;.. 
9560: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
9570: 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  ed");..#if defin
9580: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
9590: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
95a0: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31  O_TLS1).    tls1
95b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
95c0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
95d0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
95e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
95f0: 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30  ).    tls1_1 = 0
9600: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
9610: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
9620: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
9630: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20  SL_NO_TLS1_2).  
9640: 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65    tls1_2 = 0;.#e
9650: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
9660: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
9670: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
9680: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c  O_TLS1_3).    tl
9690: 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66  s1_3 = 0;.#endif
96a0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c  ..    if (objc <
96b0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
96c0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
96d0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
96e0: 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09  l ?options?");..
96f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9700: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
9710: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
9720: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
9730: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
9740: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
9750: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
9760: 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 4c   (Tcl_Size *)NUL
9770: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
9780: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
9790: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
97a0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
97b0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
97c0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
97d0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
97e0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
97f0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
9800: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
9810: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69  an);..    for (i
9820: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62  dx = 2; idx < ob
9830: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68  jc; idx++) {..ch
9840: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65  ar *opt = Tcl_Ge
9850: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
9860: 62 6a 76 5b 69 64 78 5d 2c 20 28 54 63 6c 5f 53  bjv[idx], (Tcl_S
9870: 69 7a 65 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 09 69  ize *)NULL);...i
9880: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27  f (opt[0] != '-'
9890: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  )..    break;...
98a0: 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20  OPTOBJ("-alpn", 
98b0: 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22  alpn);..OPTSTR("
98c0: 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29 3b  -cadir", CAdir);
98d0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c  ..OPTSTR("-cafil
98e0: 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50  e", CAfile);..OP
98f0: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63  TBYTE("-cert", c
9900: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a  ert, cert_len);.
9910: 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69  .OPTSTR("-certfi
9920: 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a  le", certfile);.
9930: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
9940: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50  ", ciphers);..OP
9950: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c  TSTR("-ciphers",
9960: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53   ciphers);..OPTS
9970: 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 65  TR("-ciphersuite
9980: 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  s", ciphersuites
9990: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d  );..OPTOBJ("-com
99a0: 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a  mand", script);.
99b0: 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 61  .OPTSTR("-dhpara
99c0: 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a  ms", DHparams);.
99d0: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c  .OPTBYTE("-key",
99e0: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a   key, key_len);.
99f0: 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c  .OPTSTR("-keyfil
9a00: 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f  e", keyfile);..O
9a10: 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20  PTSTR("-model", 
9a20: 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28  model);..OPTOBJ(
9a30: 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73  "-password", pas
9a40: 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c  sword);..OPTBOOL
9a50: 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  ("-post_handshak
9a60: 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61  e", post_handsha
9a70: 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  ke);..OPTBOOL("-
9a80: 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73  request", reques
9a90: 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72  t);..OPTBOOL("-r
9aa0: 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65  equire", require
9ab0: 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63  );..OPTINT("-sec
9ac0: 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76  uritylevel", lev
9ad0: 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  el);..OPTBOOL("-
9ae0: 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29  server", server)
9af0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76  ;..OPTSTR("-serv
9b00: 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e  ername", servern
9b10: 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ame);..OPTSTR("-
9b20: 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73  session_id", ses
9b30: 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f  sion_id);..OPTBO
9b40: 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32  OL("-ssl2", ssl2
9b50: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73  );..OPTBOOL("-ss
9b60: 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54  l3", ssl3);..OPT
9b70: 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c  BOOL("-tls1", tl
9b80: 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  s1);..OPTBOOL("-
9b90: 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29  tls1.1", tls1_1)
9ba0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
9bb0: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09  1.2", tls1_2);..
9bc0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33  OPTBOOL("-tls1.3
9bd0: 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54  ", tls1_3);..OPT
9be0: 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f  OBJ("-validateco
9bf0: 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09  mmand", vcmd);..
9c00: 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20  OPTOBJ("-vcmd", 
9c10: 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28  vcmd);...OPTBAD(
9c20: 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e  "option", "-alpn
9c30: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c  , -cadir, -cafil
9c40: 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66  e, -cert, -certf
9c50: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63  ile, -cipher, -c
9c60: 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f  iphersuites, -co
9c70: 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73  mmand, -dhparams
9c80: 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65  , -key, -keyfile
9c90: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77  , -model, -passw
9ca0: 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73  ord, -post_hands
9cb0: 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20  hake, -request, 
9cc0: 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72  -require, -secur
9cd0: 69 74 79 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65  itylevel, -serve
9ce0: 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20  r, -servername, 
9cf0: 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73  -session_id, -ss
9d00: 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31  l2, -ssl3, -tls1
9d10: 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31  , -tls1.1, -tls1
9d20: 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20  .2, -tls1.3, or 
9d30: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64  -validatecommand
9d40: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c  ");...return TCL
9d50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9d60: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09    if (request)..
9d70: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
9d80: 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45  RIFY_CLIENT_ONCE
9d90: 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45   | SSL_VERIFY_PE
9da0: 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75  ER;.    if (requ
9db0: 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09  est && require).
9dc0: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
9dd0: 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f  RIFY_FAIL_IF_NO_
9de0: 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69  PEER_CERT;.    i
9df0: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
9e00: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65  st_handshake).ve
9e10: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49  rify |= SSL_VERI
9e20: 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b  FY_POST_HANDSHAK
9e30: 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66  E;.    if (verif
9e40: 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20  y == 0)..verify 
9e50: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e  = SSL_VERIFY_NON
9e60: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  E;..    proto |=
9e70: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f   (ssl2 ? TLS_PRO
9e80: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20  TO_SSL2 : 0);.  
9e90: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33    proto |= (ssl3
9ea0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c   ? TLS_PROTO_SSL
9eb0: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  3 : 0);.    prot
9ec0: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53  o |= (tls1 ? TLS
9ed0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29  _PROTO_TLS1 : 0)
9ee0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
9ef0: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f  tls1_1 ? TLS_PRO
9f00: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a  TO_TLS1_1 : 0);.
9f10: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
9f20: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_2 ? TLS_PROTO
9f30: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20  _TLS1_2 : 0);.  
9f40: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
9f50: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _3 ? TLS_PROTO_T
9f60: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20  LS1_3 : 0);..   
9f70: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c   /* reset to NUL
9f80: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e  L if blank strin
9f90: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20  g provided */.  
9fa0: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a    if (cert && !*
9fb0: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63  cert)..        c
9fc0: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ert.        = NU
9fd0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20  LL;.    if (key 
9fe0: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20  && !*key)..     
9ff0: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d     key.        =
a000: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
a010: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72  ertfile && !*cer
a020: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63  tfile)         c
a030: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a  ertfile.= NULL;.
a040: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20      if (keyfile 
a050: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b  && !*keyfile)..k
a060: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  eyfile.        =
a070: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
a080: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68  iphers && !*ciph
a090: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70  ers).        cip
a0a0: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e  hers.        = N
a0b0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70  ULL;.    if (cip
a0c0: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63  hersuites && !*c
a0d0: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70  iphersuites) cip
a0e0: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e  hersuites    = N
a0f0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66  ULL;.    if (CAf
a100: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29  ile && !*CAfile)
a110: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09  .        CAfile.
a120: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a130: 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26      if (CAdir &&
a140: 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20   !*CAdir).      
a150: 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20    CAdir.        
a160: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a170: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48  DHparams && !*DH
a180: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20  params).        
a190: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20  DHparams        
a1a0: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20  = NULL;..    /* 
a1b0: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f  new SSL state */
a1c0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d  .    statePtr..=
a1d0: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c   (State *) ckall
a1e0: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69  oc((unsigned) si
a1f0: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20  zeof(State));.  
a200: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74    memset(statePt
a210: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61  r, 0, sizeof(Sta
a220: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65  te));..    state
a230: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61  Ptr->flags.= fla
a240: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  gs;.    statePtr
a250: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72  ->interp.= inter
a260: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  p;.    statePtr-
a270: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79  >vflags.= verify
a280: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
a290: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f  err.= "";..    /
a2a0: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70  * allocate scrip
a2b0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72  t */.    if (scr
a2c0: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54  ipt) {..(void) T
a2d0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
a2e0: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e  Obj(script, &len
a2f0: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
a300: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61      statePtr->ca
a310: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b  llback = script;
a320: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
a330: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
a340: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20  >callback);..}. 
a350: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c     }..    /* all
a360: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a  ocate password *
a370: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f  /.    if (passwo
a380: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63  rd) {..(void) Tc
a390: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a3a0: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65  bj(password, &le
a3b0: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
a3c0: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70  .    statePtr->p
a3d0: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f  assword = passwo
a3e0: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  rd;..    Tcl_Inc
a3f0: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
a400: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09  tr->password);..
a410: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a420: 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74  allocate validat
a430: 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  e command */.   
a440: 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76   if (vcmd) {..(v
a450: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69  oid) Tcl_GetStri
a460: 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20  ngFromObj(vcmd, 
a470: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
a480: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
a490: 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09  ->vcmd = vcmd;..
a4a0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
a4b0: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76  ount(statePtr->v
a4c0: 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  cmd);..}.    }..
a4d0: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d      if (model !=
a4e0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f   NULL) {..int mo
a4f0: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20  de;../* Get the 
a500: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20  "model" context 
a510: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47  */..chan = Tcl_G
a520: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
a530: 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b  , model, &mode);
a540: 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54  ..if (chan == (T
a550: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
a560: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
a570: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
a580: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
a590: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
a5a0: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75  ../*.. * Make su
a5b0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
a5c0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
a5d0: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20  nnel.. */..chan 
a5e0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
a5f0: 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28  nel(chan);..if (
a600: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
a610: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
a620: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
a630: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
a640: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a650: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
a660: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
a670: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
a680: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
a690: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  nel", NULL);..  
a6a0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
a6b0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
a6c0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41  , "IMPORT", "CHA
a6d0: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
a6e0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
a6f0: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
a700: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
a710: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
a720: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63  TCL_ERROR;..}..c
a730: 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54  tx = ((State *)T
a740: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
a750: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29  tanceData(chan))
a760: 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73  ->ctx;.    } els
a770: 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20  e {..if ((ctx = 
a780: 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74  CTX_Init(statePt
a790: 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f  r, server, proto
a7a0: 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66  , keyfile, certf
a7b0: 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20  ile, key, cert, 
a7c0: 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 2c 0a 09  (int) key_len,..
a7d0: 20 20 20 20 28 69 6e 74 29 20 63 65 72 74 5f 6c      (int) cert_l
a7e0: 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c  en, CAdir, CAfil
a7f0: 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68  e, ciphers, ciph
a800: 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c  ersuites, level,
a810: 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e   DHparams)) == N
a820: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  ULL) {..    Tls_
a830: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
a840: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a850: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a860: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74  .}.    }..    st
a870: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74  atePtr->ctx = ct
a880: 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  x;..    /*.     
a890: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  * We need to mak
a8a0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
a8b0: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e  channel works in
a8c0: 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65   binary (for the
a8d0: 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69  .     * encrypti
a8e0: 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f  on not to get go
a8f0: 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a  ofed up)..     *
a900: 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f   We only want to
a910: 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66   adjust the buff
a920: 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20  ering in pre-v2 
a930: 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a  channels, where.
a940: 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e       * each chan
a950: 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b  nel in the stack
a960: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20   maintained its 
a970: 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20  own buffers..   
a980: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74    */.    Tcl_DSt
a990: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
a9a0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
a9b0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  n);.    Tcl_DStr
a9c0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
a9d0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a  annelBlocking);.
a9e0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
a9f0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
aa00: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54  lEOFChar);.    T
aa10: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
aa20: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
aa30: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
aa40: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
aa50: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
aa60: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72  eofchar", &upper
aa70: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
aa80: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
aa90: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
aaa0: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69  , chan, "-encodi
aab0: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ng", &upperChann
aac0: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  elEncoding);.   
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 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
ab00: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  n", &upperChanne
ab10: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20  lTranslation);. 
ab20: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
ab30: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ab40: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
ab50: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
ab60: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
ab70: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
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 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
aba0: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20  , "binary");.   
abb0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
abc0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
abd0: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c  an, "-blocking",
abe0: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70   "true");.    dp
abf0: 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67  rintf("Consuming
ac00: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22   Tcl channel %s"
ac10: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
ac20: 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20  Name(chan));.   
ac30: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20   statePtr->self 
ac40: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e  = Tcl_StackChann
ac50: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43  el(interp, Tls_C
ac60: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43  hannelType(), (C
ac70: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
ac80: 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42  Ptr, (TCL_READAB
ac90: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c  LE | TCL_WRITABL
aca0: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64  E), chan);.    d
acb0: 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20  printf("Created 
acc0: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73  channel named %s
acd0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
ace0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
acf0: 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28  self));.    if (
ad00: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
ad10: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
ad20: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  NULL) {../*.. * 
ad30: 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76  No use of Tcl_Ev
ad40: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63  entuallyFree bec
ad50: 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65  ause no possible
ad60: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09   Tcl_Preserve...
ad70: 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63   */..Tls_Free((c
ad80: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
ad90: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
ada0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
adb0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
adc0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
add0: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74  tePtr->self, "-t
ade0: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c  ranslation", Tcl
adf0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
ae00: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
ae10: 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63  lation));.    Tc
ae20: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
ae30: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
ae40: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63  Ptr->self, "-enc
ae50: 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  oding", Tcl_DStr
ae60: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
ae70: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29  hannelEncoding))
ae80: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
ae90: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
aea0: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
aeb0: 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54  f, "-eofchar", T
aec0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
aed0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
aee0: 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f  Char));.    Tcl_
aef0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
af00: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
af10: 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b  r->self, "-block
af20: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ing", Tcl_DStrin
af30: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
af40: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a  nnelBlocking));.
af50: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
af60: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f  SL Initializatio
af70: 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n.     */.    st
af80: 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53  atePtr->ssl = SS
af90: 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e  L_new(statePtr->
afa0: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73  ctx);.    if (!s
afb0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a  tatePtr->ssl) {.
afc0: 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20  ./* SSL library 
afd0: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70  error */..Tcl_Ap
afe0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
aff0: 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e  p, "couldn't con
b000: 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69  struct ssl sessi
b010: 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  on: ", REASON(),
b020: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
b030: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
b040: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
b050: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
b060: 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22  "INIT", "FAILED"
b070: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b080: 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61  ;..Tls_Free((cha
b090: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
b0a0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
b0b0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
b0c0: 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72   Set host server
b0d0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20   name */.    if 
b0e0: 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09  (servername) {..
b0f0: 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76  /* Sets the serv
b100: 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69  er name indicati
b110: 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65  on (SNI) in Clie
b120: 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f  ntHello extensio
b130: 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43  n */../* Per RFC
b140: 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20   6066, hostname 
b150: 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64  is a ASCII encod
b160: 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67  ed string, thoug
b170: 68 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20  h RFC 4366 says 
b180: 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21  UTF-8. */..if (!
b190: 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68  SSL_set_tlsext_h
b1a0: 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74  ost_name(statePt
b1b0: 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61  r->ssl, serverna
b1c0: 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20  me) && require) 
b1d0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
b1e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b1f0: 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73  "setting TLS hos
b200: 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e  t name extension
b210: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20   failed", (char 
b220: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b230: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b240: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b250: 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20  IMPORT", "SNI", 
b260: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b270: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b280: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
b290: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
b2a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b2b0: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68  R;..}.../* Set h
b2c0: 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72  ostname for peer
b2d0: 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f 73   certificate hos
b2e0: 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 69  tname verificati
b2f0: 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09  on in clients...
b300: 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c     Don't use SSL
b310: 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65  _set1_host since
b320: 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69   it has limitati
b330: 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53  ons. */..if (!SS
b340: 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74  L_add1_host(stat
b350: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65  ePtr->ssl, serve
b360: 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54  rname)) {..    T
b370: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b380: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67  interp, "setting
b390: 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66   DNS host name f
b3a0: 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29  ailed", (char *)
b3b0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
b3c0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b3d0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
b3e0: 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45  PORT", "HOSTNAME
b3f0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b400: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b410: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b420: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b430: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b440: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
b450: 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65      /* Resume se
b460: 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20  ssion id */.    
b470: 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26  if (session_id &
b480: 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e  & strlen(session
b490: 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f  _id) <= SSL_MAX_
b4a0: 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20  SID_CTX_LENGTH) 
b4b0: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65  {../* SSL_set_se
b4c0: 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28  ssion() */..if (
b4d0: 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74  !SSL_SESSION_set
b4e0: 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c  1_id_context(SSL
b4f0: 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61  _get_session(sta
b500: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73  tePtr->ssl), ses
b510: 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e  sion_id, (unsign
b520: 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73  ed int) strlen(s
b530: 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09  ession_id))) {..
b540: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b550: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65  sult(interp, "Re
b560: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20  sume session id 
b570: 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22  ", session_id, "
b580: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20   failed", (char 
b590: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b5a0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b5b0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b5c0: 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f  IMPORT", "SESSIO
b5d0: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  N", "FAILED", (c
b5e0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  har *) NULL);.  
b5f0: 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72            Tls_Fr
b600: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
b610: 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ePtr);.         
b620: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b630: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ROR;..}.    }.. 
b640: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70     /* Enable App
b650: 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50  lication-Layer P
b660: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
b670: 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 72  ion. Examples ar
b680: 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74  e: http/1.0,..ht
b690: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20  tp/1.1, h2, h3, 
b6a0: 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c  ftp, imap, pop3,
b6b0: 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d   xmpp-client, xm
b6c0: 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 2c  pp-server, mqtt,
b6d0: 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20   irc, etc. */.  
b6e0: 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f    if (alpn) {../
b6f0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20  * Convert a TCL 
b700: 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74  list into a prot
b710: 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72  ocol-list in wir
b720: 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73  e-format */..uns
b730: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74  igned char *prot
b740: 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65  os, *p;..unsigne
b750: 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e  d int protos_len
b760: 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a 65 20   = 0;..Tcl_Size 
b770: 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a  cnt, i;..int j;.
b780: 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b  .Tcl_Obj **list;
b790: 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f  ...if (Tcl_ListO
b7a0: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
b7b0: 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74  terp, alpn, &cnt
b7c0: 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f  , &list) != TCL_
b7d0: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46  OK) {..    Tls_F
b7e0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
b7f0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
b800: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b810: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
b820: 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75   the memory requ
b830: 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f  ired for the pro
b840: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66  tocol-list */..f
b850: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63  or (i = 0; i < c
b860: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; i++) {..    
b870: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
b880: 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c  mObj(list[i], &l
b890: 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65  en);..    if (le
b8a0: 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c  n > 255) {...Tcl
b8b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b8c0: 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74  terp, "ALPN prot
b8d0: 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f  ocol name too lo
b8e0: 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ng", (char *) NU
b8f0: 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72  LL);...Tcl_SetEr
b900: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
b910: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
b920: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44   "ALPN", "FAILED
b930: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
b940: 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63  );...Tls_Free((c
b950: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
b960: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
b970: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20  RROR;..    }..  
b980: 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20    protos_len += 
b990: 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09  1 + (int) len;..
b9a0: 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65  }.../* Build the
b9b0: 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63   complete protoc
b9c0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74  ol-list */..prot
b9d0: 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f  os = ckalloc(pro
b9e0: 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72  tos_len);../* pr
b9f0: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e  otocol-lists con
ba00: 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65  sist of 8-bit le
ba10: 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62  ngth-prefixed, b
ba20: 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09  yte strings */..
ba30: 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20  for (j = 0, p = 
ba40: 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b  protos; j < cnt;
ba50: 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61   j++) {..    cha
ba60: 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74  r *str = Tcl_Get
ba70: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69  StringFromObj(li
ba80: 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20  st[j], &len);.. 
ba90: 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67     *p++ = (unsig
baa0: 6e 65 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09  ned char) len;..
bab0: 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74      memcpy(p, st
bac0: 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29  r, (size_t) len)
bad0: 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b  ;..    p += len;
bae0: 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74  ..}.../* SSL_set
baf0: 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b  _alpn_protos mak
bb00: 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  es a copy of the
bb10: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a   protocol-list *
bb20: 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73  /../* Note: This
bb30: 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72   functions rever
bb40: 73 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76  ses the return v
bb50: 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20  alue convention 
bb60: 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f  */..if (SSL_set_
bb70: 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74  alpn_protos(stat
bb80: 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f  ePtr->ssl, proto
bb90: 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20  s, protos_len)) 
bba0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
bbb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
bbc0: 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 41  "failed to set A
bbd0: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20  LPN protocols", 
bbe0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
bbf0: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
bc00: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
bc10: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
bc20: 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c  ALPN", "FAILED",
bc30: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
bc40: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
bc50: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
bc60: 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70  );..    ckfree(p
bc70: 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74  rotos);..    ret
bc80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
bc90: 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f  }.../* Store pro
bca0: 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09  tocols list */..
bcb0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
bcc0: 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74   = protos;..stat
bcd0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
bce0: 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20   = protos_len;. 
bcf0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61     } else {..sta
bd00: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20  tePtr->protos = 
bd10: 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d  NULL;..statePtr-
bd20: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b  >protos_len = 0;
bd30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
bd40: 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61      * SSL Callba
bd50: 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  cks.     */.    
bd60: 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61  SSL_set_app_data
bd70: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
bd80: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
bd90: 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b  );./* point back
bda0: 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53   to us */.    SS
bdb0: 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61  L_set_verify(sta
bdc0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69  tePtr->ssl, veri
bdd0: 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61  fy, VerifyCallba
bde0: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74  ck);.    SSL_set
bdf0: 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73  _info_callback(s
be00: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e  tatePtr->ssl, In
be10: 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20  foCallback);..  
be20: 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f    /* Callback fo
be30: 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74  r observing prot
be40: 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f  ocol messages */
be50: 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c  .#ifndef OPENSSL
be60: 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20  _NO_SSL_TRACE.  
be70: 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54    /* void SSL_CT
be80: 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61  X_set_msg_callba
be90: 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d  ck_arg(statePtr-
bea0: 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ctx, (void *)st
beb0: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69  atePtr);.    voi
bec0: 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73  d SSL_CTX_set_ms
bed0: 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  g_callback(state
bee0: 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67  Ptr->ctx, Messag
bef0: 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20  eCallback); */. 
bf00: 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63     SSL_set_msg_c
bf10: 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74  allback_arg(stat
bf20: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64  ePtr->ssl, (void
bf30: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20   *)statePtr);.  
bf40: 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61    SSL_set_msg_ca
bf50: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d  llback(statePtr-
bf60: 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c  >ssl, MessageCal
bf70: 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a  lback);.#endif..
bf80: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63      /* Create Tc
bf90: 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61  l_Channel BIO Ha
bfa0: 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61  ndler */.    sta
bfb0: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42  tePtr->p_bio.= B
bfc0: 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65  IO_new_tcl(state
bfd0: 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45  Ptr, BIO_NOCLOSE
bfe0: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  );.    statePtr-
bff0: 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42  >bio.= BIO_new(B
c000: 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20  IO_f_ssl());..  
c010: 20 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a    if (server) {.
c020: 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62  ./* Server callb
c030: 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  acks */..SSL_CTX
c040: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76  _set_tlsext_serv
c050: 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65  ername_arg(state
c060: 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20  Ptr->ctx, (void 
c070: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53  *)statePtr);..SS
c080: 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74  L_CTX_set_tlsext
c090: 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c  _servername_call
c0a0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
c0b0: 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29  tx, SNICallback)
c0c0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  ;..SSL_CTX_set_c
c0d0: 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73  lient_hello_cb(s
c0e0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65  tatePtr->ctx, He
c0f0: 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  lloCallback, (vo
c100: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c110: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70  .if (statePtr->p
c120: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  rotos != NULL) {
c130: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
c140: 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62  t_alpn_select_cb
c150: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c160: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76  ALPNCallback, (v
c170: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
c180: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a  .#ifdef USE_NPN.
c190: 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20  .    if (tls1_2 
c1a0: 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d  == 0 && tls1_3 =
c1b0: 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58  = 0) {...SSL_CTX
c1c0: 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73  _set_next_protos
c1d0: 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 73  _advertised_cb(s
c1e0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50  tatePtr->ctx, NP
c1f0: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  NCallback, (void
c200: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20   *)statePtr);.. 
c210: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a     }.#endif..}..
c220: 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65  ./* Enable serve
c230: 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72  r to send cert r
c240: 65 71 75 65 73 74 20 61 66 74 65 72 20 68 61 6e  equest after han
c250: 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20  dshake (TLS 1.3 
c260: 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77  only) */../* A w
c270: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d  rite operation m
c280: 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66  ust take place f
c290: 6f 72 20 74 68 65 20 43 65 72 74 69 66 69 63 61  or the Certifica
c2a0: 74 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 65  te Request to be
c2b0: 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65  ..   sent to the
c2c0: 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61   client, this ca
c2d0: 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53  n be done with S
c2e0: 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28  SL_do_handshake(
c2f0: 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65  ). */..if (reque
c300: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
c310: 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20  hake && tls1_3) 
c320: 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66  {..    SSL_verif
c330: 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61  y_client_post_ha
c340: 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72  ndshake(statePtr
c350: 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ->ssl);..}.../* 
c360: 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75  set automatic cu
c370: 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f  rve selection */
c380: 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61  ..SSL_set_ecdh_a
c390: 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73  uto(statePtr->ss
c3a0: 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20  l, 1);.../* Set 
c3b0: 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09  server mode */..
c3c0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
c3d0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45  |= TLS_TCL_SERVE
c3e0: 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65  R;..SSL_set_acce
c3f0: 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74  pt_state(statePt
c400: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65  r->ssl);.    } e
c410: 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74  lse {../* Client
c420: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69   callbacks */.#i
c430: 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66  fdef USE_NPN..if
c440: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74   (statePtr->prot
c450: 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c  os != NULL && tl
c460: 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73  s1_2 == 0 && tls
c470: 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20  1_3 == 0) {..   
c480: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78   SSL_CTX_set_nex
c490: 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63  t_proto_select_c
c4a0: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  b(statePtr->ctx,
c4b0: 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28   ALPNCallback, (
c4c0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c4d0: 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a  ;..}.#endif.../*
c4e0: 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67   Session caching
c4f0: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
c500: 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d  _session_cache_m
c510: 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ode(statePtr->ct
c520: 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48  x, SSL_SESS_CACH
c530: 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53  E_CLIENT | SSL_S
c540: 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54  ESS_CACHE_NO_INT
c550: 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53  ERNAL_STORE);..S
c560: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f  SL_CTX_sess_set_
c570: 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d  new_cb(statePtr-
c580: 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c  >ctx, SessionCal
c590: 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61  lback);.../* Ena
c5a0: 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61  ble post handsha
c5b0: 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f  ke Authenticatio
c5c0: 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53  n extension. TLS
c5d0: 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68   1.3 only, not h
c5e0: 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72  ttp/2. */..if (r
c5f0: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68  equest && post_h
c600: 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20  andshake) {..   
c610: 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61   SSL_set_post_ha
c620: 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61  ndshake_auth(sta
c630: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a  tePtr->ssl, 1);.
c640: 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65  .}.../* Set clie
c650: 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f  nt mode */..SSL_
c660: 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74  set_connect_stat
c670: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
c680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f  ;.    }.    SSL_
c690: 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72  set_bio(statePtr
c6a0: 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d  ->ssl, statePtr-
c6b0: 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72  >p_bio, statePtr
c6c0: 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49  ->p_bio);.    BI
c6d0: 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50  O_set_ssl(stateP
c6e0: 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74  tr->bio, statePt
c6f0: 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c  r->ssl, BIO_NOCL
c700: 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  OSE);..    /*.  
c710: 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20     * End of SSL 
c720: 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20  Init.     */.   
c730: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
c740: 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74  ing %s", Tcl_Get
c750: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
c760: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20  ePtr->self));.  
c770: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
c780: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
c790: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
c7a0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
c7b0: 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  lf), TCL_VOLATIL
c7c0: 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  E);..    return 
c7d0: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
c7e0: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
c7f0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
c800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
c840: 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a  *. * UnimportObj
c850: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
c860: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
c870: 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65  nvoked to remove
c880: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
c890: 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a  nnel filter.. *.
c8a0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
c8b0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
c8c0: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
c8d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
c8e0: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61   modify the beha
c8f0: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68  vior of an IO ch
c900: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  annel.. *. *----
c910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
c950: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55   */.static int.U
c960: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c  nimportObjCmd(Cl
c970: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
c980: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
c990: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
c9a0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
c9b0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
c9c0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
c9d0: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
c9e0: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
c9f0: 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69  on. */..    dpri
ca00: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
ca10: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
ca20: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
ca30: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
ca40: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
ca50: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
ca60: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
ca70: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
ca80: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
ca90: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
caa0: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20  jv[1]), NULL);. 
cab0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
cac0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
cad0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
cae0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
caf0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
cb00: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
cb10: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
cb20: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
cb30: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
cb40: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66  l(chan);..    if
cb50: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
cb60: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
cb70: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
cb80: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
cb90: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
cba0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
cbb0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
cbc0: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
cbd0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
cbe0: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  l", NULL);..    
cbf0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
cc00: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
cc10: 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41  "UNIMPORT", "CHA
cc20: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
cc30: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
cc40: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
cc50: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
cc60: 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43  if (Tcl_UnstackC
cc70: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
cc80: 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f  han) == TCL_ERRO
cc90: 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  R) {..return TCL
cca0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
ccb0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
ccc0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
ccd0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a  clientData;.}...
cce0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
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 0a 20 2a 0a 20 2a 20 43  --------. *. * C
cd30: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74  TX_Init -- const
cd40: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69  ruct a SSL_CTX i
cd50: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65  nstance. *. * Re
cd60: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69  sults:. *.A vali
cd70: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  d SSL_CTX instan
cd80: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20  ce or NULL.. *. 
cd90: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
cda0: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53   *.constructs SS
cdb0: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a  L context (CTX).
cdc0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
ce10: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54  tic SSL_CTX *.CT
ce20: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74  X_Init(State *st
ce30: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65  atePtr, int isSe
ce40: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c  rver, int proto,
ce50: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20   char *keyfile, 
ce60: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a  char *certfile,.
ce70: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
ce80: 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64  r *key, unsigned
ce90: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74   char *cert, int
cea0: 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65   key_len, int ce
ceb0: 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41  rt_len, char *CA
cec0: 64 69 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43  dir,.    char *C
ced0: 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70  Afile, char *cip
cee0: 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68  hers, char *ciph
cef0: 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65  ersuites, int le
cf00: 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72  vel, char *DHpar
cf10: 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49  ams) {.    Tcl_I
cf20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20  nterp *interp = 
cf30: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
cf40: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63  ;.    SSL_CTX *c
cf50: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  tx = NULL;.    T
cf60: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20  cl_DString ds;. 
cf70: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
cf80: 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20  s1;.    int off 
cf90: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61  = 0;.    int loa
cfa0: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20  d_private_key;. 
cfb0: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54     const SSL_MET
cfc0: 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20  HOD *method;..  
cfd0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
cfe0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70  d");..    if (!p
cff0: 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70  roto) {..Tcl_App
d000: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d010: 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74  , "no valid prot
d020: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20  ocol selected", 
d030: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d040: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d050: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61    }..    /* crea
d060: 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a  te SSL context *
d070: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
d080: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20  RSION_NUMBER >= 
d090: 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64  0x10100000L || d
d0a0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
d0b0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
d0c0: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20  SL_NO_SSL2).    
d0d0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
d0e0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
d0f0: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
d100: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d110: 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e  "SSL2 protocol n
d120: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
d130: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
d140: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d150: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
d160: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c  fined(NO_SSL3) |
d170: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
d180: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69  L_NO_SSL3).    i
d190: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
d1a0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  , TLS_PROTO_SSL3
d1b0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
d1c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d1d0: 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  SSL3 protocol no
d1e0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
d1f0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
d200: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
d210: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
d220: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c  ined(NO_TLS1) ||
d230: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
d240: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66  _NO_TLS1).    if
d250: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d260: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29   TLS_PROTO_TLS1)
d270: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d280: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
d290: 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.0 protocol 
d2a0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
d2b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d2c0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d2d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
d2e0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
d2f0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
d300: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
d310: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
d320: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
d330: 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c  _TLS1_1)) {..Tcl
d340: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d350: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70  terp, "TLS 1.1 p
d360: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d370: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
d380: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
d390: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
d3a0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
d3b0: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
d3c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d3d0: 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28  TLS1_2).    if (
d3e0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
d3f0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29  LS_PROTO_TLS1_2)
d400: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d410: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
d420: 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.2 protocol 
d430: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
d440: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d450: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d460: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
d470: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
d480: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
d490: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
d4a0: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
d4b0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
d4c0: 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c  _TLS1_3)) {..Tcl
d4d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d4e0: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70  terp, "TLS 1.3 p
d4f0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d500: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
d510: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
d520: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
d530: 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f  if.    if (proto
d540: 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65   == 0) {../* Use
d550: 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09   full range */..
d560: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f  SSL_CTX_set_min_
d570: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
d580: 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  x, 0);..SSL_CTX_
d590: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
d5a0: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20  rsion(ctx, 0);. 
d5b0: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68     }..    switch
d5c0: 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f   (proto) {.#if O
d5d0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
d5e0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
d5f0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28  00L && !defined(
d600: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66  NO_SSL2) && !def
d610: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d620: 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54  SSL2).    case T
d630: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09  LS_PROTO_SSL2:..
d640: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
d650: 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72  r ? SSLv2_server
d660: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76  _method() : SSLv
d670: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  2_client_method(
d680: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
d690: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
d6a0: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
d6b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
d6c0: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
d6d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
d6e0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
d6f0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  e TLS_PROTO_SSL3
d700: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
d710: 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72  rver ? SSLv3_ser
d720: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53  ver_method() : S
d730: 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  SLv3_client_meth
d740: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
d750: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
d760: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
d770: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d780: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
d790: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d7a0: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  LS1_METHOD).    
d7b0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
d7c0: 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  LS1:..method = i
d7d0: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
d7e0: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
d7f0: 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d  : TLSv1_client_m
d800: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
d810: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
d820: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
d830: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d840: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  SSL_NO_TLS1_1) &
d850: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d860: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54  SL_NO_TLS1_1_MET
d870: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
d880: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a  S_PROTO_TLS1_1:.
d890: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
d8a0: 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72  er ? TLSv1_1_ser
d8b0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
d8c0: 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65  LSv1_1_client_me
d8d0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
d8e0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
d8f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
d900: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d910: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  SL_NO_TLS1_2) &&
d920: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d930: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
d940: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  OD).    case TLS
d950: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09  _PROTO_TLS1_2:..
d960: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
d970: 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76  r ? TLSv1_2_serv
d980: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
d990: 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74  Sv1_2_client_met
d9a0: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
d9b0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
d9c0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
d9d0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d9e0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
d9f0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
da00: 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20  TLS1_3:../* Use 
da10: 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68  the generic meth
da20: 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e  od and constrain
da30: 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f  t range after co
da40: 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65 64  ntext is created
da50: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73   */..method = is
da60: 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72  Server ? TLS_ser
da70: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
da80: 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  LS_client_method
da90: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
daa0: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  if.    default:.
dab0: 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69  ./* Negotiate hi
dac0: 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20  ghest available 
dad0: 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20  SSL/TLS version 
dae0: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  */..method = isS
daf0: 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76  erver ? TLS_serv
db00: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
db10: 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  S_client_method(
db20: 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  );.#if OPENSSL_V
db30: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
db40: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21  0x10100000L && !
db50: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
db60: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
db70: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f  NSSL_NO_SSL2)..o
db80: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
db90: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
dba0: 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53  SSL2)   ? 0 : SS
dbb0: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a  L_OP_NO_SSLv2);.
dbc0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
dbd0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
dbe0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
dbf0: 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c  _NO_SSL3)..off |
dc00: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
dc10: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  , TLS_PROTO_SSL3
dc20: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  )   ? 0 : SSL_OP
dc30: 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64  _NO_SSLv3);.#end
dc40: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
dc50: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
dc60: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dc70: 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45  TLS1)..off |= (E
dc80: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
dc90: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20  S_PROTO_TLS1)   
dca0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
dcb0: 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23  TLSv1);.#endif.#
dcc0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
dcd0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
dce0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
dcf0: 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45  S1_1)..off |= (E
dd00: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
dd10: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20  S_PROTO_TLS1_1) 
dd20: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
dd30: 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66  TLSv1_1);.#endif
dd40: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
dd50: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
dd60: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dd70: 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_2)..off |= 
dd80: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
dd90: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
dda0: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
ddb0: 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64  O_TLSv1_2);.#end
ddc0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
ddd0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
dde0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
ddf0: 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c  O_TLS1_3)..off |
de00: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
de10: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
de20: 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _3) ? 0 : SSL_OP
de30: 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65  _NO_TLSv1_3);.#e
de40: 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ndif..break;.   
de50: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
de60: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
de70: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
de80: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69  w(method);.    i
de90: 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75  f (!ctx) {..retu
dea0: 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  rn(NULL);.    }.
deb0: 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28  .    if (getenv(
dec0: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20  SSLKEYLOGFILE)) 
ded0: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b  {..SSL_CTX_set_k
dee0: 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63  eylog_callback(c
def0: 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61  tx, KeyLogCallba
df00: 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  ck);.    }..#if 
df10: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
df20: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _3) && !defined(
df30: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
df40: 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f  3).    if (proto
df50: 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c   == TLS_PROTO_TL
df60: 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58  S1_3) {..SSL_CTX
df70: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
df80: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
df90: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53  _3_VERSION);..SS
dfa0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72  L_CTX_set_max_pr
dfb0: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
dfc0: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
dfd0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
dfe0: 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70      /* Force cip
dff0: 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72  her selection or
e000: 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f  der by server */
e010: 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76  .    if (!isServ
e020: 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73  er) {..SSL_CTX_s
e030: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
e040: 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45  SSL_OP_CIPHER_SE
e050: 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29  RVER_PREFERENCE)
e060: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 53 4c  ;.    }..    SSL
e070: 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74  _CTX_set_app_dat
e080: 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e  a(ctx, (void*)in
e090: 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62  terp);./* rememb
e0a0: 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  er the interpret
e0b0: 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  er */.    SSL_CT
e0c0: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
e0d0: 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09  x, SSL_OP_ALL);.
e0e0: 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77  /* all SSL bug w
e0f0: 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20  orkarounds */.  
e100: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70    SSL_CTX_set_op
e110: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
e120: 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e  P_NO_COMPRESSION
e130: 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f  );./* disable co
e140: 6d 70 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69  mpression even i
e150: 66 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20  f supported */. 
e160: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f     SSL_CTX_set_o
e170: 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29  ptions(ctx, off)
e180: 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72  ;../* disable pr
e190: 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20  otocol versions 
e1a0: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  */.#if OPENSSL_V
e1b0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
e1c0: 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20  0x10101000L.    
e1d0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65  SSL_CTX_set_mode
e1e0: 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41  (ctx, SSL_MODE_A
e1f0: 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68  UTO_RETRY);./* h
e200: 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68  andle new handsh
e210: 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75  akes in backgrou
e220: 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66 61 75 6c  nd. On by defaul
e230: 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31  t in OpenSSL 1.1
e240: 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  .1. */.#endif.  
e250: 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73    SSL_CTX_sess_s
e260: 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74  et_cache_size(ct
e270: 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a  x, 128);..    /*
e280: 20 53 65 74 20 75 73 65 72 20 64 65 66 69 6e 65   Set user define
e290: 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65  d ciphers, ciphe
e2a0: 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65  r suites, and se
e2b0: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a  curity level */.
e2c0: 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73      if ((ciphers
e2d0: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53   != NULL) && !SS
e2e0: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72  L_CTX_set_cipher
e2f0: 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68 65  _list(ctx, ciphe
e300: 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  rs)) {..Tcl_Appe
e310: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e320: 20 22 53 65 74 20 63 69 70 68 65 72 73 20 66 61   "Set ciphers fa
e330: 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63  iled: No valid c
e340: 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a  iphers", (char *
e350: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
e360: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
e370: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
e380: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72  .    if ((cipher
e390: 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20  suites != NULL) 
e3a0: 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f  && !SSL_CTX_set_
e3b0: 63 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78  ciphersuites(ctx
e3c0: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29  , ciphersuites))
e3d0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
e3e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
e3f0: 74 20 63 69 70 68 65 72 20 73 75 69 74 65 73 20  t cipher suites 
e400: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64  failed: No valid
e410: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72   ciphers", (char
e420: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
e430: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e440: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
e450: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73   }..    /* Set s
e460: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
e470: 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e  .    if (level >
e480: 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36   -1 && level < 6
e490: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
e4a0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a  security_level *
e4b0: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73  /..SSL_CTX_set_s
e4c0: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74  ecurity_level(ct
e4d0: 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  x, level);.    }
e4e0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d  ..    /* set som
e4f0: 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20  e callbacks */. 
e500: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64     SSL_CTX_set_d
e510: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62  efault_passwd_cb
e520: 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61  (ctx, PasswordCa
e530: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c  llback);.    SSL
e540: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
e550: 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64  _passwd_cb_userd
e560: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a  ata(ctx, (void *
e570: 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20  )statePtr);..   
e580: 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69   /* read a Diffi
e590: 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65  e-Hellman parame
e5a0: 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73  ters file, or us
e5b0: 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f  e the built-in o
e5c0: 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45  ne */.#ifdef OPE
e5d0: 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69  NSSL_NO_DH.    i
e5e0: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e  f (DHparams != N
e5f0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
e600: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e610: 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73   "DH parameter s
e620: 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c  upport not avail
e630: 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20  able", (char *) 
e640: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
e650: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
e660: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
e670: 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20  else.    {..DH* 
e680: 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d  dh;..if (DHparam
e690: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  s != NULL) {..  
e6a0: 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20    BIO *bio;..   
e6b0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
e6c0: 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20  (&ds);..    bio 
e6d0: 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46  = BIO_new_file(F
e6e0: 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73  2N(DHparams, &ds
e6f0: 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66  ), "r");..    if
e700: 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f   (!bio) {...Tcl_
e710: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
e720: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
e730: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
e740: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20  uld not find DH 
e750: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22  parameters file"
e760: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
e770: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
e780: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
e790: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  NULL;..    }... 
e7a0: 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64     dh = PEM_read
e7b0: 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69  _bio_DHparams(bi
e7c0: 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  o, NULL, NULL, N
e7d0: 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66  ULL);..    BIO_f
e7e0: 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54  ree(bio);..    T
e7f0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
e800: 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64  ds);..    if (!d
e810: 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  h) {...Tcl_Appen
e820: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e830: 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20  "Could not read 
e840: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72  DH parameters fr
e850: 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20  om file", (char 
e860: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
e870: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e880: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
e890: 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09     }..} else {..
e8a0: 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50      dh = get_dhP
e8b0: 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c  arams();..}..SSL
e8c0: 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28  _CTX_set_tmp_dh(
e8d0: 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72  ctx, dh);..DH_fr
e8e0: 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65  ee(dh);.    }.#e
e8f0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74  ndif..    /* set
e900: 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65   our certificate
e910: 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69   */.    load_pri
e920: 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20  vate_key = 0;.  
e930: 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21    if (certfile !
e940: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f  = NULL) {..load_
e950: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b  private_key = 1;
e960: 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  ...Tcl_DStringIn
e970: 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53  it(&ds);...if (S
e980: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69  SL_CTX_use_certi
e990: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c  ficate_file(ctx,
e9a0: 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26   F2N(certfile, &
e9b0: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ds), SSL_FILETYP
e9c0: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09  E_PEM) <= 0) {..
e9d0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
e9e0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54  ree(&ds);..    T
e9f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ea00: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
ea10: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61  to set certifica
ea20: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66  te file ", certf
ea30: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20  ile, ": ",....  
ea40: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68     REASON(), (ch
ea50: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
ea60: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
ea70: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
ea80: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20   NULL;..}.    } 
ea90: 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d  else if (cert !=
eaa0: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70   NULL) {..load_p
eab0: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a  rivate_key = 1;.
eac0: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
ead0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e  _certificate_ASN
eae0: 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c  1(ctx, cert_len,
eaf0: 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09   cert) <= 0) {..
eb00: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
eb10: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54  ree(&ds);..    T
eb20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
eb30: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
eb40: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61  to set certifica
eb50: 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52  te: ",....     R
eb60: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
eb70: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
eb80: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
eb90: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
eba0: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  L;..}.    } else
ebb0: 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28   {..certfile = (
ebc0: 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64  char*)X509_get_d
ebd0: 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65  efault_cert_file
ebe0: 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54  ();...if (SSL_CT
ebf0: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
ec00: 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74  e_file(ctx, cert
ec10: 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59  file, SSL_FILETY
ec20: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a  PE_PEM) <= 0) {.
ec30: 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44  #if 0..    Tcl_D
ec40: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
ec50: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
ec60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ec70: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65  unable to use de
ec80: 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74  fault certificat
ec90: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69  e file ", certfi
eca0: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20  le, ": ",....   
ecb0: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61    REASON(), (cha
ecc0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
ecd0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
ece0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
ecf0: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a  NULL;.#endif..}.
ed00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65      }..    /* se
ed10: 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65  t our private ke
ed20: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61  y */.    if (loa
ed30: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b  d_private_key) {
ed40: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d  ..if (keyfile ==
ed50: 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20   NULL && key == 
ed60: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79  NULL) {..    key
ed70: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b  file = certfile;
ed80: 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c  ..}...if (keyfil
ed90: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  e != NULL) {..  
eda0: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69    /* get the pri
edb0: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61  vate key associa
edc0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65  ted with this ce
edd0: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20  rtificate */..  
ede0: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d    if (keyfile ==
edf0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69   NULL) {...keyfi
ee00: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09  le = certfile;..
ee10: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
ee20: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76  SSL_CTX_use_Priv
ee30: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c  ateKey_file(ctx,
ee40: 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64   F2N(keyfile, &d
ee50: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  s), SSL_FILETYPE
ee60: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09  _PEM) <= 0) {...
ee70: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
ee80: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68  &ds);.../* flush
ee90: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20   the passphrase 
eea0: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c  which might be l
eeb0: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  eft in the resul
eec0: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65  t */...Tcl_SetRe
eed0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c  sult(interp, NUL
eee0: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  L, TCL_STATIC);.
eef0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
ef00: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
ef10: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63  le to set public
ef20: 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79   key file ", key
ef30: 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20  file, " ",....  
ef40: 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c         REASON(),
ef50: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
ef60: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
ef70: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
ef80: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ULL;..    }..   
ef90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
efa0: 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20  (&ds);...} else 
efb0: 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29  if (key != NULL)
efc0: 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f   {..    if (SSL_
efd0: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b  CTX_use_PrivateK
efe0: 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59  ey_ASN1(EVP_PKEY
eff0: 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b  _RSA, ctx, key,k
f000: 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a  ey_len) <= 0) {.
f010: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
f020: 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75  e(&ds);.../* flu
f030: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73  sh the passphras
f040: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65  e which might be
f050: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73   left in the res
f060: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74  ult */...Tcl_Set
f070: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e  Result(interp, N
f080: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ULL, TCL_STATIC)
f090: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
f0a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
f0b0: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c  able to set publ
f0c0: 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f  ic key: ", REASO
f0d0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
f0e0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
f0f0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
f100: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
f110: 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e  .}../* Now we kn
f120: 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e  ow that a key an
f130: 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e  d cert have been
f140: 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a   set against.. *
f150: 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74   the SSL context
f160: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54   */..if (!SSL_CT
f170: 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f  X_check_private_
f180: 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20  key(ctx)) {..   
f190: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f1a0: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61  t(interp, "priva
f1b0: 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  te key does not 
f1c0: 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66  match the certif
f1d0: 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79  icate public key
f1e0: 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72  ",....     (char
f1f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
f200: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f210: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
f220: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ULL;..}.    }.. 
f230: 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69     /* Set verifi
f240: 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20  cation CAs */.  
f250: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
f260: 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f  t(&ds);.    Tcl_
f270: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31  DStringInit(&ds1
f280: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  );.    /* There 
f290: 69 73 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 64  is one default d
f2a0: 69 72 65 63 74 6f 72 79 2c 20 6f 6e 65 20 64 65  irectory, one de
f2b0: 66 61 75 6c 74 20 66 69 6c 65 2c 20 61 6e 64 20  fault file, and 
f2c0: 6f 6e 65 20 64 65 66 61 75 6c 74 20 73 74 6f 72  one default stor
f2d0: 65 2e 0a 09 54 68 65 20 64 65 66 61 75 6c 74 20  e...The default 
f2e0: 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20  CA certificates 
f2f0: 64 69 72 65 63 74 6f 72 79 20 28 61 6e 64 20 64  directory (and d
f300: 65 66 61 75 6c 74 20 73 74 6f 72 65 29 20 69 73  efault store) is
f310: 20 69 6e 20 74 68 65 20 4f 70 65 6e 53 53 4c 0a   in the OpenSSL.
f320: 09 63 65 72 74 73 20 64 69 72 65 63 74 6f 72 79  .certs directory
f330: 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76 65 72  . It can be over
f340: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53  ridden by the SS
f350: 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76  L_CERT_DIR env v
f360: 61 72 2e 20 54 68 65 0a 09 64 65 66 61 75 6c 74  ar. The..default
f370: 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73   CA certificates
f380: 20 66 69 6c 65 20 69 73 20 63 61 6c 6c 65 64 20   file is called 
f390: 63 65 72 74 2e 70 65 6d 20 69 6e 20 74 68 65 20  cert.pem in the 
f3a0: 64 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c 0a  default OpenSSL.
f3b0: 09 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63  .directory. It c
f3c0: 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  an be overridden
f3d0: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54   by the SSL_CERT
f3e0: 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a  _FILE env var. *
f3f0: 2f 0a 09 2f 2a 20 69 6e 74 20 53 53 4c 5f 43 54  /../* int SSL_CT
f400: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65  X_set_default_ve
f410: 72 69 66 79 5f 64 69 72 28 53 53 4c 5f 43 54 58  rify_dir(SSL_CTX
f420: 20 2a 63 74 78 29 20 61 6e 64 20 69 6e 74 20 53   *ctx) and int S
f430: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
f440: 6c 74 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 53  lt_verify_file(S
f450: 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 2a 2f 0a  SL_CTX *ctx) */.
f460: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
f470: 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63  _load_verify_loc
f480: 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28  ations(ctx, F2N(
f490: 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32  CAfile, &ds), F2
f4a0: 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 29 20  N(CAdir, &ds1)) 
f4b0: 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65 74  ||..!SSL_CTX_set
f4c0: 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f  _default_verify_
f4d0: 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 23 69  paths(ctx)) {.#i
f4e0: 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  f 0..Tcl_DString
f4f0: 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f  Free(&ds);..Tcl_
f500: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31  DStringFree(&ds1
f510: 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72  );../* Don't cur
f520: 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66 20 74  rently care if t
f530: 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63  his fails */..Tc
f540: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f550: 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65 66 61  nterp, "SSL defa
f560: 75 6c 74 20 76 65 72 69 66 79 20 70 61 74 68 73  ult verify paths
f570: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28  : ", REASON(), (
f580: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
f590: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f5a0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
f5b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
f5c0: 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f     /* https://so
f5d0: 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f  urceforge.net/p/
f5e0: 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a  tls/bugs/57/ */.
f5f0: 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a      /* XXX:TODO:
f600: 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75   Let the user su
f610: 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65  pply values here
f620: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65   instead of some
f630: 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74  thing that exist
f640: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73  s on the filesys
f650: 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43  tem */.    if (C
f660: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  Afile != NULL) {
f670: 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f  ..STACK_OF(X509_
f680: 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73  NAME) *certNames
f690: 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65   = SSL_load_clie
f6a0: 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43  nt_CA_file(F2N(C
f6b0: 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69  Afile, &ds));..i
f6c0: 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20  f (certNames != 
f6d0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c  NULL) {..    SSL
f6e0: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
f6f0: 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72  CA_list(ctx, cer
f700: 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20  tNames);..}.    
f710: 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
f720: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20  ngFree(&ds);.   
f730: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
f740: 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75  (&ds1);.    retu
f750: 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn ctx;.}.../*. 
f760: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
f770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f7a0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75  ----. *. * Statu
f7b0: 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  sObjCmd -- retur
f7c0: 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f  n certificate fo
f7d0: 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72  r connected peer
f7e0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
f7f0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
f800: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
f810: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
f820: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
f830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f870: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
f880: 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69  StatusObjCmd(Cli
f890: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
f8a0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
f8b0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
f8c0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
f8d0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53   objv[]) {.    S
f8e0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a  tate *statePtr;.
f8f0: 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a      X509 *peer;.
f900: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
f910: 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  Ptr;.    Tcl_Cha
f920: 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63  nnel chan;.    c
f930: 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65  har *channelName
f940: 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20  , *ciphers;.    
f950: 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f  int mode;.    co
f960: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
f970: 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e  r *proto;.    un
f980: 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a  signed int len;.
f990: 20 20 20 20 69 6e 74 20 6e 69 64 3b 0a 0a 20 20      int nid;..  
f9a0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
f9b0: 64 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68  d");..    switch
f9c0: 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 65 20   (objc) {..case 
f9d0: 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 6c 4e  2:..    channelN
f9e0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
f9f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
fa00: 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29  1], (Tcl_Size *)
fa10: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61  NULL);..    brea
fa20: 6b 3b 0a 0a 09 63 61 73 65 20 33 3a 0a 09 20 20  k;...case 3:..  
fa30: 20 20 69 66 20 28 21 73 74 72 63 6d 70 20 28 54    if (!strcmp (T
fa40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 20 28 6f 62  cl_GetString (ob
fa50: 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22  jv[1]), "-local"
fa60: 29 29 20 7b 0a 09 09 63 68 61 6e 6e 65 6c 4e 61  )) {...channelNa
fa70: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
fa80: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
fa90: 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e  ], (Tcl_Size *)N
faa0: 55 4c 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  ULL);...break;..
fab0: 20 20 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c      }..    /* el
fac0: 73 65 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20  se fall-through 
fad0: 2e 2e 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ... */.#if defin
fae0: 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 20 20  ed(__GNUC__)..  
faf0: 20 20 5f 5f 61 74 74 72 69 62 75 74 65 5f 5f 28    __attribute__(
fb00: 28 66 61 6c 6c 74 68 72 6f 75 67 68 29 29 3b 0a  (fallthrough));.
fb10: 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a  #endif..default:
fb20: 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  ..    Tcl_WrongN
fb30: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
fb40: 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c  , objv, "?-local
fb50: 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20  ? channel");..  
fb60: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
fb70: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  OR;.    }..    c
fb80: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
fb90: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61  nnel(interp, cha
fba0: 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29  nnelName, &mode)
fbb0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
fbc0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
fbd0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
fbe0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
fbf0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
fc00: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
fc10: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
fc20: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
fc30: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
fc40: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69  nel(chan);.    i
fc50: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
fc60: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
fc70: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
fc80: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
fc90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
fca0: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
fcb0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
fcc0: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a  me(chan),..."\":
fcd0: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e   not a TLS chann
fce0: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c  el", NULL);..Tcl
fcf0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
fd00: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54  terp, "TLS", "ST
fd10: 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22  ATUS", "CHANNEL"
fd20: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
fd30: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
fd40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fd50: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
fd60: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54  tr = (State *) T
fd70: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
fd80: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b  tanceData(chan);
fd90: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72  ..    /* Get cer
fda0: 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65  tificate for pee
fdb0: 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20  r or self */.   
fdc0: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
fdd0: 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65  {..peer = SSL_ge
fde0: 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61  t_peer_certifica
fdf0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
fe00: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
fe10: 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f  .peer = SSL_get_
fe20: 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74  certificate(stat
fe30: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
fe40: 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30  }.    /* Get X50
fe50: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e  9 certificate in
fe60: 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65  fo */.    if (pe
fe70: 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20  er) {..objPtr = 
fe80: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69  Tls_NewX509Obj(i
fe90: 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69  nterp, peer);..i
fea0: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
feb0: 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70  .    X509_free(p
fec0: 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20  eer);..    peer 
fed0: 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d  = NULL;..}.    }
fee0: 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20   else {..objPtr 
fef0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
ff00: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  (0, NULL);.    }
ff10: 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 63 65  ..    /* Peer ce
ff20: 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65 6e 74  rt chain (client
ff30: 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 53 54   only) */.    ST
ff40: 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20 73 73  ACK_OF(X509)* ss
ff50: 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f 67 65  l_certs = SSL_ge
ff60: 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68 61 69  t_peer_cert_chai
ff70: 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  n(statePtr->ssl)
ff80: 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 5f 63 65  ;.    if (ssl_ce
ff90: 72 74 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73  rts == NULL || s
ffa0: 6b 5f 58 35 30 39 5f 6e 75 6d 28 73 73 6c 5f 63  k_X509_num(ssl_c
ffb0: 65 72 74 73 29 20 3d 3d 20 30 29 20 7b 0a 09 54  erts) == 0) {..T
ffc0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
ffd0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
ffe0: 53 54 41 54 55 53 22 2c 20 22 43 45 52 54 49 46  STATUS", "CERTIF
fff0: 49 43 41 54 45 22 2c 20 28 63 68 61 72 20 2a 29  ICATE", (char *)
10000 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 49 6e 63   NULL);..Tcl_Inc
10010 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 50 74 72  rRefCount(objPtr
10020 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43  );..Tcl_DecrRefC
10030 6f 75 6e 74 28 6f 62 6a 50 74 72 29 3b 0a 09 72  ount(objPtr);..r
10040 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10050 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
10060 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  eer name */.    
10070 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10080 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10090 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
100a0 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 6e  StringObj("peern
100b0 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ame", -1));.    
100c0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
100d0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
100e0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
100f0 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65  StringObj(SSL_ge
10100 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74  t0_peername(stat
10110 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29  ePtr->ssl), -1))
10120 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
10130 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10140 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10150 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10160 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a  ("sbits", -1));.
10170 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
10180 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10190 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
101a0 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67  _NewIntObj(SSL_g
101b0 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73  et_cipher_bits(s
101c0 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55  tatePtr->ssl, NU
101d0 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63 69 70 68  LL)));..    ciph
101e0 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c  ers = (char*)SSL
101f0 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74  _get_cipher(stat
10200 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
10210 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20  if ((ciphers != 
10220 4e 55 4c 4c 29 20 26 26 20 28 73 74 72 63 6d 70  NULL) && (strcmp
10230 28 63 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e 45  (ciphers, "(NONE
10240 29 22 29 20 21 3d 20 30 29 29 20 7b 0a 09 54 63  )") != 0)) {..Tc
10250 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10260 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10270 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10280 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22  ringObj("cipher"
10290 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
102a0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
102b0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
102c0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
102d0 62 6a 28 63 69 70 68 65 72 73 2c 20 2d 31 29 29  bj(ciphers, -1))
102e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
102f0 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20  Verify the X509 
10300 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73  certificate pres
10310 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65  ented by the pee
10320 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73  r */.    Tcl_Lis
10330 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10340 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10350 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10360 62 6a 28 22 76 65 72 69 66 79 52 65 73 75 6c 74  bj("verifyResult
10370 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
10380 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10390 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
103a0 6a 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74  jPtr,..Tcl_NewSt
103b0 72 69 6e 67 4f 62 6a 28 58 35 30 39 5f 76 65 72  ringObj(X509_ver
103c0 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
103d0 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65  tring(SSL_get_ve
103e0 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
103f0 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29  ePtr->ssl)), -1)
10400 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
10410 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 54 63  y mode */.    Tc
10420 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10430 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10440 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10450 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 4d  ringObj("verifyM
10460 6f 64 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ode", -1));.    
10470 2f 2a 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 76  /* SSL_CTX_get_v
10480 65 72 69 66 79 5f 6d 6f 64 65 28 63 74 78 29 20  erify_mode(ctx) 
10490 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53  */.    mode = SS
104a0 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64  L_get_verify_mod
104b0 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
104c0 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26  ;.    if (mode &
104d0 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e  & SSL_VERIFY_NON
104e0 45 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  E) {..Tcl_ListOb
104f0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10500 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
10510 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10520 22 6e 6f 6e 65 22 2c 20 2d 31 29 29 3b 0a 20 20  "none", -1));.  
10530 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f    } else {..Tcl_
10540 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20  Obj *listObjPtr 
10550 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
10560 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28  (0, NULL);..if (
10570 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
10580 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20  FY_PEER) {..    
10590 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
105a0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
105b0 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c   listObjPtr, Tcl
105c0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70  _NewStringObj("p
105d0 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  eer", -1));..}..
105e0 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f  if (mode && SSL_
105f0 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e  VERIFY_FAIL_IF_N
10600 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09  O_PEER_CERT) {..
10610 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
10620 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10630 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
10640 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10650 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65  j("fail if no pe
10660 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a  er cert", -1));.
10670 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20  .}..if (mode && 
10680 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e  SSL_VERIFY_CLIEN
10690 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54  T_ONCE) {..    T
106a0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
106b0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
106c0 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
106d0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c  NewStringObj("cl
106e0 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29  ient once", -1))
106f0 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26  ;..}..if (mode &
10700 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53  & SSL_VERIFY_POS
10710 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09  T_HANDSHAKE) {..
10720 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
10730 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10740 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
10750 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10760 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b  j("post handshak
10770 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63  e", -1));..}..Tc
10780 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10790 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
107a0 62 6a 50 74 72 2c 20 6c 69 73 74 4f 62 6a 50 74  bjPtr, listObjPt
107b0 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
107c0 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65  * Verify mode de
107d0 70 74 68 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c  pth */.    Tcl_L
107e0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
107f0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
10800 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
10810 67 4f 62 6a 28 22 76 65 72 69 66 79 44 65 70 74  gObj("verifyDept
10820 68 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 2f 2a  h", -1));.    /*
10830 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 76 65 72   SSL_CTX_get_ver
10840 69 66 79 5f 64 65 70 74 68 28 63 74 78 29 20 2a  ify_depth(ctx) *
10850 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  /.    Tcl_ListOb
10860 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10870 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
10880 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c  cl_NewIntObj(SSL
10890 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74  _get_verify_dept
108a0 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  h(statePtr->ssl)
108b0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f  ));..    /* Repo
108c0 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  rt the selected 
108d0 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65  protocol as a re
108e0 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f  sult of the nego
108f0 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53  tiation */.    S
10900 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c  SL_get0_alpn_sel
10910 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e  ected(statePtr->
10920 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65  ssl, &proto, &le
10930 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  n);.    Tcl_List
10940 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10950 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10960 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10970 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a  j("alpn", -1));.
10980 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
10990 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
109a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
109b0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
109c0 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e  har *)proto, (in
109d0 74 29 20 6c 65 6e 29 29 3b 0a 20 20 20 20 54 63  t) len));.    Tc
109e0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
109f0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10a00 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10a10 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f  ringObj("protoco
10a20 6c 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  l", -1));.    Tc
10a30 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10a40 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10a50 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10a60 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f  ringObj(SSL_get_
10a70 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72  version(statePtr
10a80 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20  ->ssl), -1));.. 
10a90 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20     /* Valid for 
10aa0 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72  non-RSA signatur
10ab0 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f  e and TLS 1.3 */
10ac0 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
10ad0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10ae0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
10af0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10b00 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67  signatureHashAlg
10b10 6f 72 69 74 68 6d 22 2c 20 2d 31 29 29 3b 0a 20  orithm", -1));. 
10b20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
10b30 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f   ? SSL_get_peer_
10b40 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74  signature_nid(st
10b50 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
10b60 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73 69 67  d) : SSL_get_sig
10b70 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65  nature_nid(state
10b80 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29  Ptr->ssl, &nid))
10b90 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
10ba0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10bb0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
10bc0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42  _NewStringObj(OB
10bd0 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d  J_nid2ln(nid), -
10be0 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  1));.    } else 
10bf0 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
10c00 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10c10 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10c20 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c  NewStringObj("",
10c30 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20   -1));.    }.   
10c40 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10c50 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10c60 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10c70 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e  wStringObj("sign
10c80 61 74 75 72 65 54 79 70 65 22 2c 20 2d 31 29 29  atureType", -1))
10c90 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  ;.    if (objc =
10ca0 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65  = 2 ? SSL_get_pe
10cb0 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70  er_signature_typ
10cc0 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
10cd0 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 53 53 4c  ssl, &nid) : SSL
10ce0 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74  _get_signature_t
10cf0 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ype_nid(statePtr
10d00 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a  ->ssl, &nid)) {.
10d10 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10d20 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10d30 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10d40 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e  wStringObj(OBJ_n
10d50 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29  id2ln(nid), -1))
10d60 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
10d70 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10d80 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10d90 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
10da0 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31  StringObj("", -1
10db0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  ));.    }..    T
10dc0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10dd0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
10de0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10df0 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20  OK;..clientData 
10e00 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a  = clientData;.}.
10e10 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
10e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
10e60 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
10e70 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
10e80 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20  connection info 
10e90 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a  from OpenSSL.. *
10ea0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
10eb0 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63  A list of connec
10ec0 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a  tion info.  *. *
10ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f10 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
10f20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  int ConnectionIn
10f30 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  foObjCmd(ClientD
10f40 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
10f50 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10f60 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
10f70 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
10f80 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
10f90 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
10fa0 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
10fb0 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
10fc0 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
10fd0 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
10fe0 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
10ff0 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63  socket */.    Tc
11000 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a  l_Obj *objPtr, *
11010 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e  listPtr;.    con
11020 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20  st SSL *ssl;.   
11030 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45   const SSL_CIPHE
11040 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63  R *cipher;.    c
11050 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e  onst SSL_SESSION
11060 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 6c   *session;.    l
11070 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69  ong mode;..    i
11080 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
11090 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
110a0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
110b0 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
110c0 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
110d0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68  );.    }..    ch
110e0 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
110f0 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
11100 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
11110 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f 53  (objv[1], (Tcl_S
11120 69 7a 65 20 2a 29 4e 55 4c 4c 29 2c 20 4e 55 4c  ize *)NULL), NUL
11130 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
11140 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
11150 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
11160 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
11170 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
11180 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
11190 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
111a0 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
111b0 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
111c0 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
111d0 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
111e0 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
111f0 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
11200 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
11210 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11220 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
11230 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
11240 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20  elName(chan),.. 
11250 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c     "\": not a TL
11260 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
11270 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
11280 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
11290 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22  S", "CONNECTION"
112a0 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
112b0 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
112c0 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28   NULL);..return(
112d0 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
112e0 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  }..    objPtr = 
112f0 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
11300 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a  , NULL);..    /*
11310 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f   Connection info
11320 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
11330 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f   = (State *)Tcl_
11340 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
11350 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20  ceData(chan);.  
11360 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72    ssl = statePtr
11370 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73  ->ssl;.    if (s
11380 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f  sl != NULL) {../
11390 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61  * connection sta
113a0 74 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  te */..Tcl_ListO
113b0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
113c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
113d0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
113e0 28 22 73 74 61 74 65 22 2c 20 2d 31 29 29 3b 0a  ("state", -1));.
113f0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11400 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11410 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11420 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73  wStringObj(SSL_s
11430 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67  tate_string_long
11440 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f  (ssl), -1));.../
11450 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 73  * Get SNI reques
11460 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20  ted server name 
11470 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  */..Tcl_ListObjA
11480 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11490 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
114a0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
114b0 65 72 76 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29  ervername", -1))
114c0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
114d0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
114e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
114f0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c  NewStringObj(SSL
11500 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28  _get_servername(
11510 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45  ssl, TLSEXT_NAME
11520 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c  TYPE_host_name),
11530 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20   -1));.../* Get 
11540 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 54 63 6c  protocol */..Tcl
11550 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11560 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11570 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11580 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c  ingObj("protocol
11590 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
115a0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
115b0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
115c0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
115d0 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73  Obj(SSL_get_vers
115e0 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a  ion(ssl), -1));.
115f0 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69  ../* Renegotiati
11600 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 54  on allowed */..T
11610 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11620 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11630 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
11640 74 72 69 6e 67 4f 62 6a 28 22 72 65 6e 65 67 6f  tringObj("renego
11650 74 69 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  tiation", -1));.
11660 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11670 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11680 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11690 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 20 20 20  wStringObj(..   
116a0 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f   SSL_get_secure_
116b0 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75  renegotiation_su
116c0 70 70 6f 72 74 28 73 73 6c 29 20 3f 20 22 73 75  pport(ssl) ? "su
116d0 70 70 6f 72 74 65 64 22 20 3a 20 22 6e 6f 74 20  pported" : "not 
116e0 73 75 70 70 6f 72 74 65 64 22 2c 20 2d 31 29 29  supported", -1))
116f0 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72  ;.../* Get secur
11700 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 54 63  ity level */..Tc
11710 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11720 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
11730 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
11740 72 69 6e 67 4f 62 6a 28 22 73 65 63 75 72 69 74  ringObj("securit
11750 79 6c 65 76 65 6c 22 2c 20 2d 31 29 29 3b 0a 09  ylevel", -1));..
11760 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11770 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11780 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
11790 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73  IntObj(SSL_get_s
117a0 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73  ecurity_level(ss
117b0 6c 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  l)));.../* Sessi
117c0 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c 5f  on info */..Tcl_
117d0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
117e0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
117f0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11800 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 72  ngObj("session_r
11810 65 75 73 65 64 22 2c 20 2d 31 29 29 3b 0a 09 54  eused", -1));..T
11820 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11830 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11840 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  objPtr, Tcl_NewB
11850 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 73 65  ooleanObj(SSL_se
11860 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c  ssion_reused(ssl
11870 29 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72  )));.../* Is ser
11880 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 54 63 6c  ver info */..Tcl
11890 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
118a0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
118b0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
118c0 69 6e 67 4f 62 6a 28 22 69 73 5f 73 65 72 76 65  ingObj("is_serve
118d0 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  r", -1));..Tcl_L
118e0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
118f0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
11900 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  tr, Tcl_NewBoole
11910 61 6e 4f 62 6a 28 53 53 4c 5f 69 73 5f 73 65 72  anObj(SSL_is_ser
11920 76 65 72 28 73 73 6c 29 29 29 3b 0a 20 20 20 20  ver(ssl)));.    
11930 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72  }..    /* Cipher
11940 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70   info */.    cip
11950 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  her = SSL_get_cu
11960 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c  rrent_cipher(ssl
11970 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  );.    if (ciphe
11980 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  r != NULL) {..ch
11990 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d  ar buf[BUFSIZ] =
119a0 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c   {0};..int bits,
119b0 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 54 63 6c   alg_bits;...Tcl
119c0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
119d0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
119e0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
119f0 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22 2c  ingObj("cipher",
11a00 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
11a10 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11a20 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11a30 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11a40 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  j(SSL_CIPHER_get
11a50 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d  _name(cipher), -
11a60 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
11a70 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11a80 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11a90 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11aa0 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c  "standard_name",
11ab0 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
11ac0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11ad0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11ae0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11af0 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61  j(SSL_CIPHER_sta
11b00 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65  ndard_name(ciphe
11b10 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 62 69 74 73  r), -1));...bits
11b20 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65   = SSL_CIPHER_ge
11b30 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26  t_bits(cipher, &
11b40 61 6c 67 5f 62 69 74 73 29 3b 0a 09 54 63 6c 5f  alg_bits);..Tcl_
11b50 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11b60 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11b70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11b80 6e 67 4f 62 6a 28 22 73 65 63 72 65 74 5f 62 69  ngObj("secret_bi
11b90 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  ts", -1));..Tcl_
11ba0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11bb0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11bc0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
11bd0 62 6a 28 62 69 74 73 29 29 3b 0a 09 54 63 6c 5f  bj(bits));..Tcl_
11be0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11bf0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11c00 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11c10 6e 67 4f 62 6a 28 22 61 6c 67 6f 72 69 74 68 6d  ngObj("algorithm
11c20 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54  _bits", -1));..T
11c30 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11c40 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11c50 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  objPtr, Tcl_NewI
11c60 6e 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73 29 29  ntObj(alg_bits))
11c70 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69  ;../* alg_bits i
11c80 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63  s actual key sec
11c90 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65  ret bits. If use
11ca0 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74   bits and secret
11cb0 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74   (algorithm) bit
11cc0 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68  s differ,..   th
11cd0 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69  e rest of the bi
11ce0 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e  ts are fixed, i.
11cf0 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65  e. for limited e
11d00 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62  xport ciphers (b
11d10 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 09 54 63  its < 56) */..Tc
11d20 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11d30 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
11d40 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
11d50 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 5f 76 65 72  ringObj("min_ver
11d60 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63  sion", -1));..Tc
11d70 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11d80 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
11d90 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
11da0 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48  ringObj(SSL_CIPH
11db0 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63  ER_get_version(c
11dc0 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09  ipher), -1));...
11dd0 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73  /* Get OpenSSL-s
11de0 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20  pecific ID, not 
11df0 49 41 4e 41 20 49 44 20 2a 2f 0a 09 54 63 6c 5f  IANA ID */..Tcl_
11e00 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11e10 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11e20 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11e30 6e 67 4f 62 6a 28 22 69 64 22 2c 20 2d 31 29 29  ngObj("id", -1))
11e40 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
11e50 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11e60 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11e70 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 20  NewIntObj((int) 
11e80 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69  SSL_CIPHER_get_i
11e90 64 28 63 69 70 68 65 72 29 29 29 3b 0a 0a 09 69  d(cipher)));...i
11ea0 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65  f (SSL_CIPHER_de
11eb0 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72  scription(cipher
11ec0 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75  , buf, sizeof(bu
11ed0 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  f)) != NULL) {..
11ee0 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
11ef0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11f00 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11f10 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 64  _NewStringObj("d
11f20 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 2d 31 29  escription", -1)
11f30 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
11f40 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11f50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11f60 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11f70 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 09 7d 0a  j(buf, -1));..}.
11f80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
11f90 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
11fa0 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f    session = SSL_
11fb0 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29  get_session(ssl)
11fc0 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  ;.    if (sessio
11fd0 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f  n != NULL) {..co
11fe0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
11ff0 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65  r *ticket;..size
12000 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e  _t len2;..unsign
12010 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f  ed int ulen;..co
12020 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
12030 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a  r *session_id, *
12040 70 72 6f 74 6f 3b 0a 09 63 68 61 72 20 62 75 66  proto;..char buf
12050 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54  fer[SSL_MAX_MAST
12060 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a  ER_KEY_LENGTH];.
12070 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20  ../* Report the 
12080 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f  selected protoco
12090 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  l as a result of
120a0 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69   the ALPN negoti
120b0 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45  ation */..SSL_SE
120c0 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f  SSION_get0_alpn_
120d0 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e  selected(session
120e0 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29  , &proto, &len2)
120f0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
12100 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12110 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
12120 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c  NewStringObj("al
12130 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  pn", -1));..Tcl_
12140 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
12150 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
12160 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
12170 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72  ngObj((char *)pr
12180 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29  oto, (int) len2)
12190 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74  );.../* Report t
121a0 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  he selected prot
121b0 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74  ocol as a result
121c0 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f   of the NPN nego
121d0 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65  tiation */.#ifde
121e0 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67  f USE_NPN..SSL_g
121f0 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e  et0_next_proto_n
12200 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26  egotiated(ssl, &
12210 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09  proto, &ulen);..
12220 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12230 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12240 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
12250 53 74 72 69 6e 67 4f 62 6a 28 22 6e 70 6e 22 2c  StringObj("npn",
12260 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
12270 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12280 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12290 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
122a0 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c  j((char *)proto,
122b0 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 23   (int) ulen));.#
122c0 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d  endif.../* Resum
122d0 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a  able session */.
122e0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
122f0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12300 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
12310 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 73 75  wStringObj("resu
12320 6d 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 54  mable", -1));..T
12330 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12340 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
12350 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  objPtr, Tcl_NewI
12360 6e 74 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f  ntObj(SSL_SESSIO
12370 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73  N_is_resumable(s
12380 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20  ession)));.../* 
12390 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69  Session start ti
123a0 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63  me (seconds sinc
123b0 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 54 63 6c  e epoch) */..Tcl
123c0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
123d0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
123e0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
123f0 69 6e 67 4f 62 6a 28 22 73 74 61 72 74 5f 74 69  ingObj("start_ti
12400 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  me", -1));..Tcl_
12410 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
12420 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
12430 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67  Ptr, Tcl_NewLong
12440 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  Obj(SSL_SESSION_
12450 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e  get_time(session
12460 29 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75  )));.../* Timeou
12470 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54  t value - SSL_CT
12480 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69  X_get_timeout (i
12490 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54  n seconds) */..T
124a0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
124b0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
124c0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
124d0 74 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65 6f 75  tringObj("timeou
124e0 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  t", -1));..Tcl_L
124f0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12500 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
12510 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f  tr, Tcl_NewLongO
12520 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  bj(SSL_SESSION_g
12530 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69  et_timeout(sessi
12540 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  on)));.../* Sess
12550 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74  ion ticket lifet
12560 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63  ime hint (in sec
12570 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69  onds) */..Tcl_Li
12580 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12590 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
125a0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
125b0 4f 62 6a 28 22 6c 69 66 65 74 69 6d 65 22 2c 20  Obj("lifetime", 
125c0 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
125d0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
125e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
125f0 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53  Tcl_NewLongObj(S
12600 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74  SL_SESSION_get_t
12610 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68  icket_lifetime_h
12620 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a  int(session)));.
12630 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20  ../* Session id 
12640 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65  - TLSv1.2 and be
12650 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73  low only */..ses
12660 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45  sion_id = SSL_SE
12670 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73  SSION_get_id(ses
12680 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 54  sion, &ulen);..T
12690 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
126a0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
126b0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
126c0 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f  tringObj("sessio
126d0 6e 5f 69 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63  n_id", -1));..Tc
126e0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
126f0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
12700 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79  bjPtr, Tcl_NewBy
12710 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69  teArrayObj(sessi
12720 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65  on_id, (int) ule
12730 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  n));.../* Sessio
12740 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65  n context */..se
12750 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53  ssion_id = SSL_S
12760 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63  ESSION_get0_id_c
12770 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20  ontext(session, 
12780 26 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73  &ulen);..Tcl_Lis
12790 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
127a0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
127b0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
127c0 62 6a 28 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74  bj("session_cont
127d0 65 78 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ext", -1));..Tcl
127e0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
127f0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
12800 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74  jPtr, Tcl_NewByt
12810 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f  eArrayObj(sessio
12820 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e  n_id, (int) ulen
12830 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
12840 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74   ticket - client
12850 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45   only */..SSL_SE
12860 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
12870 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  t(session, &tick
12880 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c  et, &len2);..Tcl
12890 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
128a0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
128b0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
128c0 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f  ingObj("session_
128d0 74 69 63 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 09  ticket", -1));..
128e0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
128f0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12900 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
12910 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63  ByteArrayObj(tic
12920 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29  ket, (int) len2)
12930 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61  );.../* Ticket a
12940 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 53 4c 5f  pp data */..SSL_
12950 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
12960 6b 65 74 5f 61 70 70 64 61 74 61 28 73 65 73 73  ket_appdata(sess
12970 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
12980 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  en2);..Tcl_ListO
12990 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
129a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
129b0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
129c0 28 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74  ("ticket_app_dat
129d0 61 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  a", -1));..Tcl_L
129e0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
129f0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
12a00 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
12a10 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20  rrayObj(ticket, 
12a20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09  (int) len2));...
12a30 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65  /* Get master ke
12a40 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c  y */..len2 = SSL
12a50 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73  _SESSION_get_mas
12a60 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c  ter_key(session,
12a70 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58   buffer, SSL_MAX
12a80 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47  _MASTER_KEY_LENG
12a90 54 48 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  TH);..Tcl_ListOb
12aa0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
12ab0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
12ac0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12ad0 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 2d 31  "master_key", -1
12ae0 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
12af0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
12b00 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
12b10 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
12b20 6a 28 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20  j(buffer, (int) 
12b30 6c 65 6e 32 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  len2));.    }.. 
12b40 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f     /* Compressio
12b50 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66  n info */.    if
12b60 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b   (ssl != NULL) {
12b70 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c  .#ifdef HAVE_SSL
12b80 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f  _COMPRESSION..co
12b90 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20  nst COMP_METHOD 
12ba0 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63  *comp, *expn;..c
12bb0 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  omp = SSL_get_cu
12bc0 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f  rrent_compressio
12bd0 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20  n(ssl);..expn = 
12be0 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
12bf0 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a  expansion(ssl);.
12c00 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
12c10 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
12c20 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
12c30 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d  ewStringObj("com
12c40 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b  pression", -1));
12c50 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
12c60 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
12c70 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
12c80 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 6f 6d 70  ewStringObj(comp
12c90 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f   ? SSL_COMP_get_
12ca0 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 4e 4f  name(comp) : "NO
12cb0 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  NE", -1));..Tcl_
12cc0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
12cd0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
12ce0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
12cf0 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e  ngObj("expansion
12d00 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
12d10 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12d20 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
12d30 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
12d40 4f 62 6a 28 65 78 70 6e 20 3f 20 53 53 4c 5f 43  Obj(expn ? SSL_C
12d50 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70  OMP_get_name(exp
12d60 6e 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29  n) : "NONE", -1)
12d70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 4c 69  );.#else..Tcl_Li
12d80 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12d90 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
12da0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
12db0 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e  Obj("compression
12dc0 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
12dd0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12de0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
12df0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
12e00 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29  Obj("NONE", -1))
12e10 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
12e20 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12e30 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
12e40 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78  NewStringObj("ex
12e50 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  pansion", -1));.
12e60 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
12e70 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12e80 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
12e90 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45  wStringObj("NONE
12ea0 22 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ", -1));.#endif.
12eb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
12ec0 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  rver info */.   
12ed0 20 7b 0a 09 6d 6f 64 65 20 3d 20 53 53 4c 5f 43   {..mode = SSL_C
12ee0 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63  TX_get_session_c
12ef0 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50  ache_mode(stateP
12f00 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20  tr->ctx);..char 
12f10 2a 6d 73 67 3b 0a 09 0a 09 69 66 20 28 6d 6f 64  *msg;....if (mod
12f20 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  e & SSL_SESS_CAC
12f30 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d  HE_OFF) {..    m
12f40 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65  sg = "off";..} e
12f50 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
12f60 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c  SL_SESS_CACHE_CL
12f70 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67  IENT) {..    msg
12f80 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20   = "client";..} 
12f90 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20  else if (mode & 
12fa0 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53  SSL_SESS_CACHE_S
12fb0 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73  ERVER) {..    ms
12fc0 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d  g = "server";..}
12fd0 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26   else if (mode &
12fe0 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
12ff0 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67  BOTH) {..    msg
13000 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c   = "both";..} el
13010 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20  se {..    msg = 
13020 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 54  "unknown";..}..T
13030 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
13040 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
13050 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
13060 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f  tringObj("sessio
13070 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 2d  n_cache_mode", -
13080 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
13090 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
130a0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
130b0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
130c0 6d 73 67 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d  msg, -1));.    }
130d0 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74  ..    /* CA List
130e0 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f   */.    /* IF no
130f0 74 20 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65  t a server, same
13100 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65   as SSL_get0_pee
13110 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65  r_CA_list. If se
13120 72 76 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c  rver same as SSL
13130 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_get_client_
13140 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c  CA_list */.    l
13150 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  istPtr = Tcl_New
13160 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
13170 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58  ;.    STACK_OF(X
13180 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69  509_NAME) *ca_li
13190 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f  st;.    if ((ca_
131a0 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63  list = SSL_get_c
131b0 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73  lient_CA_list(ss
131c0 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  l)) != NULL) {..
131d0 63 68 61 72 20 62 75 66 66 65 72 5b 42 55 46 53  char buffer[BUFS
131e0 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69  IZ];..for (int i
131f0 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30   = 0; i < sk_X50
13200 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69  9_NAME_num(ca_li
13210 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20  st); i++) {..   
13220 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65   X509_NAME *name
13230 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f   = sk_X509_NAME_
13240 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69  value(ca_list, i
13250 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65  );..    if (name
13260 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  ) {...X509_NAME_
13270 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75  oneline(name, bu
13280 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09  ffer, BUFSIZ);..
13290 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
132a0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
132b0 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e  , listPtr, Tcl_N
132c0 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66  ewStringObj(buff
132d0 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d  er, -1));..    }
132e0 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ..}.    }.    Tc
132f0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
13300 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
13310 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
13320 72 69 6e 67 4f 62 6a 28 22 63 61 4c 69 73 74 22  ringObj("caList"
13330 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
13340 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
13350 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
13360 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 0a  Ptr, listPtr);..
13370 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
13380 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
13390 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
133a0 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74   TCL_OK;..client
133b0 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
133c0 61 3b 0a 7d 0a 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  a;.}..../*. *---
133d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13410 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62  . *. * VersionOb
13420 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76  jCmd -- return v
13430 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72  ersion string fr
13440 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20  om OpenSSL.. *. 
13450 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
13460 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
13470 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
13480 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
13490 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
134a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
134e0 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f  tatic int.Versio
134f0 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  nObjCmd(ClientDa
13500 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
13510 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
13520 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
13530 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
13540 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []) {.    Tcl_Ob
13550 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20  j *objPtr;..    
13560 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
13570 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d  );..    objPtr =
13580 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
13590 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  j(OPENSSL_VERSIO
135a0 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20  N_TEXT, -1);.   
135b0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
135c0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
135d0 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
135e0 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
135f0 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
13600 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09  ..objc = objc;..
13610 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c  objv = objv;.}..
13620 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
13630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13660 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
13670 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69  MiscObjCmd -- mi
13680 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20  sc commands. *. 
13690 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
136a0 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
136b0 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
136c0 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
136d0 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
136e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
13720 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62  tatic int.MiscOb
13730 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
13740 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
13750 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
13760 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
13770 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
13780 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
13790 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e  nst char *comman
137a0 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c  ds [] = { "req",
137b0 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20   "strreq", NULL 
137c0 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d  };.    enum comm
137d0 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53  and { C_REQ, C_S
137e0 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d  TRREQ, C_DUMMY }
137f0 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63  ;.    Tcl_Size c
13800 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 74  md;.    int isSt
13810 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66  r;.    char buff
13820 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20  er[16384];..    
13830 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
13840 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
13850 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f   < 2) {..Tcl_Wro
13860 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13870 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63  , 1, objv, "subc
13880 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b  ommand ?args?");
13890 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
138a0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
138b0 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
138c0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
138d0 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c  jv[1], commands,
138e0 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63   "command", 0,&c
138f0 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  md) != TCL_OK) {
13900 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13910 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  OR;.    }..    E
13920 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
13930 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28  ;..    isStr = (
13940 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29  cmd == C_STRREQ)
13950 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65  ;.    switch ((e
13960 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64  num command) cmd
13970 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a  ) {..case C_REQ:
13980 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a  ..case C_STRREQ:
13990 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59   {..    EVP_PKEY
139a0 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20   *pkey=NULL;..  
139b0 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c    X509 *cert=NUL
139c0 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d  L;..    X509_NAM
139d0 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20  E *name=NULL;.. 
139e0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73     Tcl_Obj **lis
139f0 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a  tv;..    Tcl_Siz
13a00 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 20 69 6e  e listc;..    in
13a10 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a  t i;...    BIO *
13a20 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20  out=NULL;...    
13a30 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f  char *k_C="",*k_
13a40 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b  ST="",*k_L="",*k
13a50 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a  _O="",*k_OU="",*
13a60 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c  k_CN="",*k_Email
13a70 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a  ="";..    char *
13a80 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a  keyout,*pemout,*
13a90 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65  str;..    int ke
13aa0 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64  ysize,serial=0,d
13ab0 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50  ays=365;..#if OP
13ac0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
13ad0 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
13ae0 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a  0L..    BIGNUM *
13af0 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20  bne = NULL;..   
13b00 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c   RSA *rsa = NULL
13b10 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50  ;.#else..    EVP
13b20 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d  _PKEY_CTX *ctx =
13b30 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09   NULL;.#endif...
13b40 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29      if ((objc<5)
13b50 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a   || (objc>6)) {.
13b60 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
13b70 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
13b80 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79  jv, "keysize key
13b90 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69  file certfile ?i
13ba0 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e  nfo?");...return
13bb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
13bc0 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c   }...    if (Tcl
13bd0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
13be0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
13bf0 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c  &keysize) != TCL
13c00 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20  _OK) {...return 
13c10 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
13c20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63  }..    keyout=Tc
13c30 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
13c40 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75  [3]);..    pemou
13c50 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  t=Tcl_GetString(
13c60 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69  objv[4]);..    i
13c70 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63  f (isStr) {...Tc
13c80 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
13c90 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09  keyout,"",0);...
13ca0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
13cb0 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a  p,pemout,"",0);.
13cc0 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
13cd0 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66  (objc>=6) {...if
13ce0 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74   (Tcl_ListObjGet
13cf0 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c  Elements(interp,
13d00 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63   objv[5], &listc
13d10 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c  , &listv) != TCL
13d20 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74  _OK) {...    ret
13d30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
13d40 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63  .}....if ((listc
13d50 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20  %2) != 0) {...  
13d60 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
13d70 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74  interp,"Informat
13d80 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61  ion list must ha
13d90 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f  ve even number o
13da0 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c  f arguments",NUL
13db0 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e  L);...    return
13dc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a   TCL_ERROR;...}.
13dd0 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69  ..for (i=0; i<li
13de0 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20  stc; i+=2) {... 
13df0 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74     str=Tcl_GetSt
13e00 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a  ring(listv[i]);.
13e10 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d 70  ..    if (strcmp
13e20 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29  (str,"days")==0)
13e30 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65   {....if (Tcl_Ge
13e40 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
13e50 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64  rp,listv[i+1],&d
13e60 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09  ays)!=TCL_OK)...
13e70 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13e80 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65  ERROR;...    } e
13e90 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
13ea0 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29  tr,"serial")==0)
13eb0 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65   {....if (Tcl_Ge
13ec0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
13ed0 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73  rp,listv[i+1],&s
13ee0 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a  erial)!=TCL_OK).
13ef0 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
13f00 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d  L_ERROR;...    }
13f10 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
13f20 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a  (str,"C")==0) {.
13f30 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74  ...k_C=Tcl_GetSt
13f40 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
13f50 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
13f60 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53  f (strcmp(str,"S
13f70 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53  T")==0) {....k_S
13f80 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  T=Tcl_GetString(
13f90 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13fa0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13fb0 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30  rcmp(str,"L")==0
13fc0 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47  ) {....k_L=Tcl_G
13fd0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13fe0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13ff0 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
14000 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09  r,"O")==0) {....
14010 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  k_O=Tcl_GetStrin
14020 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
14030 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
14040 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29  strcmp(str,"OU")
14050 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54  ==0) {....k_OU=T
14060 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
14070 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
14080 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
14090 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20  p(str,"CN")==0) 
140a0 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65  {....k_CN=Tcl_Ge
140b0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
140c0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
140d0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
140e0 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a  ,"Email")==0) {.
140f0 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47  ...k_Email=Tcl_G
14100 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
14110 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
14120 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52  se {....Tcl_SetR
14130 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e  esult(interp,"Un
14140 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22  known parameter"
14150 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72  ,NULL);....retur
14160 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20  n TCL_ERROR;... 
14170 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a     }...}..    }.
14180 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
14190 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
141a0 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62  30000000L..    b
141b0 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09  ne = BN_new();..
141c0 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65      rsa = RSA_ne
141d0 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d  w();..    pkey =
141e0 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b   EVP_PKEY_new();
141f0 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d  ..    if (bne ==
14200 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20   NULL || rsa == 
14210 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20  NULL || pkey == 
14220 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f  NULL || !BN_set_
14230 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29  word(bne,RSA_F4)
14240 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72   ||...!RSA_gener
14250 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20  ate_key_ex(rsa, 
14260 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55  keysize, bne, NU
14270 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  LL) || !EVP_PKEY
14280 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79  _assign_RSA(pkey
14290 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f  , rsa)) {...EVP_
142a0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
142b0 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72  .../* RSA_free(r
142c0 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45 56  sa); freed by EV
142d0 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09  P_PKEY_free */..
142e0 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23  .BN_free(bne);.#
142f0 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d  else..    pkey =
14300 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e   EVP_RSA_gen((un
14310 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73  signed int) keys
14320 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d  ize);..    ctx =
14330 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65   EVP_PKEY_CTX_ne
14340 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20  w(pkey,NULL);.. 
14350 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e     if (pkey == N
14360 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55  ULL || ctx == NU
14370 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f  LL || !EVP_PKEY_
14380 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29  keygen_init(ctx)
14390 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f   ||...!EVP_PKEY_
143a0 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67  CTX_set_rsa_keyg
143b0 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79  en_bits(ctx, key
143c0 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b  size) || !EVP_PK
143d0 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26  EY_keygen(ctx, &
143e0 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50  pkey)) {...EVP_P
143f0 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
14400 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66  ..EVP_PKEY_CTX_f
14410 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66  ree(ctx);.#endif
14420 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
14430 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67  (interp,"Error g
14440 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74  enerating privat
14450 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09  e key",NULL);...
14460 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14470 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
14480 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09  ..if (isStr) {..
14490 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
144a0 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09  (BIO_s_mem());..
144b0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
144c0 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75  io_PrivateKey(ou
144d0 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c  t,pkey,NULL,NULL
144e0 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09  ,0,NULL,NULL);..
144f0 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28  .    i=BIO_read(
14500 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f  out,buffer,sizeo
14510 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09  f(buffer)-1);...
14520 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20      i=(i<0) ? 0 
14530 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65  : i;...    buffe
14540 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20  r[i]='\0';...   
14550 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
14560 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72  rp,keyout,buffer
14570 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ,0);...    BIO_f
14580 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20  lush(out);...   
14590 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a   BIO_free(out);.
145a0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
145b0 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f   out=BIO_new(BIO
145c0 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20  _s_file());...  
145d0 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65    BIO_write_file
145e0 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29  name(out,keyout)
145f0 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
14600 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79  e_bio_PrivateKey
14610 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e  (out,pkey,NULL,N
14620 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ULL,0,NULL,NULL)
14630 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77  ;...    /* PEM_w
14640 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76  rite_bio_RSAPriv
14650 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c  ateKey(out, rsa,
14660 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20   NULL, NULL, 0, 
14670 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a  NULL, NULL); */.
14680 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ..    BIO_free_a
14690 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09  ll(out);.. .}...
146a0 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f  .if ((cert=X509_
146b0 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a  new())==NULL) {.
146c0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
146d0 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
146e0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72  r generating cer
146f0 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73 74  tificate request
14700 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45  ",NULL);...    E
14710 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
14720 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
14730 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
14740 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20   0x30000000L... 
14750 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b     BN_free(bne);
14760 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65  .#endif...    re
14770 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
14780 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74  ...}....X509_set
14790 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29  _version(cert,2)
147a0 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52  ;...ASN1_INTEGER
147b0 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65  _set(X509_get_se
147c0 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29  rialNumber(cert)
147d0 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39  ,serial);...X509
147e0 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
147f0 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28  _getm_notBefore(
14800 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39  cert),0);...X509
14810 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
14820 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63  _getm_notAfter(c
14830 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30  ert),(long)60*60
14840 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30  *24*days);...X50
14850 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72  9_set_pubkey(cer
14860 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65  t,pkey);....name
14870 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63  =X509_get_subjec
14880 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09  t_name(cert);...
14890 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
148a0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
148b0 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"C", MBSTRING_A
148c0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
148d0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c  ned char *) k_C,
148e0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
148f0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
14900 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
14910 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  ST", MBSTRING_AS
14920 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
14930 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c  ed char *) k_ST,
14940 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
14950 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
14960 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
14970 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  L", MBSTRING_ASC
14980 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
14990 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d  d char *) k_L, -
149a0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
149b0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
149c0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22  _by_txt(name,"O"
149d0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
149e0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
149f0 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c  char *) k_O, -1,
14a00 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
14a10 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
14a20 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c  y_txt(name,"OU",
14a30 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
14a40 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
14a50 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c  har *) k_OU, -1,
14a60 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
14a70 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
14a80 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c  y_txt(name,"CN",
14a90 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
14aa0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
14ab0 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c  har *) k_CN, -1,
14ac0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
14ad0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
14ae0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69  y_txt(name,"Emai
14af0 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  l", MBSTRING_ASC
14b00 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
14b10 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69  d char *) k_Emai
14b20 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a  l, -1, -1, 0);..
14b30 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65  ..X509_set_subje
14b40 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d  ct_name(cert,nam
14b50 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39  e);....if (!X509
14b60 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c  _sign(cert,pkey,
14b70 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b  EVP_sha256())) {
14b80 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 65  ...    X509_free
14b90 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56  (cert);...    EV
14ba0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
14bb0 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  );.#if OPENSSL_V
14bc0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
14bd0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20  0x30000000L...  
14be0 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a    BN_free(bne);.
14bf0 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c  #endif...    Tcl
14c00 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
14c10 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67  p,"Error signing
14c20 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55   certificate",NU
14c30 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72  LL);...    retur
14c40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
14c50 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b  ....if (isStr) {
14c60 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
14c70 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b  ew(BIO_s_mem());
14c80 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
14c90 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65  _bio_X509(out,ce
14ca0 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f  rt);...    i=BIO
14cb0 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72  _read(out,buffer
14cc0 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d  ,sizeof(buffer)-
14cd0 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30  1);...    i=(i<0
14ce0 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20  ) ? 0 : i;...   
14cf0 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b   buffer[i]='\0';
14d00 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61  ...    Tcl_SetVa
14d10 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c  r(interp,pemout,
14d20 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20  buffer,0);...   
14d30 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b   BIO_flush(out);
14d40 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ...    BIO_free(
14d50 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  out);...} else {
14d60 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
14d70 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29  ew(BIO_s_file())
14d80 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74  ;...    BIO_writ
14d90 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70  e_filename(out,p
14da0 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45  emout);...    PE
14db0 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39  M_write_bio_X509
14dc0 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20  (out,cert);...  
14dd0 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f    BIO_free_all(o
14de0 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  ut);...}....X509
14df0 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45  _free(cert);...E
14e00 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
14e10 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
14e20 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
14e30 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42   0x30000000L...B
14e40 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e  N_free(bne);.#en
14e50 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62  dif..    }..}..b
14e60 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
14e70 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t:..break;.    }
14e80 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14e90 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20  OK;..clientData 
14ea0 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a  = clientData;.}.
14eb0 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
14ec0 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74  *******/./* Init
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
14ee0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14ef0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  *****/../*. *---
14f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f40 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20  . *. * Tls_Free 
14f50 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
14f60 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75  ocedure cleans u
14f70 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63  p when a SSL soc
14f80 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65  ket based channe
14f90 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61  l. *.is closed a
14fa0 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  nd its reference
14fb0 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c   count falls bel
14fc0 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ow 1. *. * Resul
14fd0 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20  ts:. *.none. *. 
14fe0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
14ff0 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65   *.Frees all the
15000 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d   state. *. *----
15010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
15050 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65   */.void.Tls_Fre
15060 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72  e(char *blockPtr
15070 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
15080 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
15090 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20   *)blockPtr;..  
150a0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
150b0 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c  d");..    Tls_Cl
150c0 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20  ean(statePtr);. 
150d0 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50     ckfree(blockP
150e0 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  tr);.}.../*. *--
150f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15130 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61  -. *. * Tls_Clea
15140 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  n --. *. *.This 
15150 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
15160 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
15170 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
15180 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
15190 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
151a0 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
151b0 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68  elow 1.  This sh
151c0 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65  ould. *.be calle
151d0 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20  d synchronously 
151e0 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63  by the CloseProc
151f0 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09  , not in the. *.
15200 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63  EventuallyFree c
15210 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52  allback.. *. * R
15220 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  esults:. *.none.
15230 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
15240 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c  ts:. *.Frees all
15250 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a   the state. *. *
15260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152a0 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73  ---. */.void Tls
152b0 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74  _Clean(State *st
152c0 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70  atePtr) {.    dp
152d0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
152e0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
152f0 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68  we're assuming h
15300 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73  ere that we're s
15310 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20  ingle-threaded. 
15320 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73      */.    if (s
15330 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21  tatePtr->timer !
15340 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
15350 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  n) NULL) {..Tcl_
15360 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c  DeleteTimerHandl
15370 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  er(statePtr->tim
15380 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  er);..statePtr->
15390 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20  timer = NULL;.  
153a0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
153b0 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b  tePtr->protos) {
153c0 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 74  ..ckfree(statePt
153d0 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61  r->protos);..sta
153e0 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20  tePtr->protos = 
153f0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
15400 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69  if (statePtr->bi
15410 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69  o) {../* This wi
15420 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74  ll call SSL_shut
15430 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34  down. Bug 141404
15440 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42  5 */..dprintf("B
15450 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22  IO_free_all(%p)"
15460 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  , statePtr->bio)
15470 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28  ;..BIO_free_all(
15480 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
15490 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d  .statePtr->bio =
154a0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
154b0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
154c0 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  sl) {..dprintf("
154d0 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73  SSL_free(%p)", s
154e0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
154f0 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74  SSL_free(statePt
15500 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50  r->ssl);..stateP
15510 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a  tr->ssl = NULL;.
15520 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
15530 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09  atePtr->ctx) {..
15540 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61  SSL_CTX_free(sta
15550 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74  tePtr->ctx);..st
15560 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55  atePtr->ctx = NU
15570 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
15580 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
15590 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63  back) {..Tcl_Dec
155a0 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
155b0 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09  tr->callback);..
155c0 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
155d0 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ck = NULL;.    }
155e0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
155f0 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09  r->password) {..
15600 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
15610 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
15620 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ord);..statePtr-
15630 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c  >password = NULL
15640 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
15650 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20  statePtr->vcmd) 
15660 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
15670 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63  unt(statePtr->vc
15680 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  md);..statePtr->
15690 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  vcmd = NULL;.   
156a0 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   }..    dprintf(
156b0 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a  "Returning");.}.
156c0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
156d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
15710 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a   Tls_Init --. *.
15720 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63   *.This is a pac
15730 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  kage initializat
15740 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77  ion procedure, w
15750 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20  hich is called. 
15760 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68  *.by Tcl when th
15770 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f  is package is to
15780 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20   be added to an 
15790 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a  interpreter.. *.
157a0 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c   * Results:  Ssl
157b0 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20   configured and 
157c0 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64  loaded. *. * Sid
157d0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63  e effects:. *. c
157e0 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f  reate the ssl co
157f0 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a  mmand, initializ
15800 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a  e ssl context. *
15810 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
15820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15850 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58  ------. */.DLLEX
15860 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69  PORT int Tls_Ini
15870 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
15880 74 65 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73  terp) {.    cons
15890 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69  t char tlsTclIni
158a0 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69  tScript[] = {.#i
158b0 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e  nclude "tls.tcl.
158c0 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a  h"..0x00.    };.
158d0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
158e0 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 54 43 4c  lled");..#if TCL
158f0 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e  _MAJOR_VERSION >
15900 20 38 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43   8.#ifdef USE_TC
15910 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 28  L_STUBS.    if (
15920 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
15930 74 65 72 70 2c 20 22 39 2e 30 22 2c 20 30 29 20  terp, "9.0", 0) 
15940 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
15950 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15960 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
15970 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72  f (Tcl_PkgRequir
15980 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c  e(interp, "Tcl",
15990 20 22 39 2e 30 2d 22 2c 20 30 29 20 3d 3d 20 4e   "9.0-", 0) == N
159a0 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
159b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
159c0 23 65 6c 73 65 0a 23 69 66 64 65 66 20 55 53 45  #else.#ifdef USE
159d0 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69  _TCL_STUBS.    i
159e0 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  f (Tcl_InitStubs
159f0 28 69 6e 74 65 72 70 2c 20 22 38 2e 35 22 2c 20  (interp, "8.5", 
15a00 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  0) == NULL) {..r
15a10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15a20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
15a30 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71    if (Tcl_PkgReq
15a40 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63  uire(interp, "Tc
15a50 6c 22 2c 20 22 38 2e 35 2d 22 2c 20 30 29 20 3d  l", "8.5-", 0) =
15a60 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
15a70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15a80 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69   }.#endif..    i
15a90 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29  f (TlsLibInit(0)
15aa0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54   != TCL_OK) {..T
15ab0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15ac0 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e  interp, "could n
15ad0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53  ot initialize SS
15ae0 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68 61  L library", (cha
15af0 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
15b00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15b10 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72     }..    Tcl_Cr
15b20 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
15b30 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70  nterp, "tls::cip
15b40 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62  hers", CiphersOb
15b50 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
15b60 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
15b70 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
15b80 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
15b90 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
15ba0 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63  rp, "tls::connec
15bb0 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f  tion", Connectio
15bc0 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c  nInfoObjCmd, (Cl
15bd0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
15be0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
15bf0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
15c00 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
15c10 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
15c20 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e  :handshake", Han
15c30 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43  dshakeObjCmd, (C
15c40 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
15c50 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
15c60 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
15c70 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
15c80 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
15c90 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72  ::import", Impor
15ca0 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tObjCmd, (Client
15cb0 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
15cc0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
15cd0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
15ce0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
15cf0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69  nterp, "tls::uni
15d00 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74  mport", Unimport
15d10 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
15d20 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
15d30 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
15d40 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
15d50 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
15d60 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74  terp, "tls::stat
15d70 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d  us", StatusObjCm
15d80 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
15d90 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
15da0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15db0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15dc0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15dd0 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c   "tls::version",
15de0 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20   VersionObjCmd, 
15df0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
15e00 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
15e10 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
15e20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
15e30 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
15e40 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f  ls::misc", MiscO
15e50 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
15e60 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
15e70 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
15e80 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
15e90 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
15ea0 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f  erp, "tls::proto
15eb0 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73  cols", Protocols
15ec0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
15ed0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
15ee0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
15ef0 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e  LL);..    if (in
15f00 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61  terp) {..Tcl_Eva
15f10 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c  l(interp, tlsTcl
15f20 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20  InitScript);.   
15f30 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54   }..    return T
15f40 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
15f50 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41  terp, PACKAGE_NA
15f60 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53  ME, PACKAGE_VERS
15f70 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  ION);.}../*. *--
15f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15fb0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f  ----*. *. *.Tls_
15fc0 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20  SafeInit --. *. 
15fd0 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
15fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16000 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20  --*. *.Standard 
16010 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72  procedure requir
16020 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a  ed by 'load'.. *
16030 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69  .Initializes thi
16040 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20  s extension for 
16050 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74  a safe interpret
16060 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  er.. *.---------
16070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16090 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53  -------*. *. *.S
160a0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
160b0 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74  .As of 'Tls_Init
160c0 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a  '. *. *.Result:.
160d0 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54   *..A standard T
160e0 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  cl error code.. 
160f0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
16100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a  ----------*. */.
16130 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c  DLLEXPORT int Tl
16140 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  s_SafeInit(Tcl_I
16150 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
16160 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
16170 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  lled");.    retu
16180 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65  rn(Tls_Init(inte
16190 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  rp));.}../*. *--
161a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161d0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c  ----*. *. *.TlsL
161e0 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09  ibInit --. *. *.
161f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16220 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73  *. *.Initializes
16230 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63   SSL library onc
16240 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f  e per applicatio
16250 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *.-----------
16260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16280 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64  -----*. *. *.Sid
16290 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69  e effects:. *..i
162a0 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c  nitializes SSL l
162b0 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73  ibrary. *. *.Res
162c0 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a  ult:. *..none. *
162d0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
162e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
162f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73  ---------*. */.s
16310 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62  tatic int TlsLib
16320 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69  Init(int uniniti
16330 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61  alize) {.    sta
16340 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69  tic int initiali
16350 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  zed = 0;.    int
16360 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b   status = TCL_OK
16370 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ;.#if defined(OP
16380 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
16390 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
163a0 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f  READS).    size_
163b0 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e  t num_locks;.#en
163c0 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69  dif..    if (uni
163d0 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66  nitialize) {..if
163e0 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20   (!initialized) 
163f0 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
16400 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69  Asked to uniniti
16410 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72  alize, but we ar
16420 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65  e not initialize
16430 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72  d");...    retur
16440 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(TCL_OK);..}...
16450 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74  dprintf("Asked t
16460 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29  o uninitialize")
16470 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
16480 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
16490 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
164a0 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74  HREADS)..Tcl_Mut
164b0 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  exLock(&init_mx)
164c0 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b  ;...if (locks) {
164d0 0a 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73  ..    free(locks
164e0 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20  );..    locks = 
164f0 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73  NULL;..    locks
16500 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65  Count = 0;..}.#e
16510 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65  ndif..initialize
16520 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69  d = 0;..#if defi
16530 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
16540 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
16550 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63  TCL_THREADS)..Tc
16560 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69  l_MutexUnlock(&i
16570 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a  nit_mx);.#endif.
16580 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29  ..return(TCL_OK)
16590 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
165a0 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  (initialized) {.
165b0 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64  .dprintf("Called
165c0 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68  , but using cach
165d0 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74  ed value");..ret
165e0 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20  urn(status);.   
165f0 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   }..    dprintf(
16600 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20  "Called");..#if 
16610 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
16620 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
16630 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
16640 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f  .    Tcl_MutexLo
16650 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65  ck(&init_mx);.#e
16660 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c  ndif.    initial
16670 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64  ized = 1;..#if d
16680 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54  efined(OPENSSL_T
16690 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e  HREADS) && defin
166a0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a  ed(TCL_THREADS).
166b0 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20      num_locks = 
166c0 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e  1;.    locksCoun
166d0 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f  t = (int) num_lo
166e0 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d  cks;.    locks =
166f0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
16700 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63  locks) * num_loc
16710 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ks);.    memset(
16720 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66  locks, 0, sizeof
16730 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c  (*locks) * num_l
16740 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ocks);.#endif.. 
16750 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
16760 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20   BOTH libcrypto 
16770 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20  and libssl. */. 
16780 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f     OPENSSL_init_
16790 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  ssl(OPENSSL_INIT
167a0 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47  _LOAD_SSL_STRING
167b0 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  S | OPENSSL_INIT
167c0 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52  _LOAD_CRYPTO_STR
167d0 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f  INGS..| OPENSSL_
167e0 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50  INIT_ADD_ALL_CIP
167f0 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49  HERS | OPENSSL_I
16800 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45  NIT_ADD_ALL_DIGE
16810 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  STS, NULL);..   
16820 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c   BIO_new_tcl(NUL
16830 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20  L, 0);..#if 0.  
16840 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a    /*.     * XXX:
16850 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69  TODO: Remove thi
16860 73 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61  s code and repla
16870 63 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65  ce it with a che
16880 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e  ck.     * for en
16890 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64  ough entropy and
168a0 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63   do not try to c
168b0 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20  reate our own.  
168c0 20 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e     * terrible en
168d0 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20  tropy.     */.  
168e0 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64    /*.     * Seed
168f0 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62   the random numb
16900 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20  er generator in 
16910 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c  the SSL library,
16920 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68  .     * using th
16930 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74  e do/while const
16940 72 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20  ruct because of 
16950 74 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20  the bug note in 
16960 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53  the.     * OpenS
16970 53 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f  SL FAQ at http:/
16980 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67  /www.openssl.org
16990 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d  /support/faq.htm
169a0 6c 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20  l#USER1.     *. 
169b0 20 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f      * The crux o
169c0 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73  f the problem is
169d0 20 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20   that Solaris 7 
169e0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a  does not have a.
169f0 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64       * /dev/rand
16a00 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64  om or /dev/urand
16a10 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20  om device so it 
16a20 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e  cannot gather en
16a30 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72  ough.     * entr
16a40 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e  opy from the RAN
16a50 44 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c  D_seed() when TL
16a60 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e  S initializes an
16a70 64 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a  d refuses.     *
16a80 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20   to go further. 
16a90 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
16aa0 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72   of OpenSSL carr
16ab0 69 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73  ied on regardles
16ac0 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73  s..     */.    s
16ad0 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69  rand((unsigned i
16ae0 6e 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74  nt) time((time_t
16af0 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20   *) NULL));.    
16b00 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30  do {..for (i = 0
16b10 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b  ; i < 16; i++) {
16b20 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69  ..    rnd_seed[i
16b30 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28  ] = 1 + (char) (
16b40 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28  255.0 * rand()/(
16b50 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a  RAND_MAX+1.0));.
16b60 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e  .}..RAND_seed(rn
16b70 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72  d_seed, sizeof(r
16b80 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d  nd_seed));.    }
16b90 20 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61   while (RAND_sta
16ba0 74 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e  tus() != 1);.#en
16bb0 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
16bc0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
16bd0 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
16be0 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d  _THREADS)..Tcl_M
16bf0 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74  utexUnlock(&init
16c00 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72  _mx);.#endif...r
16c10 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d  eturn(status);.}
16c20 0a                                               .