Hex Artifact Content

Artifact 050ef8b06566d136286e27f29d2a6500726874491b36459127c31118e4147971:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72  dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a   declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b  /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29  #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f  .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74  r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69  _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49  c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65  nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65  Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20  ar *key,...char 
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67  *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73  ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09  r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e  int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f  , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72  len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a  , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b  char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73  ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e  LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66  itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65  L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09   TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c  .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78  S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38  ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23  TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65  _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61  fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67  g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28  ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20  mask))..#define 
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22  SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a  SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74  /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f  a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53  ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65  L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23   "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72  endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64  ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e  L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64  _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65  slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69  ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68  ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e  readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e   requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42  g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74  ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20  o/cryptlib.c of 
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70  OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74  enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f  ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e  ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63  t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b  l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53  .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65  SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45  ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a  ADS */..../*****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
09a0: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20  ./* Callbacks   
09b0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45  --------. *. * E
0a20: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d  val Callback Com
0a30: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76  mand --. *. *.Ev
0a40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
0a50: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e  and and catch an
0a60: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52  y errors. *. * R
0a70: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43  esults:. *.0 = C
0a80: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ommand returned 
0a90: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74  fail or eval ret
0aa0: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a  urned TCL_ERROR.
0ab0: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72   *.1 = Command r
0ac0: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20  eturned success 
0ad0: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
0ae0: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69   TCL_OK. *. * Si
0af0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45  de effects:. *.E
0b00: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63  valuates callbac
0b10: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d  k command. *. *-
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
0b70: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54  t.EvalCallback(T
0b80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b90: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50  p, State *stateP
0ba0: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64  tr, Tcl_Obj *cmd
0bb0: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63  Ptr) {.    int c
0bc0: 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20  ode, ok = 0;..  
0bd0: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
0be0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
0bf0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
0c00: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
0c10: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
0c20: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
0c30: 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73  ack with success
0c40: 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72   for ok or retur
0c50: 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20  n value 1, fail 
0c60: 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74  for error or ret
0c70: 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20  urn value 0 */. 
0c80: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
0c90: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
0ca0: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  code = Tcl_EvalO
0cb0: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64  bjEx(interp, cmd
0cc0: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  Ptr, TCL_EVAL_GL
0cd0: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  OBAL);.    if (c
0ce0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode == TCL_OK) {
0cf0: 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c  ../* Check resul
0d00: 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c  t for return val
0d10: 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a  ue */..Tcl_Obj *
0d20: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  result = Tcl_Get
0d30: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
0d40: 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d  );..if (result =
0d50: 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65  = NULL || Tcl_Ge
0d60: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
0d70: 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29  rp, result, &ok)
0d80: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
0d90: 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20     ok = 1;..}.  
0da0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45    } else {../* E
0db0: 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68  rror - reject th
0dc0: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  e certificate */
0dd0: 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f  .#if (TCL_MAJOR_
0de0: 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26  VERSION == 8) &&
0df0: 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53   (TCL_MINOR_VERS
0e00: 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61  ION < 6)..Tcl_Ba
0e10: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e  ckgroundError(in
0e20: 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63  terp);.#else..Tc
0e30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65  l_BackgroundExce
0e40: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f  ption(interp, co
0e50: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
0e60: 7d 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  }..    Tcl_Relea
0e70: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0e80: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54  statePtr);.    T
0e90: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0ea0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
0eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a  .    return ok;.
0ec0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0f10: 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20   * InfoCallback 
0f20: 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72  --. *. *.Monitor
0f30: 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  s SSL connection
0f40: 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52   process. *. * R
0f50: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
0f60: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0f70: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
0f80: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
0f90: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d). *. *--------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
0fe0: 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f  static void.Info
0ff0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
1000: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65  SL *ssl, int whe
1010: 72 65 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a 20  re, int ret) {. 
1020: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
1030: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
1040: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
1050: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
1060: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1070: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
1080: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
1090: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
10a0: 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72  har *major; char
10b0: 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70   *minor;..    dp
10c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
10d0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
10e0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
10f0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a  (Tcl_Obj*)NULL).
1100: 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66  .return;..    if
1110: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1120: 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54  _HANDSHAKE_START
1130: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
1140: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
1150: 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20   = "start";.    
1160: 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  } else if (where
1170: 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48   & SSL_CB_HANDSH
1180: 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a  AKE_DONE) {..maj
1190: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
11a0: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65  ;..minor = "done
11b0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ";.    } else {.
11c0: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c  .if (where & SSL
11d0: 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f  _CB_ALERT)..majo
11e0: 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c  r = "alert";..el
11f0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
1200: 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d  SL_ST_CONNECT).m
1210: 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22  ajor = "connect"
1220: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1230: 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50  e & SSL_ST_ACCEP
1240: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63  T)..major = "acc
1250: 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09  ept";..else.....
1260: 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e  major = "unknown
1270: 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26  ";...if (where &
1280: 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d   SSL_CB_READ)..m
1290: 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09  inor = "read";..
12a0: 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26  else if (where &
12b0: 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09   SSL_CB_WRITE)..
12c0: 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b  minor = "write";
12d0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
12e0: 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09   & SSL_CB_LOOP).
12f0: 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b  .minor = "loop";
1300: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1310: 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09   & SSL_CB_EXIT).
1320: 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b  .minor = "exit";
1330: 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72  ..else.....minor
1340: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20   = "unknown";.  
1350: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
1360: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
1370: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
1380: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
1390: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
13a0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c  llback);.    Tcl
13b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
13d0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
13e0: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d  ingObj("info", -
13f0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
1400: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1410: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1420: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1430: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
1440: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
1450: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
1460: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1470: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1480: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1490: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14a0: 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20  major, -1));.   
14b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14d0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
14e0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72  wStringObj(minor
14f0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20  , -1));..    if 
1500: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1510: 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69  ALERT) {..Tcl_Li
1520: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1530: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1540: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1550: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65  tringObj(SSL_ale
1560: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c  rt_desc_string_l
1570: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a  ong(ret), -1));.
1580: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
1590: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
15a0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
15b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
15c0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73  SSL_alert_type_s
15d0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c  tring_long(ret),
15e0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73   -1));.    } els
15f0: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  e {..Tcl_ListObj
1600: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1610: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1620: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1630: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74  Obj(SSL_state_st
1640: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20  ring_long(ssl), 
1650: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
1660: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1670: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
1680: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1690: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20  ("info", -1));. 
16a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61     }..    /* Eva
16b0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
16c0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
16d0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
16e0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
16f0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
1700: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
1710: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1720: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
1730: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
1780: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
1790: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f   --. *. *.Monito
17a0: 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20  rs SSL protocol 
17b0: 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52  messages. *. * R
17c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
17d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
17e0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
17f0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
1800: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d). *. *--------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
1850: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f  #ifndef OPENSSL_
1860: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61  NO_SSL_TRACE.sta
1870: 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65  tic void.Message
1880: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69  Callback(int wri
1890: 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f  te_p, int versio
18a0: 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74  n, int content_t
18b0: 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ype, const void 
18c0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e  *buf, size_t len
18d0: 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64  , SSL *ssl, void
18e0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
18f0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
1900: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
1910: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1920: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
1930: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
1940: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
1950: 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65  char *ver, *type
1960: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a  ;.    BIO *bio;.
1970: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
1980: 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66  15000];.    buff
1990: 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20  er[0] = 0;..    
19a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
19b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
19c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
19d0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
19e0: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20  )..return;..    
19f0: 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20  switch(version) 
1a00: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  {.#if OPENSSL_VE
1a10: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
1a20: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
1a30: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
1a40: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
1a50: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
1a60: 20 63 61 73 65 20 53 53 4c 32 5f 56 45 52 53 49   case SSL2_VERSI
1a70: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76  ON:..ver = "SSLv
1a80: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  2";..break;.#end
1a90: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
1aa0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
1ab0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
1ac0: 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53  SSL3).    case S
1ad0: 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  SL3_VERSION:..ve
1ae0: 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72  r = "SSLv3";..br
1af0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
1b00: 63 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f  case TLS1_VERSIO
1b10: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31  N:..ver = "TLSv1
1b20: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1b30: 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49  ase TLS1_1_VERSI
1b40: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76  ON:..ver = "TLSv
1b50: 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  1.1";..break;.  
1b60: 20 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45    case TLS1_2_VE
1b70: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1b80: 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.2";..break;
1b90: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33  .    case TLS1_3
1ba0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1bb0: 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65   "TLSv1.3";..bre
1bc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a  ak;.    case 0:.
1bd0: 20 20 20 20 20 20 20 20 76 65 72 20 3d 20 22 6e          ver = "n
1be0: 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  one";..break;.  
1bf0: 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 72 20    default:..ver 
1c00: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72  = "unknown";..br
1c10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1c20: 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e 74 5f  switch (content_
1c30: 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73 65  type) {.    case
1c40: 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 52 3a   SSL3_RT_HEADER:
1c50: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64 65 72  ..type = "Header
1c60: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
1c70: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1c80: 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54  RT_INNER_CONTENT
1c90: 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22  _TYPE:..type = "
1ca0: 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79  Inner Content Ty
1cb0: 70 65 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65  pe";.        bre
1cc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ak;.    case SSL
1cd0: 33 5f 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48  3_RT_CHANGE_CIPH
1ce0: 45 52 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d  ER_SPEC:..type =
1cf0: 20 22 43 68 61 6e 67 65 20 43 69 70 68 65 72 22   "Change Cipher"
1d00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d20: 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d  T_ALERT:..type =
1d30: 20 22 41 6c 65 72 74 22 3b 0a 20 20 20 20 20 20   "Alert";.      
1d40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d50: 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48  e SSL3_RT_HANDSH
1d60: 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61  AKE:..type = "Ha
1d70: 6e 64 73 68 61 6b 65 22 3b 0a 20 20 20 20 20 20  ndshake";.      
1d80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d90: 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43  e SSL3_RT_APPLIC
1da0: 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70  ATION_DATA:..typ
1db0: 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a  e = "App Data";.
1dc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1dd0: 20 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54     case DTLS1_RT
1de0: 5f 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70  _HEARTBEAT:..typ
1df0: 65 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b  e = "Heartbeat";
1e00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1e10: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79      default:..ty
1e20: 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  pe = "unknown";.
1e30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65      }..    /* Ne
1e40: 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  eds compile time
1e50: 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d   option "enable-
1e60: 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20  ssl-trace". */. 
1e70: 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49     if ((bio = BI
1e80: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
1e90: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ))) != NULL) {..
1ea0: 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63  int n;..SSL_trac
1eb0: 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69  e(write_p, versi
1ec0: 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65  on, content_type
1ed0: 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c  , buf, len, ssl,
1ee0: 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09   (void *)bio);..
1ef0: 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f  n = BIO_read(bio
1f00: 2c 20 62 75 66 66 65 72 2c 20 6d 69 6e 28 42 49  , buffer, min(BI
1f10: 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 2c 20  O_pending(bio), 
1f20: 31 34 39 39 39 29 29 3b 0a 09 6e 20 3d 20 28 6e  14999));..n = (n
1f30: 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75  <0) ? 0 : n;..bu
1f40: 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76  ffer[n] = 0;..(v
1f50: 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69  oid)BIO_flush(bi
1f60: 6f 29 3b 0a 20 09 42 49 4f 5f 66 72 65 65 28 62  o);. .BIO_free(b
1f70: 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 2f  io);.   }..    /
1f80: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
1f90: 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20   to eval */.    
1fa0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
1fb0: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
1fc0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20  tr->callback);. 
1fd0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1fe0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1ff0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2000: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65  NewStringObj("me
2010: 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20  ssage", -1));.  
2020: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2030: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2040: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
2050: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2060: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
2070: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
2080: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
2090: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
20a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
20b0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
20c0: 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 5f 70  tringObj(write_p
20d0: 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 65 63   ? "Sent" : "Rec
20e0: 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20  eived", -1));.  
20f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2100: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2110: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2120: 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 72 2c  ewStringObj(ver,
2130: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2140: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2150: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2160: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2170: 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 29 3b  gObj(type, -1));
2180: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2190: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
21a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
21b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62  l_NewStringObj(b
21c0: 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a 20 20  uffer, -1));..  
21d0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
21e0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
21f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
2200: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
2210: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
2220: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
2230: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
2240: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
2250: 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c  Ptr);.}.#endif..
2260: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
22b0: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d  VerifyCallback -
22c0: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73  -. *. *.Monitors
22d0: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65   SSL certificate
22e0: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63   validation proc
22f0: 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e  ess. Used to con
2300: 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61  trol the. *.beha
2310: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53  vior when the SS
2320: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c  L_VERIFY_PEER fl
2330: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
2340: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65  is called. *.whe
2350: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63  never a certific
2360: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64  ate is inspected
2370: 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61   or decided inva
2380: 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f 72 0a  lid. Called for.
2390: 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 69 63   *.each certific
23a0: 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 74 20  ate in the cert 
23b0: 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65  chain.. *. * Che
23c0: 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 66 69 63  cks:. *.certific
23d0: 61 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65  ate chain is che
23e0: 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69  cked starting wi
23f0: 74 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e  th the deepest n
2400: 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09  esting level. *.
2410: 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63    (the root CA c
2420: 65 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20  ertificate) and 
2430: 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f  worked upward to
2440: 20 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74   the peer's cert
2450: 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20  ificate.. *.All 
2460: 73 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76  signatures are v
2470: 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69  alid, current ti
2480: 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72  me is within fir
2490: 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69  st and last vali
24a0: 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68  dity time.. *.Ch
24b0: 65 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72  eck that the cer
24c0: 74 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75  tificate is issu
24d0: 65 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72  ed by the issuer
24e0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73   certificate iss
24f0: 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68  uer.. *.Check th
2500: 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61  e revocation sta
2510: 74 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72  tus for each cer
2520: 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65  tificate.. *.Che
2530: 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20  ck the validity 
2540: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c  of the given CRL
2550: 20 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65   and the cert re
2560: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e  vocation status.
2570: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f  . *.Check the po
2580: 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68  licies of all th
2590: 65 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20  e certificates. 
25a0: 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65  *. * Args. *.pre
25b0: 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61  verify_ok indica
25c0: 74 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20  tes whether the 
25d0: 63 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69  certificate veri
25e0: 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20  fication passed 
25f0: 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20  (1) or not (0). 
2600: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
2610: 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e  .A callback boun
2620: 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20  d to the socket 
2630: 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f  may return one o
2640: 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20  f:. *.    0...- 
2650: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
2660: 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69  is deemed invali
2670: 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61  d, send verifica
2680: 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69  tion. *....  fai
2690: 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65  lure alert to pe
26a0: 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74  er, and terminat
26b0: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09  e handshake.. *.
26c0: 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65      1...- the ce
26d0: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65  rtificate is dee
26e0: 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69  med valid, conti
26f0: 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61  nue with handsha
2700: 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79  ke.. *.    empty
2710: 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61   string.- no cha
2720: 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61  nge to certifica
2730: 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a  te validation. *
2740: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
2750: 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65  :. *.The err fie
2760: 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ld of the curren
2770: 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74  tly operative St
2780: 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20  ate is set. *.  
2790: 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63  to a string desc
27a0: 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e  ribing the SSL n
27b0: 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75  egotiation failu
27c0: 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d  re reason. *. *-
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2810: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
2820: 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  t.VerifyCallback
2830: 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54  (int ok, X509_ST
2840: 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a  ORE_CTX *ctx) {.
2850: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
2860: 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a  Ptr;.    SSL   *
2870: 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30  ssl..= (SSL*)X50
2880: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f  9_STORE_CTX_get_
2890: 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c  ex_data(ctx, SSL
28a0: 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30  _get_ex_data_X50
28b0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28  9_STORE_CTX_idx(
28c0: 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63  ));.    X509  *c
28d0: 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52  ert..= X509_STOR
28e0: 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e  E_CTX_get_curren
28f0: 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20  t_cert(ctx);.   
2900: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
2910: 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67  .= (State*)SSL_g
2920: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29  et_app_data(ssl)
2930: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
2940: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
2950: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
2960: 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35   int depth..= X5
2970: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
2980: 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78  _error_depth(ctx
2990: 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09  );.    int err..
29a0: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58  = X509_STORE_CTX
29b0: 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b  _get_error(ctx);
29c0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56  ..    dprintf("V
29d0: 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 3b  erify: %d", ok);
29e0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
29f0: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
2a00: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69  _Obj*)NULL) {..i
2a10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c  f (statePtr->vfl
2a20: 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59  ags & SSL_VERIFY
2a30: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
2a40: 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65  _CERT) {..    re
2a50: 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65  turn ok;..} else
2a60: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31   {..    return 1
2a70: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
2a80: 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c  if (cert == NULL
2a90: 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29   || ssl == NULL)
2aa0: 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20   {..return 0;.  
2ab0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
2ac0: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
2ad0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
2ae0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
2af0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
2b00: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
2b10: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2b20: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2b30: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2b40: 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29  bj("verify", -1)
2b50: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2b60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2b70: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
2b80: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  .Tcl_NewStringOb
2b90: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
2ba0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
2bb0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
2bc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2bd0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2be0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2bf0: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a  IntObj(depth));.
2c00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2c10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2c20: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73  erp, cmdPtr, Tls
2c30: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
2c40: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20  rp, cert));.    
2c50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2c70: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2c80: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20  IntObj(ok));.   
2c90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2ca0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2cb0: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
2cc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
2cd0: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63  r*)X509_verify_c
2ce0: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
2cf0: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  (err), -1));..  
2d00: 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f    /* Prevent I/O
2d10: 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20   while callback 
2d20: 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a  is in progress *
2d30: 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74  /.    /* statePt
2d40: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
2d50: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f  TCL_CALLBACK; */
2d60: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
2d70: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
2d80: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
2d90: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2da0: 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c      ok = EvalCal
2db0: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
2dc0: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
2dd0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
2de0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
2df0: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d      /* statePtr-
2e00: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f  >flags &= ~(TLS_
2e10: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a  TCL_CALLBACK); *
2e20: 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29  /.    return(ok)
2e30: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c  ;./* By default,
2e40: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74   leave verificat
2e50: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a  ion unchanged. *
2e60: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  /.}.../*. *-----
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2eb0: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d  *. * Tls_Error -
2ec0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  -. *. *.Calls ca
2ed0: 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74  llback with list
2ee0: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20   of errors.. *. 
2ef0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2f00: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64   *.The err field
2f10: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c   of the currentl
2f20: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74  y operative Stat
2f30: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f  e is set. *.  to
2f40: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69   a string descri
2f50: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67  bing the SSL neg
2f60: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  otiation failure
2f70: 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d   reason. *. *---
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72  . */.void.Tls_Er
2fd0: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65  ror(State *state
2fe0: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20  Ptr, char *msg) 
2ff0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
3000: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
3010: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
3020: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
3030: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20  , *listPtr;.    
3040: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72  unsigned long er
3050: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  r;.    statePtr-
3060: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20  >err = msg;..   
3070: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3080: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
3090: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
30a0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
30b0: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20  L)..return;..   
30c0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
30d0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
30e0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
30f0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
3100: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
3110: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3120: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3130: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3140: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
3150: 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20  error", -1));.  
3160: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3170: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3180: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
3190: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
31a0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
31b0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
31c0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69  lf), -1));.    i
31d0: 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20  f (msg != NULL) 
31e0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
31f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3200: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3210: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67  NewStringObj(msg
3220: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65  , -1));..    } e
3230: 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54  lse if ((msg = T
3240: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3250: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
3260: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55  sult(interp), NU
3270: 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  LL)) != NULL) {.
3280: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
3290: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
32a0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
32b0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20  wStringObj(msg, 
32c0: 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73  -1));..    } els
32d0: 65 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54  e {..listPtr = T
32e0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
32f0: 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28   NULL);..while (
3300: 28 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65  (err = ERR_get_e
3310: 72 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a  rror()) != 0) {.
3320: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3330: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3340: 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54  terp, listPtr, T
3350: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3360: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72  ERR_reason_error
3370: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31  _string(err), -1
3380: 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74  ));..}..Tcl_List
3390: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
33a0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
33b0: 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d   listPtr);.    }
33c0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
33d0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
33e0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
33f0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
3400: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
3410: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
3420: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
3430: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3440: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a  (cmdPtr);.}.../*
3450: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3490: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79  ------. *. * Key
34a0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  LogCallback --. 
34b0: 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69  *. *.Write recei
34c0: 76 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20  ved key data to 
34d0: 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20  log file.. *. * 
34e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
34f0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3540: 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61  */.void KeyLogCa
3550: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
3560: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61   *ssl, const cha
3570: 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63  r *line) {.    c
3580: 68 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e  har *str = geten
3590: 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29  v(SSLKEYLOGFILE)
35a0: 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a  ;.    FILE *fd;.
35b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
35c0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
35d0: 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f  (str) {..fd = fo
35e0: 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09  pen(str, "a");..
35f0: 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c  fprintf(fd, "%s\
3600: 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73  n",line);..fclos
3610: 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c  e(fd);.    }.}..
3620: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
3670: 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63  Password Callbac
3680: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  k --. *. *.Calle
3690: 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72  d when a passwor
36a0: 64 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20  d for a private 
36b0: 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72  key loading/stor
36c0: 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72  ing a PEM. *.cer
36d0: 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e  tificate with en
36e0: 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20  cryption. Evals 
36f0: 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20  callback script 
3700: 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74  and returns. *.t
3710: 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65  he result as the
3720: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
3730: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52   in buf.. *. * R
3740: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
3750: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3760: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
3770: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
3780: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  d). *. * Returns
3790: 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69  :. *.Password si
37a0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d  ze in bytes or -
37b0: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  1 for an error..
37c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
3810: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64  tic int.Password
3820: 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62  Callback(char *b
3830: 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e  uf, int size, in
3840: 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a  t rwflag, void *
3850: 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61  udata) {.    Sta
3860: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
3870: 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a  State *) udata;.
3880: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
3890: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
38a0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
38b0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
38c0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20      int code;.. 
38d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
38e0: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ed");..    /* If
38f0: 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73   no callback, us
3900: 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61  e default callba
3910: 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  ck */.    if (st
3920: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
3930: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20   == NULL) {..if 
3940: 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65  (Tcl_EvalEx(inte
3950: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f  rp, "tls::passwo
3960: 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41  rd", -1, TCL_EVA
3970: 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c  L_GLOBAL) == TCL
3980: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72  _OK) {..    char
3990: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29   *ret = (char *)
39a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
39b0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20  sult(interp);.. 
39c0: 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20     strncpy(buf, 
39d0: 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69  ret, (size_t) si
39e0: 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  ze);..    return
39f0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74   (int)strlen(ret
3a00: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
3a10: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a    return -1;..}.
3a20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
3a30: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
3a40: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
3a50: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
3a60: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
3a70: 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54  password);.    T
3a80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3a90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3aa0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3ab0: 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f  tringObj("passwo
3ac0: 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  rd", -1));.    T
3ad0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3ae0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3af0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
3b00: 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a  ntObj(rwflag));.
3b10: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3b20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3b30: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3b40: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29  _NewIntObj(size)
3b50: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
3b60: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
3b70: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  ) interp);.    T
3b80: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
3b90: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
3ba0: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  r);..    /* Eval
3bb0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
3bc0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
3bd0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
3be0: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63  );.    code = Tc
3bf0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
3c00: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f  rp, cmdPtr, TCL_
3c10: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
3c20: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43    if (code != TC
3c30: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c  L_OK) {.#if (TCL
3c40: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d  _MAJOR_VERSION =
3c50: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e  = 8) && (TCL_MIN
3c60: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a  OR_VERSION < 6).
3c70: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
3c80: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65  rror(interp);.#e
3c90: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f  lse..Tcl_Backgro
3ca0: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74  undException(int
3cb0: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64  erp, code);.#end
3cc0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  if.    }.    Tcl
3cd0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
3ce0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  dPtr);..    Tcl_
3cf0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
3d00: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
3d10: 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65  .    /* If succe
3d20: 73 73 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b  ssful, pass back
3d30: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
3d40: 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66   and truncate if
3d50: 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20   too long */.   
3d60: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c   if (code == TCL
3d70: 5f 4f 4b 29 20 7b 0a 09 69 6e 74 20 6c 65 6e 3b  _OK) {..int len;
3d80: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63  ..char *ret = (c
3d90: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74  har *) Tcl_GetSt
3da0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
3db0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
3dc0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  erp), &len);..if
3dd0: 20 28 6c 65 6e 20 3e 20 73 69 7a 65 2d 31 29 20   (len > size-1) 
3de0: 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 73 69 7a  {..    len = siz
3df0: 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79  e-1;..}..strncpy
3e00: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
3e10: 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c  _t) len);..buf[l
3e20: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c  en] = '\0';..Tcl
3e30: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
3e40: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09  Data) interp);..
3e50: 72 65 74 75 72 6e 28 6c 65 6e 29 3b 0a 20 20 20  return(len);.   
3e60: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61   }.    Tcl_Relea
3e70: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
3e80: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
3e90: 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  urn -1;.}.../*. 
3ea0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ee0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69  ----. *. * Sessi
3ef0: 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  on Callback for 
3f00: 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a  Clients --. *. *
3f10: 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e  .Called when a n
3f20: 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64  ew session is ad
3f30: 64 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65  ded to the cache
3f40: 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09  . In TLS 1.3. *.
3f50: 74 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65  this may be rece
3f60: 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  ived multiple ti
3f70: 6d 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61  mes after the ha
3f80: 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09  ndshake. For. *.
3f90: 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  earlier versions
3fa0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72  , this will be r
3fb0: 65 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74  eceived during t
3fc0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a  he handshake.. *
3fd0: 09 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65  .This is the pre
3fe0: 66 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62  ferred way to ob
3ff0: 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65  tain a resumable
4000: 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20   session.. *. * 
4010: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
4020: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
4030: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
4040: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
4050: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
4060: 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65   codes:. *.0 = e
4070: 72 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69  rror where sessi
4080: 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64  on will be immed
4090: 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66  iately removed f
40a0: 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  rom the internal
40b0: 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73   cache.. *.1 = s
40c0: 75 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70  uccess where app
40d0: 20 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e   retains session
40e0: 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68   in session cach
40f0: 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c  e, and must call
4100: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65   SSL_SESSION_fre
4110: 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20  e() when done.. 
4120: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
4170: 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61  ic int.SessionCa
4180: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
4190: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49   *ssl, SSL_SESSI
41a0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20  ON *session) {. 
41b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
41c0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
41d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
41e0: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
41f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4200: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
4210: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
4220: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
4230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4240: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20  ar *ticket;.    
4250: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4260: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b  har *session_id;
4270: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32  .    size_t len2
4280: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
4290: 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70  nt ulen;..    dp
42a0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
42b0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
42c0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
42d0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
42e0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
42f0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
4300: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20   } else if (ssl 
4310: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
4320: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
4330: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
4340: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
4350: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f  mmand to eval */
4360: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
4370: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
4380: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
4390: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  k);.    Tcl_List
43a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
43b0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
43c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
43d0: 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29  j("session", -1)
43e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
43f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4400: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
4410: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
4420: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
4430: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
4440: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
4450: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
4460: 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  id */.    sessio
4470: 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  n_id = SSL_SESSI
4480: 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f  ON_get_id(sessio
4490: 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54  n, &ulen);.    T
44a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
44b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
44c0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
44d0: 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73  yteArrayObj(sess
44e0: 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c  ion_id, (int) ul
44f0: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  en));..    /* Se
4500: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a  ssion ticket */.
4510: 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f      SSL_SESSION_
4520: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
4530: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
4540: 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  en2);.    Tcl_Li
4550: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4560: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4570: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
4580: 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28  rayObj(ticket, (
4590: 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20  int) len2));..  
45a0: 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20    /* Lifetime - 
45b0: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
45c0: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73  s */.    Tcl_Lis
45d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
45e0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
45f0: 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62  ,..Tcl_NewLongOb
4600: 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53  j((long) SSL_SES
4610: 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f  SION_get_ticket_
4620: 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65  lifetime_hint(se
4630: 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f  ssion)));..    /
4640: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
4650: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
4660: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4670: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
4680: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
4690: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
46a0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
46b0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
46c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
46d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4720: 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63  . * ALPN Callbac
4730: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e  k for Servers an
4740: 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66  d NPN Callback f
4750: 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a  or Clients --. *
4760: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74  . *.Perform prot
4770: 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20  ocol (http/1.1, 
4780: 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65  h2, h3, etc.) se
4790: 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a  lection for the.
47a0: 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e   *.incoming conn
47b0: 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61  ection. Called a
47c0: 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73  fter Hello and s
47d0: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e  erver callbacks.
47e0: 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20  . *.Where 'out' 
47f0: 69 73 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  is selected prot
4800: 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73  ocol and 'in' is
4810: 20 74 68 65 20 70 65 65 72 20 61 64 76 65 72 74   the peer advert
4820: 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  ised list.. *. *
4830: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
4840: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
4850: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
4860: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
4870: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ned). *. * Retur
4880: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f  n codes:. *.SSL_
4890: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41  TLSEXT_ERR_OK: A
48a0: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  LPN protocol sel
48b0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
48c0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
48d0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
48e0: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20  RR_ALERT_FATAL: 
48f0: 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65  There was no ove
4900: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 68 65  rlap between the
4910: 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20   client's. *.   
4920: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61   supplied list a
4930: 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 63 6f  nd the server co
4940: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65  nfiguration. The
4950: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
4960: 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09   be aborted.. *.
4970: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
4980: 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f  OACK: ALPN proto
4990: 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64  col not selected
49a0: 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20  , e.g., because 
49b0: 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70  no ALPN. *.    p
49c0: 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e  rotocols are con
49d0: 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73  figured for this
49e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65   connection. The
49f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
4a00: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  inues.. *. *----
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4a50: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41   */.static int.A
4a60: 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  LPNCallback(cons
4a70: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73  t SSL *ssl, cons
4a80: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4a90: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20  **out, unsigned 
4aa0: 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63  char *outlen,..c
4ab0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4ac0: 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64  ar *in, unsigned
4ad0: 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64   int inlen, void
4ae0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
4af0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
4b00: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
4b10: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4b20: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
4b30: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
4b40: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
4b50: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a  int code, res;..
4b60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
4b70: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
4b80: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  ssl == NULL || a
4b90: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  rg == NULL) {..r
4ba0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
4bb0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
4bc0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  }..    /* Select
4bd0: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20   protocol */.   
4be0: 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f   if (SSL_select_
4bf0: 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20  next_proto(out, 
4c00: 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72  outlen, statePtr
4c10: 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50  ->protos, stateP
4c20: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a  tr->protos_len,.
4c30: 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f  .in, inlen) == O
4c40: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54  PENSSL_NPN_NEGOT
4c50: 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74  IATED) {../* Mat
4c60: 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73  ch found */..res
4c70: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
4c80: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
4c90: 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e   {../* OPENSSL_N
4ca0: 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20  PN_NO_OVERLAP = 
4cb0: 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75  No overlap, so u
4cc0: 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 66 72  se first item fr
4cd0: 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63  om client protoc
4ce0: 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20  ol list */..res 
4cf0: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4d00: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
4d10: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
4d20: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62  >vcmd == (Tcl_Ob
4d30: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
4d40: 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20  rn res;.    }.. 
4d50: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4d60: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
4d70: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
4d80: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
4d90: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
4da0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4db0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4dc0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
4dd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c  NewStringObj("al
4de0: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  pn", -1));.    T
4df0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4e00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4e10: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
4e20: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
4e30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
4e40: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
4e50: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
4e60: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4e70: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4e80: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
4e90: 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29  ngObj(*out, -1))
4ea0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
4eb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4ec0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
4ed0: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
4ee0: 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45  (res == SSL_TLSE
4ef0: 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20  XT_ERR_OK));..  
4f00: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
4f10: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
4f20: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
4f30: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
4f40: 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c  if ((code = Eval
4f50: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
4f60: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
4f70: 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20  r)) > 1) {..res 
4f80: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4f90: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c  _NOACK;.    } el
4fa0: 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31  se if (code == 1
4fb0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
4fc0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
4fd0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
4fe0: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4ff0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20  _ALERT_FATAL;.  
5000: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
5010: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
5020: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
5030: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5080: 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50  *. * Advertise P
5090: 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63  rotocols Callbac
50a0: 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f  k for Next Proto
50b0: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20  col Negotiation 
50c0: 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48  (NPN) in ServerH
50d0: 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61  ello --. *. *.ca
50e0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20  lled when a TLS 
50f0: 73 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c  server needs a l
5100: 69 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64  ist of supported
5110: 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e   protocols for N
5120: 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20  ext. *.Protocol 
5130: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a  Negotiation.. *.
5140: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
5150: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
5160: 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65  ffects:. *. * Re
5170: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
5180: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5190: 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73  : NPN protocol s
51a0: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e  elected. The con
51b0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
51c0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
51d0: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20  _ERR_NOACK: NPN 
51e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c  protocol not sel
51f0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
5200: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
5210: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69  ---------. */.#i
5260: 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61  fdef USE_NPN.sta
5270: 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62  tic int.NPNCallb
5280: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
5290: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  sl, const unsign
52a0: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75  ed char **out, u
52b0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74  nsigned int *out
52c0: 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  len, void *arg) 
52d0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
52e0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
52f0: 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  arg;..    dprint
5300: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
5310: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
5320: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c  L || arg == NULL
5330: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
5340: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
5350: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5360: 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69  Set protocols li
5370: 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  st */.    if (st
5380: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21  atePtr->protos !
5390: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20  = NULL) {..*out 
53a0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  = statePtr->prot
53b0: 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73  os;..*outlen = s
53c0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f  tatePtr->protos_
53d0: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  len;.    } else 
53e0: 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a  {..*out = NULL;.
53f0: 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72  .*outlen = 0;..r
5400: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5410: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
5420: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c  }.    return SSL
5430: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
5440: 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a  }.#endif.../*. *
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5490: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61  ---. *. * SNI Ca
54a0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65  llback for Serve
54b0: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66  rs --. *. *.Perf
54c0: 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20  orm server-side 
54d0: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c  SNI hostname sel
54e0: 65 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63  ection after rec
54f0: 65 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e  eiving SNI exten
5500: 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e  sion. *.in Clien
5510: 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20  t Hello. Called 
5520: 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c  after hello call
5530: 62 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20  back but before 
5540: 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  ALPN callback.. 
5550: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
5560: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
5570: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
5580: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
5590: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
55a0: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
55b0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
55c0: 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  K: SNI hostname 
55d0: 69 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65  is accepted. The
55e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
55f0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
5600: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
5610: 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61  ATAL: SNI hostna
5620: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74  me is not accept
5630: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
5640: 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f  on. *.    is abo
5650: 72 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f  rted. Default fo
5660: 72 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41  r alert is SSL_A
5670: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e  D_UNRECOGNIZED_N
5680: 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  AME.. *.SSL_TLSE
5690: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52  XT_ERR_ALERT_WAR
56a0: 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61  NING: SNI hostna
56b0: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74  me is not accept
56c0: 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72  ed, warning aler
56d0: 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e  t. *.    sent (n
56e0: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20  ot supported in 
56f0: 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f  TLSv1.3). The co
5700: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
5710: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es.. *.SSL_TLSEX
5720: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49  T_ERR_NOACK: SNI
5730: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74   hostname is not
5740: 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f   accepted and no
5750: 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a  t acknowledged,.
5760: 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53   *.    e.g. if S
5770: 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  NI has not been 
5780: 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20  configured. The 
5790: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
57a0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nues.. *. *-----
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
57f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e  */.static int.SN
5800: 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  ICallback(const 
5810: 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61  SSL *ssl, int *a
5820: 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29  lert, void *arg)
5830: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
5840: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
5850: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  )arg;.    Tcl_In
5860: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
5870: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
5880: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
5890: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
58a0: 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 68 61  de, res;.    cha
58b0: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20  r *servername = 
58c0: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e  NULL;..    dprin
58d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
58e0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
58f0: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c  LL || arg == NUL
5900: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
5910: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5920: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
5930: 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   Only works for 
5940: 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c  TLS 1.2 and earl
5950: 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65  ier */.    serve
5960: 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f  rname = SSL_get_
5970: 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20  servername(ssl, 
5980: 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f  TLSEXT_NAMETYPE_
5990: 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20  host_name);.    
59a0: 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20  if (!servername 
59b0: 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d  || servername[0]
59c0: 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74   == '\0') {..ret
59d0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
59e0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
59f0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
5a00: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f  r->vcmd == (Tcl_
5a10: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  Obj*)NULL) {..re
5a20: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5a30: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ERR_OK;.    }.. 
5a40: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
5a50: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
5a60: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
5a70: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
5a80: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
5a90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5aa0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5ab0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5ac0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e  NewStringObj("sn
5ad0: 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  i", -1));.    Tc
5ae0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5af0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5b00: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
5b10: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
5b20: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
5b30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
5b40: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5b50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5b60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5b70: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5b80: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20  gObj(servername 
5b90: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
5ba0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
5bb0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
5bc0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
5bd0: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28  dPtr);.    if ((
5be0: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62  code = EvalCallb
5bf0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
5c00: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e  ePtr, cmdPtr)) >
5c10: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
5c20: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
5c30: 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65  T_WARNING;..*ale
5c40: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45  rt = SSL_AD_UNRE
5c50: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f  COGNIZED_NAME; /
5c60: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  * Not supported 
5c70: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20  by TLS 1.3 */.  
5c80: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64    } else if (cod
5c90: 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d  e == 1) {..res =
5ca0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5cb0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  OK;.    } else {
5cc0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
5cd0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
5ce0: 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  AL;..*alert = SS
5cf0: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45  L_AD_UNRECOGNIZE
5d00: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73  D_NAME; /* Not s
5d10: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20  upported by TLS 
5d20: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  1.3 */.    }.   
5d30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5d40: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72  t(cmdPtr);.    r
5d50: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f  eturn res;.}.../
5d60: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c  -------. *. * Cl
5db0: 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68  ientHello Handsh
5dc0: 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ake Callback for
5dd0: 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20   Servers --. *. 
5de0: 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72  *.Used by server
5df0: 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20   to examine the 
5e00: 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69  server name indi
5e10: 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74  cation (SNI) ext
5e20: 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64  ension. *.provid
5e30: 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74  ed by the client
5e40: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c   in order to sel
5e50: 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ect an appropria
5e60: 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74  te certificate t
5e70: 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e  o. *.present, an
5e80: 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e  d make other con
5e90: 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73  figuration adjus
5ea0: 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20  tments relevant 
5eb0: 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20  to that server. 
5ec0: 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63  *.name and its c
5ed0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68  onfiguration. Th
5ee0: 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70  is includes swap
5ef0: 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73  ping out the ass
5f00: 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43  ociated. *.SSL_C
5f10: 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69  TX pointer, modi
5f20: 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72  fying the server
5f30: 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69  's list of permi
5f40: 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e  tted TLS version
5f50: 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74  s,. *.changing t
5f60: 68 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68  he server's ciph
5f70: 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f  er list in respo
5f80: 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  nse to the clien
5f90: 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c  t's cipher list,
5fa0: 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20   etc.. *.Called 
5fb0: 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41  before SNI and A
5fc0: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  LPN callbacks.. 
5fd0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
5fe0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
5ff0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
6000: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
6010: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
6020: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
6030: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6040: 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20  _RETRY: suspend 
6050: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61  the handshake, a
6060: 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  nd the handshake
6070: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
6080: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
6090: 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f  y. *.SSL_CLIENT_
60a0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69  HELLO_ERROR: fai
60b0: 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20  lure, terminate 
60c0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20  connection. Set 
60d0: 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63  alert to error c
60e0: 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45  ode.. *.SSL_CLIE
60f0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53  NT_HELLO_SUCCESS
6100: 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d  : success. *. *-
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6150: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
6160: 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28  t.HelloCallback(
6170: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20  const SSL *ssl, 
6180: 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64  int *alert, void
6190: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
61a0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
61b0: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
61c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
61d0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
61e0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
61f0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
6200: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20  int code, res;. 
6210: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73     const char *s
6220: 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63  ervername;.    c
6230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
6240: 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f  ar *p;.    size_
6250: 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67  t len, remaining
6260: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
6270: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
6280: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
6290: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
62a0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
62b0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
62c0: 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65  SUCCESS;.    } e
62d0: 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 28  lse if (ssl == (
62e0: 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c  const SSL *)NULL
62f0: 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69 64   || arg == (void
6300: 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75   *)NULL) {..retu
6310: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
6320: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6330: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d  ..    /* Get nam
6340: 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53  es */.    if (!S
6350: 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f  SL_client_hello_
6360: 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c  get0_ext(ssl, TL
6370: 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72  SEXT_TYPE_server
6380: 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61  _name, &p, &rema
6390: 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e  ining) || remain
63a0: 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c  ing <= 2) {..*al
63b0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56  ert = SSL_R_SSLV
63c0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f  3_ALERT_ILLEGAL_
63d0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75  PARAMETER;..retu
63e0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
63f0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6400: 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
6410: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
6420: 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74  he supplied list
6430: 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20   of names. */.  
6440: 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20    len = (*(p++) 
6450: 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b  << 8);.    len +
6460: 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66  = *(p++);.    if
6470: 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d   (len + 2 != rem
6480: 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72  aining) {..*aler
6490: 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f  t = SSL_R_SSLV3_
64a0: 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41  ALERT_ILLEGAL_PA
64b0: 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e  RAMETER;..return
64c0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
64d0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  O_ERROR;.    }. 
64e0: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c     remaining = l
64f0: 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  en;..    /* The 
6500: 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 65  list in practice
6510: 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67   only has a sing
6520: 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77  le element, so w
6530: 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20  e only consider 
6540: 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a  the first one. *
6550: 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e  /.    if (remain
6560: 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b  ing == 0 || *p++
6570: 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54   != TLSEXT_NAMET
6580: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b  YPE_host_name) {
6590: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
65a0: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54  _TLSV1_ALERT_INT
65b0: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65  ERNAL_ERROR;..re
65c0: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
65d0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
65e0: 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67   }.    remaining
65f0: 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  --;..    /* Now 
6600: 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70  we can finally p
6610: 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65  ull out the byte
6620: 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20   array with the 
6630: 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e  actual hostname.
6640: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61   */.    if (rema
6650: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a  ining <= 2) {..*
6660: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6670: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e  SV1_ALERT_INTERN
6680: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72  AL_ERROR;..retur
6690: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
66a0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
66b0: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b      len = (*(p++
66c0: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e  ) << 8);.    len
66d0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20   += *(p++);.    
66e0: 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65  if (len + 2 > re
66f0: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65  maining) {..*ale
6700: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6710: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f  _ALERT_INTERNAL_
6720: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53  ERROR;..return S
6730: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6740: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6750: 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e   remaining = len
6760: 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65  ;.    servername
6770: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
6780: 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  )p;..    /* Crea
6790: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
67a0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
67b0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
67c0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
67d0: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
67e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
67f0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
6800: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6810: 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29  bj("hello", -1))
6820: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
6830: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
6840: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
6850: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
6860: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
6870: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
6880: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
6890: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
68a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
68b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
68c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72  NewStringObj(ser
68d0: 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 29 20 6c  vername, (int) l
68e0: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  en));..    /* Ev
68f0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
6900: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
6910: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
6920: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
6930: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
6940: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
6950: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
6960: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  ) {..res = SSL_C
6970: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52  LIENT_HELLO_RETR
6980: 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  Y;..*alert = SSL
6990: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55  _R_TLSV1_ALERT_U
69a0: 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20  SER_CANCELLED;. 
69b0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f     } else if (co
69c0: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20  de == 1) {..res 
69d0: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
69e0: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20  LO_SUCCESS;.    
69f0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
6a00: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6a10: 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20  _ERROR;..*alert 
6a20: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6a30: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6a40: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  OR;.    }.    Tc
6a50: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
6a60: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
6a70: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  rn res;.}.../***
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a90: 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20  */./* Commands  
6aa0: 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
6ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
6ac0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
6b10: 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d   CiphersObjCmd -
6b20: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  - list available
6b30: 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54   ciphers. *. *.T
6b40: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
6b50: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
6b60: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69  ess the "tls::ci
6b70: 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20  phers" command. 
6b80: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61  *.to list availa
6b90: 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73  ble ciphers, bas
6ba0: 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c  ed upon protocol
6bb0: 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a   selected.. *. *
6bc0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
6bd0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
6be0: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53  lt list.. *. * S
6bf0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
6c00: 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64  constructs and d
6c10: 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74  estroys SSL cont
6c20: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d  ext (CTX). *. *-
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c70: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  --. */.static co
6c80: 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63  nst char *protoc
6c90: 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32  ols[] = {.."ssl2
6ca0: 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31  ", "ssl3", "tls1
6cb0: 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c  ", "tls1.1", "tl
6cc0: 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c  s1.2", "tls1.3",
6cd0: 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72   NULL.};.enum pr
6ce0: 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53  otocol {.    TLS
6cf0: 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c  _SSL2, TLS_SSL3,
6d00: 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54   TLS_TLS1, TLS_T
6d10: 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f  LS1_1, TLS_TLS1_
6d20: 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54  2, TLS_TLS1_3, T
6d30: 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74  LS_NONE.};..stat
6d40: 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62  ic int.CiphersOb
6d50: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
6d60: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
6d70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
6d80: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
6d90: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
6da0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
6db0: 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  objPtr = NULL;. 
6dc0: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20     SSL_CTX *ctx 
6dd0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20  = NULL;.    SSL 
6de0: 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *ssl = NULL;.   
6df0: 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49   STACK_OF(SSL_CI
6e00: 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63  PHER) *sk;.    c
6e10: 68 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46  har *cp, buf[BUF
6e20: 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e  SIZ];.    int in
6e30: 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30  dex, verbose = 0
6e40: 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20  , use_supported 
6e50: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  = 0;.    const S
6e60: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f  SL_METHOD *metho
6e70: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
6e80: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
6e90: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c  if ((objc < 2) |
6ea0: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a  | (objc > 4)) {.
6eb0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
6ec0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
6ed0: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65  v, "protocol ?ve
6ee0: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65  rbose? ?supporte
6ef0: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  d?");..return TC
6f00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
6f10: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
6f20: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
6f30: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74  p, objv[1], prot
6f40: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c  ocols, "protocol
6f50: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d  ", 0, &index) !=
6f60: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
6f70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6f80: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a    }.    if ((obj
6f90: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65  c > 2) && Tcl_Ge
6fa0: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
6fb0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
6fc0: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43   &verbose) != TC
6fd0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
6fe0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6ff0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
7000: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   3) && Tcl_GetBo
7010: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
7020: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75  erp, objv[3], &u
7030: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d  se_supported) !=
7040: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
7050: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7060: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
7070: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
7080: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70   switch ((enum p
7090: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b  rotocol)index) {
70a0: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a  ..case TLS_SSL2:
70b0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
70c0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30  SION_NUMBER >= 0
70d0: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65  x10100000L || de
70e0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c  fined(NO_SSL2) |
70f0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7100: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20  L_NO_SSL2)..    
7110: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7120: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7130: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
7140: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
7150: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
7160: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7170: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7180: 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d  method = SSLv2_m
7190: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
71a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
71b0: 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e  _SSL3:.#if defin
71c0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  ed(NO_SSL3) || d
71d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
71e0: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
71f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
7200: 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  L3_METHOD)..    
7210: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7220: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7230: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
7240: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
7250: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
7260: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7270: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7280: 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d  method = SSLv3_m
7290: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
72a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
72b0: 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e  _TLS1:.#if defin
72c0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
72d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
72e0: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
72f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7300: 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  S1_METHOD)..    
7310: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7320: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7330: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
7340: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
7350: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
7360: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7370: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7380: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d  method = TLSv1_m
7390: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
73a0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
73b0: 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66  _TLS1_1:.#if def
73c0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
73d0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
73e0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  SL_NO_TLS1_1) ||
73f0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7400: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f  _NO_TLS1_1_METHO
7410: 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  D)..    Tcl_Appe
7420: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7430: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
7440: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
7450: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
7460: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
7470: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
7480: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d  se..    method =
7490: 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28   TLSv1_1_method(
74a0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
74b0: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f  ..case TLS_TLS1_
74c0: 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  2:.#if defined(N
74d0: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
74e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
74f0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e  TLS1_2) || defin
7500: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7510: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20  S1_2_METHOD)..  
7520: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
7530: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
7540: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
7550: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
7560: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
7570: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7580: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
7590: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31    method = TLSv1
75a0: 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  _2_method(); bre
75b0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
75c0: 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66   TLS_TLS1_3:.#if
75d0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
75e0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
75f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
7600: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
7610: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7620: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
7630: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
7640: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
7650: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
7660: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
7670: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20  e..    method = 
7680: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20  TLS_method();.. 
7690: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
76a0: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
76b0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
76c0: 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f  SION);..    SSL_
76d0: 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74  CTX_set_max_prot
76e0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
76f0: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
7700: 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64  .    break;.#end
7710: 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20  if..default:..  
7720: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d    method = TLS_m
7730: 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62 72  ethod();..    br
7740: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
7750: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
7760: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69  w(method);.    i
7770: 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20  f (ctx == NULL) 
7780: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
7790: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53  ult(interp, REAS
77a0: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ON(), NULL);..re
77b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
77c0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d      }..    ssl =
77d0: 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20   SSL_new(ctx);. 
77e0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
77f0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
7800: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7810: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
7820: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
7830: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tx);..return TCL
7840: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
7850: 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61     /* Use list a
7860: 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c  nd order as woul
7870: 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43  d be sent in a C
7880: 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c  lientHello or al
7890: 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68  l available ciph
78a0: 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75  ers */.    if (u
78b0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a  se_supported) {.
78c0: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73  .sk = SSL_get1_s
78d0: 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73  upported_ciphers
78e0: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  (ssl);.    } els
78f0: 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65  e {..sk = SSL_ge
7900: 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a  t_ciphers(ssl);.
7910: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
7920: 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66  k != NULL) {..if
7930: 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20   (!verbose) {.. 
7940: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
7950: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
7960: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69  LL);..    for (i
7970: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
7980: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28  _SSL_CIPHER_num(
7990: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f  sk); i++) {...co
79a0: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a  nst SSL_CIPHER *
79b0: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  c = sk_SSL_CIPHE
79c0: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a  R_value(sk, i);.
79d0: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29  ..if (c == NULL)
79e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a   continue;..../*
79f0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20   cipher name or 
7a00: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d  (NONE) */...cp =
7a10: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
7a20: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63  name(c);...if (c
7a30: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b  p == NULL) break
7a40: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
7a50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
7a60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
7a70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70  _NewStringObj(cp
7a80: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a  , -1));..    }..
7a90: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f  .} else {..    o
7aa0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53  bjPtr = Tcl_NewS
7ab0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a  tringObj("",0);.
7ac0: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20  .    for (int i 
7ad0: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f  = 0; i < sk_SSL_
7ae0: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20  CIPHER_num(sk); 
7af0: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53  i++) {...const S
7b00: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73  SL_CIPHER *c = s
7b10: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
7b20: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20  ue(sk, i);...if 
7b30: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74  (c == NULL) cont
7b40: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74  inue;..../* text
7b50: 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ual description 
7b60: 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f  of the cipher */
7b70: 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45  ...if (SSL_CIPHE
7b80: 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c  R_description(c,
7b90: 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66   buf, sizeof(buf
7ba0: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  )) != NULL) {...
7bb0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f      Tcl_AppendTo
7bc0: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c  Obj(objPtr, buf,
7bd0: 20 28 69 6e 74 29 20 73 74 72 6c 65 6e 28 62 75   (int) strlen(bu
7be0: 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  f));...} else {.
7bf0: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
7c00: 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55  ToObj(objPtr, "U
7c10: 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09  NKNOWN\n", 8);..
7c20: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66  .}..    }..}..if
7c30: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   (use_supported)
7c40: 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43   {..    sk_SSL_C
7c50: 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a  IPHER_free(sk);.
7c60: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c  .}.    }.    SSL
7c70: 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20  _free(ssl);.    
7c80: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
7c90: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  );..    Tcl_SetO
7ca0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
7cb0: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
7cc0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
7cd0: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
7ce0: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d30: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63  ---. *. * Protoc
7d40: 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73  olsObjCmd -- lis
7d50: 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74  t available prot
7d60: 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73  ocols. *. *.This
7d70: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
7d80: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73  voked to process
7d90: 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f   the "tls::proto
7da0: 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  cols" command. *
7db0: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62  .to list availab
7dc0: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a  le protocols.. *
7dd0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
7de0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
7df0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20  esult list.. *. 
7e00: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
7e10: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.none. *. *---
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e60: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
7e70: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28  ProtocolsObjCmd(
7e80: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
7e90: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
7ea0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
7eb0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
7ec0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
7ed0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
7ee0: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
7ef0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
7f00: 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b  if (objc != 1) {
7f10: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
7f20: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
7f30: 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e  jv, "");..return
7f40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7f50: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
7f60: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f  _error();..    o
7f70: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
7f80: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
7f90: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
7fa0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
7fb0: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
7fc0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
7fd0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
7fe0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
7ff0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8000: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8010: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
8020: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
8030: 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20  cols[TLS_SSL2], 
8040: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  -1));.#endif.#if
8050: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
8060: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
8070: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20  PENSSL_NO_SSL3) 
8080: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8090: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48  SSL_NO_SSL3_METH
80a0: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  OD).    Tcl_List
80b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
80c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
80d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
80e0: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
80f0: 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  SSL3], -1));.#en
8100: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
8110: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  (NO_TLS1) && !de
8120: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8130: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
8140: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8150: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54  S1_METHOD).    T
8160: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
8170: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
8180: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
8190: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
81a0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31  ls[TLS_TLS1], -1
81b0: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
81c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
81d0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
81e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
81f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8200: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f  ENSSL_NO_TLS1_1_
8210: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f  METHOD).    Tcl_
8220: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8230: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
8240: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
8250: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
8260: 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29  TLS_TLS1_1], -1)
8270: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
8280: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
8290: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
82a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
82b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
82c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d  NSSL_NO_TLS1_2_M
82d0: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
82e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
82f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
8300: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8310: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8320: 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29  LS_TLS1_2], -1))
8330: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8340: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
8350: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8360: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
8370: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8380: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8390: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
83a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
83b0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
83c0: 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  _3], -1));.#endi
83d0: 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  f..    Tcl_SetOb
83e0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
83f0: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
8400: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
8410: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
8420: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Data;.}.../*. *-
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8470: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61  --. *. * Handsha
8480: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  keObjCmd --. *. 
8490: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  *.This command i
84a0: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79  s used to verify
84b0: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e   whether the han
84c0: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65  dshake is comple
84d0: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a  te. *.or not.. *
84e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
84f0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
8500: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68  esult. 1 means h
8510: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74  andshake complet
8520: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69  e, 0 means pendi
8530: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ng.. *. * Side e
8540: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66  ffects:. *.May f
8550: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61  orce SSL negotia
8560: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61  tion to take pla
8570: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ce.. *. *-------
8580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
85c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64  .static int Hand
85d0: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65  shakeObjCmd(Clie
85e0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
85f0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
8600: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
8610: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
8620: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
8630: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20  l_Channel chan; 
8640: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
8650: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
8660: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53  ode on. */.    S
8670: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20  tate *statePtr; 
8680: 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74         /* client
8690: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
86a0: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e  ocket */.    con
86b0: 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20  st char *errStr 
86c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
86d0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  ret = 1;.    int
86e0: 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64   err = 0;..    d
86f0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
8700: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
8710: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
8720: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
8730: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
8740: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54  nel");..return(T
8750: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
8760: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
8770: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68  error();..    ch
8780: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
8790: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
87a0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
87b0: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c  (objv[1], NULL),
87c0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
87d0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
87e0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
87f0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
8800: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8810: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
8820: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
8830: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
8840: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
8850: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
8860: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
8870: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
8880: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
8890: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
88a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
88b0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
88c0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
88d0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
88e0: 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
88f0: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
8900: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
8910: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
8920: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
8930: 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20  KE", "CHANNEL", 
8940: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72  "INVALID", (char
8950: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
8960: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
8970: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74     }.    statePt
8980: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c  r = (State *)Tcl
8990: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
89a0: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a  nceData(chan);..
89b0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
89c0: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72  ling Tls_WaitFor
89d0: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72  Connect");.    r
89e0: 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72  et = Tls_WaitFor
89f0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72  Connect(statePtr
8a00: 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20  , &err, 1);.    
8a10: 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69  dprintf("Tls_Wai
8a20: 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75  tForConnect retu
8a30: 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b  rned: %i", ret);
8a40: 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20  ..    if (ret < 
8a50: 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d  0 && ((statePtr-
8a60: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
8a70: 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20  _ASYNC) && (err 
8a80: 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09  == EAGAIN))) {..
8a90: 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73  dprintf("Async s
8aa0: 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47  et and err = EAG
8ab0: 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b  AIN");..ret = 0;
8ac0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
8ad0: 72 65 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 53  ret < 0) {..errS
8ae0: 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65  tr = statePtr->e
8af0: 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65  rr;..Tcl_ResetRe
8b00: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54  sult(interp);..T
8b10: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29  cl_SetErrno(err)
8b20: 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20  ;...if (!errStr 
8b30: 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30  || (*errStr == 0
8b40: 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72  )) {..    errStr
8b50: 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f   = Tcl_PosixErro
8b60: 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09  r(interp);..}...
8b70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8b80: 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68  (interp, "handsh
8b90: 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65  ake failed: ", e
8ba0: 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20  rrStr, (char *) 
8bb0: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
8bc0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
8bd0: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
8be0: 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  KE", "FAILED", (
8bf0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
8c00: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
8c10: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74  ng TCL_ERROR wit
8c20: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c  h handshake fail
8c30: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29  ed: %s", errStr)
8c40: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ;..return(TCL_ER
8c50: 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ROR);.    } else
8c60: 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30   {..if (err != 0
8c70: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
8c80: 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77  ("Got an error w
8c90: 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20  ith a completed 
8ca0: 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d  handshake: err =
8cb0: 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09   %i", err);..}..
8cc0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ret = 1;.    }..
8cd0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74      dprintf("Ret
8ce0: 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69  urning TCL_OK wi
8cf0: 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c  th data \"%i\"",
8d00: 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53   ret);.    Tcl_S
8d10: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
8d20: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
8d30: 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74  j(ret));.    ret
8d40: 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c  urn(TCL_OK);..cl
8d50: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
8d60: 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  tData;.}../*. *-
8d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8db0: 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f  --. *. * ImportO
8dc0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
8dd0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
8de0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
8df0: 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f  ess the "ssl" co
8e00: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20  mmand. *. *.The 
8e10: 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68  ssl command push
8e20: 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e  es SSL over a (n
8e30: 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20  ewly connected) 
8e40: 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a  tcp socket. *. *
8e50: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
8e60: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
8e70: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
8e80: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d  ffects:. *.May m
8e90: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69  odify the behavi
8ea0: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e  or of an IO chan
8eb0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8f00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70  /.static int.Imp
8f10: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  ortObjCmd(Client
8f20: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
8f30: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8f40: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
8f50: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
8f60: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
8f70: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
8f80: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
8f90: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
8fa0: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
8fb0: 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65  atePtr;../* clie
8fc0: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
8fd0: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53   socket */.    S
8fe0: 53 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20  SL_CTX *ctx.    
8ff0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9000: 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09  Tcl_Obj *script.
9010: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9020: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73      Tcl_Obj *pas
9030: 73 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d 20  sword.        = 
9040: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
9050: 6a 20 2a 76 63 6d 64 09 20 20 20 20 20 20 20 20  j *vcmd.        
9060: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
9070: 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61  DString upperCha
9080: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c  nnelTranslation,
9090: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f   upperChannelBlo
90a0: 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e  cking, upperChan
90b0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70  nelEncoding, upp
90c0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
90d0: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c  ;.    int idx, l
90e0: 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  en;.    int flag
90f0: 73 09 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53  s..        = TLS
9100: 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69  _TCL_INIT;.    i
9110: 6e 74 20 73 65 72 76 65 72 09 09 20 20 20 20 20  nt server..     
9120: 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f     = 0;./* is co
9130: 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e  nnection incomin
9140: 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a  g or outgoing? *
9150: 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66  /.    char *keyf
9160: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
9170: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65  LL;.    char *ce
9180: 72 74 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  rtfile.        =
9190: 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67   NULL;.    unsig
91a0: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09  ned char *key  .
91b0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
91c0: 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20  key_len         
91d0: 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20          = 0;.   
91e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
91f0: 63 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e  cert         = N
9200: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 72  ULL;.    int cer
9210: 74 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20  t_len           
9220: 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68       = 0;.    ch
9230: 61 72 20 2a 63 69 70 68 65 72 73 09 20 20 20 20  ar *ciphers.    
9240: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9250: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74  char *ciphersuit
9260: 65 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  es.        = NUL
9270: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66  L;.    char *CAf
9280: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
9290: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41  LL;.    char *CA
92a0: 64 69 72 09 09 20 20 20 20 20 20 20 20 3d 20 4e  dir..        = N
92b0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44  ULL;.    char *D
92c0: 48 70 61 72 61 6d 73 09 20 20 20 20 20 20 20 20  Hparams.        
92d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
92e0: 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 20   *model..       
92f0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61   = NULL;.    cha
9300: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20  r *servername.  
9310: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a        = NULL;./*
9320: 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65   hostname for Se
9330: 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61  rver Name Indica
9340: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  tion */.    cons
9350: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
9360: 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55  *session_id = NU
9370: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
9380: 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20  *alpn..= NULL;. 
9390: 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c     int ssl2 = 0,
93a0: 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69   ssl3 = 0;.    i
93b0: 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73  nt tls1 = 1, tls
93c0: 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20  1_1 = 1, tls1_2 
93d0: 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b  = 1, tls1_3 = 1;
93e0: 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d  .    int proto =
93f0: 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a   0, level = -1;.
9400: 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d      int verify =
9410: 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c   0, require = 0,
9420: 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f   request = 1, po
9430: 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30  st_handshake = 0
9440: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
9450: 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64  Called");..#if d
9460: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
9470: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
9480: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
9490: 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tls1 = 0;.#endif
94a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
94b0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
94c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
94d0: 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31  S1_1).    tls1_1
94e0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
94f0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
9500: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
9510: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
9520: 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30  ).    tls1_2 = 0
9530: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
9540: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
9550: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
9560: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
9570: 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65    tls1_3 = 0;.#e
9580: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62  ndif..    if (ob
9590: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
95a0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
95b0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
95c0: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22  annel ?options?"
95d0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
95e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
95f0: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
9600: 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20  ();..    chan = 
9610: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
9620: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
9630: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
9640: 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c  [1], NULL), NULL
9650: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
9660: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
9670: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
9680: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9690: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
96a0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
96b0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
96c0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
96d0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
96e0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20  annel(chan);..  
96f0: 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20    for (idx = 2; 
9700: 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b  idx < objc; idx+
9710: 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20  +) {..char *opt 
9720: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
9730: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d  romObj(objv[idx]
9740: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f  , NULL);...if (o
9750: 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20  pt[0] != '-').. 
9760: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f     break;...OPTO
9770: 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e  BJ("-alpn", alpn
9780: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64  );..OPTSTR("-cad
9790: 69 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50  ir", CAdir);..OP
97a0: 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20  TSTR("-cafile", 
97b0: 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42 59 54  CAfile);..OPTBYT
97c0: 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c  E("-cert", cert,
97d0: 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54   cert_len);..OPT
97e0: 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c  STR("-certfile",
97f0: 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54   certfile);..OPT
9800: 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63  STR("-cipher", c
9810: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52  iphers);..OPTSTR
9820: 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70  ("-ciphers", cip
9830: 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22  hers);..OPTSTR("
9840: 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20  -ciphersuites", 
9850: 63 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09  ciphersuites);..
9860: 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64  OPTOBJ("-command
9870: 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54  ", script);..OPT
9880: 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c  STR("-dhparams",
9890: 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54   DHparams);..OPT
98a0: 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79  BYTE("-key", key
98b0: 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54  , key_len);..OPT
98c0: 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20  STR("-keyfile", 
98d0: 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54  keyfile);..OPTST
98e0: 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65  R("-model", mode
98f0: 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61  l);..OPTOBJ("-pa
9900: 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72  ssword", passwor
9910: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70  d);..OPTBOOL("-p
9920: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20  ost_handshake", 
9930: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b  post_handshake);
9940: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75  ..OPTBOOL("-requ
9950: 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a  est", request);.
9960: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69  .OPTBOOL("-requi
9970: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09  re", require);..
9980: 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74  OPTINT("-securit
9990: 79 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b  ylevel", level);
99a0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76  ..OPTBOOL("-serv
99b0: 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f  er", server);..O
99c0: 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61  PTSTR("-serverna
99d0: 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  me", servername)
99e0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73  ;..OPTSTR("-sess
99f0: 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e  ion_id", session
9a00: 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  _id);..OPTBOOL("
9a10: 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09  -ssl2", ssl2);..
9a20: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c  OPTBOOL("-ssl3",
9a30: 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c   ssl3);..OPTBOOL
9a40: 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b  ("-tls1", tls1);
9a50: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31  ..OPTBOOL("-tls1
9a60: 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f  .1", tls1_1);..O
9a70: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22  PTBOOL("-tls1.2"
9a80: 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42  , tls1_2);..OPTB
9a90: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74  OOL("-tls1.3", t
9aa0: 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28  ls1_3);..OPTOBJ(
9ab0: 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e  "-validatecomman
9ac0: 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f  d", vcmd);..OPTO
9ad0: 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64  BJ("-vcmd", vcmd
9ae0: 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74  );...OPTBAD("opt
9af0: 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63  ion", "-alpn, -c
9b00: 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d  adir, -cafile, -
9b10: 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c  cert, -certfile,
9b20: 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65   -cipher, -ciphe
9b30: 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e  rsuites, -comman
9b40: 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b  d, -dhparams, -k
9b50: 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d  ey, -keyfile, -m
9b60: 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c  odel, -password,
9b70: 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65   -post_handshake
9b80: 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71  , -request, -req
9b90: 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 6c  uire, -securityl
9ba0: 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d  evel, -server, -
9bb0: 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73  servername, -ses
9bc0: 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20  sion_id, -ssl2, 
9bd0: 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74  -ssl3, -tls1, -t
9be0: 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20  ls1.1, -tls1.2, 
9bf0: 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c  -tls1.3, or -val
9c00: 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a  idatecommand");.
9c10: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
9c20: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
9c30: 20 28 72 65 71 75 65 73 74 29 09 09 76 65 72 69   (request)..veri
9c40: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
9c50: 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53  _CLIENT_ONCE | S
9c60: 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a  SL_VERIFY_PEER;.
9c70: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20      if (request 
9c80: 26 26 20 72 65 71 75 69 72 65 29 09 76 65 72 69  && require).veri
9c90: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
9ca0: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
9cb0: 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72  _CERT;.    if (r
9cc0: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68  equest && post_h
9cd0: 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79  andshake).verify
9ce0: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50   |= SSL_VERIFY_P
9cf0: 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20  OST_HANDSHAKE;. 
9d00: 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d     if (verify ==
9d10: 20 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 53   0)..verify = SS
9d20: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a  L_VERIFY_NONE;..
9d30: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73      proto |= (ss
9d40: 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  l2 ? TLS_PROTO_S
9d50: 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  SL2 : 0);.    pr
9d60: 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54  oto |= (ssl3 ? T
9d70: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20  LS_PROTO_SSL3 : 
9d80: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
9d90: 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f   (tls1 ? TLS_PRO
9da0: 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20  TO_TLS1 : 0);.  
9db0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
9dc0: 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _1 ? TLS_PROTO_T
9dd0: 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20  LS1_1 : 0);.    
9de0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32  proto |= (tls1_2
9df0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
9e00: 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  1_2 : 0);.    pr
9e10: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f  oto |= (tls1_3 ?
9e20: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
9e30: 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  3 : 0);..    /* 
9e40: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  reset to NULL if
9e50: 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72   blank string pr
9e60: 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66  ovided */.    if
9e70: 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74   (cert && !*cert
9e80: 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09  )..        cert.
9e90: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9ea0: 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21      if (key && !
9eb0: 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b  *key)..        k
9ec0: 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  ey.        = NUL
9ed0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66  L;.    if (certf
9ee0: 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c  ile && !*certfil
9ef0: 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66  e)         certf
9f00: 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ile.= NULL;.    
9f10: 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21  if (keyfile && !
9f20: 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69  *keyfile)..keyfi
9f30: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
9f40: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  L;.    if (ciphe
9f50: 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29  rs && !*ciphers)
9f60: 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73  .        ciphers
9f70: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9f80: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73  .    if (ciphers
9f90: 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65  uites && !*ciphe
9fa0: 72 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73  rsuites) ciphers
9fb0: 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b  uites    = NULL;
9fc0: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20  .    if (CAfile 
9fd0: 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20  && !*CAfile).   
9fe0: 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20       CAfile.    
9ff0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a000: 69 66 20 28 43 41 64 69 72 20 26 26 20 21 2a 43  if (CAdir && !*C
a010: 41 64 69 72 29 09 20 20 20 20 20 20 20 20 43 41  Adir).        CA
a020: 64 69 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55  dir.        = NU
a030: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61  LL;.    if (DHpa
a040: 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61  rams && !*DHpara
a050: 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61  ms).        DHpa
a060: 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55  rams        = NU
a070: 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20  LL;..    /* new 
a080: 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  SSL state */.   
a090: 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74   statePtr..= (St
a0a0: 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28  ate *) ckalloc((
a0b0: 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66  unsigned) sizeof
a0c0: 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65  (State));.    me
a0d0: 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30  mset(statePtr, 0
a0e0: 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  , sizeof(State))
a0f0: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  ;..    statePtr-
a100: 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a  >flags.= flags;.
a110: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e      statePtr->in
a120: 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20  terp.= interp;. 
a130: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c     statePtr->vfl
a140: 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20  ags.= verify;.  
a150: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09    statePtr->err.
a160: 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c  = "";..    /* al
a170: 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f  locate script */
a180: 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29  .    if (script)
a190: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47   {..(void) Tcl_G
a1a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a1b0: 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09  script, &len);..
a1c0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
a1d0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
a1e0: 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20  ck = script;..  
a1f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
a200: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  nt(statePtr->cal
a210: 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d  lback);..}.    }
a220: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74  ..    /* allocat
a230: 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20  e password */.  
a240: 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20    if (password) 
a250: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65  {..(void) Tcl_Ge
a260: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
a270: 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a  assword, &len);.
a280: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20  .if (len) {..   
a290: 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77   statePtr->passw
a2a0: 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a  ord = password;.
a2b0: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
a2c0: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
a2d0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20  password);..}.  
a2e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f    }..    /* allo
a2f0: 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f  cate validate co
a300: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20  mmand */.    if 
a310: 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29  (vcmd) {..(void)
a320: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
a330: 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e  omObj(vcmd, &len
a340: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
a350: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63      statePtr->vc
a360: 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20  md = vcmd;..    
a370: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
a380: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
a390: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
a3a0: 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c  if (model != NUL
a3b0: 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a  L) {..int mode;.
a3c0: 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64  ./* Get the "mod
a3d0: 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09  el" context */..
a3e0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
a3f0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f  annel(interp, mo
a400: 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66  del, &mode);..if
a410: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
a420: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
a430: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
a440: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
a450: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
a460: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
a470: 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  .. * Make sure t
a480: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
a490: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
a4a0: 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63  .. */..chan = Tc
a4b0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
a4c0: 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f  chan);..if (Tcl_
a4d0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
a4e0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
a4f0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20  nelType()) {..  
a500: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a510: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
a520: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
a530: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
a540: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f  chan),..."\": no
a550: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
a560: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  , NULL);..    Tc
a570: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
a580: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
a590: 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c  MPORT", "CHANNEL
a5a0: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
a5b0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
a5c0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
a5d0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
a5e0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a5f0: 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d  ERROR;..}..ctx =
a600: 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47   ((State *)Tcl_G
a610: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
a620: 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74  eData(chan))->ct
a630: 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  x;.    } else {.
a640: 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f  .if ((ctx = CTX_
a650: 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 73  Init(statePtr, s
a660: 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65  erver, proto, ke
a670: 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c  yfile, certfile,
a680: 20 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f   key, cert, key_
a690: 6c 65 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c  len,..    cert_l
a6a0: 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c  en, CAdir, CAfil
a6b0: 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68  e, ciphers, ciph
a6c0: 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c  ersuites, level,
a6d0: 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e   DHparams)) == N
a6e0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  ULL) {..    Tls_
a6f0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
a700: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a710: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a720: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74  .}.    }..    st
a730: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74  atePtr->ctx = ct
a740: 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  x;..    /*.     
a750: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  * We need to mak
a760: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
a770: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e  channel works in
a780: 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65   binary (for the
a790: 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69  .     * encrypti
a7a0: 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f  on not to get go
a7b0: 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a  ofed up)..     *
a7c0: 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f   We only want to
a7d0: 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66   adjust the buff
a7e0: 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20  ering in pre-v2 
a7f0: 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a  channels, where.
a800: 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e       * each chan
a810: 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b  nel in the stack
a820: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20   maintained its 
a830: 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20  own buffers..   
a840: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74    */.    Tcl_DSt
a850: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
a860: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
a870: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  n);.    Tcl_DStr
a880: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
a890: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a  annelBlocking);.
a8a0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
a8b0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
a8c0: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54  lEOFChar);.    T
a8d0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
a8e0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
a8f0: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
a900: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
a910: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
a920: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72  eofchar", &upper
a930: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
a940: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
a950: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
a960: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69  , chan, "-encodi
a970: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ng", &upperChann
a980: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  elEncoding);.   
a990: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
a9a0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
a9b0: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
a9c0: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  n", &upperChanne
a9d0: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20  lTranslation);. 
a9e0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
a9f0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
aa00: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
aa10: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
aa20: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
aa30: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
aa40: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
aa50: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
aa60: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20  , "binary");.   
aa70: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
aa80: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
aa90: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c  an, "-blocking",
aaa0: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70   "true");.    dp
aab0: 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67  rintf("Consuming
aac0: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22   Tcl channel %s"
aad0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
aae0: 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20  Name(chan));.   
aaf0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20   statePtr->self 
ab00: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e  = Tcl_StackChann
ab10: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43  el(interp, Tls_C
ab20: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43  hannelType(), (C
ab30: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
ab40: 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42  Ptr, (TCL_READAB
ab50: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c  LE | TCL_WRITABL
ab60: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64  E), chan);.    d
ab70: 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20  printf("Created 
ab80: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73  channel named %s
ab90: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
aba0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
abb0: 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28  self));.    if (
abc0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
abd0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
abe0: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  NULL) {../*.. * 
abf0: 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76  No use of Tcl_Ev
ac00: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63  entuallyFree bec
ac10: 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65  ause no possible
ac20: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09   Tcl_Preserve...
ac30: 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63   */..Tls_Free((c
ac40: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
ac50: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
ac60: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
ac70: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
ac80: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
ac90: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74  tePtr->self, "-t
aca0: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c  ranslation", Tcl
acb0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
acc0: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
acd0: 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63  lation));.    Tc
ace0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
acf0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
ad00: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63  Ptr->self, "-enc
ad10: 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  oding", Tcl_DStr
ad20: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
ad30: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29  hannelEncoding))
ad40: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
ad50: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
ad60: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
ad70: 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54  f, "-eofchar", T
ad80: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
ad90: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
ada0: 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f  Char));.    Tcl_
adb0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
adc0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
add0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b  r->self, "-block
ade0: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ing", Tcl_DStrin
adf0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
ae00: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a  nnelBlocking));.
ae10: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
ae20: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f  SL Initializatio
ae30: 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n.     */.    st
ae40: 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53  atePtr->ssl = SS
ae50: 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e  L_new(statePtr->
ae60: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73  ctx);.    if (!s
ae70: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a  tatePtr->ssl) {.
ae80: 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20  ./* SSL library 
ae90: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70  error */..Tcl_Ap
aea0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
aeb0: 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e  p, "couldn't con
aec0: 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69  struct ssl sessi
aed0: 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  on: ", REASON(),
aee0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
aef0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
af00: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
af10: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
af20: 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22  "INIT", "FAILED"
af30: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
af40: 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61  ;..Tls_Free((cha
af50: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
af60: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
af70: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
af80: 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72   Set host server
af90: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20   name */.    if 
afa0: 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09  (servername) {..
afb0: 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76  /* Sets the serv
afc0: 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69  er name indicati
afd0: 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65  on (SNI) in Clie
afe0: 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f  ntHello extensio
aff0: 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43  n */../* Per RFC
b000: 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20   6066, hostname 
b010: 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64  is a ASCII encod
b020: 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67  ed string, thoug
b030: 68 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20  h RFC 4366 says 
b040: 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21  UTF-8. */..if (!
b050: 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68  SSL_set_tlsext_h
b060: 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74  ost_name(statePt
b070: 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61  r->ssl, serverna
b080: 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20  me) && require) 
b090: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
b0a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b0b0: 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73  "setting TLS hos
b0c0: 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e  t name extension
b0d0: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20   failed", (char 
b0e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b0f0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b100: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b110: 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20  IMPORT", "SNI", 
b120: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b130: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b140: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
b150: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
b160: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b170: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68  R;..}.../* Set h
b180: 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72  ostname for peer
b190: 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f 73   certificate hos
b1a0: 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 69  tname verificati
b1b0: 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09  on in clients...
b1c0: 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c     Don't use SSL
b1d0: 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65  _set1_host since
b1e0: 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69   it has limitati
b1f0: 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53  ons. */..if (!SS
b200: 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74  L_add1_host(stat
b210: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65  ePtr->ssl, serve
b220: 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54  rname)) {..    T
b230: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b240: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67  interp, "setting
b250: 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66   DNS host name f
b260: 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29  ailed", (char *)
b270: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
b280: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b290: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
b2a0: 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45  PORT", "HOSTNAME
b2b0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b2c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b2d0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b2e0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b2f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b300: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
b310: 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65      /* Resume se
b320: 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20  ssion id */.    
b330: 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26  if (session_id &
b340: 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e  & strlen(session
b350: 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f  _id) <= SSL_MAX_
b360: 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20  SID_CTX_LENGTH) 
b370: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65  {../* SSL_set_se
b380: 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28  ssion() */..if (
b390: 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74  !SSL_SESSION_set
b3a0: 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c  1_id_context(SSL
b3b0: 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61  _get_session(sta
b3c0: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73  tePtr->ssl), ses
b3d0: 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e  sion_id, (unsign
b3e0: 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73  ed int) strlen(s
b3f0: 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09  ession_id))) {..
b400: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b410: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65  sult(interp, "Re
b420: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20  sume session id 
b430: 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22  ", session_id, "
b440: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20   failed", (char 
b450: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b460: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b470: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b480: 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f  IMPORT", "SESSIO
b490: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  N", "FAILED", (c
b4a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  har *) NULL);.  
b4b0: 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72            Tls_Fr
b4c0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
b4d0: 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ePtr);.         
b4e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b4f0: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ROR;..}.    }.. 
b500: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70     /* Enable App
b510: 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50  lication-Layer P
b520: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
b530: 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 72  ion. Examples ar
b540: 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74  e: http/1.0,..ht
b550: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20  tp/1.1, h2, h3, 
b560: 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c  ftp, imap, pop3,
b570: 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d   xmpp-client, xm
b580: 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 2c  pp-server, mqtt,
b590: 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20   irc, etc. */.  
b5a0: 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f    if (alpn) {../
b5b0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20  * Convert a TCL 
b5c0: 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74  list into a prot
b5d0: 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72  ocol-list in wir
b5e0: 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73  e-format */..uns
b5f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74  igned char *prot
b600: 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65  os, *p;..unsigne
b610: 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e  d int protos_len
b620: 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65   = 0;..int i, le
b630: 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a  n, cnt;..Tcl_Obj
b640: 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54   **list;...if (T
b650: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65  cl_ListObjGetEle
b660: 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c  ments(interp, al
b670: 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29  pn, &cnt, &list)
b680: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
b690: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
b6a0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
b6b0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b6c0: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  ERROR;..}.../* D
b6d0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d  etermine the mem
b6e0: 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72  ory required for
b6f0: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69   the protocol-li
b700: 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20  st */..for (i = 
b710: 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29  0; i < cnt; i++)
b720: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53   {..    Tcl_GetS
b730: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73  tringFromObj(lis
b740: 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20  t[i], &len);..  
b750: 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29    if (len > 255)
b760: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52   {...Tcl_AppendR
b770: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41  esult(interp, "A
b780: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d  LPN protocol nam
b790: 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68  e too long", (ch
b7a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54  ar *) NULL);...T
b7b0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b7c0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b7d0: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c  IMPORT", "ALPN",
b7e0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
b7f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73   *) NULL);...Tls
b800: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
b810: 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75  tatePtr);...retu
b820: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
b830: 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73     }..    protos
b840: 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e 3b  _len += 1 + len;
b850: 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74  ..}.../* Build t
b860: 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74  he complete prot
b870: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72  ocol-list */..pr
b880: 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70  otos = ckalloc(p
b890: 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20  rotos_len);../* 
b8a0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63  protocol-lists c
b8b0: 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20  onsist of 8-bit 
b8c0: 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c  length-prefixed,
b8d0: 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f   byte strings */
b8e0: 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 70 20  ..for (i = 0, p 
b8f0: 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63 6e  = protos; i < cn
b900: 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63  t; i++) {..    c
b910: 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47  har *str = Tcl_G
b920: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
b930: 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a  list[i], &len);.
b940: 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b  .    *p++ = len;
b950: 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20  ..    memcpy(p, 
b960: 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 20  str, len);..    
b970: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f  p += len;..}.../
b980: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70  * SSL_set_alpn_p
b990: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f  rotos makes a co
b9a0: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63  py of the protoc
b9b0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e  ol-list */../* N
b9c0: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ote: This functi
b9d0: 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 65  ons reverses the
b9e0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f   return value co
b9f0: 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20  nvention */..if 
ba00: 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72  (SSL_set_alpn_pr
ba10: 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73  otos(statePtr->s
ba20: 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74  sl, protos, prot
ba30: 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20  os_len)) {..    
ba40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ba50: 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 64  (interp, "failed
ba60: 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 72 6f   to set ALPN pro
ba70: 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a  tocols", (char *
ba80: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
ba90: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
baa0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
bab0: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20  MPORT", "ALPN", 
bac0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
bad0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
bae0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
baf0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
bb00: 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b   ckfree(protos);
bb10: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
bb20: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
bb30: 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20  Store protocols 
bb40: 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74  list */..statePt
bb50: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74  r->protos = prot
bb60: 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  os;..statePtr->p
bb70: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74  rotos_len = prot
bb80: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c  os_len;.    } el
bb90: 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e  se {..statePtr->
bba0: 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09  protos = NULL;..
bbb0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
bbc0: 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  _len = 0;.    }.
bbd0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
bbe0: 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20  SL Callbacks.   
bbf0: 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74    */.    SSL_set
bc00: 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50  _app_data(stateP
bc10: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a  tr->ssl, (void *
bc20: 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70  )statePtr);./* p
bc30: 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20  oint back to us 
bc40: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76  */.    SSL_set_v
bc50: 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e  erify(statePtr->
bc60: 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72  ssl, verify, Ver
bc70: 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  ifyCallback);.  
bc80: 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63    SSL_set_info_c
bc90: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72  allback(statePtr
bca0: 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62  ->ssl, InfoCallb
bcb0: 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  ack);..    /* Ca
bcc0: 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72  llback for obser
bcd0: 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65  ving protocol me
bce0: 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65  ssages */.#ifnde
bcf0: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  f OPENSSL_NO_SSL
bd00: 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f  _TRACE.    /* vo
bd10: 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  id SSL_CTX_set_m
bd20: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28  sg_callback_arg(
bd30: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28  statePtr->ctx, (
bd40: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
bd50: 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43  ;.    void SSL_C
bd60: 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62  TX_set_msg_callb
bd70: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ack(statePtr->ct
bd80: 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61  x, MessageCallba
bd90: 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  ck); */.    SSL_
bda0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
bdb0: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73  _arg(statePtr->s
bdc0: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  sl, (void *)stat
bdd0: 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73  ePtr);.    SSL_s
bde0: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28  et_msg_callback(
bdf0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d  statePtr->ssl, M
be00: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b  essageCallback);
be10: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
be20: 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e  Create Tcl_Chann
be30: 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a  el BIO Handler *
be40: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
be50: 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f  p_bio.= BIO_new_
be60: 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49  tcl(statePtr, BI
be70: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20  O_NOCLOSE);.    
be80: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20  statePtr->bio.= 
be90: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73  BIO_new(BIO_f_ss
bea0: 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  l());..    if (s
beb0: 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72  erver) {../* Ser
bec0: 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f  ver callbacks */
bed0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c  ..SSL_CTX_set_tl
bee0: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f  sext_servername_
bef0: 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74  arg(statePtr->ct
bf00: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  x, (void *)state
bf10: 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  Ptr);..SSL_CTX_s
bf20: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72  et_tlsext_server
bf30: 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74  name_callback(st
bf40: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49  atePtr->ctx, SNI
bf50: 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f  Callback);..SSL_
bf60: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68  CTX_set_client_h
bf70: 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72  ello_cb(statePtr
bf80: 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c  ->ctx, HelloCall
bf90: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
bfa0: 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74  atePtr);..if (st
bfb0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21  atePtr->protos !
bfc0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53  = NULL) {..    S
bfd0: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f  SL_CTX_set_alpn_
bfe0: 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50  select_cb(stateP
bff0: 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c  tr->ctx, ALPNCal
c000: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
c010: 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66  tatePtr);.#ifdef
c020: 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66   USE_NPN..    if
c030: 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26   (tls1_2 == 0 &&
c040: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a   tls1_3 == 0) {.
c050: 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65  ..SSL_CTX_set_ne
c060: 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74  xt_protos_advert
c070: 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 72  ised_cb(statePtr
c080: 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61  ->ctx, NPNCallba
c090: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
c0a0: 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65  ePtr);..    }.#e
c0b0: 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61  ndif..}.../* Ena
c0c0: 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 65  ble server to se
c0d0: 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 20  nd cert request 
c0e0: 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20  after handshake 
c0f0: 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a  (TLS 1.3 only) *
c100: 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70  /../* A write op
c110: 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b  eration must tak
c120: 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20  e place for the 
c130: 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 75  Certificate Requ
c140: 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65  est to be..   se
c150: 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  nt to the client
c160: 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f  , this can be do
c170: 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68  ne with SSL_do_h
c180: 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09  andshake(). */..
c190: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70  if (request && p
c1a0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26  ost_handshake &&
c1b0: 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20   tls1_3) {..    
c1c0: 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e  SSL_verify_clien
c1d0: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  t_post_handshake
c1e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
c1f0: 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74  ..}.../* set aut
c200: 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 6c  omatic curve sel
c210: 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73  ection */..SSL_s
c220: 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61  et_ecdh_auto(sta
c230: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a  tePtr->ssl, 1);.
c240: 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20  ../* Set server 
c250: 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74  mode */..statePt
c260: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
c270: 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c  TCL_SERVER;..SSL
c280: 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74  _set_accept_stat
c290: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
c2a0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
c2b0: 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61  /* Client callba
c2c0: 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53  cks */.#ifdef US
c2d0: 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65  E_NPN..if (state
c2e0: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e  Ptr->protos != N
c2f0: 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d  ULL && tls1_2 ==
c300: 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20   0 && tls1_3 == 
c310: 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54  0) {..    SSL_CT
c320: 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f  X_set_next_proto
c330: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65  _select_cb(state
c340: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61  Ptr->ctx, ALPNCa
c350: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
c360: 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65  statePtr);..}.#e
c370: 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  ndif.../* Sessio
c380: 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53  n caching */..SS
c390: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f  L_CTX_set_sessio
c3a0: 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61  n_cache_mode(sta
c3b0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f  tePtr->ctx, SSL_
c3c0: 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e  SESS_CACHE_CLIEN
c3d0: 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  T | SSL_SESS_CAC
c3e0: 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53  HE_NO_INTERNAL_S
c3f0: 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  TORE);..SSL_CTX_
c400: 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28  sess_set_new_cb(
c410: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
c420: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b  essionCallback);
c430: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73  .../* Enable pos
c440: 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68  t handshake Auth
c450: 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e  entication exten
c460: 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e  sion. TLS 1.3 on
c470: 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20  ly, not http/2. 
c480: 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20  */..if (request 
c490: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  && post_handshak
c4a0: 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65  e) {..    SSL_se
c4b0: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  t_post_handshake
c4c0: 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e  _auth(statePtr->
c4d0: 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a  ssl, 1);..}.../*
c4e0: 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65   Set client mode
c4f0: 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e   */..SSL_set_con
c500: 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65  nect_state(state
c510: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
c520: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f  .    SSL_set_bio
c530: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c540: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c  statePtr->p_bio,
c550: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
c560: 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73  );.    BIO_set_s
c570: 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  sl(statePtr->bio
c580: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  , statePtr->ssl,
c590: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a   BIO_NOCLOSE);..
c5a0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e      /*.     * En
c5b0: 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20  d of SSL Init.  
c5c0: 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74     */.    dprint
c5d0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22  f("Returning %s"
c5e0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
c5f0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
c600: 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  elf));.    Tcl_S
c610: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
c620: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65   (char *) Tcl_Ge
c630: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
c640: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43  tePtr->self), TC
c650: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20  L_VOLATILE);..  
c660: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
c670: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63  ..clientData = c
c680: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f  lientData;.}.../
c690: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
c6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e  -------. *. * Un
c6e0: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a  importObjCmd --.
c6f0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
c700: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
c710: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f  to remove the to
c720: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69  pmost channel fi
c730: 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  lter.. *. * Resu
c740: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
c750: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
c760: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
c770: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79  s:. *.May modify
c780: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
c790: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a   an IO channel..
c7a0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
c7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
c7f0: 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74  tic int.Unimport
c800: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
c810: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
c820: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c830: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
c840: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
c850: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
c860: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54  nnel chan;../* T
c870: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65  he channel to se
c880: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a  t a mode on. */.
c890: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
c8a0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
c8b0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
c8c0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
c8d0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
c8e0: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65   "channel");..re
c8f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c900: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20      }..    chan 
c910: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
c920: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
c930: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
c940: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
c950: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
c960: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
c970: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c980: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
c990: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
c9a0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
c9b0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
c9c0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
c9d0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
c9e0: 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  ;..    if (Tcl_G
c9f0: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
ca00: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
ca10: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
ca20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ca30: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
ca40: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
ca50: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
ca60: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54  ,..."\": not a T
ca70: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  LS channel", NUL
ca80: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
ca90: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
caa0: 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f  , "TLS", "UNIMPO
cab0: 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20  RT", "CHANNEL", 
cac0: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72  "INVALID", (char
cad0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
cae0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
caf0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c    }..    if (Tcl
cb00: 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28  _UnstackChannel(
cb10: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d  interp, chan) ==
cb20: 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72   TCL_ERROR) {..r
cb30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cb40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
cb50: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65  rn TCL_OK;..clie
cb60: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
cb70: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ata;.}.../*. *--
cb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbc0: 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74  -. *. * CTX_Init
cbd0: 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20   -- construct a 
cbe0: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65  SSL_CTX instance
cbf0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
cc00: 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43   *.A valid SSL_C
cc10: 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e  TX instance or N
cc20: 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ULL.. *. * Side 
cc30: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73  effects:. *.cons
cc40: 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65  tructs SSL conte
cc50: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d  xt (CTX). *. *--
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cca0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c  -. */.static SSL
ccb0: 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28  _CTX *.CTX_Init(
ccc0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
ccd0: 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69   int isServer, i
cce0: 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a  nt proto, char *
ccf0: 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63  keyfile, char *c
cd00: 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73  ertfile,.    uns
cd10: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c  igned char *key,
cd20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
cd30: 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65  cert, int key_le
cd40: 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c  n, int cert_len,
cd50: 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20   char *CAdir,.  
cd60: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20    char *CAfile, 
cd70: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63  char *ciphers, c
cd80: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
cd90: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68  s, int level, ch
cda0: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a  ar *DHparams) {.
cdb0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
cdc0: 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74  interp = statePt
cdd0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53  r->interp;.    S
cde0: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  SL_CTX *ctx = NU
cdf0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  LL;.    Tcl_DStr
ce00: 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f  ing ds;.    Tcl_
ce10: 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20  DString ds1;.   
ce20: 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20   int off = 0;.  
ce30: 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61    int load_priva
ce40: 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73  te_key;.    cons
ce50: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65  t SSL_METHOD *me
ce60: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e  thod;..    dprin
ce70: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
ce80: 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b     if (!proto) {
ce90: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
cea0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76  lt(interp, "no v
ceb0: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65  alid protocol se
cec0: 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  lected", NULL);.
ced0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
cee0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61    }..    /* crea
cef0: 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a  te SSL context *
cf00: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
cf10: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20  RSION_NUMBER >= 
cf20: 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64  0x10100000L || d
cf30: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
cf40: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
cf50: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20  SL_NO_SSL2).    
cf60: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
cf70: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
cf80: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
cf90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
cfa0: 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e  "SSL2 protocol n
cfb0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
cfc0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
cfd0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
cfe0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
cff0: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL3) || defined
d000: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
d010: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d020: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d030: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c  TO_SSL3)) {..Tcl
d040: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d050: 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74  terp, "SSL3 prot
d060: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d070: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
d080: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
d090: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
d0a0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
d0b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d0c0: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28  O_TLS1).    if (
d0d0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
d0e0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20  LS_PROTO_TLS1)) 
d0f0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
d100: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
d110: 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.0 protocol no
d120: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
d130: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d140: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
d150: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
d160: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_1) || define
d170: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d180: 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41  1_1).    if (ENA
d190: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
d1a0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b  PROTO_TLS1_1)) {
d1b0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d1c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
d1d0: 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.1 protocol not
d1e0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
d1f0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
d200: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
d210: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
d220: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
d230: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d240: 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  _2).    if (ENAB
d250: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d260: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a  ROTO_TLS1_2)) {.
d270: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d280: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
d290: 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .2 protocol not 
d2a0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
d2b0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
d2c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
d2d0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
d2e0: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_3) || defined(
d2f0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d300: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  3).    if (ENABL
d310: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
d320: 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09  OTO_TLS1_3)) {..
d330: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d340: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
d350: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  3 protocol not s
d360: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
d370: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d380: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
d390: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29   if (proto == 0)
d3a0: 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20   {../* Use full 
d3b0: 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54  range */..SSL_CT
d3c0: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
d3d0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b  version(ctx, 0);
d3e0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61  ..SSL_CTX_set_ma
d3f0: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  x_proto_version(
d400: 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ctx, 0);.    }..
d410: 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74      switch (prot
d420: 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  o) {.#if OPENSSL
d430: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
d440: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
d450: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
d460: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
d470: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
d480: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
d490: 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64  TO_SSL2:..method
d4a0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53   = isServer ? SS
d4b0: 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  Lv2_server_metho
d4c0: 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65  d() : SSLv2_clie
d4d0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
d4e0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
d4f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
d500: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d510: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26  ENSSL_NO_SSL3) &
d520: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d530: 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f  SL_NO_SSL3_METHO
d540: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  D).    case TLS_
d550: 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74  PROTO_SSL3:..met
d560: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
d570: 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65   SSLv3_server_me
d580: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63  thod() : SSLv3_c
d590: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
d5a0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
d5b0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
d5c0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
d5d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d5e0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d5f0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
d600: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
d610: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09  LS_PROTO_TLS1:..
d620: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
d630: 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72  r ? TLSv1_server
d640: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76  _method() : TLSv
d650: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  1_client_method(
d660: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
d670: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
d680: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
d690: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d6a0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
d6b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d6c0: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_1_METHOD). 
d6d0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
d6e0: 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f  O_TLS1_1:..metho
d6f0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
d700: 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65  LSv1_1_server_me
d710: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31  thod() : TLSv1_1
d720: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
d730: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
d740: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
d750: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
d760: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d770: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
d780: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d790: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_2_METHOD).  
d7a0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
d7b0: 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64  _TLS1_2:..method
d7c0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
d7d0: 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74  Sv1_2_server_met
d7e0: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f  hod() : TLSv1_2_
d7f0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
d800: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
d810: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
d820: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
d830: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d840: 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20  LS1_3).    case 
d850: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
d860: 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65  :../* Use the ge
d870: 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64  neric method and
d880: 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67   constraint rang
d890: 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20  e after context 
d8a0: 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d  is created */..m
d8b0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
d8c0: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65   ? TLS_server_me
d8d0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69  thod() : TLS_cli
d8e0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
d8f0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  reak;.#endif.   
d900: 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65   default:../* Ne
d910: 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20  gotiate highest 
d920: 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c  available SSL/TL
d930: 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65  S version */..me
d940: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
d950: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74  ? TLS_server_met
d960: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65  hod() : TLS_clie
d970: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66  nt_method();.#if
d980: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
d990: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
d9a0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
d9b0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
d9c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d9d0: 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20  O_SSL2)..off |= 
d9e0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
d9f0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20  TLS_PROTO_SSL2) 
da00: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
da10: 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66  O_SSLv2);.#endif
da20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
da30: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
da40: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
da50: 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  L3)..off |= (ENA
da60: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
da70: 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20  PROTO_SSL3)   ? 
da80: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53  0 : SSL_OP_NO_SS
da90: 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  Lv3);.#endif.#if
daa0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
dab0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
dac0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
dad0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
dae0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
daf0: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20  O_TLS1)   ? 0 : 
db00: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29  SSL_OP_NO_TLSv1)
db10: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
db20: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
db30: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
db40: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
db50: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
db60: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
db70: 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20  O_TLS1_1) ? 0 : 
db80: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
db90: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  1);.#endif.#if !
dba0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
dbb0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
dbc0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
dbd0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
dbe0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
dbf0: 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20  OTO_TLS1_2) ? 0 
dc00: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
dc10: 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  1_2);.#endif.#if
dc20: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
dc30: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
dc40: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
dc50: 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _3)..off |= (ENA
dc60: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
dc70: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20  PROTO_TLS1_3) ? 
dc80: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
dc90: 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09  Sv1_3);.#endif..
dca0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
dcb0: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
dcc0: 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20  r();..    ctx = 
dcd0: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68  SSL_CTX_new(meth
dce0: 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74  od);.    if (!ct
dcf0: 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c  x) {..return(NUL
dd00: 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  L);.    }..    i
dd10: 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59  f (getenv(SSLKEY
dd20: 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c  LOGFILE)) {..SSL
dd30: 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f  _CTX_set_keylog_
dd40: 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65  callback(ctx, Ke
dd50: 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  yLogCallback);. 
dd60: 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
dd70: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
dd80: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
dd90: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
dda0: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c   if (proto == TL
ddb0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20  S_PROTO_TLS1_3) 
ddc0: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  {..SSL_CTX_set_m
ddd0: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
dde0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
ddf0: 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  SION);..SSL_CTX_
de00: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
de10: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
de20: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20  3_VERSION);.    
de30: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
de40: 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65   Force cipher se
de50: 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79  lection order by
de60: 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69   server */.    i
de70: 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a  f (!isServer) {.
de80: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74  .SSL_CTX_set_opt
de90: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50  ions(ctx, SSL_OP
dea0: 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50  _CIPHER_SERVER_P
deb0: 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20  REFERENCE);.    
dec0: 7d 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  }..    SSL_CTX_s
ded0: 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c  et_app_data(ctx,
dee0: 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b   (void*)interp);
def0: 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65  ./* remember the
df00: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a   interpreter */.
df10: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
df20: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c  options(ctx, SSL
df30: 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c  _OP_ALL);./* all
df40: 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f   SSL bug workaro
df50: 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  unds */.    SSL_
df60: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
df70: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43  ctx, SSL_OP_NO_C
df80: 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20  OMPRESSION);./* 
df90: 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73  disable compress
dfa0: 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70  ion even if supp
dfb0: 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c  orted */.    SSL
dfc0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
dfd0: 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20  (ctx, off);../* 
dfe0: 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c  disable protocol
dff0: 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66   versions */.#if
e000: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
e010: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
e020: 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54  1000L.    SSL_CT
e030: 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20  X_set_mode(ctx, 
e040: 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45  SSL_MODE_AUTO_RE
e050: 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20  TRY);./* handle 
e060: 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69  new handshakes i
e070: 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e  n background. On
e080: 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f   by default in O
e090: 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f  penSSL 1.1.1. */
e0a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f  .#endif.    SSL_
e0b0: 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63  CTX_sess_set_cac
e0c0: 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38  he_size(ctx, 128
e0d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  );..    /* Set u
e0e0: 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68  ser defined ciph
e0f0: 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74  ers, cipher suit
e100: 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79  es, and security
e110: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66   level */.    if
e120: 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55   ((ciphers != NU
e130: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f  LL) && !SSL_CTX_
e140: 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28  set_cipher_list(
e150: 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b  ctx, ciphers)) {
e160: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
e170: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
e180: 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20  ciphers failed: 
e190: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73  No valid ciphers
e1a0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
e1b0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
e1c0: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
e1d0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
e1e0: 66 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73  f ((ciphersuites
e1f0: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53   != NULL) && !SS
e200: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72  L_CTX_set_cipher
e210: 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68  suites(ctx, ciph
e220: 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63  ersuites)) {..Tc
e230: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e240: 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68  nterp, "Set ciph
e250: 65 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64  er suites failed
e260: 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65  : No valid ciphe
e270: 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  rs", (char *) NU
e280: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  LL);..SSL_CTX_fr
e290: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e  ee(ctx);..return
e2a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
e2b0: 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74    /* Set securit
e2c0: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  y level */.    i
e2d0: 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26  f (level > -1 &&
e2e0: 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f   level < 6) {../
e2f0: 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69  * SSL_set_securi
e300: 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c  ty_level */..SSL
e310: 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74  _CTX_set_securit
e320: 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76  y_level(ctx, lev
e330: 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  el);.    }..    
e340: 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c  /* set some call
e350: 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c  backs */.    SSL
e360: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
e370: 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20  _passwd_cb(ctx, 
e380: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b  PasswordCallback
e390: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  );.    SSL_CTX_s
e3a0: 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77  et_default_passw
e3b0: 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74  d_cb_userdata(ct
e3c0: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  x, (void *)state
e3d0: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65  Ptr);..    /* re
e3e0: 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c  ad a Diffie-Hell
e3f0: 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66  man parameters f
e400: 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20  ile, or use the 
e410: 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a  built-in one */.
e420: 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e  #ifdef OPENSSL_N
e430: 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70  O_DH.    if (DHp
e440: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  arams != NULL) {
e450: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
e460: 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70  lt(interp, "DH p
e470: 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74  arameter support
e480: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c   not available",
e490: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
e4a0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
e4b0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
e4c0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  L;.    }.#else. 
e4d0: 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69     {..DH* dh;..i
e4e0: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e  f (DHparams != N
e4f0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20  ULL) {..    BIO 
e500: 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44  *bio;..    Tcl_D
e510: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b  StringInit(&ds);
e520: 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f  ..    bio = BIO_
e530: 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70  new_file(F2N(DHp
e540: 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22  arams, &ds), "r"
e550: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f  );..    if (!bio
e560: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  ) {...Tcl_DStrin
e570: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63  gFree(&ds);...Tc
e580: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e590: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f  nterp, "Could no
e5a0: 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65  t find DH parame
e5b0: 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61  ters file", (cha
e5c0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
e5d0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e5e0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
e5f0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20  .    }...    dh 
e600: 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44  = PEM_read_bio_D
e610: 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c  Hparams(bio, NUL
e620: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  L, NULL, NULL);.
e630: 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69  .    BIO_free(bi
e640: 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  o);..    Tcl_DSt
e650: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
e660: 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09      if (!dh) {..
e670: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
e680: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64  t(interp, "Could
e690: 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72   not read DH par
e6a0: 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c  ameters from fil
e6b0: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
e6c0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
e6d0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
e6e0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
e6f0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 68  } else {..    dh
e700: 20 3d 20 67 65 74 5f 64 68 50 61 72 61 6d 73 28   = get_dhParams(
e710: 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73  );..}..SSL_CTX_s
e720: 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64  et_tmp_dh(ctx, d
e730: 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29  h);..DH_free(dh)
e740: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
e750: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63      /* set our c
e760: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20  ertificate */.  
e770: 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b    load_private_k
e780: 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28  ey = 0;.    if (
e790: 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  certfile != NULL
e7a0: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74  ) {..load_privat
e7b0: 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c  e_key = 1;...Tcl
e7c0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
e7d0: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58  );...if (SSL_CTX
e7e0: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65  _use_certificate
e7f0: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63  _file(ctx, F2N(c
e800: 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53  ertfile, &ds), S
e810: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
e820: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63   <= 0) {..    Tc
e830: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e840: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  s);..    Tcl_App
e850: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e860: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
e870: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c   certificate fil
e880: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22  e ", certfile, "
e890: 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41  : ",....     REA
e8a0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
e8b0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
e8c0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e8d0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
e8e0: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ..}.    } else i
e8f0: 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29  f (cert != NULL)
e900: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65   {..load_private
e910: 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53  _key = 1;..if (S
e920: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69  SL_CTX_use_certi
e930: 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c  ficate_ASN1(ctx,
e940: 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29   cert_len, cert)
e950: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63   <= 0) {..    Tc
e960: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e970: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  s);..    Tcl_App
e980: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e990: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
e9a0: 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c   certificate: ",
e9b0: 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28  ....     REASON(
e9c0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
e9d0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
e9e0: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20  free(ctx);..    
e9f0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a  return NULL;..}.
ea00: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65      } else {..ce
ea10: 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29  rtfile = (char*)
ea20: 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74  X509_get_default
ea30: 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09  _cert_file();...
ea40: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
ea50: 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65  certificate_file
ea60: 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20  (ctx, certfile, 
ea70: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
ea80: 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a  ) <= 0) {.#if 0.
ea90: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
eaa0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20  Free(&ds);..    
eab0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
eac0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
ead0: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20   to use default 
eae0: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65  certificate file
eaf0: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a   ", certfile, ":
eb00: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53   ",....     REAS
eb10: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
eb20: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
eb30: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
eb40: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
eb50: 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a  #endif..}.    }.
eb60: 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20  .    /* set our 
eb70: 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20  private key */. 
eb80: 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76     if (load_priv
eb90: 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28  ate_key) {..if (
eba0: 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20  keyfile == NULL 
ebb0: 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20  && key == NULL) 
ebc0: 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d  {..    keyfile =
ebd0: 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09   certfile;..}...
ebe0: 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e  if (keyfile != N
ebf0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67  ULL) {..    /* g
ec00: 65 74 20 74 68 65 20 70 72 69 76 61 74 65 20 6b  et the private k
ec10: 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
ec20: 74 68 20 74 68 69 73 20 63 65 72 74 69 66 69 63  th this certific
ec30: 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28  ate */..    if (
ec40: 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29  keyfile == NULL)
ec50: 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63   {...keyfile = c
ec60: 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a  ertfile;..    }.
ec70: 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54  ..    if (SSL_CT
ec80: 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79  X_use_PrivateKey
ec90: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b  _file(ctx, F2N(k
eca0: 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53  eyfile, &ds), SS
ecb0: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20  L_FILETYPE_PEM) 
ecc0: 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53  <= 0) {...Tcl_DS
ecd0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
ece0: 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70  ../* flush the p
ecf0: 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20  assphrase which 
ed00: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e  might be left in
ed10: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09   the result */..
ed20: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
ed30: 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c  nterp, NULL, TCL
ed40: 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f  _STATIC);...Tcl_
ed50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ed60: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
ed70: 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66  set public key f
ed80: 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20  ile ", keyfile, 
ed90: 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20 20 20  " ",....        
eda0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
edb0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c   *) NULL);...SSL
edc0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
edd0: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09  ..return NULL;..
ede0: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
edf0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
ee00: 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65  ...} else if (ke
ee10: 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  y != NULL) {..  
ee20: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73    if (SSL_CTX_us
ee30: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e  e_PrivateKey_ASN
ee40: 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20  1(EVP_PKEY_RSA, 
ee50: 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e  ctx, key,key_len
ee60: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f  ) <= 0) {...Tcl_
ee70: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
ee80: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65  ;.../* flush the
ee90: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63   passphrase whic
eea0: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  h might be left 
eeb0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
eec0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
eed0: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54  (interp, NULL, T
eee0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63  CL_STATIC);...Tc
eef0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ef00: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
ef10: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79  o set public key
ef20: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28  : ", REASON(), (
ef30: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
ef40: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
ef50: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
ef60: 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a  L;..    }..}../*
ef70: 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61   Now we know tha
ef80: 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74  t a key and cert
ef90: 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61   have been set a
efa0: 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53  gainst.. * the S
efb0: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69  SL context */..i
efc0: 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63  f (!SSL_CTX_chec
efd0: 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74  k_private_key(ct
efe0: 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  x)) {..    Tcl_A
eff0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f000: 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79  rp, "private key
f010: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
f020: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
f030: 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09  public key",....
f040: 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55       (char *) NU
f050: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
f060: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
f070: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
f080: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
f090: 53 65 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e  Set verification
f0a0: 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f   CAs */.    Tcl_
f0b0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
f0c0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
f0d0: 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20  gInit(&ds1);.   
f0e0: 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65   /* There is one
f0f0: 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f   default directo
f100: 72 79 2c 20 6f 6e 65 20 64 65 66 61 75 6c 74 20  ry, one default 
f110: 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 20 64 65  file, and one de
f120: 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a 09 54 68  fault store...Th
f130: 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 65 72  e default CA cer
f140: 74 69 66 69 63 61 74 65 73 20 64 69 72 65 63 74  tificates direct
f150: 6f 72 79 20 28 61 6e 64 20 64 65 66 61 75 6c 74  ory (and default
f160: 20 73 74 6f 72 65 29 20 69 73 20 69 6e 20 74 68   store) is in th
f170: 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65 72 74 73  e OpenSSL..certs
f180: 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63   directory. It c
f190: 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  an be overridden
f1a0: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54   by the SSL_CERT
f1b0: 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68  _DIR env var. Th
f1c0: 65 0a 09 64 65 66 61 75 6c 74 20 43 41 20 63 65  e..default CA ce
f1d0: 72 74 69 66 69 63 61 74 65 73 20 66 69 6c 65 20  rtificates file 
f1e0: 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74 2e 70  is called cert.p
f1f0: 65 6d 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c  em in the defaul
f200: 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69 72 65 63  t OpenSSL..direc
f210: 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 65 20  tory. It can be 
f220: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
f230: 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20  e SSL_CERT_FILE 
f240: 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a 20  env var. */../* 
f250: 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  int SSL_CTX_set_
f260: 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 64  default_verify_d
f270: 69 72 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 29  ir(SSL_CTX *ctx)
f280: 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f 43 54 58   and int SSL_CTX
f290: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72  _set_default_ver
f2a0: 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f 43 54 58  ify_file(SSL_CTX
f2b0: 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20 20 69 66   *ctx) */.    if
f2c0: 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f   (!SSL_CTX_load_
f2d0: 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73  verify_locations
f2e0: 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65  (ctx, F2N(CAfile
f2f0: 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64 69  , &ds), F2N(CAdi
f300: 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 53  r, &ds1)) ||..!S
f310: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
f320: 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28  lt_verify_paths(
f330: 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54  ctx)) {.#if 0..T
f340: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
f350: 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e  ds);..Tcl_DStrin
f360: 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a  gFree(&ds1);../*
f370: 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79   Don't currently
f380: 20 63 61 72 65 20 69 66 20 74 68 69 73 20 66 61   care if this fa
f390: 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65  ils */..Tcl_Appe
f3a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f3b0: 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65   "SSL default ve
f3c0: 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c 20 52  rify paths: ", R
f3d0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
f3e0: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
f3f0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
f400: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  turn NULL;.#endi
f410: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
f420: 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f  https://sourcefo
f430: 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75  rge.net/p/tls/bu
f440: 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a  gs/57/ */.    /*
f450: 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74   XXX:TODO: Let t
f460: 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76  he user supply v
f470: 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65  alues here inste
f480: 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20  ad of something 
f490: 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74  that exists on t
f4a0: 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f  he filesystem */
f4b0: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20  .    if (CAfile 
f4c0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 43  != NULL) {..STAC
f4d0: 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20  K_OF(X509_NAME) 
f4e0: 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c  *certNames = SSL
f4f0: 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f  _load_client_CA_
f500: 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c  file(F2N(CAfile,
f510: 20 26 64 73 29 29 3b 0a 09 69 66 20 28 63 65 72   &ds));..if (cer
f520: 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20  tNames != NULL) 
f530: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  {..    SSL_CTX_s
f540: 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73  et_client_CA_lis
f550: 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73  t(ctx, certNames
f560: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
f570: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
f580: 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44  (&ds);.    Tcl_D
f590: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29  StringFree(&ds1)
f5a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78  ;.    return ctx
f5b0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
f5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
f600: 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d  *. * StatusObjCm
f610: 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74  d -- return cert
f620: 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e  ificate for conn
f630: 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20  ected peer.. *. 
f640: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
f650: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
f660: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
f670: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
f680: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
f690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
f6d0: 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73  tatic int.Status
f6e0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
f6f0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
f700: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f710: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
f720: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
f730: 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  ]) {.    State *
f740: 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35  statePtr;.    X5
f750: 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63  09 *peer;.    Tc
f760: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20  l_Obj *objPtr;. 
f770: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
f780: 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  han;.    char *c
f790: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70  hannelName, *cip
f7a0: 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f  hers;.    int mo
f7b0: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  de;.    const un
f7c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f  signed char *pro
f7d0: 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  to;.    unsigned
f7e0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e   int len;.    in
f7f0: 74 20 6e 69 64 3b 0a 0a 20 20 20 20 64 70 72 69  t nid;..    dpri
f800: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
f810: 20 20 20 20 73 77 69 74 63 68 20 28 6f 62 6a 63      switch (objc
f820: 29 20 7b 0a 09 63 61 73 65 20 32 3a 0a 09 20 20  ) {..case 2:..  
f830: 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20    channelName = 
f840: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
f850: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55  mObj(objv[1], NU
f860: 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  LL);..    break;
f870: 0a 0a 09 63 61 73 65 20 33 3a 0a 09 20 20 20 20  ...case 3:..    
f880: 69 66 20 28 21 73 74 72 63 6d 70 20 28 54 63 6c  if (!strcmp (Tcl
f890: 5f 47 65 74 53 74 72 69 6e 67 20 28 6f 62 6a 76  _GetString (objv
f8a0: 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29  [1]), "-local"))
f8b0: 20 7b 0a 09 09 63 68 61 6e 6e 65 6c 4e 61 6d 65   {...channelName
f8c0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f8d0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
f8e0: 20 4e 55 4c 4c 29 3b 0a 09 09 62 72 65 61 6b 3b   NULL);...break;
f8f0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2f 2a 20  ..    }..    /* 
f900: 65 6c 73 65 20 66 61 6c 6c 2d 74 68 72 6f 75 67  else fall-throug
f910: 68 20 2e 2e 2e 20 2a 2f 0a 23 69 66 20 64 65 66  h ... */.#if def
f920: 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09  ined(__GNUC__)..
f930: 20 20 20 20 5f 5f 61 74 74 72 69 62 75 74 65 5f      __attribute_
f940: 5f 28 28 66 61 6c 6c 74 68 72 6f 75 67 68 29 29  _((fallthrough))
f950: 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c  ;.#endif..defaul
f960: 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e  t:..    Tcl_Wron
f970: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
f980: 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63   1, objv, "?-loc
f990: 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  al? channel");..
f9a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f9b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
f9c0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
f9d0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
f9e0: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64  hannelName, &mod
f9f0: 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  e);.    if (chan
fa00: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
fa10: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
fa20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
fa30: 20 7d 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73   }.    /* Make s
fa40: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
fa50: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
fa60: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
fa70: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
fa80: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20  annel(chan);.   
fa90: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
faa0: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
fab0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
fac0: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
fad0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
fae0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
faf0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
fb00: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
fb10: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
fb20: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54  nnel", NULL);..T
fb30: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
fb40: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
fb50: 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45  STATUS", "CHANNE
fb60: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
fb70: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
fb80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fb90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74  ;.    }.    stat
fba0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
fbb0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49   Tcl_GetChannelI
fbc0: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
fbd0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63  );..    /* Get c
fbe0: 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 70  ertificate for p
fbf0: 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20  eer or self */. 
fc00: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
fc10: 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f  ) {..peer = SSL_
fc20: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69  get_peer_certifi
fc30: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  cate(statePtr->s
fc40: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  sl);.    } else 
fc50: 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65  {..peer = SSL_ge
fc60: 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74  t_certificate(st
fc70: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
fc80: 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58    }.    /* Get X
fc90: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
fca0: 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28  info */.    if (
fcb0: 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20  peer) {..objPtr 
fcc0: 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a  = Tls_NewX509Obj
fcd0: 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a  (interp, peer);.
fce0: 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20  .if (objc == 2) 
fcf0: 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65 65  {..    X509_free
fd00: 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65  (peer);..    pee
fd10: 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20  r = NULL;..}.   
fd20: 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74   } else {..objPt
fd30: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
fd40: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
fd50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20   }..    /* Peer 
fd60: 63 65 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65  cert chain (clie
fd70: 6e 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20  nt only) */.    
fd80: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20  STACK_OF(X509)* 
fd90: 73 73 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f  ssl_certs = SSL_
fda0: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68  get_peer_cert_ch
fdb0: 61 69 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ain(statePtr->ss
fdc0: 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 5f  l);.    if (ssl_
fdd0: 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  certs == NULL ||
fde0: 20 73 6b 5f 58 35 30 39 5f 6e 75 6d 28 73 73 6c   sk_X509_num(ssl
fdf0: 5f 63 65 72 74 73 29 20 3d 3d 20 30 29 20 7b 0a  _certs) == 0) {.
fe00: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
fe10: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
fe20: 20 22 53 54 41 54 55 53 22 2c 20 22 43 45 52 54   "STATUS", "CERT
fe30: 49 46 49 43 41 54 45 22 2c 20 28 63 68 61 72 20  IFICATE", (char 
fe40: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 49  *) NULL);..Tcl_I
fe50: 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 50  ncrRefCount(objP
fe60: 74 72 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65  tr);..Tcl_DecrRe
fe70: 66 43 6f 75 6e 74 28 6f 62 6a 50 74 72 29 3b 0a  fCount(objPtr);.
fe80: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
fe90: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
fea0: 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20   Peer name */.  
feb0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
fec0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
fed0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
fee0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65  ewStringObj("pee
fef0: 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20  rname", -1));.  
ff00: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
ff10: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
ff20: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
ff30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
ff40: 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74  get0_peername(st
ff50: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31  atePtr->ssl), -1
ff60: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73  ));..    Tcl_Lis
ff70: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
ff80: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
ff90: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
ffa0: 62 6a 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29  bj("sbits", -1))
ffb0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
ffc0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
ffd0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
ffe0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c  cl_NewIntObj(SSL
fff0: 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73  _get_cipher_bits
10000 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
10010 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63 69  NULL)));..    ci
10020 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53  phers = (char*)S
10030 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74  SL_get_cipher(st
10040 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
10050 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21    if ((ciphers !
10060 3d 20 4e 55 4c 4c 29 20 26 26 20 28 73 74 72 63  = NULL) && (strc
10070 6d 70 28 63 69 70 68 65 72 73 2c 20 22 28 4e 4f  mp(ciphers, "(NO
10080 4e 45 29 22 29 20 21 3d 20 30 29 29 20 7b 0a 09  NE)") != 0)) {..
10090 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
100a0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
100b0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
100c0 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65  StringObj("ciphe
100d0 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  r", -1));..Tcl_L
100e0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
100f0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
10100 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
10110 67 4f 62 6a 28 63 69 70 68 65 72 73 2c 20 2d 31  gObj(ciphers, -1
10120 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
10130 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30  * Verify the X50
10140 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72  9 certificate pr
10150 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70  esented by the p
10160 65 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c  eer */.    Tcl_L
10170 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10180 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
10190 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
101a0 67 4f 62 6a 28 22 76 65 72 69 66 79 52 65 73 75  gObj("verifyResu
101b0 6c 74 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lt", -1));.    T
101c0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
101d0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
101e0 6f 62 6a 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77  objPtr,..Tcl_New
101f0 53 74 72 69 6e 67 4f 62 6a 28 58 35 30 39 5f 76  StringObj(X509_v
10200 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72  erify_cert_error
10210 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f  _string(SSL_get_
10220 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74  verify_result(st
10230 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d  atePtr->ssl)), -
10240 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  1));..    /* Ver
10250 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  ify mode */.    
10260 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10270 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10280 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
10290 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66  StringObj("verif
102a0 79 4d 6f 64 65 22 2c 20 2d 31 29 29 3b 0a 20 20  yMode", -1));.  
102b0 20 20 2f 2a 20 53 53 4c 5f 43 54 58 5f 67 65 74    /* SSL_CTX_get
102c0 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 63 74 78  _verify_mode(ctx
102d0 29 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20  ) */.    mode = 
102e0 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d  SSL_get_verify_m
102f0 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ode(statePtr->ss
10300 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65  l);.    if (mode
10310 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e   && SSL_VERIFY_N
10320 4f 4e 45 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74  ONE) {..Tcl_List
10330 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10340 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10350 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10360 6a 28 22 6e 6f 6e 65 22 2c 20 2d 31 29 29 3b 0a  j("none", -1));.
10370 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
10380 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74  l_Obj *listObjPt
10390 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
103a0 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  bj(0, NULL);..if
103b0 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
103c0 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20  RIFY_PEER) {..  
103d0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
103e0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
103f0 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54  p, listObjPtr, T
10400 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10410 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d  "peer", -1));..}
10420 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53  ..if (mode && SS
10430 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
10440 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
10450 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
10460 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10470 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
10480 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10490 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20  Obj("fail if no 
104a0 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29  peer cert", -1))
104b0 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26  ;..}..if (mode &
104c0 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49  & SSL_VERIFY_CLI
104d0 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20  ENT_ONCE) {..   
104e0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
104f0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10500 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
10510 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10520 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31  client once", -1
10530 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65  ));..}..if (mode
10540 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50   && SSL_VERIFY_P
10550 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b  OST_HANDSHAKE) {
10560 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
10570 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10580 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
10590 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
105a0 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68  Obj("post handsh
105b0 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ake", -1));..}..
105c0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
105d0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
105e0 20 6f 62 6a 50 74 72 2c 20 6c 69 73 74 4f 62 6a   objPtr, listObj
105f0 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Ptr);.    }..   
10600 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20   /* Verify mode 
10610 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 54 63 6c  depth */.    Tcl
10620 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10630 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
10640 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10650 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 44 65  ingObj("verifyDe
10660 70 74 68 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  pth", -1));.    
10670 2f 2a 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 76  /* SSL_CTX_get_v
10680 65 72 69 66 79 5f 64 65 70 74 68 28 63 74 78 29  erify_depth(ctx)
10690 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74   */.    Tcl_List
106a0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
106b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
106c0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53   Tcl_NewIntObj(S
106d0 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65  SL_get_verify_de
106e0 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73  pth(statePtr->ss
106f0 6c 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  l)));..    /* Re
10700 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
10710 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
10720 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65  result of the ne
10730 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  gotiation */.   
10740 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73   SSL_get0_alpn_s
10750 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72  elected(statePtr
10760 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  ->ssl, &proto, &
10770 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  len);.    Tcl_Li
10780 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10790 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
107a0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
107b0 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29  Obj("alpn", -1))
107c0 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
107d0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
107e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
107f0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10800 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28  (char *)proto, (
10810 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 20 20 20 20  int) len));.    
10820 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10830 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10840 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
10850 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f  StringObj("proto
10860 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  col", -1));.    
10870 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10880 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10890 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
108a0 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65  StringObj(SSL_ge
108b0 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50  t_version(stateP
108c0 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a  tr->ssl), -1));.
108d0 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f  .    /* Valid fo
108e0 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74  r non-RSA signat
108f0 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20  ure and TLS 1.3 
10900 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  */.    Tcl_ListO
10910 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10920 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10930 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10940 28 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41  ("signatureHashA
10950 6c 67 6f 72 69 74 68 6d 22 2c 20 2d 31 29 29 3b  lgorithm", -1));
10960 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
10970 20 32 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65   2 ? SSL_get_pee
10980 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28  r_signature_nid(
10990 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
109a0 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73  nid) : SSL_get_s
109b0 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61  ignature_nid(sta
109c0 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64  tePtr->ssl, &nid
109d0 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  )) {..Tcl_ListOb
109e0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
109f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
10a00 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10a10 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c  OBJ_nid2ln(nid),
10a20 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73   -1));.    } els
10a30 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  e {..Tcl_ListObj
10a40 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10a50 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
10a60 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10a70 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20  ", -1));.    }. 
10a80 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
10a90 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10aa0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10ab0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69  NewStringObj("si
10ac0 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20 2d 31  gnatureType", -1
10ad0 29 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  ));.    if (objc
10ae0 20 3d 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74 5f   == 2 ? SSL_get_
10af0 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74  peer_signature_t
10b00 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ype_nid(statePtr
10b10 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 53  ->ssl, &nid) : S
10b20 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65  SL_get_signature
10b30 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50  _type_nid(stateP
10b40 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29 20  tr->ssl, &nid)) 
10b50 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
10b60 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10b70 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10b80 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a  NewStringObj(OBJ
10b90 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31  _nid2ln(nid), -1
10ba0 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ));.    } else {
10bb0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
10bc0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10bd0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10be0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20  ewStringObj("", 
10bf0 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  -1));.    }..   
10c00 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10c10 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10c20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10c30 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
10c40 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
10c50 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
10c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
10ca0 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66   * ConnectionInf
10cb0 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  oObjCmd -- retur
10cc0 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66  n connection inf
10cd0 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a  o from OpenSSL..
10ce0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
10cf0 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e  *.A list of conn
10d00 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a  ection info.  *.
10d10 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
10d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d50 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
10d60 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e  c int Connection
10d70 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  InfoObjCmd(Clien
10d80 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
10d90 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
10da0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
10db0 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
10dc0 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
10dd0 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
10de0 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
10df0 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e  o set a mode on.
10e00 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73   */.    State *s
10e10 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69  tatePtr;../* cli
10e20 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73  ent state for ss
10e30 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20  l socket */.    
10e40 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c  Tcl_Obj *objPtr,
10e50 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63   *listPtr;.    c
10e60 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20  onst SSL *ssl;. 
10e70 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50     const SSL_CIP
10e80 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20  HER *cipher;.   
10e90 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49   const SSL_SESSI
10ea0 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20  ON *session;.   
10eb0 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20   long mode;..   
10ec0 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
10ed0 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
10ee0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
10ef0 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b  bjv, "channel");
10f00 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
10f10 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OR);.    }..    
10f20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
10f30 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
10f40 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10f50 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c  bj(objv[1], NULL
10f60 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
10f70 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
10f80 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
10f90 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
10fa0 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  R);.    }..    /
10fb0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
10fc0 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
10fd0 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
10fe0 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
10ff0 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
11000 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c  an);.    if (Tcl
11010 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
11020 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
11030 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54  nnelType()) {..T
11040 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11050 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
11060 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
11070 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
11080 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f  n),..    "\": no
11090 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
110a0 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  , NULL);..Tcl_Se
110b0 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
110c0 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45  p, "TLS", "CONNE
110d0 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c  CTION", "CHANNEL
110e0 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
110f0 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
11100 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
11110 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a  ;.    }..    obj
11120 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
11130 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a  tObj(0, NULL);..
11140 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
11150 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74  n info */.    st
11160 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
11170 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
11180 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61  InstanceData(cha
11190 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74  n);.    ssl = st
111a0 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20  atePtr->ssl;.   
111b0 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c   if (ssl != NULL
111c0 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69  ) {../* connecti
111d0 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 54 63 6c  on state */..Tcl
111e0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
111f0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11200 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11210 69 6e 67 4f 62 6a 28 22 73 74 61 74 65 22 2c 20  ingObj("state", 
11220 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
11230 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11240 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11250 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11260 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e  (SSL_state_strin
11270 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29  g_long(ssl), -1)
11280 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20  );.../* Get SNI 
11290 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72  requested server
112a0 20 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69   name */..Tcl_Li
112b0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
112c0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
112d0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
112e0 4f 62 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 22  Obj("servername"
112f0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
11300 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11310 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
11320 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11330 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 65  bj(SSL_get_serve
11340 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58  rname(ssl, TLSEX
11350 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
11360 6e 61 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f  name), -1));.../
11370 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a  * Get protocol *
11380 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
11390 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
113a0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
113b0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72  NewStringObj("pr
113c0 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09  otocol", -1));..
113d0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
113e0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
113f0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
11400 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65  StringObj(SSL_ge
11410 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20  t_version(ssl), 
11420 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67  -1));.../* Reneg
11430 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64  otiation allowed
11440 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   */..Tcl_ListObj
11450 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11460 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
11470 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
11480 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20  renegotiation", 
11490 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
114a0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
114b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
114c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
114d0 28 0a 09 20 20 20 20 53 53 4c 5f 67 65 74 5f 73  (..    SSL_get_s
114e0 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74  ecure_renegotiat
114f0 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29  ion_support(ssl)
11500 20 3f 20 22 73 75 70 70 6f 72 74 65 64 22 20 3a   ? "supported" :
11510 20 22 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22   "not supported"
11520 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74  , -1));.../* Get
11530 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
11540 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  */..Tcl_ListObjA
11550 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11560 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11570 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
11580 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 2d  ecuritylevel", -
11590 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
115a0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
115b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
115c0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c  cl_NewIntObj(SSL
115d0 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65  _get_security_le
115e0 76 65 6c 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a  vel(ssl)));.../*
115f0 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f   Session info */
11600 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
11610 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11620 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11630 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73  ewStringObj("ses
11640 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31  sion_reused", -1
11650 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
11660 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11670 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
11680 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
11690 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73  SSL_session_reus
116a0 65 64 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20  ed(ssl)));.../* 
116b0 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a  Is server info *
116c0 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
116d0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
116e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
116f0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 73  NewStringObj("is
11700 5f 73 65 72 76 65 72 22 2c 20 2d 31 29 29 3b 0a  _server", -1));.
11710 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11720 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11730 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11740 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f  wBooleanObj(SSL_
11750 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 29  is_server(ssl)))
11760 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11770 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20  Cipher info */. 
11780 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f     cipher = SSL_
11790 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68  get_current_ciph
117a0 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20  er(ssl);.    if 
117b0 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29  (cipher != NULL)
117c0 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46   {..char buf[BUF
117d0 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74  SIZ] = {0};..int
117e0 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b   bits, alg_bits;
117f0 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
11800 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11810 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11820 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69  NewStringObj("ci
11830 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63  pher", -1));..Tc
11840 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11850 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
11860 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
11870 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48  ringObj(SSL_CIPH
11880 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68  ER_get_name(ciph
11890 65 72 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  er), -1));..Tcl_
118a0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
118b0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
118c0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
118d0 6e 67 4f 62 6a 28 22 73 74 61 6e 64 61 72 64 5f  ngObj("standard_
118e0 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63  name", -1));..Tc
118f0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11900 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
11910 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
11920 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48  ringObj(SSL_CIPH
11930 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65  ER_standard_name
11940 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a  (cipher), -1));.
11950 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50  ..bits = SSL_CIP
11960 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70  HER_get_bits(cip
11970 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b  her, &alg_bits);
11980 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
11990 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
119a0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
119b0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63  ewStringObj("sec
119c0 72 65 74 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b  ret_bits", -1));
119d0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
119e0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
119f0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11a00 65 77 49 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b  ewIntObj(bits));
11a10 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
11a20 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11a30 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11a40 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 67  ewStringObj("alg
11a50 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 2d 31  orithm_bits", -1
11a60 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
11a70 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11a80 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
11a90 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6c 67 5f  l_NewIntObj(alg_
11aa0 62 69 74 73 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f  bits));../* alg_
11ab0 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b  bits is actual k
11ac0 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20  ey secret bits. 
11ad0 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20  If use bits and 
11ae0 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68  secret (algorith
11af0 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a  m) bits differ,.
11b00 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20  .   the rest of 
11b10 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78  the bits are fix
11b20 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d  ed, i.e. for lim
11b30 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68  ited export ciph
11b40 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20  ers (bits < 56) 
11b50 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  */..Tcl_ListObjA
11b60 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11b70 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11b80 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d  _NewStringObj("m
11b90 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29  in_version", -1)
11ba0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
11bb0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11bc0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11bd0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
11be0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72  L_CIPHER_get_ver
11bf0 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31  sion(cipher), -1
11c00 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65  ));.../* Get Ope
11c10 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44  nSSL-specific ID
11c20 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f  , not IANA ID */
11c30 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
11c40 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11c50 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11c60 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 64 22  ewStringObj("id"
11c70 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
11c80 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11c90 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
11ca0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
11cb0 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52  (int) SSL_CIPHER
11cc0 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 29  _get_id(cipher))
11cd0 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 49 50  );...if (SSL_CIP
11ce0 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28  HER_description(
11cf0 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a  cipher, buf, siz
11d00 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c  eof(buf)) != NUL
11d10 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  L) {..    Tcl_Li
11d20 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
11d30 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
11d40 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
11d50 4f 62 6a 28 22 64 65 73 63 72 69 70 74 69 6f 6e  Obj("description
11d60 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 63  ", -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 62 75 66 2c 20 2d 31 29  ringObj(buf, -1)
11db0 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
11dc0 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f   /* Session info
11dd0 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20   */.    session 
11de0 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f  = SSL_get_sessio
11df0 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  n(ssl);.    if (
11e00 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29  session != NULL)
11e10 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e   {..const unsign
11e20 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
11e30 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09  ..size_t len2;..
11e40 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65  unsigned int ule
11e50 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n;..const unsign
11e60 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
11e70 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63 68  _id, *proto;..ch
11e80 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41  ar buffer[SSL_MA
11e90 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e  X_MASTER_KEY_LEN
11ea0 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72  GTH];.../* Repor
11eb0 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70  t the selected p
11ec0 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73  rotocol as a res
11ed0 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20  ult of the ALPN 
11ee0 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09  negotiation */..
11ef0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
11f00 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73  _alpn_selected(s
11f10 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20  ession, &proto, 
11f20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73  &len2);..Tcl_Lis
11f30 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11f40 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
11f50 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11f60 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b  bj("alpn", -1));
11f70 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
11f80 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11f90 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11fa0 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
11fb0 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29  r *)proto, (int)
11fc0 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 52 65   len2));.../* Re
11fd0 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
11fe0 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
11ff0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50  result of the NP
12000 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f  N negotiation */
12010 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a  .#ifdef USE_NPN.
12020 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70  .SSL_get0_next_p
12030 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28  roto_negotiated(
12040 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c  ssl, &proto, &ul
12050 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  en);..Tcl_ListOb
12060 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
12070 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
12080 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12090 22 6e 70 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63  "npn", -1));..Tc
120a0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
120b0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
120c0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
120d0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
120e0 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 75 6c 65  proto, (int) ule
120f0 6e 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a  n));.#endif.../*
12100 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69   Resumable sessi
12110 6f 6e 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  on */..Tcl_ListO
12120 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12130 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12140 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12150 28 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 2d 31  ("resumable", -1
12160 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
12170 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
12180 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
12190 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f  l_NewIntObj(SSL_
121a0 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d  SESSION_is_resum
121b0 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 29 3b  able(session)));
121c0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74  .../* Session st
121d0 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64  art time (second
121e0 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a  s since epoch) *
121f0 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
12200 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12210 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
12220 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74  NewStringObj("st
12230 61 72 74 5f 74 69 6d 65 22 2c 20 2d 31 29 29 3b  art_time", -1));
12240 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
12250 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
12260 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
12270 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45  ewLongObj(SSL_SE
12280 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73  SSION_get_time(s
12290 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20  ession)));.../* 
122a0 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20  Timeout value - 
122b0 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65  SSL_CTX_get_time
122c0 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29  out (in seconds)
122d0 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   */..Tcl_ListObj
122e0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
122f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
12300 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
12310 74 69 6d 65 6f 75 74 22 2c 20 2d 31 29 29 3b 0a  timeout", -1));.
12320 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
12330 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12340 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
12350 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53  wLongObj(SSL_SES
12360 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74  SION_get_timeout
12370 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f  (session)));.../
12380 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  * Session ticket
12390 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28   lifetime hint (
123a0 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09  in seconds) */..
123b0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
123c0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
123d0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
123e0 53 74 72 69 6e 67 4f 62 6a 28 22 6c 69 66 65 74  StringObj("lifet
123f0 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ime", -1));..Tcl
12400 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12410 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
12420 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e  jPtr, Tcl_NewLon
12430 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e  gObj(SSL_SESSION
12440 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65  _get_ticket_life
12450 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f  time_hint(sessio
12460 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  n)));.../* Sessi
12470 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20  on id - TLSv1.2 
12480 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a  and below only *
12490 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
124a0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
124b0 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65  id(session, &ule
124c0 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  n);..Tcl_ListObj
124d0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
124e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
124f0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
12500 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29  session_id", -1)
12510 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
12520 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
12530 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
12540 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
12550 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e  (session_id, (in
12560 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20  t) ulen));.../* 
12570 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20  Session context 
12580 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d  */..session_id =
12590 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
125a0 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73  0_id_context(ses
125b0 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 54  sion, &ulen);..T
125c0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
125d0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
125e0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
125f0 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f  tringObj("sessio
12600 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 2d 31 29 29  n_context", -1))
12610 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
12620 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12630 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
12640 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
12650 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74  session_id, (int
12660 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20 53  ) ulen));.../* S
12670 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20  ession ticket - 
12680 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09  client only */..
12690 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
126a0 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c  _ticket(session,
126b0 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29   &ticket, &len2)
126c0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
126d0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
126e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
126f0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65  NewStringObj("se
12700 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 2d  ssion_ticket", -
12710 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
12720 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
12730 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
12740 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
12750 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74 29  bj(ticket, (int)
12760 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 54 69   len2));.../* Ti
12770 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f  cket app data */
12780 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  ..SSL_SESSION_ge
12790 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74  t0_ticket_appdat
127a0 61 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  a(session, &tick
127b0 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c  et, &len2);..Tcl
127c0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
127d0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
127e0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
127f0 69 6e 67 4f 62 6a 28 22 74 69 63 6b 65 74 5f 61  ingObj("ticket_a
12800 70 70 5f 64 61 74 61 22 2c 20 2d 31 29 29 3b 0a  pp_data", -1));.
12810 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
12820 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12830 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
12840 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69  wByteArrayObj(ti
12850 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32  cket, (int) len2
12860 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73  ));.../* Get mas
12870 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32  ter key */..len2
12880 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
12890 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65  et_master_key(se
128a0 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53  ssion, buffer, S
128b0 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45  SL_MAX_MASTER_KE
128c0 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 54 63 6c 5f  Y_LENGTH);..Tcl_
128d0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
128e0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
128f0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
12900 6e 67 4f 62 6a 28 22 6d 61 73 74 65 72 5f 6b 65  ngObj("master_ke
12910 79 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  y", -1));..Tcl_L
12920 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12930 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
12940 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
12950 72 72 61 79 4f 62 6a 28 62 75 66 66 65 72 2c 20  rrayObj(buffer, 
12960 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 20 20  (int) len2));.  
12970 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
12980 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  ression info */.
12990 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e      if (ssl != N
129a0 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41  ULL) {.#ifdef HA
129b0 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49  VE_SSL_COMPRESSI
129c0 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d  ON..const COMP_M
129d0 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78  ETHOD *comp, *ex
129e0 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f  pn;..comp = SSL_
129f0 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70  get_current_comp
12a00 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65  ression(ssl);..e
12a10 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  xpn = SSL_get_cu
12a20 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28  rrent_expansion(
12a30 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74  ssl);...Tcl_List
12a40 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12a50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12a60 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12a70 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c  j("compression",
12a80 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
12a90 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12aa0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12ab0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12ac0 6a 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d  j(comp ? SSL_COM
12ad0 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29  P_get_name(comp)
12ae0 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b   : "NONE", -1));
12af0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
12b00 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
12b10 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
12b20 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70  ewStringObj("exp
12b30 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09  ansion", -1));..
12b40 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12b50 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12b60 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
12b70 53 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e 20 3f  StringObj(expn ?
12b80 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61   SSL_COMP_get_na
12b90 6d 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f 4e 45  me(expn) : "NONE
12ba0 22 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65 0a 09  ", -1));.#else..
12bb0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12bc0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12bd0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
12be0 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72  StringObj("compr
12bf0 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09  ession", -1));..
12c00 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12c10 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12c20 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
12c30 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22  StringObj("NONE"
12c40 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
12c50 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12c60 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
12c70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
12c80 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20  bj("expansion", 
12c90 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
12ca0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12cb0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12cc0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12cd0 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 23  ("NONE", -1));.#
12ce0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
12cf0 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20   /* Server info 
12d00 2a 2f 0a 20 20 20 20 7b 0a 09 6d 6f 64 65 20 3d  */.    {..mode =
12d10 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73   SSL_CTX_get_ses
12d20 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28  sion_cache_mode(
12d30 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
12d40 09 63 68 61 72 20 2a 6d 73 67 3b 0a 09 0a 09 69  .char *msg;....i
12d50 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45  f (mode & SSL_SE
12d60 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a  SS_CACHE_OFF) {.
12d70 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22  .    msg = "off"
12d80 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f  ;..} else if (mo
12d90 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41  de & SSL_SESS_CA
12da0 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20  CHE_CLIENT) {.. 
12db0 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74     msg = "client
12dc0 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d  ";..} else if (m
12dd0 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
12de0 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09  ACHE_SERVER) {..
12df0 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65      msg = "serve
12e00 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  r";..} else if (
12e10 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
12e20 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20  CACHE_BOTH) {.. 
12e30 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b     msg = "both";
12e40 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
12e50 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b  msg = "unknown";
12e60 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ..}..Tcl_ListObj
12e70 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
12e80 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
12e90 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
12ea0 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
12eb0 64 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  de", -1));..Tcl_
12ec0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
12ed0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
12ee0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
12ef0 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b  ngObj(msg, -1));
12f00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
12f10 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a  A List */.    /*
12f20 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72   IF not a server
12f30 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65  , same as SSL_ge
12f40 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e  t0_peer_CA_list.
12f50 20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65 20   If server same 
12f60 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63  as SSL_CTX_get_c
12f70 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f  lient_CA_list */
12f80 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54  .    listPtr = T
12f90 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
12fa0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43   NULL);.    STAC
12fb0 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20  K_OF(X509_NAME) 
12fc0 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66  *ca_list;.    if
12fd0 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c   ((ca_list = SSL
12fe0 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c  _get_client_CA_l
12ff0 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c  ist(ssl)) != NUL
13000 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65  L) {..char buffe
13010 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20  r[BUFSIZ];..for 
13020 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
13030 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d  sk_X509_NAME_num
13040 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20  (ca_list); i++) 
13050 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45  {..    X509_NAME
13060 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39   *name = sk_X509
13070 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c  _NAME_value(ca_l
13080 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66  ist, i);..    if
13090 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39   (name) {...X509
130a0 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61  _NAME_oneline(na
130b0 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53  me, buffer, BUFS
130c0 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f  IZ);...Tcl_ListO
130d0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
130e0 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c  interp, listPtr,
130f0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
13100 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a  j(buffer, -1));.
13110 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
13120 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
13130 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
13140 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
13150 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
13160 61 4c 69 73 74 22 2c 20 2d 31 29 29 3b 0a 20 20  aList", -1));.  
13170 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
13180 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
13190 70 2c 20 6f 62 6a 50 74 72 2c 20 6c 69 73 74 50  p, objPtr, listP
131a0 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65  tr);..    Tcl_Se
131b0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
131c0 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
131d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
131e0 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
131f0 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a  entData;.}.../*.
13200 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
13210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13240 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73  -----. *. * Vers
13250 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74  ionObjCmd -- ret
13260 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69  urn version stri
13270 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e  ng from OpenSSL.
13280 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
13290 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
132a0 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
132b0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
132c0 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
132d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
13310 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56   */.static int.V
13320 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69  ersionObjCmd(Cli
13330 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
13340 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
13350 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
13360 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
13370 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
13380 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a  cl_Obj *objPtr;.
13390 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
133a0 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a  lled");..    obj
133b0 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Ptr = Tcl_NewStr
133c0 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56  ingObj(OPENSSL_V
133d0 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29  ERSION_TEXT, -1)
133e0 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
133f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
13400 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74  bjPtr);..    ret
13410 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
13420 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
13430 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62  Data;..objc = ob
13440 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76  jc;..objv = objv
13450 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
13460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
134a0 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20  *. * MiscObjCmd 
134b0 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73  -- misc commands
134c0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
134d0 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
134e0 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
134f0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
13500 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
13510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
13550 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d   */.static int.M
13560 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  iscObjCmd(Client
13570 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
13580 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
13590 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
135a0 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
135b0 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74  jv[]) {.    stat
135c0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
135d0 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22  ommands [] = { "
135e0 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20  req", "strreq", 
135f0 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d  NULL };.    enum
13600 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51   command { C_REQ
13610 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55  , C_STRREQ, C_DU
13620 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63  MMY };.    int c
13630 6d 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 63  md, isStr;.    c
13640 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34  har buffer[16384
13650 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  ];..    dprintf(
13660 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
13670 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a  if (objc < 2) {.
13680 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
13690 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
136a0 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f  v, "subcommand ?
136b0 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e  args?");..return
136c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
136d0 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  }.    if (Tcl_Ge
136e0 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
136f0 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63  terp, objv[1], c
13700 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e  ommands, "comman
13710 64 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54  d", 0,&cmd) != T
13720 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
13730 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13740 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
13750 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69  _error();..    i
13760 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43  sStr = (cmd == C
13770 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77  _STRREQ);.    sw
13780 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d  itch ((enum comm
13790 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73  and) cmd) {..cas
137a0 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43  e C_REQ:..case C
137b0 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20  _STRREQ: {..    
137c0 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e  EVP_PKEY *pkey=N
137d0 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a  ULL;..    X509 *
137e0 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  cert=NULL;..    
137f0 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d  X509_NAME *name=
13800 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f  NULL;..    Tcl_O
13810 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20  bj **listv;..   
13820 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09   int listc,i;...
13830 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c      BIO *out=NUL
13840 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b  L;...    char *k
13850 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a  _C="",*k_ST="",*
13860 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a  k_L="",*k_O="",*
13870 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22  k_OU="",*k_CN=""
13880 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20  ,*k_Email="";.. 
13890 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c     char *keyout,
138a0 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20  *pemout,*str;.. 
138b0 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73     int keysize,s
138c0 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35  erial=0,days=365
138d0 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  ;..#if OPENSSL_V
138e0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
138f0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20  0x30000000L..   
13900 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e   BIGNUM *bne = N
13910 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72  ULL;..    RSA *r
13920 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65  sa = NULL;.#else
13930 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43  ..    EVP_PKEY_C
13940 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
13950 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20  #endif...    if 
13960 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62  ((objc<5) || (ob
13970 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57  jc>6)) {...Tcl_W
13980 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13990 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65  rp, 2, objv, "ke
139a0 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65  ysize keyfile ce
139b0 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b  rtfile ?info?");
139c0 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
139d0 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ROR;..    }...  
139e0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74    if (Tcl_GetInt
139f0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
13a00 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a  objv[2], &keysiz
13a10 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  e) != TCL_OK) {.
13a20 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13a30 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
13a40 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74  keyout=Tcl_GetSt
13a50 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09  ring(objv[3]);..
13a60 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47      pemout=Tcl_G
13a70 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d  etString(objv[4]
13a80 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74  );..    if (isSt
13a90 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61  r) {...Tcl_SetVa
13aa0 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c  r(interp,keyout,
13ab0 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74  "",0);...Tcl_Set
13ac0 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75  Var(interp,pemou
13ad0 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a  t,"",0);..    }.
13ae0 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d  ..    if (objc>=
13af0 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c  6) {...if (Tcl_L
13b00 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
13b10 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35  s(interp, objv[5
13b20 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 26 6c  ],....&listc, &l
13b30 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  istv) != TCL_OK)
13b40 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20   {...    return 
13b50 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a  TCL_ERROR;...}..
13b60 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 20  ..if ((listc%2) 
13b70 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63  != 0) {...    Tc
13b80 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
13b90 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  rp,"Information 
13ba0 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 65  list must have e
13bb0 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ven number of ar
13bc0 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a  guments",NULL);.
13bd0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
13be0 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f  _ERROR;...}...fo
13bf0 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b  r (i=0; i<listc;
13c00 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73   i+=2) {...    s
13c10 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  tr=Tcl_GetString
13c20 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20  (listv[i]);...  
13c30 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72    if (strcmp(str
13c40 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09  ,"days")==0) {..
13c50 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74  ..if (Tcl_GetInt
13c60 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c  FromObj(interp,l
13c70 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29  istv[i+1],&days)
13c80 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20  !=TCL_OK)....   
13c90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13ca0 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  R;...    } else 
13cb0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13cc0 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09  serial")==0) {..
13cd0 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74  ..if (Tcl_GetInt
13ce0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c  FromObj(interp,l
13cf0 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61  istv[i+1],&seria
13d00 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20  l)!=TCL_OK).... 
13d10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13d20 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  ROR;...    } els
13d30 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
13d40 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ,"C")==0) {....k
13d50 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  _C=Tcl_GetString
13d60 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13d70 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13d80 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d  trcmp(str,"ST")=
13d90 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63  =0) {....k_ST=Tc
13da0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
13db0 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
13dc0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
13dd0 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a  (str,"L")==0) {.
13de0 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74  ...k_L=Tcl_GetSt
13df0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
13e00 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
13e10 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f  f (strcmp(str,"O
13e20 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d  ")==0) {....k_O=
13e30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
13e40 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
13e50 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
13e60 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29  mp(str,"OU")==0)
13e70 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47   {....k_OU=Tcl_G
13e80 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13e90 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13ea0 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
13eb0 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09  r,"CN")==0) {...
13ec0 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72  .k_CN=Tcl_GetStr
13ed0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
13ee0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
13ef0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d   (strcmp(str,"Em
13f00 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ail")==0) {....k
13f10 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74  _Email=Tcl_GetSt
13f20 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
13f30 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;...    } else {
13f40 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  ....Tcl_SetResul
13f50 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77  t(interp,"Unknow
13f60 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c  n parameter",NUL
13f70 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43  L);....return TC
13f80 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d  L_ERROR;...    }
13f90 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66  ...}..    }..#if
13fa0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
13fb0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
13fc0 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d  0000L..    bne =
13fd0 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20   BN_new();..    
13fe0 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b  rsa = RSA_new();
13ff0 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50  ..    pkey = EVP
14000 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20  _PKEY_new();..  
14010 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c    if (bne == NUL
14020 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c  L || rsa == NULL
14030 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c   || pkey == NULL
14040 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64   || !BN_set_word
14050 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a  (bne,RSA_F4) ||.
14060 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f  ..!RSA_generate_
14070 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73  key_ex(rsa, keys
14080 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20  ize, bne, NULL) 
14090 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73  || !EVP_PKEY_ass
140a0 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73  ign_RSA(pkey, rs
140b0 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59  a)) {...EVP_PKEY
140c0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f  _free(pkey);.../
140d0 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b  * RSA_free(rsa);
140e0 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b   freed by EVP_PK
140f0 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f  EY_free */...BN_
14100 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65  free(bne);.#else
14110 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50  ..    pkey = EVP
14120 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e  _RSA_gen((unsign
14130 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29  ed int) keysize)
14140 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50  ;..    ctx = EVP
14150 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b  _PKEY_CTX_new(pk
14160 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69  ey,NULL);..    i
14170 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20  f (pkey == NULL 
14180 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c  || ctx == NULL |
14190 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67  | !EVP_PKEY_keyg
141a0 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a  en_init(ctx) ||.
141b0 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f  ..!EVP_PKEY_CTX_
141c0 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62  set_rsa_keygen_b
141d0 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65  its(ctx, keysize
141e0 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b  ) || !EVP_PKEY_k
141f0 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79  eygen(ctx, &pkey
14200 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  )) {...EVP_PKEY_
14210 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56  free(pkey);...EV
14220 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28  P_PKEY_CTX_free(
14230 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54  ctx);.#endif...T
14240 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
14250 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72  erp,"Error gener
14260 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65  ating private ke
14270 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75  y",NULL);...retu
14280 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
14290 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66     } else {...if
142a0 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20   (isStr) {...   
142b0 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f   out=BIO_new(BIO
142c0 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20  _s_mem());...   
142d0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50   PEM_write_bio_P
142e0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b  rivateKey(out,pk
142f0 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e  ey,NULL,NULL,0,N
14300 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  ULL,NULL);...   
14310 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c   i=BIO_read(out,
14320 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75  buffer,sizeof(bu
14330 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20  ffer)-1);...    
14340 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b  i=(i<0) ? 0 : i;
14350 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d  ...    buffer[i]
14360 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c  ='\0';...    Tcl
14370 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b  _SetVar(interp,k
14380 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b  eyout,buffer,0);
14390 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68  ...    BIO_flush
143a0 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f  (out);...    BIO
143b0 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20  _free(out);...} 
143c0 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74  else {...    out
143d0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66  =BIO_new(BIO_s_f
143e0 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49  ile());...    BI
143f0 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65  O_write_filename
14400 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09  (out,keyout);...
14410 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69      PEM_write_bi
14420 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74  o_PrivateKey(out
14430 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c  ,pkey,NULL,NULL,
14440 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09  0,NULL,NULL);...
14450 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65      /* PEM_write
14460 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b  _bio_RSAPrivateK
14470 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c  ey(out, rsa, NUL
14480 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c  L, NULL, 0, NULL
14490 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20  , NULL); */...  
144a0 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f    BIO_free_all(o
144b0 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20  ut);.. .}....if 
144c0 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28  ((cert=X509_new(
144d0 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20  ))==NULL) {...  
144e0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
144f0 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65  interp,"Error ge
14500 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69  nerating certifi
14510 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55  cate request",NU
14520 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50  LL);...    EVP_P
14530 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
14540 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
14550 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
14560 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42  0000000L...    B
14570 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e  N_free(bne);.#en
14580 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e  dif...    return
14590 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d  (TCL_ERROR);...}
145a0 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72  ....X509_set_ver
145b0 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09  sion(cert,2);...
145c0 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74  ASN1_INTEGER_set
145d0 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c  (X509_get_serial
145e0 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72  Number(cert),ser
145f0 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74  ial);...X509_gmt
14600 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74  ime_adj(X509_get
14610 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74  m_notBefore(cert
14620 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74  ),0);...X509_gmt
14630 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74  ime_adj(X509_get
14640 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29  m_notAfter(cert)
14650 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a  ,(long)60*60*24*
14660 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65  days);...X509_se
14670 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b  t_pubkey(cert,pk
14680 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30  ey);....name=X50
14690 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61  9_get_subject_na
146a0 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30  me(cert);....X50
146b0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
146c0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22  _by_txt(name,"C"
146d0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
146e0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
146f0 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c  char *) k_C, -1,
14700 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
14710 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
14720 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c  y_txt(name,"ST",
14730 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
14740 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
14750 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c  har *) k_ST, -1,
14760 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
14770 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
14780 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20  y_txt(name,"L", 
14790 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
147a0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
147b0 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d  ar *) k_L, -1, -
147c0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
147d0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
147e0 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42  txt(name,"O", MB
147f0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
14800 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
14810 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c   *) k_O, -1, -1,
14820 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
14830 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
14840 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53  t(name,"OU", MBS
14850 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
14860 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
14870 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c  *) k_OU, -1, -1,
14880 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
14890 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
148a0 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53  t(name,"CN", MBS
148b0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
148c0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
148d0 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c  *) k_CN, -1, -1,
148e0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
148f0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
14900 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20  t(name,"Email", 
14910 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
14920 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
14930 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d  ar *) k_Email, -
14940 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35  1, -1, 0);....X5
14950 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e  09_set_subject_n
14960 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a  ame(cert,name);.
14970 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67  ...if (!X509_sig
14980 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f  n(cert,pkey,EVP_
14990 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20  sha256())) {... 
149a0 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72     X509_free(cer
149b0 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b  t);...    EVP_PK
149c0 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23  EY_free(pkey);.#
149d0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
149e0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
149f0 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e  000000L...    BN
14a00 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64  _free(bne);.#end
14a10 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  if...    Tcl_Set
14a20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
14a30 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72  rror signing cer
14a40 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b  tificate",NULL);
14a50 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
14a60 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09  L_ERROR;...}....
14a70 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20  if (isStr) {... 
14a80 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
14a90 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20  IO_s_mem());... 
14aa0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
14ab0 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b  _X509(out,cert);
14ac0 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61  ...    i=BIO_rea
14ad0 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a  d(out,buffer,siz
14ae0 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a  eof(buffer)-1);.
14af0 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20  ..    i=(i<0) ? 
14b00 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66  0 : i;...    buf
14b10 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20  fer[i]='\0';... 
14b20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
14b30 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66  terp,pemout,buff
14b40 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f  er,0);...    BIO
14b50 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20  _flush(out);... 
14b60 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29     BIO_free(out)
14b70 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  ;...} else {... 
14b80 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
14b90 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09  IO_s_file());...
14ba0 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69      BIO_write_fi
14bb0 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75  lename(out,pemou
14bc0 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  t);...    PEM_wr
14bd0 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74  ite_bio_X509(out
14be0 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49  ,cert);...    BI
14bf0 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b  O_free_all(out);
14c00 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65  ...}....X509_fre
14c10 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50  e(cert);...EVP_P
14c20 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
14c30 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
14c40 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
14c50 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72  0000000L...BN_fr
14c60 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
14c70 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b  .    }..}..break
14c80 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09  ;.    default:..
14c90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14ca0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
14cb0 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
14cc0 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a  ientData;.}.../*
14cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ce0 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20  ***/./* Init    
14cf0 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a           */./***
14d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d10 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  */../*. *-------
14d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
14d60 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20   * Tls_Free --. 
14d70 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
14d80 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68  ure cleans up wh
14d90 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20  en a SSL socket 
14da0 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a  based channel. *
14db0 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69  .is closed and i
14dc0 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
14dd0 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31  nt falls below 1
14de0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
14df0 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.none. *. * Si
14e00 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46  de effects:. *.F
14e10 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61  rees all the sta
14e20 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  te. *. *--------
14e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
14e70 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 68  void.Tls_Free(ch
14e80 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a  ar *blockPtr) {.
14e90 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
14ea0 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62  Ptr = (State *)b
14eb0 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70  lockPtr;..    dp
14ec0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
14ed0 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28  ..    Tls_Clean(
14ee0 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63  statePtr);.    c
14ef0 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b  kfree(blockPtr);
14f00 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
14f50 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d  . * Tls_Clean --
14f60 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
14f70 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20  edure cleans up 
14f80 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65  when a SSL socke
14f90 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a  t based channel.
14fa0 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64   *.is closed and
14fb0 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
14fc0 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77  ount falls below
14fd0 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64   1.  This should
14fe0 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79  . *.be called sy
14ff0 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74  nchronously by t
15000 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f  he CloseProc, no
15010 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e  t in the. *.Even
15020 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62  tuallyFree callb
15030 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ack.. *. * Resul
15040 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20  ts:. *.none. *. 
15050 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
15060 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65   *.Frees all the
15070 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d   state. *. *----
15080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
150c0 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65   */.void Tls_Cle
150d0 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  an(State *stateP
150e0 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74  tr) {.    dprint
150f0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
15100 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72    /*.     * we'r
15110 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20  e assuming here 
15120 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c  that we're singl
15130 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20  e-threaded.     
15140 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
15150 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54  Ptr->timer != (T
15160 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e  cl_TimerToken) N
15170 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65  ULL) {..Tcl_Dele
15180 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73  teTimerHandler(s
15190 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b  tatePtr->timer);
151a0 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  ..statePtr->time
151b0 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  r = NULL;.    }.
151c0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
151d0 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b  r->protos) {..ck
151e0 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70  free(statePtr->p
151f0 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74  rotos);..statePt
15200 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c  r->protos = NULL
15210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
15220 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b  statePtr->bio) {
15230 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63  ../* This will c
15240 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e  all SSL_shutdown
15250 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f  . Bug 1414045 */
15260 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66  ..dprintf("BIO_f
15270 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74  ree_all(%p)", st
15280 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42  atePtr->bio);..B
15290 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74  IO_free_all(stat
152a0 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61  ePtr->bio);..sta
152b0 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c  tePtr->bio = NUL
152c0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
152d0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20  (statePtr->ssl) 
152e0 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f  {..dprintf("SSL_
152f0 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65  free(%p)", state
15300 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f  Ptr->ssl);..SSL_
15310 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73  free(statePtr->s
15320 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  sl);..statePtr->
15330 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ssl = NULL;.    
15340 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
15350 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f  tr->ctx) {..SSL_
15360 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74  CTX_free(statePt
15370 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50  r->ctx);..stateP
15380 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  tr->ctx = NULL;.
15390 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
153a0 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
153b0 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  ) {..Tcl_DecrRef
153c0 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
153d0 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74  callback);..stat
153e0 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
153f0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
15400 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70   if (statePtr->p
15410 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f  assword) {..Tcl_
15420 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
15430 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29  tePtr->password)
15440 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73  ;..statePtr->pas
15450 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20  sword = NULL;.  
15460 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
15470 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54  ePtr->vcmd) {..T
15480 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
15490 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
154a0 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  ..statePtr->vcmd
154b0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a   = NULL;.    }..
154c0 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74      dprintf("Ret
154d0 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a  urning");.}.../*
154e0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
154f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15520 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
15530 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54  _Init --. *. *.T
15540 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65  his is a package
15550 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
15560 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68  procedure, which
15570 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79   is called. *.by
15580 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70   Tcl when this p
15590 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20  ackage is to be 
155a0 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65  added to an inte
155b0 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52  rpreter.. *. * R
155c0 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e  esults:  Ssl con
155d0 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64  figured and load
155e0 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ed. *. * Side ef
155f0 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74  fects:. *. creat
15600 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e  e the ssl comman
15610 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73  d, initialize ss
15620 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d  l context. *. *-
15630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15670 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54  --. */.DLLEXPORT
15680 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63   int Tls_Init(Tc
15690 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
156a0 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ) {.    const ch
156b0 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72  ar tlsTclInitScr
156c0 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75  ipt[] = {.#inclu
156d0 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09  de "tls.tcl.h"..
156e0 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20  0x00.    };..   
156f0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
15700 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ");..    /*.    
15710 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f   * We only suppo
15720 72 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 6e 65  rt Tcl 8.4 or ne
15730 77 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  wer.     */.    
15740 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f  if (.#ifdef USE_
15750 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f 49  TCL_STUBS..Tcl_I
15760 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c  nitStubs(interp,
15770 20 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c 73 65   "8.4", 0).#else
15780 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65  ..Tcl_PkgRequire
15790 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20  (interp, "Tcl", 
157a0 22 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e 64 69  "8.4-", 0).#endi
157b0 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  f.. == NULL) {..
157c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
157d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
157e0 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21  (TlsLibInit(0) !
157f0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c  = TCL_OK) {..Tcl
15800 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15810 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74  terp, "could not
15820 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20   initialize SSL 
15830 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b  library", NULL);
15840 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
15850 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  OR;.    }..    T
15860 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
15870 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
15880 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68  ::ciphers", Ciph
15890 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ersObjCmd, (Clie
158a0 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
158b0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
158c0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
158d0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
158e0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63  (interp, "tls::c
158f0 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e  onnection", Conn
15900 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
15910 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
15920 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
15930 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
15940 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15950 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15960 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22  "tls::handshake"
15970 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d  , HandshakeObjCm
15980 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
15990 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
159a0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
159b0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
159c0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
159d0 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20   "tls::import", 
159e0 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43  ImportObjCmd, (C
159f0 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
15a00 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
15a10 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
15a20 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
15a30 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
15a40 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69  ::unimport", Uni
15a50 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c  mportObjCmd, (Cl
15a60 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
15a70 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
15a80 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
15a90 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
15aa0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
15ab0 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73  :status", Status
15ac0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
15ad0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
15ae0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
15af0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
15b00 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
15b10 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73  terp, "tls::vers
15b20 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a  ion", VersionObj
15b30 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
15b40 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
15b50 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
15b60 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
15b70 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15b80 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20  p, "tls::misc", 
15b90 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  MiscObjCmd, (Cli
15ba0 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
15bb0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
15bc0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
15bd0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
15be0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
15bf0 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74  protocols", Prot
15c00 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  ocolsObjCmd, (Cl
15c10 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
15c20 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
15c30 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69  *) NULL);..    i
15c40 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63  f (interp) {..Tc
15c50 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74  l_Eval(interp, t
15c60 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29  lsTclInitScript)
15c70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
15c80 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76 69  urn(Tcl_PkgProvi
15c90 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 22  de(interp, "tls"
15ca0 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  , PACKAGE_VERSIO
15cb0 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  N));.}../*. *---
15cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cf0 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53  ---*. *. *.Tls_S
15d00 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  afeInit --. *. *
15d10 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
15d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d40 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70  -*. *.Standard p
15d50 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65  rocedure require
15d60 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09  d by 'load'.. *.
15d70 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73  Initializes this
15d80 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61   extension for a
15d90 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65   safe interprete
15da0 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.. *.----------
15db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15dd0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69  ------*. *. *.Si
15de0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09  de effects:. *..
15df0 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27  As of 'Tls_Init'
15e00 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20  . *. *.Result:. 
15e10 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63  *..A standard Tc
15e20 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a  l error code.. *
15e30 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
15e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44  ---------*. */.D
15e70 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73  LLEXPORT int Tls
15e80 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
15e90 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a  terp *interp) {.
15ea0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
15eb0 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
15ec0 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72  n(Tls_Init(inter
15ed0 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  p));.}../*. *---
15ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f10 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69  ---*. *. *.TlsLi
15f20 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d  bInit --. *. *.-
15f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
15f60 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20  . *.Initializes 
15f70 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65  SSL library once
15f80 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e   per application
15f90 0a 20 2a 09 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15fc0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65  ----*. *. *.Side
15fd0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e   effects:. *..in
15fe0 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69  itializes SSL li
15ff0 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75  brary. *. *.Resu
16000 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a  lt:. *..none. *.
16010 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
16020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16040 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74  --------*. */.st
16050 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49  atic int TlsLibI
16060 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61  nit(int uninitia
16070 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74  lize) {.    stat
16080 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a  ic int initializ
16090 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ed = 0;.    int 
160a0 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b  status = TCL_OK;
160b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
160c0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
160d0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
160e0 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74  EADS).    size_t
160f0 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64   num_locks;.#end
16100 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e  if..    if (unin
16110 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20  itialize) {..if 
16120 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  (!initialized) {
16130 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41  ..    dprintf("A
16140 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61  sked to uninitia
16150 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65  lize, but we are
16160 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   not initialized
16170 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e  ");...    return
16180 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64  (TCL_OK);..}...d
16190 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
161a0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b   uninitialize");
161b0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
161c0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
161d0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
161e0 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65  READS)..Tcl_Mute
161f0 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b  xLock(&init_mx);
16200 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a  ...if (locks) {.
16210 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29  .    free(locks)
16220 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e  ;..    locks = N
16230 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43  ULL;..    locksC
16240 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e  ount = 0;..}.#en
16250 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64  dif..initialized
16260 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e   = 0;..#if defin
16270 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
16280 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
16290 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c  CL_THREADS)..Tcl
162a0 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e  _MutexUnlock(&in
162b0 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a  it_mx);.#endif..
162c0 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b  .return(TCL_OK);
162d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
162e0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
162f0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c  dprintf("Called,
16300 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65   but using cache
16310 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75  d value");..retu
16320 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20  rn(status);.    
16330 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
16340 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64  Called");..#if d
16350 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54  efined(OPENSSL_T
16360 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e  HREADS) && defin
16370 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a  ed(TCL_THREADS).
16380 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63      Tcl_MutexLoc
16390 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
163a0 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69  dif.    initiali
163b0 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65  zed = 1;..#if de
163c0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
163d0 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
163e0 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20  d(TCL_THREADS). 
163f0 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31     num_locks = 1
16400 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74  ;.    locksCount
16410 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63   = (int) num_loc
16420 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20  ks;.    locks = 
16430 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c  malloc(sizeof(*l
16440 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b  ocks) * num_lock
16450 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c  s);.    memset(l
16460 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocks, 0, sizeof(
16470 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f  *locks) * num_lo
16480 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  cks);.#endif..  
16490 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
164a0 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61  BOTH libcrypto a
164b0 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20  nd libssl. */.  
164c0 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73    OPENSSL_init_s
164d0 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f  sl(OPENSSL_INIT_
164e0 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53  LOAD_SSL_STRINGS
164f0 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f   | OPENSSL_INIT_
16500 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49  LOAD_CRYPTO_STRI
16510 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49  NGS..| OPENSSL_I
16520 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48  NIT_ADD_ALL_CIPH
16530 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e  ERS | OPENSSL_IN
16540 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53  IT_ADD_ALL_DIGES
16550 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  TS, NULL);..    
16560 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c  BIO_new_tcl(NULL
16570 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20  , 0);..#if 0.   
16580 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54   /*.     * XXX:T
16590 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73  ODO: Remove this
165a0 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63   code and replac
165b0 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63  e it with a chec
165c0 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f  k.     * for eno
165d0 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20  ugh entropy and 
165e0 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72  do not try to cr
165f0 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20  eate our own.   
16600 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74    * terrible ent
16610 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ropy.     */.   
16620 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20   /*.     * Seed 
16630 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  the random numbe
16640 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74  r generator in t
16650 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a  he SSL library,.
16660 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65       * using the
16670 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72   do/while constr
16680 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  uct because of t
16690 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74  he bug note in t
166a0 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53  he.     * OpenSS
166b0 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f  L FAQ at http://
166c0 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f  www.openssl.org/
166d0 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c  support/faq.html
166e0 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20  #USER1.     *.  
166f0 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66     * The crux of
16700 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
16710 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64  that Solaris 7 d
16720 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20  oes not have a. 
16730 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f      * /dev/rando
16740 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f  m or /dev/urando
16750 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63  m device so it c
16760 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f  annot gather eno
16770 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f  ugh.     * entro
16780 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44  py from the RAND
16790 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53  _seed() when TLS
167a0 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64   initializes and
167b0 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20   refuses.     * 
167c0 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45  to go further. E
167d0 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20  arlier versions 
167e0 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69  of OpenSSL carri
167f0 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73  ed on regardless
16800 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72  ..     */.    sr
16810 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  and((unsigned in
16820 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20  t) time((time_t 
16830 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64  *) NULL));.    d
16840 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b  o {..for (i = 0;
16850 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a   i < 16; i++) {.
16860 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d  .    rnd_seed[i]
16870 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32   = 1 + (char) (2
16880 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52  55.0 * rand()/(R
16890 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09  AND_MAX+1.0));..
168a0 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64  }..RAND_seed(rnd
168b0 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e  _seed, sizeof(rn
168c0 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20  d_seed));.    } 
168d0 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74  while (RAND_stat
168e0 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64  us() != 1);.#end
168f0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
16900 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
16910 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
16920 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75  THREADS)..Tcl_Mu
16930 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f  texUnlock(&init_
16940 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65  mx);.#endif...re
16950 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a  turn(status);.}.