Hex Artifact Content

Artifact 3a81d8a8fc17053b39878969645cb35e751ae51214b7124b49c27b97454d74db:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72  dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a   declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b  /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29  #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f  .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74  r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69  _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49  c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65  nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65  Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20  ar *key,...char 
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67  *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73  ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09  r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e  int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f  , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72  len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a  , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b  char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73  ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e  LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66  itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65  L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09   TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c  .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78  S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38  ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23  TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65  _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61  fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67  g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28  ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20  mask))..#define 
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22  SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a  SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74  /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f  a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53  ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65  L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23   "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72  endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64  ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e  L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64  _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65  slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69  ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68  ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e  readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e   requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42  g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74  ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20  o/cryptlib.c of 
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70  OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74  enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f  ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e  ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63  t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b  l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53  .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65  SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45  ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a  ADS */..../*****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
09a0: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20  ./* Callbacks   
09b0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45  --------. *. * E
0a20: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d  val Callback Com
0a30: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76  mand --. *. *.Ev
0a40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
0a50: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e  and and catch an
0a60: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52  y errors. *. * R
0a70: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43  esults:. *.0 = C
0a80: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ommand returned 
0a90: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74  fail or eval ret
0aa0: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a  urned TCL_ERROR.
0ab0: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72   *.1 = Command r
0ac0: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20  eturned success 
0ad0: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
0ae0: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69   TCL_OK. *. * Si
0af0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45  de effects:. *.E
0b00: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63  valuates callbac
0b10: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d  k command. *. *-
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
0b70: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54  t.EvalCallback(T
0b80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b90: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50  p, State *stateP
0ba0: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64  tr, Tcl_Obj *cmd
0bb0: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63  Ptr) {.    int c
0bc0: 6f 64 65 2c 20 6f 6b 3b 0a 0a 20 20 20 20 54 63  ode, ok;..    Tc
0bd0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
0be0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
0bf0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
0c00: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
0c10: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
0c20: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
0c30: 77 69 74 68 20 73 75 63 63 65 73 73 20 66 6f 72  with success for
0c40: 20 6f 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61   ok or return va
0c50: 6c 75 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20  lue 1, fail for 
0c60: 65 72 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20  error or return 
0c70: 76 61 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 63  value 0 */.    c
0c80: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62  ode = Tcl_EvalOb
0c90: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  jEx(interp, cmdP
0ca0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  tr, TCL_EVAL_GLO
0cb0: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f  BAL);.    if (co
0cc0: 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  de == TCL_OK) {.
0cd0: 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74  ./* Check result
0ce0: 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75   for return valu
0cf0: 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72  e */..Tcl_Obj *r
0d00: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
0d10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
0d20: 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d  ;..if (result ==
0d30: 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74   NULL || Tcl_Get
0d40: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
0d50: 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20  p, result, &ok) 
0d60: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
0d70: 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20 20    ok = 1;..}.   
0d80: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72   } else {../* Er
0d90: 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65  ror - reject the
0da0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
0db0: 09 6f 6b 20 3d 20 30 3b 0a 23 69 66 20 28 54 43  .ok = 0;.#if (TC
0dc0: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
0dd0: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49  == 8) && (TCL_MI
0de0: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29  NOR_VERSION < 6)
0df0: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
0e00: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
0e10: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
0e20: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e  oundException(in
0e30: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
0e40: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  dif.    }..    T
0e50: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0e60: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
0e70: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  );.    Tcl_Relea
0e80: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0e90: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
0ea0: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  urn ok;.}.../*. 
0eb0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43  ----. *. * InfoC
0f00: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
0f10: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f  .Monitors SSL co
0f20: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73  nnection process
0f30: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0f40: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
0f50: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
0f60: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
0f70: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ---. */.static v
0fd0: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  oid.InfoCallback
0fe0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
0ff0: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20   int where, int 
1000: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ret) {.    State
1010: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
1020: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
1030: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
1040: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
1050: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
1060: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
1070: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
1080: 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 6a  r;.    char *maj
1090: 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b  or; char *minor;
10a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
10b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
10c0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
10d0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
10e0: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b  *)NULL)..return;
10f0: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20  ..    if (where 
1100: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
1110: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a  KE_START) {..maj
1120: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
1130: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72  ;..minor = "star
1140: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  t";.    } else i
1150: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1160: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45  B_HANDSHAKE_DONE
1170: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
1180: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
1190: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d   = "done";.    }
11a0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65   else {..if (whe
11b0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
11c0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65  T)..major = "ale
11d0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  rt";..else if (w
11e0: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f  here & SSL_ST_CO
11f0: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22  NNECT).major = "
1200: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20  connect";..else 
1210: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1220: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f  ST_ACCEPT)..majo
1230: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65  r = "accept";..e
1240: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20  lse.....major = 
1250: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20  "unknown";...if 
1260: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1270: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22  READ)..minor = "
1280: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20  read";..else if 
1290: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
12a0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20  WRITE)..minor = 
12b0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69  "write";..else i
12c0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
12d0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d  B_LOOP)..minor =
12e0: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69   "loop";..else i
12f0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1300: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d  B_EXIT)..minor =
1310: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09   "exit";..else..
1320: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e  ...minor = "unkn
1330: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
1340: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
1350: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
1360: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
1370: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
1380: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
1390: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
13a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
13b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
13c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
13d0: 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20  info", -1));.   
13e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
13f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1400: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1410: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1420: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
1430: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
1440: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
1450: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1460: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
1470: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
1480: 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d  ringObj(major, -
1490: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
14a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14b0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
14c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14d0: 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a  bj(minor, -1));.
14e0: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26  .    if (where &
14f0: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b   SSL_CB_ALERT) {
1500: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
1510: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1520: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1530: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1540: 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f  (SSL_alert_desc_
1550: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29  string_long(ret)
1560: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
1570: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1580: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1590: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
15a0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72  ringObj(SSL_aler
15b0: 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f  t_type_string_lo
15c0: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20  ng(ret), -1));. 
15d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
15e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
15f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1600: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1610: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
1620: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e  state_string_lon
1630: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54  g(ssl), -1));..T
1640: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1650: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1660: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
1670: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c  tringObj("info",
1680: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   -1));.    }..  
1690: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
16a0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
16b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
16c0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
16d0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
16e0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
16f0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
1700: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
1710: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65  --. *. * Message
1770: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
1780: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70  *.Monitors SSL p
1790: 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73  rotocol messages
17a0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
17b0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
17c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
17d0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
17e0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ---. */.#ifndef 
1840: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54  OPENSSL_NO_SSL_T
1850: 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64  RACE.static void
1860: 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b  .MessageCallback
1870: 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e  (int write_p, in
1880: 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63  t version, int c
1890: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e  ontent_type, con
18a0: 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69  st void *buf, si
18b0: 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73  ze_t len, SSL *s
18c0: 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  sl, void *arg) {
18d0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
18e0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
18f0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
1900: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
1910: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
1920: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
1930: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65  tr;.    char *ve
1940: 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49  r, *type;.    BI
1950: 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72  O *bio;.    char
1960: 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a   buffer[15000];.
1970: 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20      buffer[0] = 
1980: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
1990: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
19a0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
19b0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
19c0: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72  bj*)NULL)..retur
19d0: 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76  n;..    switch(v
19e0: 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f 50  ersion) {.#if OP
19f0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
1a00: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
1a10: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
1a20: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
1a30: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
1a40: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 53  SL2).    case SS
1a50: 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  L2_VERSION:..ver
1a60: 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65   = "SSLv2";..bre
1a70: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
1a80: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
1a90: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
1aa0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20  NSSL_NO_SSL3).  
1ab0: 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53    case SSL3_VERS
1ac0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c  ION:..ver = "SSL
1ad0: 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  v3";..break;.#en
1ae0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53  dif.    case TLS
1af0: 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  1_VERSION:..ver 
1b00: 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61  = "TLSv1";..brea
1b10: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31  k;.    case TLS1
1b20: 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  _1_VERSION:..ver
1b30: 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62   = "TLSv1.1";..b
1b40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b50: 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09  LS1_2_VERSION:..
1b60: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b  ver = "TLSv1.2";
1b70: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1b80: 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  e TLS1_3_VERSION
1b90: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1ba0: 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  3";..break;.    
1bb0: 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20 20 20  case 0:.        
1bc0: 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62  ver = "none";..b
1bd0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
1be0: 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f  t:..ver = "unkno
1bf0: 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  wn";..break;.   
1c00: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28   }..    switch (
1c10: 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a  content_type) {.
1c20: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1c30: 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d  _HEADER:..type =
1c40: 20 22 48 65 61 64 65 72 22 3b 0a 20 20 20 20 20   "Header";.     
1c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1c60: 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52  se SSL3_RT_INNER
1c70: 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09  _CONTENT_TYPE:..
1c80: 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f  type = "Inner Co
1c90: 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 20 20 20  ntent Type";.   
1ca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cb0: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41  case SSL3_RT_CHA
1cc0: 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a  NGE_CIPHER_SPEC:
1cd0: 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65  ..type = "Change
1ce0: 20 43 69 70 68 65 72 22 3b 0a 20 20 20 20 20 20   Cipher";.      
1cf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d00: 65 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a  e SSL3_RT_ALERT:
1d10: 0a 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22  ..type = "Alert"
1d20: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d30: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d40: 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79  T_HANDSHAKE:..ty
1d50: 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22  pe = "Handshake"
1d60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d70: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d80: 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41  T_APPLICATION_DA
1d90: 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70  TA:..type = "App
1da0: 20 44 61 74 61 22 3b 0a 20 20 20 20 20 20 20 20   Data";.        
1db0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1dc0: 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45  DTLS1_RT_HEARTBE
1dd0: 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61  AT:..type = "Hea
1de0: 72 74 62 65 61 74 22 3b 0a 20 20 20 20 20 20 20  rtbeat";.       
1df0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
1e00: 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e  ult:..type = "un
1e10: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20  known";.    }.. 
1e20: 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70     /* Needs comp
1e30: 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile time option 
1e40: 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63  "enable-ssl-trac
1e50: 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  e". */.    if ((
1e60: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio = BIO_new(BI
1e70: 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e  O_s_mem())) != N
1e80: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09  ULL) {..int n;..
1e90: 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f  SSL_trace(write_
1ea0: 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74  p, version, cont
1eb0: 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c  ent_type, buf, l
1ec0: 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a  en, ssl, (void *
1ed0: 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f  )bio);..n = BIO_
1ee0: 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72  read(bio, buffer
1ef0: 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e  , min(BIO_pendin
1f00: 67 28 62 69 6f 29 2c 20 31 34 39 39 39 29 29 3b  g(bio), 14999));
1f10: 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20  ..n = (n<0) ? 0 
1f20: 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20  : n;..buffer[n] 
1f30: 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f  = 0;..(void)BIO_
1f40: 66 6c 75 73 68 28 62 69 6f 29 3b 0a 20 09 42 49  flush(bio);. .BI
1f50: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20  O_free(bio);.   
1f60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
1f70: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
1f80: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
1f90: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1fa0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
1fb0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
1fc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1fd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1fe0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1ff0: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20  gObj("message", 
2000: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2010: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2020: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2030: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
2040: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
2050: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
2060: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
2070: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2080: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2090: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
20a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
20b0: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74  (write_p ? "Sent
20c0: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20  " : "Received", 
20d0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
20e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
20f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2100: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2110: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20  Obj(ver, -1));. 
2120: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2130: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2140: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2150: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70  NewStringObj(typ
2160: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  e, -1));.    Tcl
2170: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2180: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2190: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
21a0: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
21b0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
21c0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
21d0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
21e0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
21f0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
2200: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2210: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2220: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2230: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
2240: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61  -. *. * VerifyCa
22a0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
22b0: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72  Monitors SSL cer
22c0: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
22d0: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65  ion process. Use
22e0: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  d to control the
22f0: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65  . *.behavior whe
2300: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59  n the SSL_VERIFY
2310: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65  _PEER flag is se
2320: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  t. This is calle
2330: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20  d. *.whenever a 
2340: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69  certificate is i
2350: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69  nspected or deci
2360: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c  ded invalid. Cal
2370: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20  led for. *.each 
2380: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74  certificate in t
2390: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20  he cert chain.. 
23a0: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09  *. * Checks:. *.
23b0: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69  certificate chai
23c0: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61  n is checked sta
23d0: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64  rting with the d
23e0: 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c  eepest nesting l
23f0: 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72  evel. *.  (the r
2400: 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61  oot CA certifica
2410: 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75  te) and worked u
2420: 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65  pward to the pee
2430: 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e  r's certificate.
2440: 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72  . *.All signatur
2450: 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75  es are valid, cu
2460: 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69  rrent time is wi
2470: 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c  thin first and l
2480: 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d  ast validity tim
2490: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74  e.. *.Check that
24a0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
24b0: 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68   is issued by th
24c0: 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69  e issuer certifi
24d0: 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09  cate issuer.. *.
24e0: 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61  Check the revoca
24f0: 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20  tion status for 
2500: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65  each certificate
2510: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76  .. *.Check the v
2520: 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67  alidity of the g
2530: 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65  iven CRL and the
2540: 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e   cert revocation
2550: 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63   status.. *.Chec
2560: 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f  k the policies o
2570: 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66  f all the certif
2580: 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67  icates. *. * Arg
2590: 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f  s. *.preverify_o
25a0: 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  k indicates whet
25b0: 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63  her the certific
25c0: 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ate verification
25d0: 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e   passed (1) or n
25e0: 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73  ot (0). *. * Res
25f0: 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62  ults:. *.A callb
2600: 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65  ack bound to the
2610: 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75   socket may retu
2620: 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20  rn one of:. *.  
2630: 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74    0...- the cert
2640: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65  ificate is deeme
2650: 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20  d invalid, send 
2660: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09  verification. *.
2670: 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65  ...  failure ale
2680: 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20  rt to peer, and 
2690: 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68  terminate handsh
26a0: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09  ake.. *.    1...
26b0: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  - the certificat
26c0: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69  e is deemed vali
26d0: 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  d, continue with
26e0: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
26f0: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09     empty string.
2700: 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63  - no change to c
2710: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64  ertificate valid
2720: 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65  ation. *. * Side
2730: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
2740: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
2750: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
2760: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
2770: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
2780: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
2790: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
27a0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
27b0: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *. *---------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
2800: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79  tatic int.Verify
2810: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c  Callback(int ok,
2820: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20   X509_STORE_CTX 
2830: 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f  *ctx) {.    Tcl_
2840: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
2850: 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28   SSL   *ssl..= (
2860: 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f  SSL*)X509_STORE_
2870: 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28  CTX_get_ex_data(
2880: 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f  ctx, SSL_get_ex_
2890: 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f  data_X509_STORE_
28a0: 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20  CTX_idx());.    
28b0: 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58  X509  *cert..= X
28c0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
28d0: 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63  t_current_cert(c
28e0: 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a  tx);.    State *
28f0: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
2900: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64  e*)SSL_get_app_d
2910: 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63  ata(ssl);.    Tc
2920: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2930: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
2940: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70  erp;.    int dep
2950: 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  th..= X509_STORE
2960: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64  _CTX_get_error_d
2970: 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69  epth(ctx);.    i
2980: 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53  nt err..= X509_S
2990: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
29a0: 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70  or(ctx);..    dp
29b0: 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25  rintf("Verify: %
29c0: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66  d", ok);..    if
29d0: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
29e0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
29f0: 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65  LL) {..if (state
2a00: 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53  Ptr->vflags & SS
2a10: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
2a20: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
2a30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b  ..    return ok;
2a40: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
2a50: 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20  return 1;..}.   
2a60: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74   } else if (cert
2a70: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20   == NULL || ssl 
2a80: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
2a90: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
2aa0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
2ab0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
2ac0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
2ad0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
2ae0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
2af0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2b00: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2b10: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2b20: 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69  wStringObj("veri
2b30: 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  fy", -1));.    T
2b40: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2b50: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2b60: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77  cmdPtr,..Tcl_New
2b70: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
2b80: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
2b90: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
2ba0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2bb0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2bc0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2bd0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64   Tcl_NewIntObj(d
2be0: 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f  epth));.    Tcl_
2bf0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2c00: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
2c10: 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39  Ptr, Tls_NewX509
2c20: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74  Obj(interp, cert
2c30: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2c40: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2c50: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2c60: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f   Tcl_NewIntObj(o
2c70: 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  k));.    Tcl_Lis
2c80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2c90: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2ca0: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  ,..Tcl_NewString
2cb0: 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f  Obj((char*)X509_
2cc0: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f  verify_cert_erro
2cd0: 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d  r_string(err), -
2ce0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65  1));..    /* Pre
2cf0: 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63  vent I/O while c
2d00: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72  allback is in pr
2d10: 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a  ogress */.    /*
2d20: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73   statePtr->flags
2d30: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c   |= TLS_TCL_CALL
2d40: 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a  BACK; */..    /*
2d50: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
2d60: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
2d70: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
2d80: 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d  mdPtr);.    ok =
2d90: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
2da0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
2db0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  cmdPtr);.    Tcl
2dc0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
2dd0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 73  dPtr);..    /* s
2de0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
2df0: 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c  = ~(TLS_TCL_CALL
2e00: 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65  BACK); */.    re
2e10: 74 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20  turn(ok);./* By 
2e20: 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76  default, leave v
2e30: 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68  erification unch
2e40: 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a  anged. */.}.../*
2e50: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
2ea0: 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09  _Error --. *. *.
2eb0: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77  Calls callback w
2ec0: 69 74 68 20 6c 69 73 74 20 6f 66 20 65 72 72 6f  ith list of erro
2ed0: 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  rs.. *. * Side e
2ee0: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65  ffects:. *.The e
2ef0: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  rr field of the 
2f00: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74  currently operat
2f10: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74  ive State is set
2f20: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e  . *.  to a strin
2f30: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  g describing the
2f40: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e   SSL negotiation
2f50: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a   failure reason.
2f60: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
2fb0: 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74  d.Tls_Error(Stat
2fc0: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61  e *statePtr, cha
2fd0: 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63  r *msg) {.    Tc
2fe0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2ff0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
3000: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
3010: 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50   *cmdPtr, *listP
3020: 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  tr;.    unsigned
3030: 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73   long err;.    s
3040: 74 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d  tatePtr->err = m
3050: 73 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  sg;..    dprintf
3060: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
3070: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
3080: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f  allback == (Tcl_
3090: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75  Obj*)NULL)..retu
30a0: 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  rn;..    /* Crea
30b0: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
30c0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
30d0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
30e0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
30f0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c  llback);.    Tcl
3100: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3110: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3120: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
3130: 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20  ingObj("error", 
3140: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
3150: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3160: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
3170: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
3180: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
3190: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
31a0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
31b0: 29 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21  );.    if (msg !
31c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c  = NULL) {..Tcl_L
31d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
31e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
31f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
3200: 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a  gObj(msg, -1));.
3210: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
3220: 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  (msg = Tcl_GetSt
3230: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
3240: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
3250: 65 72 70 29 2c 20 4e 55 4c 4c 29 29 20 21 3d 20  erp), NULL)) != 
3260: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73  NULL) {..Tcl_Lis
3270: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3280: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3290: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
32a0: 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20  bj(msg, -1));.. 
32b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73     } else {..lis
32c0: 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tPtr = Tcl_NewLi
32d0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
32e0: 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 45  .while ((err = E
32f0: 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 20  RR_get_error()) 
3300: 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c  != 0) {..    Tcl
3310: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3320: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
3330: 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  stPtr, Tcl_NewSt
3340: 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 73  ringObj(ERR_reas
3350: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  on_error_string(
3360: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  err), -1));..}..
3370: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3380: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3390: 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 72   cmdPtr, listPtr
33a0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
33b0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
33c0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
33d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
33e0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c  mdPtr);.    Eval
33f0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
3400: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
3410: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  r);.    Tcl_Decr
3420: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
3430: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3450: 2d 2d 2d 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 0a 20  --------------. 
3480: 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62  *. * KeyLogCallb
3490: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69  ack --. *. *.Wri
34a0: 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 20  te received key 
34b0: 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65  data to log file
34c0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
34d0: 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ects:. *.none. *
34e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
3530: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63  KeyLogCallback(c
3540: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63  onst SSL *ssl, c
3550: 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29  onst char *line)
3560: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72   {.    char *str
3570: 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59   = getenv(SSLKEY
3580: 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49  LOGFILE);.    FI
3590: 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72  LE *fd;..    dpr
35a0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
35b0: 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a  .    if (str) {.
35c0: 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c  .fd = fopen(str,
35d0: 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28   "a");..fprintf(
35e0: 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29  fd, "%s\n",line)
35f0: 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20  ;..fclose(fd);. 
3600: 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d     }.}.../*. *--
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64  -. *. * Password
3660: 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a   Callback --. *.
3670: 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61   *.Called when a
3680: 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20 61 20   password for a 
3690: 70 72 69 76 61 74 65 20 6b 65 79 20 6c 6f 61 64  private key load
36a0: 69 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20 50 45  ing/storing a PE
36b0: 4d 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 65  M. *.certificate
36c0: 20 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e   with encryption
36d0: 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b  . Evals callback
36e0: 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75   script and retu
36f0: 72 6e 73 0a 20 2a 09 74 68 65 20 72 65 73 75 6c  rns. *.the resul
3700: 74 20 61 73 20 74 68 65 20 70 61 73 73 77 6f 72  t as the passwor
3710: 64 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e  d string in buf.
3720: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
3730: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
3740: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
3750: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
3760: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
3770: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73   Returns:. *.Pas
3780: 73 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79  sword size in by
3790: 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e  tes or -1 for an
37a0: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d   error.. *. *---
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 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: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
3800: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b  PasswordCallback
3810: 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20  (char *buf, int 
3820: 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67  size, int rwflag
3830: 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b  , void *udata) {
3840: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
3850: 65 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29  ePtr.= (State *)
3860: 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f   udata;.    Tcl_
3870: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
3880: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
3890: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
38a0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20  cmdPtr;.    int 
38b0: 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e  code;..    dprin
38c0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
38d0: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c     /* If no call
38e0: 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c  back, use defaul
38f0: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t callback */.  
3900: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
3910: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c  password == NULL
3920: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61  ) {..if (Tcl_Eva
3930: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  lEx(interp, "tls
3940: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c  ::password", -1,
3950: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
3960: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) == TCL_OK) {..
3970: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20      char *ret = 
3980: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
3990: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
39a0: 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63  erp);..    strnc
39b0: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69  py(buf, ret, (si
39c0: 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20  ze_t) size);..  
39d0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74    return (int)st
39e0: 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c  rlen(ret);..} el
39f0: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  se {..    return
3a00: 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20   -1;..}.    }.. 
3a10: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
3a20: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
3a30: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
3a40: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
3a50: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
3a60: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
3a70: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3a80: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3a90: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3aa0: 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29  ("password", -1)
3ab0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
3ac0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3ad0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3ae0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77  Tcl_NewIntObj(rw
3af0: 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f  flag));.    Tcl_
3b00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3b10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3b20: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
3b30: 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20  bj(size));..    
3b40: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c  Tcl_Preserve((Cl
3b50: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70  ientData) interp
3b60: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  );.    Tcl_Prese
3b70: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  rve((ClientData)
3b80: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20   statePtr);..   
3b90: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
3ba0: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
3bb0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
3bc0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63  t(cmdPtr);.    c
3bd0: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62  ode = Tcl_EvalOb
3be0: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  jEx(interp, cmdP
3bf0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  tr, TCL_EVAL_GLO
3c00: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f  BAL);.    if (co
3c10: 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  de != TCL_OK) {.
3c20: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56  #if (TCL_MAJOR_V
3c30: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20  ERSION == 8) && 
3c40: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49  (TCL_MINOR_VERSI
3c50: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63  ON < 6)..Tcl_Bac
3c60: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
3c70: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c  erp);.#else..Tcl
3c80: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70  _BackgroundExcep
3c90: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64  tion(interp, cod
3ca0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  e);.#endif.    }
3cb0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3cc0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
3cd0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
3ce0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
3cf0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
3d00: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70  If successful, p
3d10: 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72  ass back passwor
3d20: 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75  d string and tru
3d30: 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e  ncate if too lon
3d40: 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64  g */.    if (cod
3d50: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  e == TCL_OK) {..
3d60: 69 6e 74 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a  int len;..char *
3d70: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54  ret = (char *) T
3d80: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3d90: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
3da0: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c  sult(interp), &l
3db0: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20  en);..if (len > 
3dc0: 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c  size-1) {..    l
3dd0: 65 6e 20 3d 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a  en = size-1;..}.
3de0: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65  .strncpy(buf, re
3df0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29  t, (size_t) len)
3e00: 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c  ;..buf[len] = '\
3e10: 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65  0';..Tcl_Release
3e20: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
3e30: 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 6c  terp);..return(l
3e40: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  en);.    }.    T
3e50: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
3e60: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
3e70: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
3e80: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ea0: 2d 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 0a 20 2a 0a  ------------. *.
3ed0: 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62   * Session Callb
3ee0: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20  ack for Clients 
3ef0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
3f00: 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69  when a new sessi
3f10: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  on is added to t
3f20: 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53  he cache. In TLS
3f30: 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79   1.3. *.this may
3f40: 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c   be received mul
3f50: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65  tiple times afte
3f60: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e  r the handshake.
3f70: 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20   For. *.earlier 
3f80: 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77  versions, this w
3f90: 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20  ill be received 
3fa0: 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73  during the hands
3fb0: 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73  hake.. *.This is
3fc0: 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77   the preferred w
3fd0: 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72  ay to obtain a r
3fe0: 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e  esumable session
3ff0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
4000: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
4010: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
4020: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
4030: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
4040: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
4050: 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65   *.0 = error whe
4060: 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20  re session will 
4070: 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  be immediately r
4080: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
4090: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a  internal cache..
40a0: 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77   *.1 = success w
40b0: 68 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73  here app retains
40c0: 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73   session in sess
40d0: 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d  ion cache, and m
40e0: 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53  ust call SSL_SES
40f0: 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e  SION_free() when
4100: 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   done.. *. *----
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4120: 2d 2d 2d 2d 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 0a  ---------------.
4150: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53   */.static int.S
4160: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63  essionCallback(c
4170: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53  onst SSL *ssl, S
4180: 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73  SL_SESSION *sess
4190: 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ion) {.    State
41a0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
41b0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
41c0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
41d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
41e0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
41f0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
4200: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
4210: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  r;.    const uns
4220: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b  igned char *tick
4230: 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  et;.    const un
4240: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
4250: 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a  sion_id;.    siz
4260: 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e  e_t len2;.    un
4270: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b  signed int ulen;
4280: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
4290: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
42a0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
42b0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
42c0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
42d0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
42e0: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
42f0: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29  if (ssl == NULL)
4300: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
4310: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4320: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
4330: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
4340: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64   eval */.    cmd
4350: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
4360: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
4370: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
4380: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4390: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
43a0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
43b0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69  StringObj("sessi
43c0: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  on", -1));.    T
43d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
43e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
43f0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
4400: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
4410: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
4420: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
4430: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
4440: 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20  Session id */.  
4450: 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53    session_id = S
4460: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69  SL_SESSION_get_i
4470: 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e  d(session, &ulen
4480: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4490: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
44a0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
44b0: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
44c0: 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20  Obj(session_id, 
44d0: 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20  (int) ulen));.. 
44e0: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69     /* Session ti
44f0: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  cket */.    SSL_
4500: 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
4510: 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69  ket(session, &ti
4520: 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20  cket, &len2);.  
4530: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4540: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4550: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
4560: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74  ewByteArrayObj(t
4570: 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e  icket, (int) len
4580: 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66  2));..    /* Lif
4590: 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f  etime - number o
45a0: 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20  f seconds */.   
45b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
45c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
45d0: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
45e0: 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29  ewLongObj((long)
45f0: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
4600: 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65  _ticket_lifetime
4610: 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29  _hint(session)))
4620: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
4630: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
4640: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
4650: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
4660: 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63  .    EvalCallbac
4670: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
4680: 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20  tr, cmdPtr);.   
4690: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
46a0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72  t(cmdPtr);.    r
46b0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a  eturn 0;.}.../*.
46c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 41 4c 50 4e  -----. *. * ALPN
4710: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65   Callback for Se
4720: 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61  rvers and NPN Ca
4730: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e  llback for Clien
4740: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66  ts --. *. *.Perf
4750: 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74  orm protocol (ht
4760: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20  tp/1.1, h2, h3, 
4770: 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20  etc.) selection 
4780: 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d  for the. *.incom
4790: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ing connection. 
47a0: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c  Called after Hel
47b0: 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61  lo and server ca
47c0: 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72  llbacks.. *.Wher
47d0: 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63  e 'out' is selec
47e0: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64  ted protocol and
47f0: 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65   'in' is the pee
4800: 72 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73  r advertised lis
4810: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  t.. *. * Results
4820: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
4830: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
4840: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
4850: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
4860: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
4870: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
4880: 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74  RR_OK: ALPN prot
4890: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54  ocol selected. T
48a0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
48b0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f  ntinues.. *.SSL_
48c0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
48d0: 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61  _FATAL: There wa
48e0: 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74  s no overlap bet
48f0: 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27  ween the client'
4900: 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65  s. *.    supplie
4910: 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73  d list and the s
4920: 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74  erver configurat
4930: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ion. The connect
4940: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72  ion will be abor
4950: 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ted.. *.SSL_TLSE
4960: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c  XT_ERR_NOACK: AL
4970: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  PN protocol not 
4980: 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20  selected, e.g., 
4990: 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a  because no ALPN.
49a0: 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73   *.    protocols
49b0: 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20   are configured 
49c0: 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  for this connect
49d0: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ion. The connect
49e0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
49f0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
4a40: 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62  ic int.ALPNCallb
4a50: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
4a60: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  sl, const unsign
4a70: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75  ed char **out, u
4a80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
4a90: 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73  tlen,..const uns
4aa0: 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20  igned char *in, 
4ab0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c  unsigned int inl
4ac0: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  en, void *arg) {
4ad0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
4ae0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
4af0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
4b00: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
4b10: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
4b20: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
4b30: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
4b40: 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69  , res;..    dpri
4b50: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
4b60: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e      if (ssl == N
4b70: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55  ULL || arg == NU
4b80: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
4b90: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
4ba0: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CK;.    }..    /
4bb0: 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f  * Select protoco
4bc0: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c  l */.    if (SSL
4bd0: 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f  _select_next_pro
4be0: 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20  to(out, outlen, 
4bf0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
4c00: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  , statePtr->prot
4c10: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c  os_len,..in, inl
4c20: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e  en) == OPENSSL_N
4c30: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b  PN_NEGOTIATED) {
4c40: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64  ../* Match found
4c50: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54   */..res = SSL_T
4c60: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
4c70: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f    } else {../* O
4c80: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56  PENSSL_NPN_NO_OV
4c90: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c  ERLAP = No overl
4ca0: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74  ap, so use first
4cb0: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e   item from clien
4cc0: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20  t protocol list 
4cd0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c  */..res = SSL_TL
4ce0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4cf0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
4d00: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d  tatePtr->vcmd ==
4d10: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
4d20: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a   {..return res;.
4d30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
4d40: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
4d50: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
4d60: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
4d70: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
4d80: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
4d90: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4da0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4db0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
4dc0: 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29  gObj("alpn", -1)
4dd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4de0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4df0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
4e00: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
4e10: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
4e20: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
4e30: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
4e40: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4e50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4e60: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
4e70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f  _NewStringObj(*o
4e80: 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  ut, -1));.    Tc
4e90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4ea0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4eb0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f  mdPtr, Tcl_NewBo
4ec0: 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20  oleanObj(res == 
4ed0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
4ee0: 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  K));..    /* Eva
4ef0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
4f00: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
4f10: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
4f20: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64  r);.    if ((cod
4f30: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b  e = EvalCallback
4f40: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
4f50: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29  r, cmdPtr)) > 1)
4f60: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
4f70: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4f80: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
4f90: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73  ode == 1) {..res
4fa0: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
4fb0: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
4fc0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
4fd0: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
4fe0: 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ATAL;.    }.    
4ff0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5000: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
5010: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
5020: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 41 64 76  ------. *. * Adv
5070: 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73  ertise Protocols
5080: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65   Callback for Ne
5090: 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f  xt Protocol Nego
50a0: 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e  tiation (NPN) in
50b0: 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a   ServerHello --.
50c0: 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65   *. *.called whe
50d0: 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e  n a TLS server n
50e0: 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73  eeds a list of s
50f0: 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f  upported protoco
5100: 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50  ls for Next. *.P
5110: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
5120: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ion.. *. * Resul
5130: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
5140: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
5150: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
5160: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
5170: 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72  T_ERR_OK: NPN pr
5180: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e  otocol selected.
5190: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
51a0: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
51b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
51c0: 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c  CK: NPN protocol
51d0: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54   not selected. T
51e0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
51f0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5210: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45  -. */.#ifdef USE
5250: 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a  _NPN.static int.
5260: 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  NPNCallback(cons
5270: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73  t SSL *ssl, cons
5280: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
5290: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20  **out, unsigned 
52a0: 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69  int *outlen, voi
52b0: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
52c0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
52d0: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20  (State*)arg;..  
52e0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
52f0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73  d");..    if (ss
5300: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  l == NULL || arg
5310: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
5320: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5330: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
5340: 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74  .    /* Set prot
5350: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20  ocols list */.  
5360: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
5370: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20  protos != NULL) 
5380: 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50  {..*out = stateP
5390: 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75  tr->protos;..*ou
53a0: 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d  tlen = statePtr-
53b0: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20  >protos_len;.   
53c0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20   } else {..*out 
53d0: 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e  = NULL;..*outlen
53e0: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53   = 0;..return SS
53f0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5400: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  CK;.    }.    re
5410: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5420: 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ERR_OK;.}.#endif
5430: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20  -----------. *. 
5480: 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66  * SNI Callback f
5490: 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a  or Servers --. *
54a0: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76  . *.Perform serv
54b0: 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74  er-side SNI host
54c0: 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61  name selection a
54d0: 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53  fter receiving S
54e0: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09  NI extension. *.
54f0: 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e  in Client Hello.
5500: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65   Called after he
5510: 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74  llo callback but
5520: 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c   before ALPN cal
5530: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73  lback.. *. * Res
5540: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
5550: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
5560: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
5570: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
5580: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
5590: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  des:. *.SSL_TLSE
55a0: 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68  XT_ERR_OK: SNI h
55b0: 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70  ostname is accep
55c0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
55d0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
55e0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
55f0: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e  _ALERT_FATAL: SN
5600: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f  I hostname is no
5610: 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20  t accepted. The 
5620: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20  connection. *.  
5630: 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65    is aborted. De
5640: 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20  fault for alert 
5650: 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f  is SSL_AD_UNRECO
5660: 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09  GNIZED_NAME.. *.
5670: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
5680: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e  LERT_WARNING: SN
5690: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f  I hostname is no
56a0: 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e  t accepted, warn
56b0: 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20  ing alert. *.   
56c0: 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f   sent (not suppo
56d0: 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29  rted in TLSv1.3)
56e0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
56f0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
5700: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5710: 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  ACK: SNI hostnam
5720: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65  e is not accepte
5730: 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77  d and not acknow
5740: 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65  ledged,. *.    e
5750: 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e  .g. if SNI has n
5760: 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  ot been configur
5770: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
5780: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
5790: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
57e0: 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63  c int.SNICallbac
57f0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
5800: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f  , int *alert, vo
5810: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
5820: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
5830: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
5840: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
5850: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
5860: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
5870: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
5880: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
5890: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65  .    char *serve
58a0: 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  rname = NULL;.. 
58b0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
58c0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
58d0: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  sl == NULL || ar
58e0: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g == NULL) {..re
58f0: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5900: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
5910: 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f  ..    /* Only wo
5920: 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20  rks for TLS 1.2 
5930: 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20  and earlier */. 
5940: 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20     servername = 
5950: 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61  SSL_get_serverna
5960: 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e  me(ssl, TLSEXT_N
5970: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d  AMETYPE_host_nam
5980: 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72  e);.    if (!ser
5990: 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65  vername || serve
59a0: 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27  rname[0] == '\0'
59b0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
59c0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
59d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
59e0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  (statePtr->vcmd 
59f0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
5a00: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
5a10: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
5a20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
5a30: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
5a40: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
5a50: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
5a60: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
5a70: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
5a80: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5a90: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5aa0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5ab0: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29  gObj("sni", -1))
5ac0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
5ad0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5ae0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
5af0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
5b00: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
5b10: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
5b20: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
5b30: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5b40: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5b50: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5b60: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72  NewStringObj(ser
5b70: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a  vername , -1));.
5b80: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
5b90: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
5ba0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
5bb0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
5bc0: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
5bd0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
5be0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
5bf0: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
5c00: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5c10: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e  ERR_ALERT_WARNIN
5c20: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  G;..*alert = SSL
5c30: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44  _AD_UNRECOGNIZED
5c40: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75  _NAME; /* Not su
5c50: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31  pported by TLS 1
5c60: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65  .3 */.    } else
5c70: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
5c80: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
5c90: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
5ca0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
5cb0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
5cc0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c  LERT_FATAL;..*al
5cd0: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52  ert = SSL_AD_UNR
5ce0: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20  ECOGNIZED_NAME; 
5cf0: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64  /* Not supported
5d00: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20   by TLS 1.3 */. 
5d10: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
5d20: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
5d30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
5d40: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  s;.}.../*. *----
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d60: 2d 2d 2d 2d 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 0a  ---------------.
5d90: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c   *. * ClientHell
5da0: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c  o Handshake Call
5db0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
5dc0: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62   --. *. *.Used b
5dd0: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d  y server to exam
5de0: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e  ine the server n
5df0: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28  ame indication (
5e00: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20  SNI) extension. 
5e10: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68  *.provided by th
5e20: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65  e client in orde
5e30: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61  r to select an a
5e40: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69  ppropriate certi
5e50: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65  ficate to. *.pre
5e60: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f  sent, and make o
5e70: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  ther configurati
5e80: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72  on adjustments r
5e90: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20  elevant to that 
5ea0: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61  server. *.name a
5eb0: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61  nd its configura
5ec0: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75  tion. This inclu
5ed0: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74  des swapping out
5ee0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
5ef0: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74   *.SSL_CTX point
5f00: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  er, modifying th
5f10: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20  e server's list 
5f20: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53  of permitted TLS
5f30: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68   versions,. *.ch
5f40: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65  anging the serve
5f50: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20  r's cipher list 
5f60: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74  in response to t
5f70: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68  he client's ciph
5f80: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a  er list, etc.. *
5f90: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53  .Called before S
5fa0: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c  NI and ALPN call
5fb0: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73  backs.. *. * Res
5fc0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
5fd0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
5fe0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
5ff0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
6000: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
6010: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45  des:. *.SSL_CLIE
6020: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20  NT_HELLO_RETRY: 
6030: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64  suspend the hand
6040: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68  shake, and the h
6050: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f  andshake functio
6060: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d  n will return im
6070: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c  mediately. *.SSL
6080: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6090: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65  ROR: failure, te
60a0: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69  rminate connecti
60b0: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f  on. Set alert to
60c0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09   error code.. *.
60d0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
60e0: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73  _SUCCESS: succes
60f0: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  s. *. *---------
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73  ----------. */.s
6140: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43  tatic int.HelloC
6150: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
6160: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
6170: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
6180: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
6190: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
61a0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
61b0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
61c0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
61d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
61e0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
61f0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74  , res;.    const
6200: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
6210: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
6220: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20  igned char *p;. 
6230: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72     size_t len, r
6240: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64  emaining;..    d
6250: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
6260: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
6270: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
6280: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
6290: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
62a0: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b  T_HELLO_SUCCESS;
62b0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
62c0: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53  ssl == (const SS
62d0: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20  L *)NULL || arg 
62e0: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29  == (void *)NULL)
62f0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43   {..return SSL_C
6300: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6310: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6320: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20   Get names */.  
6330: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e    if (!SSL_clien
6340: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74  t_hello_get0_ext
6350: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50  (ssl, TLSEXT_TYP
6360: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26  E_server_name, &
6370: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c  p, &remaining) |
6380: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32  | remaining <= 2
6390: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
63a0: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f  L_R_SSLV3_ALERT_
63b0: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45  ILLEGAL_PARAMETE
63c0: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
63d0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
63e0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
63f0: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e   Extract the len
6400: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c  gth of the suppl
6410: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  ied list of name
6420: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20  s. */.    len = 
6430: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20  (*(p++) << 8);. 
6440: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29     len += *(p++)
6450: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20  ;.    if (len + 
6460: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20  2 != remaining) 
6470: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
6480: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c  R_SSLV3_ALERT_IL
6490: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b  LEGAL_PARAMETER;
64a0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
64b0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
64c0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
64d0: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20  ning = len;..   
64e0: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20   /* The list in 
64f0: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61  practice only ha
6500: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  s a single eleme
6510: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63  nt, so we only c
6520: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73  onsider the firs
6530: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66  t one. */.    if
6540: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30   (remaining == 0
6550: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45   || *p++ != TLSE
6560: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74  XT_NAMETYPE_host
6570: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74  _name) {..*alert
6580: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
6590: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
65a0: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ROR;..return SSL
65b0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
65c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
65d0: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20  emaining--;..   
65e0: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66   /* Now we can f
65f0: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20  inally pull out 
6600: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77  the byte array w
6610: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68  ith the actual h
6620: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ostname. */.    
6630: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d  if (remaining <=
6640: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20   2) {..*alert = 
6650: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
6660: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
6670: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
6680: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
6690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
66a0: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b  = (*(p++) << 8);
66b0: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b  .    len += *(p+
66c0: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20  +);.    if (len 
66d0: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29  + 2 > remaining)
66e0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
66f0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6700: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
6710: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6720: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6730: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6740: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65  ng = len;.    se
6750: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  rvername = (cons
6760: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20  t char *)p;..   
6770: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
6780: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
6790: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
67a0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
67b0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
67c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
67d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
67e0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
67f0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c  wStringObj("hell
6800: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  o", -1));.    Tc
6810: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6820: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
6830: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
6840: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
6850: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
6860: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
6870: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
6880: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
6890: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
68a0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
68b0: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c  gObj(servername,
68c0: 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 0a 20   (int) len));.. 
68d0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
68e0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
68f0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
6900: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
6910: 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61   if ((code = Eva
6920: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
6930: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
6940: 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73  tr)) > 1) {..res
6950: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   = SSL_CLIENT_HE
6960: 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65  LLO_RETRY;..*ale
6970: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6980: 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e 43  _ALERT_USER_CANC
6990: 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73  ELLED;.    } els
69a0: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29  e if (code == 1)
69b0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c   {..res = SSL_CL
69c0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45  IENT_HELLO_SUCCE
69d0: 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  SS;.    } else {
69e0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45  ..res = SSL_CLIE
69f0: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6a00: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
6a10: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45  TLSV1_ALERT_INTE
6a20: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RNAL_ERROR;.    
6a30: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
6a40: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
6a50: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
6a60: 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
6a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f  *********/./* Co
6a80: 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a  mmands         *
6a90: 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
6aa0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73  --. *. * Ciphers
6b00: 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61  ObjCmd -- list a
6b10: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73  vailable ciphers
6b20: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
6b30: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
6b40: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
6b50: 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63  "tls::ciphers" c
6b60: 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73  ommand. *.to lis
6b70: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68  t available ciph
6b80: 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20  ers, based upon 
6b90: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65  protocol selecte
6ba0: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  d.. *. * Results
6bb0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
6bc0: 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e  Tcl result list.
6bd0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
6be0: 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63  cts:. *.construc
6bf0: 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20  ts and destroys 
6c00: 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58  SSL context (CTX
6c10: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ). *. *---------
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73  ----------. */.s
6c60: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6c70: 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20   *protocols[] = 
6c80: 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73 73 6c 33  {.."ssl2", "ssl3
6c90: 22 2c 20 22 74 6c 73 31 22 2c 20 22 74 6c 73 31  ", "tls1", "tls1
6ca0: 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22  .1", "tls1.2", "
6cb0: 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b  tls1.3", NULL.};
6cc0: 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b  .enum protocol {
6cd0: 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54  .    TLS_SSL2, T
6ce0: 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53  LS_SSL3, TLS_TLS
6cf0: 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54  1, TLS_TLS1_1, T
6d00: 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54  LS_TLS1_2, TLS_T
6d10: 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a  LS1_3, TLS_NONE.
6d20: 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43  };..static int.C
6d30: 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69  iphersObjCmd(Cli
6d40: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
6d50: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
6d60: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
6d70: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
6d80: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
6d90: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d  cl_Obj *objPtr =
6da0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43   NULL;.    SSL_C
6db0: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
6dc0: 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e      SSL *ssl = N
6dd0: 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f  ULL;.    STACK_O
6de0: 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73  F(SSL_CIPHER) *s
6df0: 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c  k;.    char *cp,
6e00: 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20   buf[BUFSIZ];.  
6e10: 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72    int index, ver
6e20: 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75  bose = 0, use_su
6e30: 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 0a 20 20  pported = 0;..  
6e40: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
6e50: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f  d");..    if ((o
6e60: 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a  bjc < 2) || (obj
6e70: 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57  c > 4)) {..Tcl_W
6e80: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
6e90: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72  rp, 1, objv, "pr
6ea0: 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f  otocol ?verbose?
6eb0: 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a   ?supported?");.
6ec0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
6ed0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
6ee0: 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f  (Tcl_GetIndexFro
6ef0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
6f00: 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c  v[1], protocols,
6f10: 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20   "protocol", 0, 
6f20: 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f  &index) != TCL_O
6f30: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
6f40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6f50: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32 29    if ((objc > 2)
6f60: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65   && Tcl_GetBoole
6f70: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
6f80: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62  , objv[2], &verb
6f90: 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ose) != TCL_OK) 
6fa0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
6fb0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
6fc0: 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26 26  f ((objc > 3) &&
6fd0: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
6fe0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
6ff0: 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70  bjv[3], &use_sup
7000: 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f  ported) != TCL_O
7010: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
7020: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
7030: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
7040: 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74 63  or();..    switc
7050: 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f  h ((enum protoco
7060: 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 65  l)index) {..case
7070: 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f   TLS_SSL2:.#if O
7080: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
7090: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30  UMBER >= 0x10100
70a0: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28  000L || defined(
70b0: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69  NO_SSL2) || defi
70c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
70d0: 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 70  SL2)..    Tcl_Ap
70e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
70f0: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
7100: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
7110: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
7120: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7130: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7140: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20  else..    ctx = 
7150: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76  SSL_CTX_new(SSLv
7160: 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65  2_method()); bre
7170: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
7180: 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64   TLS_SSL3:.#if d
7190: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
71a0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
71b0: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  SL_NO_SSL3) || d
71c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
71d0: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09  O_SSL3_METHOD)..
71e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
71f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
7200: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
7210: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
7220: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
7230: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
7240: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
7250: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54      ctx = SSL_CT
7260: 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74 68  X_new(SSLv3_meth
7270: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65  od()); break;.#e
7280: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
7290: 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  LS1:.#if defined
72a0: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66  (NO_TLS1) || def
72b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
72c0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  TLS1) || defined
72d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
72e0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63  _METHOD)..    Tc
72f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7300: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73  nterp, protocols
7310: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74  [index], ": prot
7320: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
7330: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ed", NULL);..   
7340: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7350: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74  R;.#else..    ct
7360: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28  x = SSL_CTX_new(
7370: 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 29 3b  TLSv1_method());
7380: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
7390: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a  case TLS_TLS1_1:
73a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
73b0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
73c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
73d0: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
73e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
73f0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  _1_METHOD)..    
7400: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7410: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7420: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
7430: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
7440: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
7450: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7460: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7470: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
7480: 77 28 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64  w(TLSv1_1_method
7490: 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  ()); break;.#end
74a0: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53  if..case TLS_TLS
74b0: 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  1_2:.#if defined
74c0: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
74d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
74e0: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
74f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7500: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09  TLS1_2_METHOD)..
7510: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
7520: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
7530: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
7540: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
7550: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
7560: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
7570: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
7580: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54      ctx = SSL_CT
7590: 58 5f 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d 65  X_new(TLSv1_2_me
75a0: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a  thod()); break;.
75b0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
75c0: 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66  _TLS1_3:.#if def
75d0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
75e0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
75f0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20  SL_NO_TLS1_3).. 
7600: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7610: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
7620: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
7630: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7640: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
7650: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
7660: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
7670: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
7680: 5f 6e 65 77 28 54 4c 53 5f 6d 65 74 68 6f 64 28  _new(TLS_method(
7690: 29 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  ));..    SSL_CTX
76a0: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
76b0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
76c0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20  _3_VERSION);..  
76d0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61    SSL_CTX_set_ma
76e0: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  x_proto_version(
76f0: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
7700: 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  ION);..    break
7710: 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c  ;.#endif..defaul
7720: 74 3a 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20  t:..    break;. 
7730: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 74 78     }.    if (ctx
7740: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
7750: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7760: 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20  terp, REASON(), 
7770: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
7780: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7790: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e  .    ssl = SSL_n
77a0: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20  ew(ctx);.    if 
77b0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
77c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
77d0: 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e  t(interp, REASON
77e0: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f  (), NULL);..SSL_
77f0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
7800: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7810: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7820: 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64  Use list and ord
7830: 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73  er as would be s
7840: 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48  ent in a ClientH
7850: 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69  ello or all avai
7860: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f  lable ciphers */
7870: 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 70  .    if (use_sup
7880: 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20  ported) {..sk = 
7890: 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74  SSL_get1_support
78a0: 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b  ed_ciphers(ssl);
78b0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73  .    } else {..s
78c0: 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68  k = SSL_get_ciph
78d0: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a  ers(ssl);.    }.
78e0: 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e  .    if (sk != N
78f0: 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72  ULL) {..if (!ver
7900: 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f 62 6a  bose) {..    obj
7910: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
7920: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09  tObj(0, NULL);..
7930: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
7940: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43   0; i < sk_SSL_C
7950: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69  IPHER_num(sk); i
7960: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53  ++) {...const SS
7970: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b  L_CIPHER *c = sk
7980: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75  _SSL_CIPHER_valu
7990: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28  e(sk, i);...if (
79a0: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69  c == NULL) conti
79b0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65  nue;..../* ciphe
79c0: 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29  r name or (NONE)
79d0: 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43   */...cp = SSL_C
79e0: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63  IPHER_get_name(c
79f0: 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e  );...if (cp == N
7a00: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63  ULL) break;...Tc
7a10: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7a20: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
7a30: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
7a40: 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29  ringObj(cp, -1))
7a50: 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73  ;..    }...} els
7a60: 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20  e {..    objPtr 
7a70: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
7a80: 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66  bj("",0);..    f
7a90: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
7aa0: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   < sk_SSL_CIPHER
7ab0: 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b  _num(sk); i++) {
7ac0: 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50  ...const SSL_CIP
7ad0: 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f  HER *c = sk_SSL_
7ae0: 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c  CIPHER_value(sk,
7af0: 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20   i);...if (c == 
7b00: 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  NULL) continue;.
7b10: 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65  .../* textual de
7b20: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
7b30: 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20   cipher */...if 
7b40: 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63  (SSL_CIPHER_desc
7b50: 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20  ription(c, buf, 
7b60: 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20  sizeof(buf)) != 
7b70: 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63  NULL) {...    Tc
7b80: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62  l_AppendToObj(ob
7b90: 6a 50 74 72 2c 20 62 75 66 2c 20 28 69 6e 74 29  jPtr, buf, (int)
7ba0: 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09   strlen(buf));..
7bb0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20  .} else {...    
7bc0: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28  Tcl_AppendToObj(
7bd0: 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e  objPtr, "UNKNOWN
7be0: 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20  \n", 8);...}..  
7bf0: 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f    }..}..if (use_
7c00: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20  supported) {..  
7c10: 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f    sk_SSL_CIPHER_
7c20: 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20  free(sk);..}.   
7c30: 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28   }.    SSL_free(
7c40: 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54  ssl);.    SSL_CT
7c50: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20  X_free(ctx);..  
7c60: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
7c70: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
7c80: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
7c90: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
7ca0: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
7cb0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7d00: 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a  . * ProtocolsObj
7d10: 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69  Cmd -- list avai
7d20: 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a  lable protocols.
7d30: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
7d40: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
7d50: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
7d60: 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20  tls::protocols" 
7d70: 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69  command. *.to li
7d80: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f  st available pro
7d90: 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65  tocols.. *. * Re
7da0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
7db0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20  dard Tcl result 
7dc0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  list.. *. * Side
7dd0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e   effects:. *.non
7de0: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
7df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
7e30: 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63  tatic int.Protoc
7e40: 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  olsObjCmd(Client
7e50: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
7e60: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
7e70: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
7e80: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
7e90: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
7ea0: 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20  Obj *objPtr;..  
7eb0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
7ec0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
7ed0: 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f  jc != 1) {..Tcl_
7ee0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
7ef0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
7f00: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7f10: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
7f20: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
7f30: 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20  ();..    objPtr 
7f40: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
7f50: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20  (0, NULL);..#if 
7f60: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
7f70: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30  NUMBER < 0x10100
7f80: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64  000L && !defined
7f90: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65  (NO_SSL2) && !de
7fa0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7fb0: 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c  _SSL2).    Tcl_L
7fc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7fd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
7fe0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
7ff0: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8000: 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a  LS_SSL2], -1));.
8010: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
8020: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
8030: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8040: 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  _NO_SSL3) && !de
8050: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8060: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20  _SSL3_METHOD).  
8070: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
8080: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
8090: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
80a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
80b0: 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c  ocols[TLS_SSL3],
80c0: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
80d0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
80e0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
80f0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
8100: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8110: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54  NSSL_NO_TLS1_MET
8120: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  HOD).    Tcl_Lis
8130: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8140: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8150: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8160: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
8170: 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65  _TLS1], -1));.#e
8180: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
8190: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
81a0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
81b0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  _NO_TLS1_1) && !
81c0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
81d0: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44  NO_TLS1_1_METHOD
81e0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
81f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
8200: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
8210: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8220: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c  protocols[TLS_TL
8230: 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  S1_1], -1));.#en
8240: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
8250: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
8260: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8270: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
8280: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8290: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
82a0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
82b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
82c0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
82d0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
82e0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53  rotocols[TLS_TLS
82f0: 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  1_2], -1));.#end
8300: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
8310: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
8320: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8330: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63  O_TLS1_3).    Tc
8340: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
8350: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
8360: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
8370: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
8380: 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d  s[TLS_TLS1_3], -
8390: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  1));.#endif..   
83a0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
83b0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
83c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
83d0: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
83e0: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
83f0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
8400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
8440: 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43   * HandshakeObjC
8450: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  md --. *. *.This
8460: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
8470: 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 68   to verify wheth
8480: 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  er the handshake
8490: 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09   is complete. *.
84a0: 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65  or not.. *. * Re
84b0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
84c0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
84d0: 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61   1 means handsha
84e0: 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d  ke complete, 0 m
84f0: 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a  eans pending.. *
8500: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
8510: 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53  :. *.May force S
8520: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74  SL negotiation t
8530: 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a  o take place.. *
8540: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
8550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8580: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
8590: 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f  c int HandshakeO
85a0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
85b0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
85c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
85d0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
85e0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
85f0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
8600: 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20  nel chan;       
8610: 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20   /* The channel 
8620: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e  to set a mode on
8630: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a  . */.    State *
8640: 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 20  statePtr;       
8650: 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65   /* client state
8660: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20   for ssl socket 
8670: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
8680: 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c  r *errStr = NULL
8690: 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20  ;.    int ret = 
86a0: 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d  1;.    int err =
86b0: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
86c0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
86d0: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
86e0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
86f0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
8700: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b  bjv, "channel");
8710: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
8720: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OR);.    }..    
8730: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
8740: 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54  );..    chan = T
8750: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
8760: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
8770: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
8780: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29  1], NULL), NULL)
8790: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
87a0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
87b0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28  NULL) {..return(
87c0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
87d0: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
87e0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
87f0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
8800: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
8810: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
8820: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20  annel(chan);.   
8830: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
8840: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
8850: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
8860: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
8870: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8880: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
8890: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
88a0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20  Name(chan),..   
88b0: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20   "\": not a TLS 
88c0: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
88d0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
88e0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
88f0: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22  , "HANDSHAKE", "
8900: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
8910: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
8920: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c  LL);..return(TCL
8930: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20  _ERROR);.    }. 
8940: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53     statePtr = (S
8950: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
8960: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
8970: 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70  a(chan);..    dp
8980: 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54  rintf("Calling T
8990: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  ls_WaitForConnec
89a0: 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54  t");.    ret = T
89b0: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  ls_WaitForConnec
89c0: 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72  t(statePtr, &err
89d0: 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  , 1);.    dprint
89e0: 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  f("Tls_WaitForCo
89f0: 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20  nnect returned: 
8a00: 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20  %i", ret);..    
8a10: 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 28  if (ret < 0 && (
8a20: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
8a30: 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43   & TLS_TCL_ASYNC
8a40: 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47  ) && (err == EAG
8a50: 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74  AIN))) {..dprint
8a60: 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64  f("Async set and
8a70: 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b   err = EAGAIN");
8a80: 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ..ret = 0;.    }
8a90: 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20   else if (ret < 
8aa0: 30 29 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 73  0) {..errStr = s
8ab0: 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54  tatePtr->err;..T
8ac0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
8ad0: 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74  nterp);..Tcl_Set
8ae0: 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66  Errno(err);...if
8af0: 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65   (!errStr || (*e
8b00: 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09  rrStr == 0)) {..
8b10: 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c      errStr = Tcl
8b20: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65  _PosixError(inte
8b30: 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70  rp);..}...Tcl_Ap
8b40: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8b50: 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61  p, "handshake fa
8b60: 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c  iled: ", errStr,
8b70: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
8b80: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
8b90: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
8ba0: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22  , "HANDSHAKE", "
8bb0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
8bc0: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74  ) NULL);..dprint
8bd0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
8be0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64  _ERROR with hand
8bf0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73  shake failed: %s
8c00: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74  ", errStr);..ret
8c10: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
8c20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66      } else {..if
8c30: 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20   (err != 0) {.. 
8c40: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
8c50: 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20  an error with a 
8c60: 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68  completed handsh
8c70: 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20  ake: err = %i", 
8c80: 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20  err);..}..ret = 
8c90: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  1;.    }..    dp
8ca0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
8cb0: 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74   TCL_OK with dat
8cc0: 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b  a \"%i\"", ret);
8cd0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
8ce0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
8cf0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29  l_NewIntObj(ret)
8d00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43  );.    return(TC
8d10: 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61  L_OK);..clientDa
8d20: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
8d30: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
8d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
8d80: 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20   * ImportObjCmd 
8d90: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
8da0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
8db0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
8dc0: 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a  e "ssl" command.
8dd0: 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f   *. *.The ssl co
8de0: 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c  mmand pushes SSL
8df0: 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63   over a (newly c
8e00: 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f  onnected) tcp so
8e10: 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cket. *. * Resul
8e20: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
8e30: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
8e40: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
8e50: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20  :. *.May modify 
8e60: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
8e70: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20  an IO channel.. 
8e80: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ec0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
8ed0: 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a  ic int.ImportObj
8ee0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
8ef0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
8f00: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
8f10: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
8f20: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
8f30: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
8f40: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
8f50: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
8f60: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20   mode on. */.   
8f70: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
8f80: 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61  ;../* client sta
8f90: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65  te for ssl socke
8fa0: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  t */.    SSL_CTX
8fb0: 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d 20   *ctx.        = 
8fc0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
8fd0: 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 20 20  j *script.      
8fe0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63    = NULL;.    Tc
8ff0: 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09  l_Obj *password.
9000: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9010: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d      Tcl_Obj *vcm
9020: 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  d.        = NULL
9030: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
9040: 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  g upperChannelTr
9050: 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72  anslation, upper
9060: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c  ChannelBlocking,
9070: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63   upperChannelEnc
9080: 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e  oding, upperChan
9090: 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20  nelEOFChar;.    
90a0: 69 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20  int idx, len;.  
90b0: 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20    int flags..   
90c0: 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49       = TLS_TCL_I
90d0: 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72  NIT;.    int ser
90e0: 76 65 72 09 09 20 20 20 20 20 20 20 20 3d 20 30  ver..        = 0
90f0: 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69  ;./* is connecti
9100: 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f  on incoming or o
9110: 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20  utgoing? */.    
9120: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20  char *keyfile.  
9130: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
9140: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65    char *certfile
9150: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9160: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
9170: 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c  ar *key  .= NULL
9180: 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65  ;.    int key_le
9190: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
91a0: 20 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67    = 0;.    unsig
91b0: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 20 20  ned char *cert  
91c0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
91d0: 20 20 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20     int cert_len 
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d                 =
91f0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69   0;.    char *ci
9200: 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20  phers.        = 
9210: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9220: 63 69 70 68 65 72 73 75 69 74 65 73 09 20 20 20  ciphersuites.   
9230: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
9240: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20   char *CAfile.  
9250: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
9260: 20 20 63 68 61 72 20 2a 43 41 64 69 72 09 09 20    char *CAdir.. 
9270: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
9280: 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d     char *DHparam
9290: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  s.        = NULL
92a0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65  ;.    char *mode
92b0: 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  l..        = NUL
92c0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72  L;.    char *ser
92d0: 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20 20 20  vername.        
92e0: 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e  = NULL;./* hostn
92f0: 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e  ame for Server N
9300: 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a  ame Indication *
9310: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  /.    const unsi
9320: 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69  gned char *sessi
9330: 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20  on_id = NULL;.  
9340: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09    Tcl_Obj *alpn.
9350: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74  .= NULL;.    int
9360: 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20   ssl2 = 0, ssl3 
9370: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73  = 0;.    int tls
9380: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20  1 = 1, tls1_1 = 
9390: 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74  1, tls1_2 = 1, t
93a0: 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69  ls1_3 = 1;.    i
93b0: 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65  nt proto = 0, le
93c0: 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e  vel = -1;.    in
93d0: 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65  t verify = 0, re
93e0: 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65  quire = 0, reque
93f0: 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e  st = 1, post_han
9400: 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20  dshake = 0;..   
9410: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
9420: 22 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ");..#if OPENSSL
9430: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
9440: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
9450: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
9460: 4c 5f 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  L_NO_SSL2) && !d
9470: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
9480: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  && defined(NO_SS
9490: 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  L3) && defined(N
94a0: 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e  O_TLS1) && defin
94b0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  ed(NO_TLS1_1) &&
94c0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
94d0: 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  _2) && defined(N
94e0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 73 73  O_TLS1_3).    ss
94f0: 6c 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23  l2 = 1;.#endif.#
9500: 69 66 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  if !defined(OPEN
9510: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20  SSL_NO_SSL3) && 
9520: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
9530: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
9540: 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65 64  SSL2) && defined
9550: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66  (NO_TLS1) && def
9560: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
9570: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
9580: 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64  S1_2) && defined
9590: 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  (NO_TLS1_3).    
95a0: 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64 69 66  ssl3 = 1;.#endif
95b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
95c0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  TLS1) || defined
95d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
95e0: 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a  ).    tls1 = 0;.
95f0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
9600: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  ed(NO_TLS1_1) ||
9610: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
9620: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20  _NO_TLS1_1).    
9630: 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64  tls1_1 = 0;.#end
9640: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
9650: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
9660: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
9670: 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31  TLS1_2).    tls1
9680: 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  _2 = 0;.#endif.#
9690: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
96a0: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_3) || defined
96b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
96c0: 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d  _3).    tls1_3 =
96d0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
96e0: 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a  if (objc < 2) {.
96f0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
9700: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
9710: 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74  v, "channel ?opt
9720: 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e  ions?");..return
9730: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9740: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
9750: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
9760: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
9770: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
9780: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
9790: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29  j(objv[1], NULL)
97a0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
97b0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
97c0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
97d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
97e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
97f0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
9800: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
9810: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
9820: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
9830: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
9840: 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78  );..    for (idx
9850: 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63   = 2; idx < objc
9860: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72  ; idx++) {..char
9870: 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53   *opt = Tcl_GetS
9880: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
9890: 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a  v[idx], NULL);..
98a0: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27  .if (opt[0] != '
98b0: 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  -')..    break;.
98c0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22  ..OPTOBJ("-alpn"
98d0: 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52  , alpn);..OPTSTR
98e0: 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72  ("-cadir", CAdir
98f0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66  );..OPTSTR("-caf
9900: 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09  ile", CAfile);..
9910: 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c  OPTBYTE("-cert",
9920: 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29   cert, cert_len)
9930: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74  ;..OPTSTR("-cert
9940: 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29  file", certfile)
9950: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68  ;..OPTSTR("-ciph
9960: 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09  er", ciphers);..
9970: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73  OPTSTR("-ciphers
9980: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50  ", ciphers);..OP
9990: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69  TSTR("-ciphersui
99a0: 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74  tes", ciphersuit
99b0: 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63  es);..OPTOBJ("-c
99c0: 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29  ommand", script)
99d0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61  ;..OPTSTR("-dhpa
99e0: 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29  rams", DHparams)
99f0: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79  ;..OPTBYTE("-key
9a00: 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29  ", key, key_len)
9a10: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66  ;..OPTSTR("-keyf
9a20: 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a  ile", keyfile);.
9a30: 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22  .OPTSTR("-model"
9a40: 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42  , model);..OPTOB
9a50: 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70  J("-password", p
9a60: 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f  assword);..OPTBO
9a70: 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68  OL("-post_handsh
9a80: 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73  ake", post_hands
9a90: 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  hake);..OPTBOOL(
9aa0: 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75  "-request", requ
9ab0: 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  est);..OPTBOOL("
9ac0: 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69  -require", requi
9ad0: 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73  re);..OPTINT("-s
9ae0: 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 6c  ecuritylevel", l
9af0: 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  evel);..OPTBOOL(
9b00: 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 65  "-server", serve
9b10: 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65  r);..OPTSTR("-se
9b20: 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65  rvername", serve
9b30: 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28  rname);..OPTSTR(
9b40: 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73  "-session_id", s
9b50: 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54  ession_id);..OPT
9b60: 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73  BOOL("-ssl2", ss
9b70: 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  l2);..OPTBOOL("-
9b80: 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f  ssl3", ssl3);..O
9b90: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20  PTBOOL("-tls1", 
9ba0: 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  tls1);..OPTBOOL(
9bb0: 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f  "-tls1.1", tls1_
9bc0: 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74  1);..OPTBOOL("-t
9bd0: 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b  ls1.2", tls1_2);
9be0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31  ..OPTBOOL("-tls1
9bf0: 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f  .3", tls1_3);..O
9c00: 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65  PTOBJ("-validate
9c10: 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b  command", vcmd);
9c20: 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22  ..OPTOBJ("-vcmd"
9c30: 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41  , vcmd);...OPTBA
9c40: 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c  D("option", "-al
9c50: 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66  pn, -cadir, -caf
9c60: 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72  ile, -cert, -cer
9c70: 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20  tfile, -cipher, 
9c80: 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d  -ciphersuites, -
9c90: 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61  command, -dhpara
9ca0: 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69  ms, -key, -keyfi
9cb0: 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73  le, -model, -pas
9cc0: 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e  sword, -post_han
9cd0: 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 74  dshake, -request
9ce0: 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 63  , -require, -sec
9cf0: 75 72 69 74 79 6c 65 76 65 6c 2c 20 2d 73 65 72  uritylevel, -ser
9d00: 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65  ver, -servername
9d10: 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d  , -session_id, -
9d20: 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c  ssl2, -ssl3, -tl
9d30: 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c  s1, -tls1.1, -tl
9d40: 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f  s1.2, -tls1.3, o
9d50: 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61  r -validatecomma
9d60: 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54  nd");...return T
9d70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
9d80: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 29      if (request)
9d90: 09 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f  ..verify |= SSL_
9da0: 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e  VERIFY_CLIENT_ON
9db0: 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f  CE | SSL_VERIFY_
9dc0: 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65  PEER;.    if (re
9dd0: 71 75 65 73 74 20 26 26 20 72 65 71 75 69 72 65  quest && require
9de0: 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f  ).verify |= SSL_
9df0: 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e  VERIFY_FAIL_IF_N
9e00: 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20  O_PEER_CERT;.   
9e10: 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20   if (request && 
9e20: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09  post_handshake).
9e30: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
9e40: 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48  RIFY_POST_HANDSH
9e50: 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72  AKE;.    if (ver
9e60: 69 66 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66  ify == 0)..verif
9e70: 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e  y = SSL_VERIFY_N
9e80: 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20  ONE;..    proto 
9e90: 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50  |= (ssl2 ? TLS_P
9ea0: 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a  ROTO_SSL2 : 0);.
9eb0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73      proto |= (ss
9ec0: 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  l3 ? TLS_PROTO_S
9ed0: 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  SL3 : 0);.    pr
9ee0: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54  oto |= (tls1 ? T
9ef0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20  LS_PROTO_TLS1 : 
9f00: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
9f10: 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50   (tls1_1 ? TLS_P
9f20: 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29  ROTO_TLS1_1 : 0)
9f30: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
9f40: 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f  tls1_2 ? TLS_PRO
9f50: 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a  TO_TLS1_2 : 0);.
9f60: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
9f70: 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_3 ? TLS_PROTO
9f80: 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20  _TLS1_3 : 0);.. 
9f90: 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e     /* reset to N
9fa0: 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72  ULL if blank str
9fb0: 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a  ing provided */.
9fc0: 20 20 20 20 69 66 20 28 63 65 72 74 20 26 26 20      if (cert && 
9fd0: 21 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 20  !*cert)..       
9fe0: 20 63 65 72 74 09 20 20 20 20 20 20 20 20 3d 20   cert.        = 
9ff0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65  NULL;.    if (ke
a000: 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20  y && !*key)..   
a010: 20 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 20       key.       
a020: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a030: 28 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63  (certfile && !*c
a040: 65 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 20  ertfile)        
a050: 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c   certfile.= NULL
a060: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c  ;.    if (keyfil
a070: 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09  e && !*keyfile).
a080: 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20  .keyfile.       
a090: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a0a0: 28 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 69  (ciphers && !*ci
a0b0: 70 68 65 72 73 29 09 20 20 20 20 20 20 20 20 63  phers).        c
a0c0: 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d  iphers.        =
a0d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
a0e0: 69 70 68 65 72 73 75 69 74 65 73 20 26 26 20 21  iphersuites && !
a0f0: 2a 63 69 70 68 65 72 73 75 69 74 65 73 29 20 63  *ciphersuites) c
a100: 69 70 68 65 72 73 75 69 74 65 73 20 20 20 20 3d  iphersuites    =
a110: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43   NULL;.    if (C
a120: 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c  Afile && !*CAfil
a130: 65 29 09 20 20 20 20 20 20 20 20 43 41 66 69 6c  e).        CAfil
a140: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  e.        = NULL
a150: 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69 72 20  ;.    if (CAdir 
a160: 26 26 20 21 2a 43 41 64 69 72 29 09 20 20 20 20  && !*CAdir).    
a170: 20 20 20 20 43 41 64 69 72 09 20 20 20 20 20 20      CAdir.      
a180: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
a190: 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a   (DHparams && !*
a1a0: 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 20  DHparams).      
a1b0: 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 20    DHparams      
a1c0: 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f    = NULL;..    /
a1d0: 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20  * new SSL state 
a1e0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 09  */.    statePtr.
a1f0: 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61  .= (State *) cka
a200: 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20  lloc((unsigned) 
a210: 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a  sizeof(State));.
a220: 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65      memset(state
a230: 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  Ptr, 0, sizeof(S
a240: 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61  tate));..    sta
a250: 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66  tePtr->flags.= f
a260: 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50  lags;.    stateP
a270: 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74  tr->interp.= int
a280: 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74  erp;.    statePt
a290: 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69  r->vflags.= veri
a2a0: 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  fy;.    statePtr
a2b0: 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20  ->err.= "";..   
a2c0: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72   /* allocate scr
a2d0: 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  ipt */.    if (s
a2e0: 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29  cript) {..(void)
a2f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
a300: 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c  omObj(script, &l
a310: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b  en);..if (len) {
a320: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
a330: 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70  callback = scrip
a340: 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  t;..    Tcl_Incr
a350: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
a360: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d  r->callback);..}
a370: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61  .    }..    /* a
a380: 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64  llocate password
a390: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73   */.    if (pass
a3a0: 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20  word) {..(void) 
a3b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
a3c0: 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26  mObj(password, &
a3d0: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20  len);..if (len) 
a3e0: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  {..    statePtr-
a3f0: 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73  >password = pass
a400: 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49  word;..    Tcl_I
a410: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ncrRefCount(stat
a420: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b  ePtr->password);
a430: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
a440: 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64  * allocate valid
a450: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ate command */. 
a460: 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09     if (vcmd) {..
a470: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
a480: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64  ringFromObj(vcmd
a490: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65  , &len);..if (le
a4a0: 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50  n) {..    stateP
a4b0: 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b  tr->vcmd = vcmd;
a4c0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
a4d0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
a4e0: 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d  >vcmd);..}.    }
a4f0: 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20  ..    if (model 
a500: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20  != NULL) {..int 
a510: 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68  mode;../* Get th
a520: 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78  e "model" contex
a530: 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c  t */..chan = Tcl
a540: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
a550: 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65  rp, model, &mode
a560: 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20  );..if (chan == 
a570: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
a580: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46  LL) {..    Tls_F
a590: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
a5a0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a5b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a5c0: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20  }.../*.. * Make 
a5d0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
a5e0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
a5f0: 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61  hannel.. */..cha
a600: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
a610: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66  annel(chan);..if
a620: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
a630: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
a640: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
a650: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
a660: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a670: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
a680: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
a690: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
a6a0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
a6b0: 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09  annel", NULL);..
a6c0: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
a6d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
a6e0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43  S", "IMPORT", "C
a6f0: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
a700: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
a710: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  L);..    Tls_Fre
a720: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
a730: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
a740: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
a750: 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a  .ctx = ((State *
a760: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  )Tcl_GetChannelI
a770: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
a780: 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65  ))->ctx;.    } e
a790: 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20  lse {..if ((ctx 
a7a0: 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65  = CTX_Init(state
a7b0: 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f  Ptr, server, pro
a7c0: 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72  to, keyfile, cer
a7d0: 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74  tfile, key, cert
a7e0: 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20  , key_len,..    
a7f0: 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c  cert_len, CAdir,
a800: 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73   CAfile, ciphers
a810: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c 20  , ciphersuites, 
a820: 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29  level, DHparams)
a830: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  ) == NULL) {..  
a840: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
a850: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
a860: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a870: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
a880: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74      statePtr->ct
a890: 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a  x = ctx;..    /*
a8a0: 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20  .     * We need 
a8b0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
a8c0: 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f  t the channel wo
a8d0: 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66  rks in binary (f
a8e0: 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e  or the.     * en
a8f0: 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20  cryption not to 
a900: 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a  get goofed up)..
a910: 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77       * We only w
a920: 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68  ant to adjust th
a930: 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70  e buffering in p
a940: 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20  re-v2 channels, 
a950: 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63  where.     * eac
a960: 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65  h channel in the
a970: 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65   stack maintaine
a980: 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72  d its own buffer
a990: 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54  s..     */.    T
a9a0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
a9b0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
a9c0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63  slation);.    Tc
a9d0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
a9e0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
a9f0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ing);.    Tcl_DS
aa00: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
aa10: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
aa20: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
aa30: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
aa40: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  elEncoding);.   
aa50: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
aa60: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
aa70: 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20  an, "-eofchar", 
aa80: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
aa90: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47  Char);.    Tcl_G
aaa0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
aab0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
aac0: 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65  encoding", &uppe
aad0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
aae0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
aaf0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ab00: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e  rp, chan, "-tran
ab10: 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72  slation", &upper
ab20: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
ab30: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  on);.    Tcl_Get
ab40: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ab50: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c  terp, chan, "-bl
ab60: 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43  ocking", &upperC
ab70: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b  hannelBlocking);
ab80: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
ab90: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
aba0: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
abb0: 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22  ation", "binary"
abc0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
abd0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
abe0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63  rp, chan, "-bloc
abf0: 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a  king", "true");.
ac00: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e      dprintf("Con
ac10: 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e  suming Tcl chann
ac20: 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  el %s", Tcl_GetC
ac30: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
ac40: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  );.    statePtr-
ac50: 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63  >self = Tcl_Stac
ac60: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  kChannel(interp,
ac70: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
ac80: 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  (), (ClientData)
ac90: 20 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f   statePtr, (TCL_
aca0: 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57  READABLE | TCL_W
acb0: 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b  RITABLE), chan);
acc0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72  .    dprintf("Cr
acd0: 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61  eated channel na
ace0: 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74  med %s", Tcl_Get
acf0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
ad00: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20  ePtr->self));.  
ad10: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
ad20: 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61  self == (Tcl_Cha
ad30: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f  nnel) NULL) {../
ad40: 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20  *.. * No use of 
ad50: 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72  Tcl_EventuallyFr
ad60: 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f  ee because no po
ad70: 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65  ssible Tcl_Prese
ad80: 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46  rve... */..Tls_F
ad90: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
ada0: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
adb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
adc0: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ..    Tcl_SetCha
add0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
ade0: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
adf0: 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  f, "-translation
ae00: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
ae10: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
ae20: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a  lTranslation));.
ae30: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
ae40: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
ae50: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
ae60: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63   "-encoding", Tc
ae70: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
ae80: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
ae90: 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f  ding));.    Tcl_
aea0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
aeb0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
aec0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68  r->self, "-eofch
aed0: 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  ar", Tcl_DString
aee0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
aef0: 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20  nelEOFChar));.  
af00: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
af10: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
af20: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
af30: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f  -blocking", Tcl_
af40: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
af50: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
af60: 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ng));..    /*.  
af70: 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c     * SSL Initial
af80: 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a  ization.     */.
af90: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73      statePtr->ss
afa0: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74  l = SSL_new(stat
afb0: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20  ePtr->ctx);.    
afc0: 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73  if (!statePtr->s
afd0: 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69  sl) {../* SSL li
afe0: 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09  brary error */..
aff0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b000: 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e  (interp, "couldn
b010: 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c  't construct ssl
b020: 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41   session: ", REA
b030: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
b040: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
b050: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b060: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b070: 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46  ORT", "INIT", "F
b080: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
b090: 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65   NULL);..Tls_Fre
b0a0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
b0b0: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  Ptr);..return TC
b0c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
b0d0: 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20      /* Set host 
b0e0: 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20  server name */. 
b0f0: 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d     if (servernam
b100: 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68  e) {../* Sets th
b110: 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e  e server name in
b120: 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 69  dication (SNI) i
b130: 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78  n ClientHello ex
b140: 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50  tension */../* P
b150: 65 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f 73  er RFC 6066, hos
b160: 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49 49  tname is a ASCII
b170: 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2e   encoded string.
b180: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65   */..if (!SSL_se
b190: 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61  t_tlsext_host_na
b1a0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  me(statePtr->ssl
b1b0: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26  , servername) &&
b1c0: 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20   require) {..   
b1d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b1e0: 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69  t(interp, "setti
b1f0: 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65  ng TLS host name
b200: 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65   extension faile
b210: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
b220: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
b230: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
b240: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
b250: 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45  ", "SNI", "FAILE
b260: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
b270: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  L);..    Tls_Fre
b280: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
b290: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
b2a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
b2b0: 0a 09 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 73  ../* Configure s
b2c0: 65 72 76 65 72 20 68 6f 73 74 20 6e 61 6d 65 20  erver host name 
b2d0: 63 68 65 63 6b 73 20 69 6e 20 74 68 65 20 53 53  checks in the SS
b2e0: 4c 20 63 6c 69 65 6e 74 2e 20 53 65 74 20 44 4e  L client. Set DN
b2f0: 53 20 68 6f 73 74 6e 61 6d 65 20 74 6f 0a 09 20  S hostname to.. 
b300: 20 20 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20    name for peer 
b310: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 65 63  certificate chec
b320: 6b 73 2e 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73  ks. SSL_set1_hos
b330: 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e  t has limitation
b340: 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  s. */..if (!SSL_
b350: 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50  add1_host(stateP
b360: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e  tr->ssl, servern
b370: 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ame)) {..    Tcl
b380: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b390: 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 44  terp, "setting D
b3a0: 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 69  NS host name fai
b3b0: 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  led", (char *) N
b3c0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
b3d0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
b3e0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
b3f0: 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c  RT", "HOSTNAME",
b400: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
b410: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
b420: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
b430: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
b440: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b450: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
b460: 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73    /* Resume sess
b470: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66  ion id */.    if
b480: 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20   (session_id && 
b490: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69  strlen(session_i
b4a0: 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49  d) <= SSL_MAX_SI
b4b0: 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a  D_CTX_LENGTH) {.
b4c0: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73  ./* SSL_set_sess
b4d0: 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53  ion() */..if (!S
b4e0: 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f  SL_SESSION_set1_
b4f0: 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67  id_context(SSL_g
b500: 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65  et_session(state
b510: 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69  Ptr->ssl), sessi
b520: 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64  on_id, (unsigned
b530: 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73   int) strlen(ses
b540: 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20  sion_id))) {..  
b550: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b560: 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75  lt(interp, "Resu
b570: 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 22 2c  me session id ",
b580: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22 20 66   session_id, " f
b590: 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29  ailed", (char *)
b5a0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
b5b0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b5c0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
b5d0: 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22  PORT", "SESSION"
b5e0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
b5f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  r *) NULL);.    
b600: 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65 65          Tls_Free
b610: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
b620: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tr);.           
b630: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b640: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  R;..}.    }..   
b650: 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a   if (alpn) {../*
b660: 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c   Convert a TCL l
b670: 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f  ist into a proto
b680: 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65  col-list in wire
b690: 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69  -format */..unsi
b6a0: 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f  gned char *proto
b6b0: 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64  s, *p;..unsigned
b6c0: 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20   int protos_len 
b6d0: 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 6e  = 0;..int i, len
b6e0: 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20  , cnt;..Tcl_Obj 
b6f0: 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63  **list;...if (Tc
b700: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
b710: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70  ents(interp, alp
b720: 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20  n, &cnt, &list) 
b730: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
b740: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b750: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b760: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b770: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  RROR;..}.../* De
b780: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f  termine the memo
b790: 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ry required for 
b7a0: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  the protocol-lis
b7b0: 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30  t */..for (i = 0
b7c0: 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20  ; i < cnt; i++) 
b7d0: 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74  {..    Tcl_GetSt
b7e0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74  ringFromObj(list
b7f0: 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20  [i], &len);..   
b800: 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20   if (len > 255) 
b810: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
b820: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c  sult(interp, "AL
b830: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65  PN protocol name
b840: 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61   too long", (cha
b850: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63  r *) NULL);...Tc
b860: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
b870: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
b880: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20  MPORT", "ALPN", 
b890: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b8a0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f  *) NULL);...Tls_
b8b0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
b8c0: 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72  atePtr);...retur
b8d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
b8e0: 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f    }..    protos_
b8f0: 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e 3b 0a  len += 1 + len;.
b900: 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68  .}.../* Build th
b910: 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f  e complete proto
b920: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f  col-list */..pro
b930: 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72  tos = ckalloc(pr
b940: 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70  otos_len);../* p
b950: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f  rotocol-lists co
b960: 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c  nsist of 8-bit l
b970: 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20  ength-prefixed, 
b980: 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a  byte strings */.
b990: 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 70 20 3d  .for (i = 0, p =
b9a0: 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63 6e 74   protos; i < cnt
b9b0: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68  ; i++) {..    ch
b9c0: 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65  ar *str = Tcl_Ge
b9d0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c  tStringFromObj(l
b9e0: 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09  ist[i], &len);..
b9f0: 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b 0a      *p++ = len;.
ba00: 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73  .    memcpy(p, s
ba10: 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70  tr, len);..    p
ba20: 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a   += len;..}.../*
ba30: 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72   SSL_set_alpn_pr
ba40: 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70  otos makes a cop
ba50: 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f  y of the protoco
ba60: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f  l-list */../* No
ba70: 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  te: This functio
ba80: 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 65 20  ns reverses the 
ba90: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e  return value con
baa0: 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28  vention */..if (
bab0: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f  SSL_set_alpn_pro
bac0: 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73  tos(statePtr->ss
bad0: 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f  l, protos, proto
bae0: 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54  s_len)) {..    T
baf0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
bb00: 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 64 20  interp, "failed 
bb10: 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 72 6f 74  to set ALPN prot
bb20: 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a 29  ocols", (char *)
bb30: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
bb40: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
bb50: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
bb60: 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22  PORT", "ALPN", "
bb70: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
bb80: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c  ) NULL);..    Tl
bb90: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
bba0: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
bbb0: 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a  ckfree(protos);.
bbc0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
bbd0: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  ERROR;..}.../* S
bbe0: 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c  tore protocols l
bbf0: 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72  ist */..statePtr
bc00: 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f  ->protos = proto
bc10: 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72  s;..statePtr->pr
bc20: 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f  otos_len = proto
bc30: 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73  s_len;.    } els
bc40: 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  e {..statePtr->p
bc50: 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73  rotos = NULL;..s
bc60: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f  tatePtr->protos_
bc70: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  len = 0;.    }..
bc80: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53      /*.     * SS
bc90: 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20  L Callbacks.    
bca0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f   */.    SSL_set_
bcb0: 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 74  app_data(statePt
bcc0: 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29  r->ssl, (void *)
bcd0: 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f  statePtr);./* po
bce0: 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a  int back to us *
bcf0: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65  /.    SSL_set_ve
bd00: 72 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73  rify(statePtr->s
bd10: 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69  sl, verify, Veri
bd20: 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  fyCallback);.   
bd30: 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61   SSL_set_info_ca
bd40: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d  llback(statePtr-
bd50: 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61  >ssl, InfoCallba
bd60: 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c  ck);..    /* Cal
bd70: 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76  lback for observ
bd80: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73  ing protocol mes
bd90: 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66  sages */.#ifndef
bda0: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f   OPENSSL_NO_SSL_
bdb0: 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69  TRACE.    /* voi
bdc0: 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73  d SSL_CTX_set_ms
bdd0: 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73  g_callback_arg(s
bde0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76  tatePtr->ctx, (v
bdf0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
be00: 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54  .    void SSL_CT
be10: 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61  X_set_msg_callba
be20: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ck(statePtr->ctx
be30: 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63  , MessageCallbac
be40: 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73  k); */.    SSL_s
be50: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f  et_msg_callback_
be60: 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73  arg(statePtr->ss
be70: 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  l, (void *)state
be80: 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65  Ptr);.    SSL_se
be90: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73  t_msg_callback(s
bea0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65  tatePtr->ssl, Me
beb0: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a  ssageCallback);.
bec0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
bed0: 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65  reate Tcl_Channe
bee0: 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f  l BIO Handler */
bef0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70  .    statePtr->p
bf00: 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74  _bio.= BIO_new_t
bf10: 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f  cl(statePtr, BIO
bf20: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73  _NOCLOSE);.    s
bf30: 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42  tatePtr->bio.= B
bf40: 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c  IO_new(BIO_f_ssl
bf50: 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65  ());..    if (se
bf60: 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76  rver) {../* Serv
bf70: 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  er callbacks */.
bf80: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73  .SSL_CTX_set_tls
bf90: 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61  ext_servername_a
bfa0: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  rg(statePtr->ctx
bfb0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
bfc0: 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  tr);..SSL_CTX_se
bfd0: 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e  t_tlsext_servern
bfe0: 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  ame_callback(sta
bff0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43  tePtr->ctx, SNIC
c000: 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43  allback);..SSL_C
c010: 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65  TX_set_client_he
c020: 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d  llo_cb(statePtr-
c030: 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62  >ctx, HelloCallb
c040: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
c050: 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61  tePtr);..if (sta
c060: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d  tePtr->protos !=
c070: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53   NULL) {..    SS
c080: 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73  L_CTX_set_alpn_s
c090: 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74  elect_cb(statePt
c0a0: 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c  r->ctx, ALPNCall
c0b0: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
c0c0: 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20  atePtr);.#ifdef 
c0d0: 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20  USE_NPN..    if 
c0e0: 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20  (tls1_2 == 0 && 
c0f0: 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09  tls1_3 == 0) {..
c100: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78  .SSL_CTX_set_nex
c110: 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69  t_protos_adverti
c120: 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d  sed_cb(statePtr-
c130: 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63  >ctx, NPNCallbac
c140: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
c150: 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e  Ptr);..    }.#en
c160: 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62  dif..}.../* Enab
c170: 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e  le server to sen
c180: 64 20 63 65 72 74 20 72 65 71 75 65 73 74 20 61  d cert request a
c190: 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28  fter handshake (
c1a0: 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f  TLS 1.3 only) */
c1b0: 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65  ../* A write ope
c1c0: 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65  ration must take
c1d0: 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43   place for the C
c1e0: 65 72 74 69 66 69 63 61 74 65 20 52 65 71 75 65  ertificate Reque
c1f0: 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e  st to be..   sen
c200: 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c  t to the client,
c210: 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e   this can be don
c220: 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61  e with SSL_do_ha
c230: 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69  ndshake(). */..i
c240: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
c250: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a  st_handshake) {.
c260: 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79 5f  .    SSL_verify_
c270: 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64  client_post_hand
c280: 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d 3e  shake(statePtr->
c290: 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65  ssl);..}.../* Se
c2a0: 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f  t server mode */
c2b0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ..statePtr->flag
c2c0: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52  s |= TLS_TCL_SER
c2d0: 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63  VER;..SSL_set_ac
c2e0: 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65  cept_state(state
c2f0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
c300: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65   else {../* Clie
c310: 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  nt callbacks */.
c320: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
c330: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
c340: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20  otos != NULL && 
c350: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74  tls1_2 == 0 && t
c360: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20  ls1_3 == 0) {.. 
c370: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e     SSL_CTX_set_n
c380: 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74  ext_proto_select
c390: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _cb(statePtr->ct
c3a0: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c  x, ALPNCallback,
c3b0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c3c0: 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09  r);..}.#endif...
c3d0: 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69  /* Session cachi
c3e0: 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  ng */..SSL_CTX_s
c3f0: 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  et_session_cache
c400: 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e  _mode(statePtr->
c410: 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41  ctx, SSL_SESS_CA
c420: 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c  CHE_CLIENT | SSL
c430: 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49  _SESS_CACHE_NO_I
c440: 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a  NTERNAL_STORE);.
c450: 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65  .SSL_CTX_sess_se
c460: 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74  t_new_cb(statePt
c470: 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43  r->ctx, SessionC
c480: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45  allback);.../* E
c490: 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73  nable post hands
c4a0: 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74  hake Authenticat
c4b0: 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54  ion extension. T
c4c0: 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74  LS 1.3 only, not
c4d0: 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20   http/2. */..if 
c4e0: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
c4f0: 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20  _handshake) {.. 
c500: 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f     SSL_set_post_
c510: 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73  handshake_auth(s
c520: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29  tatePtr->ssl, 1)
c530: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c  ;..}.../* Set cl
c540: 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53  ient mode */..SS
c550: 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74  L_set_connect_st
c560: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
c570: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53  l);.    }.    SS
c580: 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50  L_set_bio(stateP
c590: 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74  tr->ssl, statePt
c5a0: 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50  r->p_bio, stateP
c5b0: 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20  tr->p_bio);.    
c5c0: 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74  BIO_set_ssl(stat
c5d0: 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65  ePtr->bio, state
c5e0: 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f  Ptr->ssl, BIO_NO
c5f0: 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a  CLOSE);..    /*.
c600: 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53       * End of SS
c610: 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20  L Init.     */. 
c620: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
c630: 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47  rning %s", Tcl_G
c640: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
c650: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a  atePtr->self));.
c660: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
c670: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
c680: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  *) Tcl_GetChanne
c690: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
c6a0: 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  self), TCL_VOLAT
c6b0: 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  ILE);..    retur
c6c0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
c6d0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
c6e0: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ta;.}.../*. *---
c6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c730: 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f  . *. * UnimportO
c740: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
c750: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
c760: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f   invoked to remo
c770: 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  ve the topmost c
c780: 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20  hannel filter.. 
c790: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
c7a0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
c7b0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
c7c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
c7d0: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65  ay modify the be
c7e0: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20  havior of an IO 
c7f0: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
c800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c840: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
c850: 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28  .UnimportObjCmd(
c860: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
c870: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
c880: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
c890: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
c8a0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
c8b0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
c8c0: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e  an;../* The chan
c8d0: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
c8e0: 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70  e on. */..    dp
c8f0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
c900: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
c910: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
c920: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
c930: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
c940: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  el");..return TC
c950: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
c960: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
c970: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
c980: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
c990: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b  objv[1]), NULL);
c9a0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
c9b0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
c9c0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
c9d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
c9e0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
c9f0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
ca00: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
ca10: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
ca20: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
ca30: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  nel(chan);..    
ca40: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
ca50: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
ca60: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
ca70: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
ca80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ca90: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
caa0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
cab0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
cac0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
cad0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  nel", NULL);..  
cae0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
caf0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
cb00: 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43  , "UNIMPORT", "C
cb10: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
cb20: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
cb30: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
cb40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
cb50: 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63    if (Tcl_Unstac
cb60: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  kChannel(interp,
cb70: 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52   chan) == TCL_ER
cb80: 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ROR) {..return T
cb90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
cba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
cbb0: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20  OK;..clientData 
cbc0: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a  = clientData;.}.
cbd0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
cbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
cc20: 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e   CTX_Init -- con
cc30: 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58  struct a SSL_CTX
cc40: 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20   instance. *. * 
cc50: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61  Results:. *.A va
cc60: 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74  lid SSL_CTX inst
cc70: 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a  ance or NULL.. *
cc80: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
cc90: 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20  :. *.constructs 
cca0: 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58  SSL context (CTX
ccb0: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ). *. *---------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
cd00: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a  tatic SSL_CTX *.
cd10: 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a  CTX_Init(State *
cd20: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73  statePtr, int is
cd30: 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74  Server, int prot
cd40: 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65  o, char *keyfile
cd50: 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65  , char *certfile
cd60: 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ,.    unsigned c
cd70: 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e  har *key, unsign
cd80: 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69  ed char *cert, i
cd90: 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20  nt key_len, int 
cda0: 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a  cert_len, char *
cdb0: 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61 72 20  CAdir,.    char 
cdc0: 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63  *CAfile, char *c
cdd0: 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69  iphers, char *ci
cde0: 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20  phersuites, int 
cdf0: 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70  level, char *DHp
ce00: 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c  arams) {.    Tcl
ce10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20  _Interp *interp 
ce20: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
ce30: 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20  rp;.    SSL_CTX 
ce40: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *ctx = NULL;.   
ce50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b   Tcl_DString ds;
ce60: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
ce70: 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66   ds1;.    int of
ce80: 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c  f = 0;.    int l
ce90: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b  oad_private_key;
cea0: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d  .    const SSL_M
ceb0: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a  ETHOD *method;..
cec0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
ced0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
cee0: 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41  !proto) {..Tcl_A
cef0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
cf00: 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72  rp, "no valid pr
cf10: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22  otocol selected"
cf20: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
cf30: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
cf40: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20    /* create SSL 
cf50: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f  context */.#if O
cf60: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
cf70: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30  UMBER >= 0x10100
cf80: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28  000L || defined(
cf90: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69  NO_SSL2) || defi
cfa0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
cfb0: 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41  SL2).    if (ENA
cfc0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
cfd0: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09  PROTO_SSL2)) {..
cfe0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
cff0: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70  (interp, "SSL2 p
d000: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d010: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
d020: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d030: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
d040: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c  fined(NO_SSL3) |
d050: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
d060: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69  L_NO_SSL3).    i
d070: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
d080: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  , TLS_PROTO_SSL3
d090: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
d0a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d0b0: 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  SSL3 protocol no
d0c0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
d0d0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d0e0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
d0f0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
d100: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
d110: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
d120: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
d130: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d140: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f  O_TLS1)) {..Tcl_
d150: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d160: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72  erp, "TLS 1.0 pr
d170: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d180: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
d190: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
d1a0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
d1b0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
d1c0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
d1d0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20  SL_NO_TLS1_1).  
d1e0: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
d1f0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
d200: 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41  LS1_1)) {..Tcl_A
d210: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d220: 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f  rp, "TLS 1.1 pro
d230: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
d240: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ted", NULL);..re
d250: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d260: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
d270: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  ned(NO_TLS1_2) |
d280: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
d290: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20  L_NO_TLS1_2).   
d2a0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
d2b0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
d2c0: 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_2)) {..Tcl_Ap
d2d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d2e0: 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74  p, "TLS 1.2 prot
d2f0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d300: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
d310: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
d320: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
d330: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
d340: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
d350: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
d360: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
d370: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
d380: 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  1_3)) {..Tcl_App
d390: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d3a0: 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f  , "TLS 1.3 proto
d3b0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
d3c0: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  d", NULL);..retu
d3d0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
d3e0: 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 69 74 63  endif..    switc
d3f0: 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20  h (proto) {.#if 
d400: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
d410: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30  NUMBER < 0x10100
d420: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64  000L && !defined
d430: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65  (NO_SSL2) && !de
d440: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d450: 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20  _SSL2).    case 
d460: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a  TLS_PROTO_SSL2:.
d470: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
d480: 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65  er ? SSLv2_serve
d490: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c  r_method() : SSL
d4a0: 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  v2_client_method
d4b0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
d4c0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
d4d0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
d4e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d4f0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
d500: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
d510: 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61  3_METHOD).    ca
d520: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  se TLS_PROTO_SSL
d530: 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  3:..method = isS
d540: 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65  erver ? SSLv3_se
d550: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
d560: 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74  SSLv3_client_met
d570: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
d580: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
d590: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  ed(NO_TLS1) && !
d5a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d5b0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
d5c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d5d0: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20  TLS1_METHOD).   
d5e0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
d5f0: 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  TLS1:..method = 
d600: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31  isServer ? TLSv1
d610: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
d620: 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f   : TLSv1_client_
d630: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
d640: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
d650: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
d660: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d670: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20  NSSL_NO_TLS1_1) 
d680: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d690: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45  SSL_NO_TLS1_1_ME
d6a0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
d6b0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a  LS_PROTO_TLS1_1:
d6c0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
d6d0: 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65  ver ? TLSv1_1_se
d6e0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
d6f0: 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d  TLSv1_1_client_m
d700: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
d710: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
d720: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
d730: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d740: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  SSL_NO_TLS1_2) &
d750: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d760: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54  SL_NO_TLS1_2_MET
d770: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
d780: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a  S_PROTO_TLS1_2:.
d790: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
d7a0: 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72  er ? TLSv1_2_ser
d7b0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
d7c0: 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65  LSv1_2_client_me
d7d0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
d7e0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
d7f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
d800: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d810: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
d820: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
d830: 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65  _TLS1_3:../* Use
d840: 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74   the generic met
d850: 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69  hod and constrai
d860: 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63  nt range after c
d870: 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65  ontext is create
d880: 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69  d */..method = i
d890: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65  sServer ? TLS_se
d8a0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
d8b0: 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  TLS_client_metho
d8c0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
d8d0: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
d8e0: 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68  ../* Negotiate h
d8f0: 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65  ighest available
d900: 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e   SSL/TLS version
d910: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73   */..method = is
d920: 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72  Server ? TLS_ser
d930: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
d940: 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  LS_client_method
d950: 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  ();.#if OPENSSL_
d960: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
d970: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20   0x10100000L && 
d980: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32  !defined(NO_SSL2
d990: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d9a0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09  ENSSL_NO_SSL2)..
d9b0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
d9c0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
d9d0: 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53  _SSL2)   ? 0 : S
d9e0: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b  SL_OP_NO_SSLv2);
d9f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
da00: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26  ined(NO_SSL3) &&
da10: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
da20: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20  L_NO_SSL3)..off 
da30: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
da40: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
da50: 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  3)   ? 0 : SSL_O
da60: 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e  P_NO_SSLv3);.#en
da70: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
da80: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  (NO_TLS1) && !de
da90: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
daa0: 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28  _TLS1)..off |= (
dab0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
dac0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20  LS_PROTO_TLS1)  
dad0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
dae0: 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a  _TLSv1);.#endif.
daf0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
db00: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
db10: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
db20: 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28  LS1_1)..off |= (
db30: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
db40: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29  LS_PROTO_TLS1_1)
db50: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
db60: 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69  _TLSv1_1);.#endi
db70: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
db80: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
db90: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
dba0: 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d  _TLS1_2)..off |=
dbb0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
dbc0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
dbd0: 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f  2) ? 0 : SSL_OP_
dbe0: 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e  NO_TLSv1_2);.#en
dbf0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
dc00: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
dc10: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
dc20: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20  NO_TLS1_3)..off 
dc30: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
dc40: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
dc50: 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1_3) ? 0 : SSL_O
dc60: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23  P_NO_TLSv1_3);.#
dc70: 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20  endif..break;.  
dc80: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
dc90: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
dca0: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e   ctx = SSL_CTX_n
dcb0: 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20  ew(method);.    
dcc0: 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74  if (!ctx) {..ret
dcd0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  urn(NULL);.    }
dce0: 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76  ..    if (getenv
dcf0: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29  (SSLKEYLOGFILE))
dd00: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
dd10: 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28  keylog_callback(
dd20: 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62  ctx, KeyLogCallb
dd30: 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  ack);.    }..#if
dd40: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
dd50: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
dd60: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
dd70: 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74  _3).    if (prot
dd80: 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  o == TLS_PROTO_T
dd90: 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54  LS1_3) {..SSL_CT
dda0: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
ddb0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53  version(ctx, TLS
ddc0: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53  1_3_VERSION);..S
ddd0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
dde0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
ddf0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
de00: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
de10: 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69  .    /* Force ci
de20: 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f  pher selection o
de30: 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a  rder by server *
de40: 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72  /.    if (!isSer
de50: 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  ver) {..SSL_CTX_
de60: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
de70: 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53   SSL_OP_CIPHER_S
de80: 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45  ERVER_PREFERENCE
de90: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 53  );.    }..    SS
dea0: 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61  L_CTX_set_app_da
deb0: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69  ta(ctx, (void*)i
dec0: 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d  nterp);./* remem
ded0: 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 65  ber the interpre
dee0: 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ter */.    SSL_C
def0: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63  TX_set_options(c
df00: 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b  tx, SSL_OP_ALL);
df10: 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20  ./* all SSL bug 
df20: 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20  workarounds */. 
df30: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f     SSL_CTX_set_o
df40: 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29  ptions(ctx, off)
df50: 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72  ;../* disable pr
df60: 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20  otocol versions 
df70: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  */.#if OPENSSL_V
df80: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
df90: 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20  0x10101000L.    
dfa0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65  SSL_CTX_set_mode
dfb0: 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41  (ctx, SSL_MODE_A
dfc0: 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68  UTO_RETRY);./* h
dfd0: 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68  andle new handsh
dfe0: 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75  akes in backgrou
dff0: 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66 61 75 6c  nd. On by defaul
e000: 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31  t in OpenSSL 1.1
e010: 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  .1. */.#endif.  
e020: 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73    SSL_CTX_sess_s
e030: 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74  et_cache_size(ct
e040: 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a  x, 128);..    /*
e050: 20 53 65 74 20 75 73 65 72 20 64 65 66 69 6e 65   Set user define
e060: 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65  d ciphers, ciphe
e070: 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65  r suites, and se
e080: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a  curity level */.
e090: 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73      if ((ciphers
e0a0: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53   != NULL) && !SS
e0b0: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72  L_CTX_set_cipher
e0c0: 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68 65  _list(ctx, ciphe
e0d0: 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  rs)) {..Tcl_Appe
e0e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e0f0: 20 22 53 65 74 20 63 69 70 68 65 72 73 20 66 61   "Set ciphers fa
e100: 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63  iled: No valid c
e110: 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a  iphers", (char *
e120: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
e130: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
e140: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
e150: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72  .    if ((cipher
e160: 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20  suites != NULL) 
e170: 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f  && !SSL_CTX_set_
e180: 63 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78  ciphersuites(ctx
e190: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29  , ciphersuites))
e1a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
e1b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
e1c0: 74 20 63 69 70 68 65 72 20 73 75 69 74 65 73 20  t cipher suites 
e1d0: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64  failed: No valid
e1e0: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72   ciphers", (char
e1f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
e200: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e210: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
e220: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73   }..    /* Set s
e230: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
e240: 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e  .    if (level >
e250: 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36   -1 && level < 6
e260: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
e270: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a  security_level *
e280: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73  /..SSL_CTX_set_s
e290: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74  ecurity_level(ct
e2a0: 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  x, level);.    }
e2b0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d  ..    /* set som
e2c0: 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20  e callbacks */. 
e2d0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64     SSL_CTX_set_d
e2e0: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62  efault_passwd_cb
e2f0: 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61  (ctx, PasswordCa
e300: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c  llback);.    SSL
e310: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
e320: 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64  _passwd_cb_userd
e330: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a  ata(ctx, (void *
e340: 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20  )statePtr);..   
e350: 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69   /* read a Diffi
e360: 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65  e-Hellman parame
e370: 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73  ters file, or us
e380: 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f  e the built-in o
e390: 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45  ne */.#ifdef OPE
e3a0: 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69  NSSL_NO_DH.    i
e3b0: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e  f (DHparams != N
e3c0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
e3d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e3e0: 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73   "DH parameter s
e3f0: 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c  upport not avail
e400: 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20  able", (char *) 
e410: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
e420: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
e430: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
e440: 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20  else.    {..DH* 
e450: 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d  dh;..if (DHparam
e460: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  s != NULL) {..  
e470: 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20    BIO *bio;..   
e480: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
e490: 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20  (&ds);..    bio 
e4a0: 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46  = BIO_new_file(F
e4b0: 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73  2N(DHparams, &ds
e4c0: 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66  ), "r");..    if
e4d0: 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f   (!bio) {...Tcl_
e4e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
e4f0: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
e500: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
e510: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20  uld not find DH 
e520: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22  parameters file"
e530: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
e540: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
e550: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
e560: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  NULL;..    }... 
e570: 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64     dh = PEM_read
e580: 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69  _bio_DHparams(bi
e590: 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  o, NULL, NULL, N
e5a0: 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66  ULL);..    BIO_f
e5b0: 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54  ree(bio);..    T
e5c0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
e5d0: 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64  ds);..    if (!d
e5e0: 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  h) {...Tcl_Appen
e5f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e600: 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20  "Could not read 
e610: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72  DH parameters fr
e620: 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20  om file", (char 
e630: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
e640: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e650: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
e660: 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09     }..} else {..
e670: 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50      dh = get_dhP
e680: 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c  arams();..}..SSL
e690: 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28  _CTX_set_tmp_dh(
e6a0: 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72  ctx, dh);..DH_fr
e6b0: 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65  ee(dh);.    }.#e
e6c0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74  ndif..    /* set
e6d0: 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65   our certificate
e6e0: 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69   */.    load_pri
e6f0: 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20  vate_key = 0;.  
e700: 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21    if (certfile !
e710: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f  = NULL) {..load_
e720: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b  private_key = 1;
e730: 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  ...Tcl_DStringIn
e740: 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53  it(&ds);...if (S
e750: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69  SL_CTX_use_certi
e760: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c  ficate_file(ctx,
e770: 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26   F2N(certfile, &
e780: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ds), SSL_FILETYP
e790: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09  E_PEM) <= 0) {..
e7a0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
e7b0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54  ree(&ds);..    T
e7c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e7d0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
e7e0: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61  to set certifica
e7f0: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66  te file ", certf
e800: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20  ile, ": ",....  
e810: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68     REASON(), (ch
e820: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
e830: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
e840: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
e850: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20   NULL;..}.    } 
e860: 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d  else if (cert !=
e870: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70   NULL) {..load_p
e880: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a  rivate_key = 1;.
e890: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
e8a0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e  _certificate_ASN
e8b0: 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c  1(ctx, cert_len,
e8c0: 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09   cert) <= 0) {..
e8d0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
e8e0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54  ree(&ds);..    T
e8f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e900: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
e910: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61  to set certifica
e920: 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52  te: ",....     R
e930: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
e940: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
e950: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e960: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
e970: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  L;..}.    } else
e980: 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28   {..certfile = (
e990: 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64  char*)X509_get_d
e9a0: 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65  efault_cert_file
e9b0: 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54  ();...if (SSL_CT
e9c0: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
e9d0: 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74  e_file(ctx, cert
e9e0: 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59  file, SSL_FILETY
e9f0: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a  PE_PEM) <= 0) {.
ea00: 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44  #if 0..    Tcl_D
ea10: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
ea20: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
ea30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ea40: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65  unable to use de
ea50: 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74  fault certificat
ea60: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69  e file ", certfi
ea70: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20  le, ": ",....   
ea80: 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61    REASON(), (cha
ea90: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
eaa0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
eab0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
eac0: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a  NULL;.#endif..}.
ead0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65      }..    /* se
eae0: 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65  t our private ke
eaf0: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61  y */.    if (loa
eb00: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b  d_private_key) {
eb10: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d  ..if (keyfile ==
eb20: 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20   NULL && key == 
eb30: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79  NULL) {..    key
eb40: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b  file = certfile;
eb50: 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c  ..}...if (keyfil
eb60: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  e != NULL) {..  
eb70: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69    /* get the pri
eb80: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61  vate key associa
eb90: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65  ted with this ce
eba0: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20  rtificate */..  
ebb0: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d    if (keyfile ==
ebc0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69   NULL) {...keyfi
ebd0: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09  le = certfile;..
ebe0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
ebf0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76  SSL_CTX_use_Priv
ec00: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c  ateKey_file(ctx,
ec10: 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64   F2N(keyfile, &d
ec20: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  s), SSL_FILETYPE
ec30: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09  _PEM) <= 0) {...
ec40: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
ec50: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68  &ds);.../* flush
ec60: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20   the passphrase 
ec70: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c  which might be l
ec80: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  eft in the resul
ec90: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65  t */...Tcl_SetRe
eca0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c  sult(interp, NUL
ecb0: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  L, TCL_STATIC);.
ecc0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
ecd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
ece0: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63  le to set public
ecf0: 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79   key file ", key
ed00: 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20  file, " ",....  
ed10: 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c         REASON(),
ed20: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
ed30: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
ed40: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
ed50: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ULL;..    }..   
ed60: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
ed70: 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20  (&ds);...} else 
ed80: 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29  if (key != NULL)
ed90: 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f   {..    if (SSL_
eda0: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b  CTX_use_PrivateK
edb0: 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59  ey_ASN1(EVP_PKEY
edc0: 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b  _RSA, ctx, key,k
edd0: 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a  ey_len) <= 0) {.
ede0: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
edf0: 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75  e(&ds);.../* flu
ee00: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73  sh the passphras
ee10: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65  e which might be
ee20: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73   left in the res
ee30: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74  ult */...Tcl_Set
ee40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e  Result(interp, N
ee50: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ULL, TCL_STATIC)
ee60: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
ee70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
ee80: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c  able to set publ
ee90: 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f  ic key: ", REASO
eea0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
eeb0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
eec0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
eed0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
eee0: 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e  .}../* Now we kn
eef0: 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e  ow that a key an
ef00: 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e  d cert have been
ef10: 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a   set against.. *
ef20: 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74   the SSL context
ef30: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54   */..if (!SSL_CT
ef40: 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f  X_check_private_
ef50: 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20  key(ctx)) {..   
ef60: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ef70: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61  t(interp, "priva
ef80: 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  te key does not 
ef90: 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66  match the certif
efa0: 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79  icate public key
efb0: 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72  ",....     (char
efc0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
efd0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
efe0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
eff0: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ULL;..}.    }.. 
f000: 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69     /* Set verifi
f010: 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20  cation CAs */.  
f020: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
f030: 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f  t(&ds);.    Tcl_
f040: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31  DStringInit(&ds1
f050: 29 3b 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f  );.    if (!SSL_
f060: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f  CTX_load_verify_
f070: 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46  locations(ctx, F
f080: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c  2N(CAfile, &ds),
f090: 20 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31   F2N(CAdir, &ds1
f0a0: 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f  )) ||..!SSL_CTX_
f0b0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69  set_default_veri
f0c0: 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b  fy_paths(ctx)) {
f0d0: 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72  .#if 0..Tcl_DStr
f0e0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54  ingFree(&ds);..T
f0f0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
f100: 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20  ds1);../* Don't 
f110: 63 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69  currently care i
f120: 66 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a  f this fails */.
f130: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
f140: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64  t(interp, "SSL d
f150: 65 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 61  efault verify pa
f160: 74 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  ths: ", REASON()
f170: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
f180: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
f190: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ctx);..return NU
f1a0: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  LL;.#endif.    }
f1b0: 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f  ..    /* https:/
f1c0: 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  /sourceforge.net
f1d0: 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20  /p/tls/bugs/57/ 
f1e0: 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f  */.    /* XXX:TO
f1f0: 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72  DO: Let the user
f200: 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68   supply values h
f210: 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73  ere instead of s
f220: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78  omething that ex
f230: 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ists on the file
f240: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66  system */.    if
f250: 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c   (CAfile != NULL
f260: 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35  ) {..STACK_OF(X5
f270: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61  09_NAME) *certNa
f280: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63  mes = SSL_load_c
f290: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32  lient_CA_file(F2
f2a0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b  N(CAfile, &ds));
f2b0: 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20  ..if (certNames 
f2c0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
f2d0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
f2e0: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20  nt_CA_list(ctx, 
f2f0: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20  certNames);..}. 
f300: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
f310: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
f320: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
f330: 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72  ree(&ds1);.    r
f340: 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f  eturn ctx;.}.../
f350: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
f360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f390: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74  -------. *. * St
f3a0: 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  atusObjCmd -- re
f3b0: 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65  turn certificate
f3c0: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70   for connected p
f3d0: 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  eer.. *. * Resul
f3e0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
f3f0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
f400: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
f410: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
f420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f460: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
f470: 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28  nt.StatusObjCmd(
f480: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
f490: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
f4a0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
f4b0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
f4c0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
f4d0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
f4e0: 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65  r;.    X509 *pee
f4f0: 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  r;.    Tcl_Obj *
f500: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f  objPtr;.    Tcl_
f510: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20  Channel chan;.  
f520: 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e    char *channelN
f530: 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20  ame, *ciphers;. 
f540: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20     int mode;.   
f550: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
f560: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20  char *proto;.   
f570: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65   unsigned int le
f580: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 3b 0a  n;.    int nid;.
f590: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
f5a0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77 69  lled");..    swi
f5b0: 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63 61  tch (objc) {..ca
f5c0: 73 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e 6e  se 2:..    chann
f5d0: 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  elName = Tcl_Get
f5e0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f5f0: 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20  jv[1], NULL);.. 
f600: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65     break;...case
f610: 20 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74   3:..    if (!st
f620: 72 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72  rcmp (Tcl_GetStr
f630: 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22  ing (objv[1]), "
f640: 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68  -local")) {...ch
f650: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f  annelName = Tcl_
f660: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
f670: 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b  (objv[2], NULL);
f680: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d  ...break;..    }
f690: 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61  ..    /* else fa
f6a0: 6c 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20 2a  ll-through ... *
f6b0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
f6c0: 47 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f 61  GNUC__)..    __a
f6d0: 74 74 72 69 62 75 74 65 5f 5f 28 28 66 61 6c 6c  ttribute__((fall
f6e0: 74 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64 69  through));.#endi
f6f0: 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20  f..default:..   
f700: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f710: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
f720: 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61  v, "?-local? cha
f730: 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72 65 74  nnel");..    ret
f740: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f750: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d     }..    chan =
f760: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
f770: 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e  interp, channelN
f780: 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20  ame, &mode);.   
f790: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
f7a0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
f7b0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
f7c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
f7d0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
f7e0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
f7f0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
f800: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
f810: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
f820: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
f830: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
f840: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
f850: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
f860: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f870: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
f880: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
f890: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
f8a0: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20  an),..."\": not 
f8b0: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
f8c0: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
f8d0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
f8e0: 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22   "TLS", "STATUS"
f8f0: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
f900: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
f910: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
f920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
f930: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
f940: 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65  (State *) Tcl_Ge
f950: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
f960: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20  Data(chan);..   
f970: 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63   /* Get certific
f980: 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20  ate for peer or 
f990: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28  self */.    if (
f9a0: 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65  objc == 2) {..pe
f9b0: 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65  er = SSL_get_pee
f9c0: 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74  r_certificate(st
f9d0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
f9e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72    } else {..peer
f9f0: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69   = SSL_get_certi
fa00: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d  ficate(statePtr-
fa10: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >ssl);.    }.   
fa20: 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72   /* Get X509 cer
fa30: 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f  tificate info */
fa40: 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b  .    if (peer) {
fa50: 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e  ..objPtr = Tls_N
fa60: 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70  ewX509Obj(interp
fa70: 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62  , peer);..if (ob
fa80: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20  jc == 2) {..    
fa90: 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b  X509_free(peer);
faa0: 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c  ..    peer = NUL
fab0: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  L;..}.    } else
fac0: 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c   {..objPtr = Tcl
fad0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
fae0: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ULL);.    }..   
faf0: 20 2f 2a 20 50 65 65 72 20 63 65 72 74 20 63 68   /* Peer cert ch
fb00: 61 69 6e 20 28 63 6c 69 65 6e 74 20 6f 6e 6c 79  ain (client only
fb10: 29 20 2a 2f 0a 20 20 20 20 53 54 41 43 4b 5f 4f  ) */.    STACK_O
fb20: 46 28 58 35 30 39 29 2a 20 73 73 6c 5f 63 65 72  F(X509)* ssl_cer
fb30: 74 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65  ts = SSL_get_pee
fb40: 72 5f 63 65 72 74 5f 63 68 61 69 6e 28 73 74 61  r_cert_chain(sta
fb50: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
fb60: 20 69 66 20 28 73 73 6c 5f 63 65 72 74 73 20 3d   if (ssl_certs =
fb70: 3d 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30  = NULL || sk_X50
fb80: 39 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73 29  9_num(ssl_certs)
fb90: 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f 53 65   == 0) {..Tcl_Se
fba0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
fbb0: 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55  p, "TLS", "STATU
fbc0: 53 22 2c 20 22 43 45 52 54 49 46 49 43 41 54 45  S", "CERTIFICATE
fbd0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
fbe0: 29 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43  );..Tcl_IncrRefC
fbf0: 6f 75 6e 74 28 6f 62 6a 50 74 72 29 3b 0a 09 54  ount(objPtr);..T
fc00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
fc10: 6f 62 6a 50 74 72 29 3b 0a 09 72 65 74 75 72 6e  objPtr);..return
fc20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
fc30: 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e  }..    /* Peer n
fc40: 61 6d 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c  ame */.    Tcl_L
fc50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
fc60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
fc70: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
fc80: 67 4f 62 6a 28 22 70 65 65 72 6e 61 6d 65 22 2c  gObj("peername",
fc90: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
fca0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
fcb0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
fcc0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
fcd0: 67 4f 62 6a 28 53 53 4c 5f 67 65 74 30 5f 70 65  gObj(SSL_get0_pe
fce0: 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  ername(statePtr-
fcf0: 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  >ssl), -1));..  
fd00: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
fd10: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
fd20: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
fd30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 62 69  ewStringObj("sbi
fd40: 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ts", -1));.    T
fd50: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
fd60: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
fd70: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  objPtr, Tcl_NewI
fd80: 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69  ntObj(SSL_get_ci
fd90: 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50  pher_bits(stateP
fda0: 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 29  tr->ssl, NULL)))
fdb0: 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d  ;..    ciphers =
fdc0: 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f   (char*)SSL_get_
fdd0: 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d  cipher(statePtr-
fde0: 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 28  >ssl);.    if ((
fdf0: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29  ciphers != NULL)
fe00: 20 26 26 20 28 73 74 72 63 6d 70 28 63 69 70 68   && (strcmp(ciph
fe10: 65 72 73 2c 20 22 28 4e 4f 4e 45 29 22 29 20 21  ers, "(NONE)") !
fe20: 3d 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73  = 0)) {..Tcl_Lis
fe30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
fe40: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
fe50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fe60: 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29  bj("cipher", -1)
fe70: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
fe80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
fe90: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
fea0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 69  _NewStringObj(ci
feb0: 70 68 65 72 73 2c 20 2d 31 29 29 3b 0a 20 20 20  phers, -1));.   
fec0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66   }..    /* Verif
fed0: 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69  y the X509 certi
fee0: 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64  ficate presented
fef0: 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a   by the peer */.
ff00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
ff10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
ff20: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
ff30: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76  _NewStringObj("v
ff40: 65 72 69 66 79 52 65 73 75 6c 74 22 2c 20 2d 31  erifyResult", -1
ff50: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
ff60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
ff70: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
ff80: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
ff90: 62 6a 28 58 35 30 39 5f 76 65 72 69 66 79 5f 63  bj(X509_verify_c
ffa0: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
ffb0: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f  (SSL_get_verify_
ffc0: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
ffd0: 3e 73 73 6c 29 29 2c 20 2d 31 29 29 3b 0a 0a 20  >ssl)), -1));.. 
ffe0: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64     /* Verify mod
fff0: 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73  e */.    Tcl_Lis
10000 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10010 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10020 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10030 62 6a 28 22 76 65 72 69 66 79 4d 6f 64 65 22 2c  bj("verifyMode",
10040 20 2d 31 29 29 3b 0a 20 20 20 20 2f 2a 20 53 53   -1));.    /* SS
10050 4c 5f 43 54 58 5f 67 65 74 5f 76 65 72 69 66 79  L_CTX_get_verify
10060 5f 6d 6f 64 65 28 63 74 78 29 20 2a 2f 0a 20 20  _mode(ctx) */.  
10070 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74    mode = SSL_get
10080 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61  _verify_mode(sta
10090 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
100a0 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c   if (mode && SSL
100b0 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a  _VERIFY_NONE) {.
100c0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
100d0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
100e0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
100f0 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 6f 6e 65  wStringObj("none
10100 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65  ", -1));.    } e
10110 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  lse {..Tcl_Obj *
10120 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c  listObjPtr = Tcl
10130 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
10140 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20  ULL);..if (mode 
10150 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45  && SSL_VERIFY_PE
10160 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  ER) {..    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 6c 69 73 74  ent(interp, list
10190 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  ObjPtr, Tcl_NewS
101a0 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c  tringObj("peer",
101b0 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d   -1));..}..if (m
101c0 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
101d0 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45  Y_FAIL_IF_NO_PEE
101e0 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 54  R_CERT) {..    T
101f0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10200 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10210 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
10220 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 61  NewStringObj("fa
10230 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 65  il if no peer ce
10240 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  rt", -1));..}..i
10250 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
10260 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43  ERIFY_CLIENT_ONC
10270 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  E) {..    Tcl_Li
10280 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10290 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  nt(interp, listO
102a0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
102b0 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20  ringObj("client 
102c0 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  once", -1));..}.
102d0 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
102e0 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e  _VERIFY_POST_HAN
102f0 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54  DSHAKE) {..    T
10300 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10310 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10320 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
10330 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f  NewStringObj("po
10340 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d  st handshake", -
10350 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73  1));..}..Tcl_Lis
10360 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10370 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10380 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 3b 0a 20  , listObjPtr);. 
10390 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72     }..    /* Ver
103a0 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a  ify mode depth *
103b0 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  /.    Tcl_ListOb
103c0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
103d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
103e0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
103f0 22 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 2d  "verifyDepth", -
10400 31 29 29 3b 0a 20 20 20 20 2f 2a 20 53 53 4c 5f  1));.    /* SSL_
10410 43 54 58 5f 67 65 74 5f 76 65 72 69 66 79 5f 64  CTX_get_verify_d
10420 65 70 74 68 28 63 74 78 29 20 2a 2f 0a 20 20 20  epth(ctx) */.   
10430 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10440 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10450 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10460 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f  wIntObj(SSL_get_
10470 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 61  verify_depth(sta
10480 74 65 50 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 0a  tePtr->ssl)));..
10490 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68      /* Report th
104a0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
104b0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
104c0 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69  of the negotiati
104d0 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65  on */.    SSL_ge
104e0 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64  t0_alpn_selected
104f0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
10500 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20  &proto, &len);. 
10510 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
10520 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10530 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10540 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c  NewStringObj("al
10550 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  pn", -1));.    T
10560 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10570 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10580 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
10590 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
105a0 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65  )proto, (int) le
105b0 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  n));.    Tcl_Lis
105c0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
105d0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
105e0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
105f0 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d  bj("protocol", -
10600 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
10610 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10620 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10630 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10640 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69  bj(SSL_get_versi
10650 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  on(statePtr->ssl
10660 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a  ), -1));..    /*
10670 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52   Valid for non-R
10680 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64  SA signature and
10690 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20   TLS 1.3 */.    
106a0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
106b0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
106c0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
106d0 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e 61  StringObj("signa
106e0 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68  tureHashAlgorith
106f0 6d 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66  m", -1));.    if
10700 20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 53 53   (objc == 2 ? SS
10710 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61  L_get_peer_signa
10720 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74  ture_nid(statePt
10730 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20  r->ssl, &nid) : 
10740 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72  SSL_get_signatur
10750 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
10760 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54  ssl, &nid)) {..T
10770 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10780 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10790 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
107a0 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64  tringObj(OBJ_nid
107b0 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a  2ln(nid), -1));.
107c0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
107d0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
107e0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
107f0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10800 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29  ringObj("", -1))
10810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
10820 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10830 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10840 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10850 6e 67 4f 62 6a 28 22 73 69 67 6e 61 74 75 72 65  ngObj("signature
10860 54 79 70 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20  Type", -1));.   
10870 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f   if (objc == 2 ?
10880 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69   SSL_get_peer_si
10890 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64  gnature_type_nid
108a0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
108b0 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f  &nid) : SSL_get_
108c0 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e  signature_type_n
108d0 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
108e0 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 63 6c 5f  , &nid)) {..Tcl_
108f0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10900 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10910 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10920 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32 6c 6e  ngObj(OBJ_nid2ln
10930 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20 20 20  (nid), -1));.   
10940 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c   } else {..Tcl_L
10950 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10960 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
10970 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
10980 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b 0a 20  gObj("", -1));. 
10990 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65     }..    Tcl_Se
109a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
109b0 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
109c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
109d0 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
109e0 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a  entData;.}.../*.
109f0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
10a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a30 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e  -----. *. * Conn
10a40 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
10a50 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65   -- return conne
10a60 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20  ction info from 
10a70 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52  OpenSSL.. *. * R
10a80 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73  esults:. *.A lis
10a90 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  t of connection 
10aa0 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d  info.  *. *-----
10ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
10af0 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43  */..static int C
10b00 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a  onnectionInfoObj
10b10 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
10b20 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
10b30 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
10b40 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
10b50 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
10b60 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
10b70 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
10b80 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
10b90 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20   mode on. */.   
10ba0 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
10bb0 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61  ;../* client sta
10bc0 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65  te for ssl socke
10bd0 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  t */.    Tcl_Obj
10be0 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 63 6f   *objPtr;.    co
10bf0 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20  nst SSL *ssl;.  
10c00 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48    const SSL_CIPH
10c10 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20  ER *cipher;.    
10c20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f  const SSL_SESSIO
10c30 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20  N *session;.    
10c40 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
10c50 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20  har *proto;.    
10c60 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20 20 20  long mode;..    
10c70 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
10c80 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
10c90 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
10ca0 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
10cb0 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
10cc0 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  R);.    }..    c
10cd0 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
10ce0 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
10cf0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10d00 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29  j(objv[1], NULL)
10d10 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
10d20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
10d30 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
10d40 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
10d50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10d60 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
10d70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
10d80 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
10d90 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
10da0 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
10db0 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
10dc0 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
10dd0 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
10de0 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
10df0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10e00 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
10e10 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
10e20 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
10e30 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74  ),..    "\": not
10e40 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
10e50 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74   NULL);..Tcl_Set
10e60 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
10e70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43  , "TLS", "CONNEC
10e80 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22  TION", "CHANNEL"
10e90 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
10ea0 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
10eb0 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
10ec0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50  .    }..    objP
10ed0 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
10ee0 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  Obj(0, NULL);.. 
10ef0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
10f00 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61   info */.    sta
10f10 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
10f20 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  )Tcl_GetChannelI
10f30 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
10f40 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61  );.    ssl = sta
10f50 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20  tePtr->ssl;.    
10f60 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29  if (ssl != NULL)
10f70 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f   {../* connectio
10f80 6e 20 73 74 61 74 65 20 2a 2f 0a 09 54 63 6c 5f  n state */..Tcl_
10f90 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10fa0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10fb0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10fc0 6e 67 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 2d  ngObj("state", -
10fd0 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
10fe0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10ff0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11000 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11010 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67  SSL_state_string
11020 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29  _long(ssl), -1))
11030 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72  ;.../* Get SNI r
11040 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20  equested server 
11050 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  name */..Tcl_Lis
11060 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11070 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
11080 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11090 62 6a 28 22 73 65 72 76 65 72 6e 61 6d 65 22 2c  bj("servername",
110a0 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
110b0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
110c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
110d0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
110e0 6a 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72  j(SSL_get_server
110f0 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54  name(ssl, TLSEXT
11100 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e  _NAMETYPE_host_n
11110 61 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a  ame), -1));.../*
11120 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f   Get protocol */
11130 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
11140 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11150 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11160 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f  ewStringObj("pro
11170 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09 54  tocol", -1));..T
11180 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11190 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
111a0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
111b0 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74  tringObj(SSL_get
111c0 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d  _version(ssl), -
111d0 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f  1));.../* Renego
111e0 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20  tiation allowed 
111f0 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  */..Tcl_ListObjA
11200 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11210 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11220 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72  _NewStringObj("r
11230 65 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 2d  enegotiation", -
11240 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
11250 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11260 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11270 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11280 0a 09 20 20 20 20 53 53 4c 5f 67 65 74 5f 73 65  ..    SSL_get_se
11290 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69  cure_renegotiati
112a0 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 20  on_support(ssl) 
112b0 3f 20 22 73 75 70 70 6f 72 74 65 64 22 20 3a 20  ? "supported" : 
112c0 22 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c  "not supported",
112d0 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20   -1));.../* Get 
112e0 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a  security level *
112f0 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
11300 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11310 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11320 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65  NewStringObj("se
11330 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 2d 31  curitylevel", -1
11340 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
11350 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11360 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
11370 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f  l_NewIntObj(SSL_
11380 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76  get_security_lev
11390 65 6c 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20  el(ssl)));.../* 
113a0 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  Session info */.
113b0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
113c0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
113d0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
113e0 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73  wStringObj("sess
113f0 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31 29  ion_reused", -1)
11400 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
11410 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11420 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11430 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53  _NewBooleanObj(S
11440 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65  SL_session_reuse
11450 64 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 49  d(ssl)));.../* I
11460 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f  s server info */
11470 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
11480 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11490 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
114a0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 73 5f  ewStringObj("is_
114b0 73 65 72 76 65 72 22 2c 20 2d 31 29 29 3b 0a 09  server", -1));..
114c0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
114d0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
114e0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
114f0 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 69  BooleanObj(SSL_i
11500 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 29 3b  s_server(ssl)));
11510 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
11520 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20  ipher info */.  
11530 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67    cipher = SSL_g
11540 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65  et_current_ciphe
11550 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  r(ssl);.    if (
11560 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20  cipher != NULL) 
11570 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 53  {..char buf[BUFS
11580 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20  IZ] = {0};..int 
11590 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a  bits, alg_bits;.
115a0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
115b0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
115c0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
115d0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70  ewStringObj("cip
115e0 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  her", -1));..Tcl
115f0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11600 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11610 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11620 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45  ingObj(SSL_CIPHE
11630 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65  R_get_name(ciphe
11640 72 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  r), -1));..Tcl_L
11650 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11660 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
11670 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
11680 67 4f 62 6a 28 22 73 74 61 6e 64 61 72 64 5f 6e  gObj("standard_n
11690 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ame", -1));..Tcl
116a0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
116b0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
116c0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
116d0 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45  ingObj(SSL_CIPHE
116e0 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28  R_standard_name(
116f0 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a  cipher), -1));..
11700 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48  .bits = SSL_CIPH
11710 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68  ER_get_bits(ciph
11720 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a  er, &alg_bits);.
11730 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11740 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11750 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11760 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 72  wStringObj("secr
11770 65 74 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a  et_bits", -1));.
11780 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11790 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
117a0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
117b0 77 49 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a  wIntObj(bits));.
117c0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
117d0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
117e0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
117f0 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 67 6f  wStringObj("algo
11800 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 2d 31 29  rithm_bits", -1)
11810 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
11820 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11830 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11840 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6c 67 5f 62  _NewIntObj(alg_b
11850 69 74 73 29 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62  its));../* alg_b
11860 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65  its is actual ke
11870 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49  y secret bits. I
11880 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73  f use bits and s
11890 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d  ecret (algorithm
118a0 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09  ) bits differ,..
118b0 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74     the rest of t
118c0 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65  he bits are fixe
118d0 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69  d, i.e. for limi
118e0 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65  ted export ciphe
118f0 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a  rs (bits < 56) *
11900 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
11910 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11920 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11930 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69  NewStringObj("mi
11940 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 29  n_version", -1))
11950 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
11960 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11970 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11980 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c  NewStringObj(SSL
11990 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73  _CIPHER_get_vers
119a0 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29  ion(cipher), -1)
119b0 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e  );.../* Get Open
119c0 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c  SSL-specific ID,
119d0 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a   not IANA ID */.
119e0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
119f0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11a00 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11a10 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 64 22 2c  wStringObj("id",
11a20 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
11a30 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11a40 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11a50 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28   Tcl_NewIntObj((
11a60 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f  int) SSL_CIPHER_
11a70 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 29  get_id(cipher)))
11a80 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48  ;...if (SSL_CIPH
11a90 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63  ER_description(c
11aa0 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65  ipher, buf, size
11ab0 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c  of(buf)) != NULL
11ac0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
11ad0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11ae0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
11af0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11b00 62 6a 28 22 64 65 73 63 72 69 70 74 69 6f 6e 22  bj("description"
11b10 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 63 6c  , -1));..    Tcl
11b20 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11b30 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11b40 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11b50 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29  ingObj(buf, -1))
11b60 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
11b70 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20  /* Session info 
11b80 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d  */.    session =
11b90 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e   SSL_get_session
11ba0 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73  (ssl);.    if (s
11bb0 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20  ession != NULL) 
11bc0 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  {..const unsigne
11bd0 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a  d char *ticket;.
11be0 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75  .size_t len2;..u
11bf0 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e  nsigned int ulen
11c00 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ;..const unsigne
11c10 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f  d char *session_
11c20 69 64 3b 0a 09 63 68 61 72 20 62 75 66 66 65 72  id;..char buffer
11c30 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f  [SSL_MAX_MASTER_
11c40 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f  KEY_LENGTH];.../
11c50 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c  * Report the sel
11c60 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61  ected protocol a
11c70 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
11c80 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69  e ALPN negotiati
11c90 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49  on */..SSL_SESSI
11ca0 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c  ON_get0_alpn_sel
11cb0 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26  ected(session, &
11cc0 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09  proto, &len2);..
11cd0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11ce0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11cf0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
11d00 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22  StringObj("alpn"
11d10 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
11d20 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11d30 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
11d40 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11d50 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f  bj((char *)proto
11d60 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a  , (int) len2));.
11d70 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20  ../* Report the 
11d80 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f  selected protoco
11d90 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  l as a result of
11da0 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61   the NPN negotia
11db0 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55  tion */.#ifdef U
11dc0 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30  SE_NPN..SSL_get0
11dd0 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f  _next_proto_nego
11de0 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f  tiated(ssl, &pro
11df0 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 63 6c  to, &ulen);..Tcl
11e00 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11e10 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11e20 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11e30 69 6e 67 4f 62 6a 28 22 6e 70 6e 22 2c 20 2d 31  ingObj("npn", -1
11e40 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
11e50 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11e60 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
11e70 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
11e80 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69  char *)proto, (i
11e90 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 23 65 6e 64  nt) ulen));.#end
11ea0 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c  if.../* Resumabl
11eb0 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 54 63  e session */..Tc
11ec0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11ed0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
11ee0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
11ef0 72 69 6e 67 4f 62 6a 28 22 72 65 73 75 6d 61 62  ringObj("resumab
11f00 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  le", -1));..Tcl_
11f10 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11f20 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11f30 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
11f40 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69  bj(SSL_SESSION_i
11f50 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73  s_resumable(sess
11f60 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73  ion)));.../* Ses
11f70 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20  sion start time 
11f80 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65  (seconds since e
11f90 70 6f 63 68 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69  poch) */..Tcl_Li
11fa0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
11fb0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
11fc0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
11fd0 4f 62 6a 28 22 73 74 61 72 74 5f 74 69 6d 65 22  Obj("start_time"
11fe0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
11ff0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12000 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
12010 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a  , Tcl_NewLongObj
12020 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  (SSL_SESSION_get
12030 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 29  _time(session)))
12040 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76  ;.../* Timeout v
12050 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67  alue - SSL_CTX_g
12060 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73  et_timeout (in s
12070 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f  econds) */..Tcl_
12080 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
12090 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
120a0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
120b0 6e 67 4f 62 6a 28 22 74 69 6d 65 6f 75 74 22 2c  ngObj("timeout",
120c0 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
120d0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
120e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
120f0 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28   Tcl_NewLongObj(
12100 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
12110 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29  timeout(session)
12120 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
12130 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65   ticket lifetime
12140 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64   hint (in second
12150 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  s) */..Tcl_ListO
12160 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12170 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12180 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12190 28 22 6c 69 66 65 74 69 6d 65 22 2c 20 2d 31 29  ("lifetime", -1)
121a0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
121b0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
121c0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
121d0 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f  _NewLongObj(SSL_
121e0 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b  SESSION_get_tick
121f0 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74  et_lifetime_hint
12200 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f  (session)));.../
12210 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54  * Session id - T
12220 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77  LSv1.2 and below
12230 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f   only */..sessio
12240 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  n_id = SSL_SESSI
12250 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f  ON_get_id(sessio
12260 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f  n, &ulen);..Tcl_
12270 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
12280 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
12290 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
122a0 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 69  ngObj("session_i
122b0 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  d", -1));..Tcl_L
122c0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
122d0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
122e0 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
122f0 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f  rrayObj(session_
12300 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29  id, (int) ulen))
12310 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63  ;.../* Session c
12320 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69  ontext */..sessi
12330 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53  on_id = SSL_SESS
12340 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74  ION_get0_id_cont
12350 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c  ext(session, &ul
12360 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  en);..Tcl_ListOb
12370 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
12380 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
12390 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
123a0 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74  "session_context
123b0 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
123c0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
123d0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
123e0 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
123f0 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69  rayObj(session_i
12400 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b  d, (int) ulen));
12410 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69  .../* Session ti
12420 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e  cket - client on
12430 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49  ly */..SSL_SESSI
12440 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73  ON_get0_ticket(s
12450 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c  ession, &ticket,
12460 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69   &len2);..Tcl_Li
12470 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12480 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
12490 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
124a0 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f 74 69 63  Obj("session_tic
124b0 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ket", -1));..Tcl
124c0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
124d0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
124e0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74  jPtr, Tcl_NewByt
124f0 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74  eArrayObj(ticket
12500 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a  , (int) len2));.
12510 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20  ../* Ticket app 
12520 64 61 74 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53  data */..SSL_SES
12530 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74  SION_get0_ticket
12540 5f 61 70 70 64 61 74 61 28 73 65 73 73 69 6f 6e  _appdata(session
12550 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32  , &ticket, &len2
12560 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
12570 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
12580 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
12590 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74  _NewStringObj("t
125a0 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c  icket_app_data",
125b0 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
125c0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
125d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
125e0 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
125f0 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e  yObj(ticket, (in
12600 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20  t) len2));.../* 
12610 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a  Get master key *
12620 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45  /..len2 = SSL_SE
12630 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72  SSION_get_master
12640 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75  _key(session, bu
12650 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41  ffer, SSL_MAX_MA
12660 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29  STER_KEY_LENGTH)
12670 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
12680 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12690 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
126a0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61  NewStringObj("ma
126b0 73 74 65 72 5f 6b 65 79 22 2c 20 2d 31 29 29 3b  ster_key", -1));
126c0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
126d0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
126e0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
126f0 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 62  ewByteArrayObj(b
12700 75 66 66 65 72 2c 20 28 69 6e 74 29 20 6c 65 6e  uffer, (int) len
12710 32 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  2));.    }..    
12720 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69  /* Compression i
12730 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  nfo */.    if (s
12740 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69  sl != NULL) {.#i
12750 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f  fdef HAVE_SSL_CO
12760 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74  MPRESSION..const
12770 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f   COMP_METHOD *co
12780 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70  mp, *expn;..comp
12790 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65   = SSL_get_curre
127a0 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73  nt_compression(s
127b0 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c  sl);..expn = SSL
127c0 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70  _get_current_exp
127d0 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 54  ansion(ssl);...T
127e0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
127f0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
12800 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
12810 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72 65  tringObj("compre
12820 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54  ssion", -1));..T
12830 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12840 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
12850 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
12860 74 72 69 6e 67 4f 62 6a 28 63 6f 6d 70 20 3f 20  tringObj(comp ? 
12870 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d  SSL_COMP_get_nam
12880 65 28 63 6f 6d 70 29 20 3a 20 22 4e 4f 4e 45 22  e(comp) : "NONE"
12890 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
128a0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
128b0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
128c0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
128d0 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20  bj("expansion", 
128e0 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
128f0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12900 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12910 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12920 28 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50  (expn ? SSL_COMP
12930 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20  _get_name(expn) 
12940 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a  : "NONE", -1));.
12950 23 65 6c 73 65 0a 09 54 63 6c 5f 4c 69 73 74 4f  #else..Tcl_ListO
12960 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12970 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12980 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12990 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20  ("compression", 
129a0 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
129b0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
129c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
129d0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
129e0 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a 09  ("NONE", -1));..
129f0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12a00 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12a10 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
12a20 53 74 72 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e  StringObj("expan
12a30 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63  sion", -1));..Tc
12a40 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12a50 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
12a60 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
12a70 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20  ringObj("NONE", 
12a80 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
12a90 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65   }..    /* Serve
12aa0 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 6d 6f  r info */.    mo
12ab0 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74  de = SSL_CTX_get
12ac0 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d  _session_cache_m
12ad0 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ode(statePtr->ct
12ae0 78 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65  x);.    if (mode
12af0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
12b00 45 5f 4f 46 46 29 20 7b 0a 09 70 72 6f 74 6f 20  E_OFF) {..proto 
12b10 3d 20 22 6f 66 66 22 3b 0a 20 20 20 20 7d 20 65  = "off";.    } e
12b20 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
12b30 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c  SL_SESS_CACHE_CL
12b40 49 45 4e 54 29 20 7b 0a 09 70 72 6f 74 6f 20 3d  IENT) {..proto =
12b50 20 22 63 6c 69 65 6e 74 22 3b 0a 20 20 20 20 7d   "client";.    }
12b60 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26   else if (mode &
12b70 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
12b80 53 45 52 56 45 52 29 20 7b 0a 09 70 72 6f 74 6f  SERVER) {..proto
12b90 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 20 20 20   = "server";.   
12ba0 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65   } else if (mode
12bb0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
12bc0 45 5f 42 4f 54 48 29 20 7b 0a 09 70 72 6f 74 6f  E_BOTH) {..proto
12bd0 20 3d 20 22 62 6f 74 68 22 3b 0a 20 20 20 20 7d   = "both";.    }
12be0 20 65 6c 73 65 20 7b 0a 09 70 72 6f 74 6f 20 3d   else {..proto =
12bf0 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20   "unknown";.    
12c00 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  }.    Tcl_ListOb
12c10 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
12c20 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
12c30 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12c40 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d  "session_cache_m
12c50 6f 64 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ode", -1));.    
12c60 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12c70 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12c80 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
12c90 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 2c  StringObj(proto,
12ca0 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43   -1));..    /* C
12cb0 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69  A List */.    li
12cc0 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  stPtr = Tcl_NewL
12cd0 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
12ce0 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35  .    STACK_OF(X5
12cf0 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73  09_NAME) *ca_lis
12d00 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c  t;.    if ((ca_l
12d10 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c  ist = SSL_get_cl
12d20 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c  ient_CA_list(ssl
12d30 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63  )) != NULL) {..c
12d40 68 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49  har buffer[BUFSI
12d50 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20  Z];..for (int i 
12d60 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39  = 0; i < sk_X509
12d70 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73  _NAME_num(ca_lis
12d80 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  t); i++) {..    
12d90 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20  X509_NAME *name 
12da0 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76  = sk_X509_NAME_v
12db0 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29  alue(ca_list, i)
12dc0 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29  ;..    if (name)
12dd0 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f   {...X509_NAME_o
12de0 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66  neline(name, buf
12df0 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09  fer, BUFSIZ);...
12e00 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12e10 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12e20 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65   listPtr, Tcl_Ne
12e30 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65  wStringObj(buffe
12e40 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a  r, -1));..    }.
12e50 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  .}.    }.    Tcl
12e60 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12e70 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
12e80 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
12e90 69 6e 67 4f 62 6a 28 22 63 61 4c 69 73 74 22 2c  ingObj("caList",
12ea0 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
12eb0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12ec0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
12ed0 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 0a 20  tr, listPtr);.. 
12ee0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
12ef0 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ult(interp, objP
12f00 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
12f10 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
12f20 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
12f30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
12f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
12f80 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43  *. * VersionObjC
12f90 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72  md -- return ver
12fa0 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d  sion string from
12fb0 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20   OpenSSL.. *. * 
12fc0 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
12fd0 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
12fe0 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
12ff0 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
13000 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
13010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13040 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
13050 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f  tic int.VersionO
13060 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
13070 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
13080 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
13090 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
130a0 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
130b0 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
130c0 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70  *objPtr;..    dp
130d0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
130e0 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
130f0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
13100 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
13110 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54  TEXT, -1);.    T
13120 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
13130 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
13140 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
13150 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  _OK;..clientData
13160 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 09   = clientData;..
13170 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62  objc = objc;..ob
13180 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f  jv = objv;.}.../
13190 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
131a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131d0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69  -------. *. * Mi
131e0 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63  scObjCmd -- misc
131f0 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20   commands. *. * 
13200 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
13210 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
13220 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
13230 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
13240 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
13250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13280 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
13290 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43  tic int.MiscObjC
132a0 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
132b0 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
132c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
132d0 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
132e0 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
132f0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
13300 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73  t char *commands
13310 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22   [] = { "req", "
13320 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b  strreq", NULL };
13330 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e  .    enum comman
13340 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52  d { C_REQ, C_STR
13350 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a  REQ, C_DUMMY };.
13360 20 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 53      int cmd, isS
13370 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66  tr;.    char buf
13380 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20  fer[16384];..   
13390 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
133a0 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
133b0 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72  c < 2) {..Tcl_Wr
133c0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
133d0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62  p, 1, objv, "sub
133e0 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29  command ?args?")
133f0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
13400 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
13410 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
13420 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
13430 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73  bjv[1], commands
13440 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26  , "command", 0,&
13450 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  cmd) != TCL_OK) 
13460 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
13470 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
13480 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
13490 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20  );..    isStr = 
134a0 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51  (cmd == C_STRREQ
134b0 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28  );.    switch ((
134c0 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d  enum command) cm
134d0 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51  d) {..case C_REQ
134e0 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51  :..case C_STRREQ
134f0 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45  : {..    EVP_PKE
13500 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20  Y *pkey=NULL;.. 
13510 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55     X509 *cert=NU
13520 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41  LL;..    X509_NA
13530 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09  ME *name=NULL;..
13540 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69      Tcl_Obj **li
13550 73 74 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69  stv;..    int li
13560 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f  stc,i;...    BIO
13570 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20   *out=NULL;...  
13580 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a    char *k_C="",*
13590 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c  k_ST="",*k_L="",
135a0 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22  *k_O="",*k_OU=""
135b0 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61  ,*k_CN="",*k_Ema
135c0 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72  il="";..    char
135d0 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74   *keyout,*pemout
135e0 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20  ,*str;..    int 
135f0 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30  keysize,serial=0
13600 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20  ,days=365;..#if 
13610 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
13620 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
13630 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d  000L..    BIGNUM
13640 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20   *bne = NULL;.. 
13650 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55     RSA *rsa = NU
13660 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45  LL;.#else..    E
13670 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78  VP_PKEY_CTX *ctx
13680 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a   = NULL;.#endif.
13690 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c  ..    if ((objc<
136a0 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20  5) || (objc>6)) 
136b0 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d  {...Tcl_WrongNum
136c0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
136d0 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b  objv, "keysize k
136e0 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20  eyfile certfile 
136f0 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75  ?info?");...retu
13700 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
13710 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54     }...    if (T
13720 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
13730 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
13740 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54  , &keysize) != T
13750 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72  CL_OK) {...retur
13760 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
13770 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d    }..    keyout=
13780 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
13790 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d  jv[3]);..    pem
137a0 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  out=Tcl_GetStrin
137b0 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20  g(objv[4]);..   
137c0 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09   if (isStr) {...
137d0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
137e0 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a  p,keyout,"",0);.
137f0 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74  ..Tcl_SetVar(int
13800 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29  erp,pemout,"",0)
13810 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
13820 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09  f (objc>=6) {...
13830 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  if (Tcl_ListObjG
13840 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72  etElements(inter
13850 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26  p, objv[5],....&
13860 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21  listc, &listv) !
13870 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20  = TCL_OK) {...  
13880 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13890 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  OR;...}....if ((
138a0 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b  listc%2) != 0) {
138b0 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ...    Tcl_SetRe
138c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66  sult(interp,"Inf
138d0 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75  ormation list mu
138e0 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d  st have even num
138f0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
13900 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
13910 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13920 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b  ...}...for (i=0;
13930 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20   i<listc; i+=2) 
13940 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f  {...    str=Tcl_
13950 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13960 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73  i]);...    if (s
13970 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22  trcmp(str,"days"
13980 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54  )==0) {....if (T
13990 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
139a0 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b  (interp,listv[i+
139b0 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f  1],&days)!=TCL_O
139c0 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e  K)....    return
139d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
139e0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
139f0 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22  cmp(str,"serial"
13a00 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54  )==0) {....if (T
13a10 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
13a20 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b  (interp,listv[i+
13a30 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c  1],&serial)!=TCL
13a40 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75  _OK)....    retu
13a50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
13a60 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13a70 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d  trcmp(str,"C")==
13a80 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f  0) {....k_C=Tcl_
13a90 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13aa0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
13ab0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
13ac0 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09  tr,"ST")==0) {..
13ad0 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74  ..k_ST=Tcl_GetSt
13ae0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
13af0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
13b00 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c  f (strcmp(str,"L
13b10 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d  ")==0) {....k_L=
13b20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
13b30 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
13b40 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
13b50 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20  mp(str,"O")==0) 
13b60 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74  {....k_O=Tcl_Get
13b70 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
13b80 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
13b90 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
13ba0 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "OU")==0) {....k
13bb0 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _OU=Tcl_GetStrin
13bc0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
13bd0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
13be0 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29  strcmp(str,"CN")
13bf0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54  ==0) {....k_CN=T
13c00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
13c10 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
13c20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
13c30 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d  p(str,"Email")==
13c40 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d  0) {....k_Email=
13c50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
13c60 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
13c70 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c   } else {....Tcl
13c80 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
13c90 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d  p,"Unknown param
13ca0 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09  eter",NULL);....
13cb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13cc0 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20  ;...    }...}.. 
13cd0 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53     }..#if OPENSS
13ce0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
13cf0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
13d00 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77      bne = BN_new
13d10 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52  ();..    rsa = R
13d20 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70  SA_new();..    p
13d30 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e  key = EVP_PKEY_n
13d40 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62  ew();..    if (b
13d50 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73  ne == NULL || rs
13d60 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65  a == NULL || pke
13d70 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e  y == NULL || !BN
13d80 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53  _set_word(bne,RS
13d90 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f  A_F4) ||...!RSA_
13da0 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28  generate_key_ex(
13db0 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e  rsa, keysize, bn
13dc0 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50  e, NULL) || !EVP
13dd0 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41  _PKEY_assign_RSA
13de0 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09  (pkey, rsa)) {..
13df0 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
13e00 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66  key);.../* RSA_f
13e10 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20  ree(rsa); freed 
13e20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  by EVP_PKEY_free
13e30 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e   */...BN_free(bn
13e40 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70  e);.#else..    p
13e50 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65  key = EVP_RSA_ge
13e60 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  n((unsigned int)
13e70 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20   keysize);..    
13e80 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43  ctx = EVP_PKEY_C
13e90 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c  TX_new(pkey,NULL
13ea0 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79  );..    if (pkey
13eb0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20   == NULL || ctx 
13ec0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f  == NULL || !EVP_
13ed0 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74  PKEY_keygen_init
13ee0 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f  (ctx) ||...!EVP_
13ef0 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61  PKEY_CTX_set_rsa
13f00 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78  _keygen_bits(ctx
13f10 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45  , keysize) || !E
13f20 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63  VP_PKEY_keygen(c
13f30 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09  tx, &pkey)) {...
13f40 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
13f50 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  ey);...EVP_PKEY_
13f60 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23  CTX_free(ctx);.#
13f70 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52  endif...Tcl_SetR
13f80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
13f90 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70  ror generating p
13fa0 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c  rivate key",NULL
13fb0 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
13fc0 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c  ERROR;..    } el
13fd0 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72  se {...if (isStr
13fe0 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  ) {...    out=BI
13ff0 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
14000 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  ));...    PEM_wr
14010 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b  ite_bio_PrivateK
14020 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c  ey(out,pkey,NULL
14030 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c  ,NULL,0,NULL,NUL
14040 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f  L);...    i=BIO_
14050 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c  read(out,buffer,
14060 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31  sizeof(buffer)-1
14070 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29  );...    i=(i<0)
14080 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20   ? 0 : i;...    
14090 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a  buffer[i]='\0';.
140a0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ..    Tcl_SetVar
140b0 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62  (interp,keyout,b
140c0 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20  uffer,0);...    
140d0 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a  BIO_flush(out);.
140e0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f  ..    BIO_free(o
140f0 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ut);...} else {.
14100 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65  ..    out=BIO_ne
14110 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b  w(BIO_s_file());
14120 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65  ...    BIO_write
14130 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65  _filename(out,ke
14140 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d  yout);...    PEM
14150 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61  _write_bio_Priva
14160 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e  teKey(out,pkey,N
14170 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c  ULL,NULL,0,NULL,
14180 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20  NULL);...    /* 
14190 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53  PEM_write_bio_RS
141a0 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  APrivateKey(out,
141b0 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c   rsa, NULL, NULL
141c0 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  , 0, NULL, NULL)
141d0 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66  ; */...    BIO_f
141e0 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20  ree_all(out);.. 
141f0 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d  .}....if ((cert=
14200 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c  X509_new())==NUL
14210 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  L) {...    Tcl_S
14220 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
14230 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
14240 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65  g certificate re
14250 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09  quest",NULL);...
14260 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65      EVP_PKEY_fre
14270 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45  e(pkey);.#if OPE
14280 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
14290 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
142a0 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28  L...    BN_free(
142b0 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20  bne);.#endif... 
142c0 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52     return(TCL_ER
142d0 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30  ROR);...}....X50
142e0 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65  9_set_version(ce
142f0 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e  rt,2);...ASN1_IN
14300 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67  TEGER_set(X509_g
14310 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28  et_serialNumber(
14320 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09  cert),serial);..
14330 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a  .X509_gmtime_adj
14340 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65  (X509_getm_notBe
14350 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09  fore(cert),0);..
14360 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a  .X509_gmtime_adj
14370 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66  (X509_getm_notAf
14380 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29  ter(cert),(long)
14390 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a  60*60*24*days);.
143a0 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65  ..X509_set_pubke
143b0 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09  y(cert,pkey);...
143c0 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73  .name=X509_get_s
143d0 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74  ubject_name(cert
143e0 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  );....X509_NAME_
143f0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
14400 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52  (name,"C", MBSTR
14410 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
14420 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
14430 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29   k_C, -1, -1, 0)
14440 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
14450 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
14460 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49  ame,"ST", MBSTRI
14470 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
14480 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
14490 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_ST, -1, -1, 0)
144a0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
144b0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
144c0 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e  ame,"L", MBSTRIN
144d0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
144e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
144f0 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _L, -1, -1, 0);.
14500 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
14510 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
14520 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"O", MBSTRING_
14530 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
14540 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f  gned char *) k_O
14550 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
14560 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
14570 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
14580 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "OU", MBSTRING_A
14590 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
145a0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55  ned char *) k_OU
145b0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
145c0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
145d0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
145e0 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "CN", MBSTRING_A
145f0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
14600 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e  ned char *) k_CN
14610 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
14620 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
14630 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
14640 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e  "Email", MBSTRIN
14650 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
14660 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
14670 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20  _Email, -1, -1, 
14680 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f  0);....X509_set_
14690 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72  subject_name(cer
146a0 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28  t,name);....if (
146b0 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c  !X509_sign(cert,
146c0 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28  pkey,EVP_sha256(
146d0 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39  ))) {...    X509
146e0 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20  _free(cert);... 
146f0 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65     EVP_PKEY_free
14700 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
14710 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
14720 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
14730 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62  ...    BN_free(b
14740 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20  ne);.#endif...  
14750 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
14760 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69  interp,"Error si
14770 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  gning certificat
14780 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  e",NULL);...    
14790 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
147a0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53  ;...}....if (isS
147b0 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  tr) {...    out=
147c0 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65  BIO_new(BIO_s_me
147d0 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  m());...    PEM_
147e0 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f  write_bio_X509(o
147f0 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ut,cert);...    
14800 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62  i=BIO_read(out,b
14810 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66  uffer,sizeof(buf
14820 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69  fer)-1);...    i
14830 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a  =(i<0) ? 0 : i;.
14840 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d  ..    buffer[i]=
14850 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f  '\0';...    Tcl_
14860 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65  SetVar(interp,pe
14870 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a  mout,buffer,0);.
14880 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28  ..    BIO_flush(
14890 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  out);...    BIO_
148a0 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65  free(out);...} e
148b0 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  lse {...    out=
148c0 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69  BIO_new(BIO_s_fi
148d0 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f  le());...    BIO
148e0 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28  _write_filename(
148f0 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20  out,pemout);... 
14900 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
14910 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b  _X509(out,cert);
14920 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f  ...    BIO_free_
14930 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09  all(out);...}...
14940 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29  .X509_free(cert)
14950 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  ;...EVP_PKEY_fre
14960 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45  e(pkey);.#if OPE
14970 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
14980 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
14990 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29  L...BN_free(bne)
149a0 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a  ;.#endif..    }.
149b0 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64  .}..break;.    d
149c0 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a  efault:..break;.
149d0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
149e0 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74   TCL_OK;..client
149f0 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
14a00 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  a;.}.../********
14a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
14a20 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 20   Init           
14a30 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    */./**********
14a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
14a50 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
14a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a90 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
14aa0 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Free --. *. *.Th
14ab0 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
14ac0 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
14ad0 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
14ae0 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
14af0 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
14b00 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
14b10 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20  s below 1. *. * 
14b20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65  Results:. *.none
14b30 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
14b40 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c  cts:. *.Frees al
14b50 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20  l the state. *. 
14b60 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
14b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ba0 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c  ----. */.void.Tl
14bb0 73 5f 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f  s_Free(char *blo
14bc0 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61  ckPtr) {.    Sta
14bd0 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
14be0 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72  State *)blockPtr
14bf0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
14c00 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54  Called");..    T
14c10 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74  ls_Clean(statePt
14c20 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62  r);.    ckfree(b
14c30 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a  lockPtr);.}.../*
14c40 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c80 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
14c90 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09  _Clean --. *. *.
14ca0 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  This procedure c
14cb0 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20  leans up when a 
14cc0 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
14cd0 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63   channel. *.is c
14ce0 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65  losed and its re
14cf0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61  ference count fa
14d00 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68  lls below 1.  Th
14d10 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20  is should. *.be 
14d20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f  called synchrono
14d30 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73  usly by the Clos
14d40 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68  eProc, not in th
14d50 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46  e. *.EventuallyF
14d60 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a  ree callback.. *
14d70 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
14d80 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  none. *. * Side 
14d90 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65  effects:. *.Free
14da0 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a  s all the state.
14db0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
14dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14df0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
14e00 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74  d Tls_Clean(Stat
14e10 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20  e *statePtr) {. 
14e20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
14e30 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ed");..    /*.  
14e40 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d     * we're assum
14e50 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65  ing here that we
14e60 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61  're single-threa
14e70 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ded.     */.    
14e80 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69  if (statePtr->ti
14e90 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65  mer != (Tcl_Time
14ea0 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a  rToken) NULL) {.
14eb0 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72  .Tcl_DeleteTimer
14ec0 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72  Handler(statePtr
14ed0 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65  ->timer);..state
14ee0 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c  Ptr->timer = NUL
14ef0 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
14f00 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74   (statePtr->prot
14f10 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74  os) {..ckfree(st
14f20 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b  atePtr->protos);
14f30 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
14f40 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  os = NULL;.    }
14f50 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
14f60 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68  r->bio) {../* Th
14f70 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c  is will call SSL
14f80 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31  _shutdown. Bug 1
14f90 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e  414045 */..dprin
14fa0 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c  tf("BIO_free_all
14fb0 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d  (%p)", statePtr-
14fc0 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65  >bio);..BIO_free
14fd0 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62  _all(statePtr->b
14fe0 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  io);..statePtr->
14ff0 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  bio = NULL;.    
15000 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
15010 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69  tr->ssl) {..dpri
15020 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70  ntf("SSL_free(%p
15030 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73  )", statePtr->ss
15040 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74  l);..SSL_free(st
15050 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73  atePtr->ssl);..s
15060 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e  tatePtr->ssl = N
15070 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
15080 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  f (statePtr->ctx
15090 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  ) {..SSL_CTX_fre
150a0 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  e(statePtr->ctx)
150b0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ;..statePtr->ctx
150c0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
150d0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
150e0 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63  >callback) {..Tc
150f0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
15100 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
15110 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63  k);..statePtr->c
15120 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a  allback = NULL;.
15130 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
15140 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
15150 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  ) {..Tcl_DecrRef
15160 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
15170 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74  password);..stat
15180 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d  ePtr->password =
15190 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
151a0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
151b0 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  cmd) {..Tcl_Decr
151c0 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
151d0 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65  r->vcmd);..state
151e0 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c  Ptr->vcmd = NULL
151f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
15200 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22  intf("Returning"
15210 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
15220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
15260 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d   *. * Tls_Init -
15270 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20  -. *. *.This is 
15280 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61  a package initia
15290 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75  lization procedu
152a0 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c  re, which is cal
152b0 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68  led. *.by Tcl wh
152c0 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20  en this package 
152d0 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  is to be added t
152e0 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72  o an interpreter
152f0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
15300 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64    Ssl configured
15310 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20   and loaded. *. 
15320 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
15330 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73   *. create the s
15340 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74  sl command, init
15350 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65  ialize ssl conte
15360 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  xt. *. *--------
15370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
153b0 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c  DLLEXPORT int Tl
153c0 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
153d0 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
153e0 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54   const char tlsT
153f0 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d  clInitScript[] =
15400 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73   {.#include "tls
15410 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20  .tcl.h"..0x00.  
15420 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74    };..    dprint
15430 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
15440 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6f    /*.     * We o
15450 6e 6c 79 20 73 75 70 70 6f 72 74 20 54 63 6c 20  nly support Tcl 
15460 38 2e 34 20 6f 72 20 6e 65 77 65 72 0a 20 20 20  8.4 or newer.   
15470 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 0a 23 69    */.    if (.#i
15480 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  fdef USE_TCL_STU
15490 42 53 0a 09 54 63 6c 5f 49 6e 69 74 53 74 75 62  BS..Tcl_InitStub
154a0 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c  s(interp, "8.4",
154b0 20 30 29 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 50   0).#else..Tcl_P
154c0 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70  kgRequire(interp
154d0 2c 20 22 54 63 6c 22 2c 20 22 38 2e 34 2d 22 2c  , "Tcl", "8.4-",
154e0 20 30 29 0a 23 65 6e 64 69 66 0a 09 20 3d 3d 20   0).#endif.. == 
154f0 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
15500 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
15510 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62  ..    if (TlsLib
15520 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f  Init(0) != TCL_O
15530 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  K) {..Tcl_Append
15540 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
15550 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61  could not initia
15560 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79  lize SSL library
15570 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
15580 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15590 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61   }..    Tcl_Crea
155a0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
155b0 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65  erp, "tls::ciphe
155c0 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43  rs", CiphersObjC
155d0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
155e0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
155f0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
15600 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
15610 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
15620 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69  , "tls::connecti
15630 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49  on", ConnectionI
15640 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  nfoObjCmd, (Clie
15650 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
15660 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
15670 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
15680 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
15690 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68  (interp, "tls::h
156a0 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73  andshake", Hands
156b0 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  hakeObjCmd, (Cli
156c0 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
156d0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
156e0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
156f0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
15700 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
15710 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f  import", ImportO
15720 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
15730 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
15740 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
15750 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
15760 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
15770 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70  erp, "tls::unimp
15780 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62  ort", UnimportOb
15790 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
157a0 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
157b0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
157c0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
157d0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
157e0 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73  rp, "tls::status
157f0 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c  ", StatusObjCmd,
15800 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
15810 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15820 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15830 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15840 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15850 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56  tls::version", V
15860 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43  ersionObjCmd, (C
15870 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
15880 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
15890 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
158a0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
158b0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
158c0 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a  ::misc", MiscObj
158d0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
158e0 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
158f0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
15900 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
15910 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15920 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f  p, "tls::protoco
15930 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62  ls", ProtocolsOb
15940 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
15950 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
15960 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
15970 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65  );..    if (inte
15980 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28  rp) {..Tcl_Eval(
15990 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e  interp, tlsTclIn
159a0 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d  itScript);.    }
159b0 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 54 63 6c  ..    return(Tcl
159c0 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
159d0 72 70 2c 20 22 74 6c 73 22 2c 20 50 41 43 4b 41  rp, "tls", PACKA
159e0 47 45 5f 56 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a  GE_VERSION));.}.
159f0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
15a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
15a30 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74  . *.Tls_SafeInit
15a40 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d   --. *. *.------
15a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53  ----------*. *.S
15a80 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72  tandard procedur
15a90 65 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c  e required by 'l
15aa0 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c  oad'.. *.Initial
15ab0 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73  izes this extens
15ac0 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69  ion for a safe i
15ad0 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d  nterpreter.. *.-
15ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
15b10 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65  . *. *.Side effe
15b20 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27  cts:. *..As of '
15b30 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09  Tls_Init'. *. *.
15b40 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74  Result:. *..A st
15b50 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72  andard Tcl error
15b60 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   code.. *. *----
15b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ba0 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52  --*. */.DLLEXPOR
15bb0 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e  T int Tls_SafeIn
15bc0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
15bd0 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72  nterp) {.    dpr
15be0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
15bf0 20 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49      return(Tls_I
15c00 6e 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a  nit(interp));.}.
15c10 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
15c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
15c50 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d  . *.TlsLibInit -
15c60 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d  -. *. *.--------
15c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c90 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69  --------*. *.Ini
15ca0 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62  tializes SSL lib
15cb0 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70  rary once per ap
15cc0 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d  plication. *.---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
15d00 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74  *. *.Side effect
15d10 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a  s:. *..initializ
15d20 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20  es SSL library. 
15d30 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09  *. *.Result:. *.
15d40 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
15d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d80 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  -*. */.static in
15d90 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74  t TlsLibInit(int
15da0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b   uninitialize) {
15db0 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20  .    static int 
15dc0 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
15dd0 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20  .    int status 
15de0 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65  = TCL_OK;.#if de
15df0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
15e00 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
15e10 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20  d(TCL_THREADS). 
15e20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f     size_t num_lo
15e30 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  cks;.#endif..   
15e40 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a   if (uninitializ
15e50 65 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69  e) {..if (!initi
15e60 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64  alized) {..    d
15e70 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
15e80 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62   uninitialize, b
15e90 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  ut we are not in
15ea0 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20  itialized");... 
15eb0 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b     return(TCL_OK
15ec0 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28  );..}...dprintf(
15ed0 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74  "Asked to uninit
15ee0 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64  ialize");..#if d
15ef0 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54  efined(OPENSSL_T
15f00 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e  HREADS) && defin
15f10 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a  ed(TCL_THREADS).
15f20 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26  .Tcl_MutexLock(&
15f30 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28  init_mx);...if (
15f40 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72  locks) {..    fr
15f50 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20  ee(locks);..    
15f60 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20  locks = NULL;.. 
15f70 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20     locksCount = 
15f80 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e  0;..}.#endif..in
15f90 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a  itialized = 0;..
15fa0 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
15fb0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
15fc0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
15fd0 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55  ADS)..Tcl_MutexU
15fe0 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b  nlock(&init_mx);
15ff0 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e  .#endif...return
16000 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a  (TCL_OK);.    }.
16010 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c  .    if (initial
16020 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66  ized) {..dprintf
16030 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73  ("Called, but us
16040 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65  ing cached value
16050 22 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 74  ");..return(stat
16060 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  us);.    }..    
16070 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
16080 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
16090 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
160a0 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
160b0 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c  THREADS).    Tcl
160c0 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74  _MutexLock(&init
160d0 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  _mx);.#endif.   
160e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31   initialized = 1
160f0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
16100 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
16110 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
16120 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f  HREADS).    num_
16130 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c  locks = 1;.    l
16140 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74  ocksCount = (int
16150 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20  ) num_locks;.   
16160 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28   locks = malloc(
16170 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a  sizeof(*locks) *
16180 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20   num_locks);.   
16190 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30   memset(locks, 0
161a0 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29  , sizeof(*locks)
161b0 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23   * num_locks);.#
161c0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e  endif..    /* In
161d0 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69  itialize BOTH li
161e0 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73  bcrypto and libs
161f0 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53  sl. */.    OPENS
16200 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e  SL_init_ssl(OPEN
16210 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53  SSL_INIT_LOAD_SS
16220 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e  L_STRINGS | OPEN
16230 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52  SSL_INIT_LOAD_CR
16240 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20  YPTO_STRINGS..| 
16250 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44  OPENSSL_INIT_ADD
16260 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f  _ALL_CIPHERS | O
16270 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f  PENSSL_INIT_ADD_
16280 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c  ALL_DIGESTS, NUL
16290 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77  L);..    BIO_new
162a0 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a  _tcl(NULL, 0);..
162b0 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20  #if 0.    /*.   
162c0 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65    * XXX:TODO: Re
162d0 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61  move this code a
162e0 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69  nd replace it wi
162f0 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20  th a check.     
16300 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74  * for enough ent
16310 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20  ropy and do not 
16320 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75  try to create ou
16330 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72  r own.     * ter
16340 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20  rible entropy.  
16350 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20     */.    /*.   
16360 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e    * Seed the ran
16370 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72  dom number gener
16380 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20  ator in the SSL 
16390 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20  library,.     * 
163a0 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69  using the do/whi
163b0 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63  le construct bec
163c0 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20  ause of the bug 
163d0 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20  note in the.    
163e0 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61   * OpenSSL FAQ a
163f0 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65  t http://www.ope
16400 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74  nssl.org/support
16410 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a  /faq.html#USER1.
16420 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68       *.     * Th
16430 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72  e crux of the pr
16440 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f  oblem is that So
16450 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74  laris 7 does not
16460 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f   have a.     * /
16470 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64  dev/random or /d
16480 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63  ev/urandom devic
16490 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67  e so it cannot g
164a0 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20  ather enough.   
164b0 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d    * entropy from
164c0 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29   the RAND_seed()
164d0 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61   when TLS initia
164e0 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65  lizes and refuse
164f0 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66  s.     * to go f
16500 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20  urther. Earlier 
16510 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e  versions of Open
16520 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72  SSL carried on r
16530 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20  egardless..     
16540 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e  */.    srand((un
16550 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65  signed int) time
16560 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c  ((time_t *) NULL
16570 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f  ));.    do {..fo
16580 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36  r (i = 0; i < 16
16590 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e  ; i++) {..    rn
165a0 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20  d_seed[i] = 1 + 
165b0 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20  (char) (255.0 * 
165c0 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58  rand()/(RAND_MAX
165d0 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44  +1.0));..}..RAND
165e0 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20  _seed(rnd_seed, 
165f0 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29  sizeof(rnd_seed)
16600 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28  );.    } while (
16610 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d  RAND_status() !=
16620 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66   1);.#endif..#if
16630 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
16640 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
16650 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
16660 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f  )..Tcl_MutexUnlo
16670 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65  ck(&init_mx);.#e
16680 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 74  ndif...return(st
16690 61 74 75 73 29 3b 0a 7d 0a                       atus);.}.