Hex Artifact Content

Artifact 5b3a9ccd274a8dfcf837e051cec76e0981d283ecf054f634471a274344ee47b2:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72  dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a   declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b  /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
04e0: 23 64 65 66 69 6e 65 20 52 45 41 53 4f 4e 28 29  #define REASON()
04f0: 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f  .ERR_reason_erro
0500: 72 5f 73 74 72 69 6e 67 28 45 52 52 5f 67 65 74  r_string(ERR_get
0510: 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74 61 74 69  _error())..stati
0520: 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49  c SSL_CTX *CTX_I
0530: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65  nit(State *state
0540: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65  Ptr, int isServe
0550: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
0560: 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20  ar *key,...char 
0570: 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67  *certfile, unsig
0580: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73  ned char *key_as
0590: 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  n1, unsigned cha
05a0: 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09  r *cert_asn1,...
05b0: 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e  int key_asn1_len
05c0: 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f  , int cert_asn1_
05d0: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72  len, char *CAdir
05e0: 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a  , char *CAfile,.
05f0: 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  ..char *ciphers,
0600: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
0610: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
0620: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b  char *DHparams);
0630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73  ..static int.Tls
0640: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e  LibInit(int unin
0650: 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66  itialize);..#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ine TLS_PROTO_SS
0670: 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65  L2..0x01.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09   TLS_PROTO_SSL3.
0690: 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c  .0x02.#define TL
06a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78  S_PROTO_TLS1..0x
06b0: 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  04.#define TLS_P
06c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38  ROTO_TLS1_1.0x08
06d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
06e0: 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23  TO_TLS1_2.0x10.#
06f0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0700: 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65  _TLS1_3.0x20.#de
0710: 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61  fine ENABLED(fla
0720: 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67  g, mask).(((flag
0730: 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28  ) & (mask)) == (
0740: 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20  mask))..#define 
0750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22  SSLKEYLOGFILE.."
0760: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a  SSLKEYLOGFILE"..
0770: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61 74  /*. * Static dat
0780: 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 2f  a structures. */
0790: 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53  ..#ifndef OPENSS
07a0: 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 65  L_NO_DH.#include
07b0: 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a 23   "dh_params.h".#
07c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72  endif../*. * Thr
07d0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64  ead-Safe TLS Cod
07e0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  e. */..#ifdef TC
07f0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e  L_THREADS.#defin
0800: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  e OPENSSL_THREAD
0810: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64  _DEFINES.#includ
0820: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  e <openssl/opens
0830: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65  slconf.h>..#ifde
0840: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
0850: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
0860: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69  ssl/crypto.h>.#i
0870: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0880: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68  ssl.h>../*. * Th
0890: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e  readed operation
08a0: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e   requires lockin
08b0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42  g callbacks. * B
08c0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74  ased from /crypt
08d0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20  o/cryptlib.c of 
08e0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70  OpenSSL and NSOp
08f0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74  enSSL.. */..stat
0900: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f  ic Tcl_Mutex *lo
0910: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  cks = NULL;.stat
0920: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e  ic int locksCoun
0930: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63  t = 0;.static Tc
0940: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b  l_Mutex init_mx;
0950: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53  .#endif /* OPENS
0960: 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65  SL_THREADS */.#e
0970: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45  ndif /* TCL_THRE
0980: 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a  ADS */..../*****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
09a0: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20  ./* Callbacks   
09b0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
09d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45  --------. *. * E
0a20: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d  val Callback Com
0a30: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76  mand --. *. *.Ev
0a40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
0a50: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e  and and catch an
0a60: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52  y errors. *. * R
0a70: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43  esults:. *.0 = C
0a80: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ommand returned 
0a90: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74  fail or eval ret
0aa0: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a  urned TCL_ERROR.
0ab0: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72   *.1 = Command r
0ac0: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20  eturned success 
0ad0: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
0ae0: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69   TCL_OK. *. * Si
0af0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45  de effects:. *.E
0b00: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63  valuates callbac
0b10: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d  k command. *. *-
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
0b70: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54  t.EvalCallback(T
0b80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b90: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50  p, State *stateP
0ba0: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64  tr, Tcl_Obj *cmd
0bb0: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63  Ptr) {.    int c
0bc0: 6f 64 65 2c 20 6f 6b 3b 0a 0a 20 20 20 20 54 63  ode, ok;..    Tc
0bd0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
0be0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
0bf0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
0c00: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
0c10: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
0c20: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
0c30: 77 69 74 68 20 73 75 63 63 65 73 73 20 66 6f 72  with success for
0c40: 20 6f 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61   ok or return va
0c50: 6c 75 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20  lue 1, fail for 
0c60: 65 72 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20  error or return 
0c70: 76 61 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 63  value 0 */.    c
0c80: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62  ode = Tcl_EvalOb
0c90: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  jEx(interp, cmdP
0ca0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  tr, TCL_EVAL_GLO
0cb0: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f  BAL);.    if (co
0cc0: 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  de == TCL_OK) {.
0cd0: 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74  ./* Check result
0ce0: 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75   for return valu
0cf0: 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72  e */..Tcl_Obj *r
0d00: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
0d10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
0d20: 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d  ;..if (result ==
0d30: 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74   NULL || Tcl_Get
0d40: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
0d50: 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20  p, result, &ok) 
0d60: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
0d70: 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20 20    ok = 1;..}.   
0d80: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72   } else {../* Er
0d90: 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65  ror - reject the
0da0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
0db0: 09 6f 6b 20 3d 20 30 3b 0a 23 69 66 20 28 54 43  .ok = 0;.#if (TC
0dc0: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
0dd0: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49  == 8) && (TCL_MI
0de0: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29  NOR_VERSION < 6)
0df0: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
0e00: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
0e10: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
0e20: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e  oundException(in
0e30: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
0e40: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  dif.    }..    T
0e50: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0e60: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
0e70: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  );.    Tcl_Relea
0e80: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0e90: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
0ea0: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  urn ok;.}.../*. 
0eb0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43  ----. *. * InfoC
0f00: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
0f10: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f  .Monitors SSL co
0f20: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73  nnection process
0f30: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0f40: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
0f50: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
0f60: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
0f70: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ---. */.static v
0fd0: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  oid.InfoCallback
0fe0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
0ff0: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20   int where, int 
1000: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ret) {.    State
1010: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
1020: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
1030: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
1040: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
1050: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
1060: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
1070: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
1080: 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 6a  r;.    char *maj
1090: 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b  or; char *minor;
10a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
10b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
10c0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
10d0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
10e0: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b  *)NULL)..return;
10f0: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20  ..    if (where 
1100: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
1110: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a  KE_START) {..maj
1120: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
1130: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72  ;..minor = "star
1140: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  t";.    } else i
1150: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1160: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45  B_HANDSHAKE_DONE
1170: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
1180: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
1190: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d   = "done";.    }
11a0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65   else {..if (whe
11b0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
11c0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65  T)..major = "ale
11d0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  rt";..else if (w
11e0: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f  here & SSL_ST_CO
11f0: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22  NNECT).major = "
1200: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20  connect";..else 
1210: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1220: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f  ST_ACCEPT)..majo
1230: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65  r = "accept";..e
1240: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20  lse.....major = 
1250: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20  "unknown";...if 
1260: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1270: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22  READ)..minor = "
1280: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20  read";..else if 
1290: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
12a0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20  WRITE)..minor = 
12b0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69  "write";..else i
12c0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
12d0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d  B_LOOP)..minor =
12e0: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69   "loop";..else i
12f0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1300: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d  B_EXIT)..minor =
1310: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09   "exit";..else..
1320: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e  ...minor = "unkn
1330: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
1340: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
1350: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
1360: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
1370: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
1380: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
1390: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
13a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
13b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
13c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
13d0: 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20  info", -1));.   
13e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
13f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1400: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1410: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1420: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
1430: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
1440: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
1450: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1460: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
1470: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
1480: 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d  ringObj(major, -
1490: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
14a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14b0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
14c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14d0: 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a  bj(minor, -1));.
14e0: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26  .    if (where &
14f0: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b   SSL_CB_ALERT) {
1500: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
1510: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1520: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1530: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1540: 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f  (SSL_alert_desc_
1550: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29  string_long(ret)
1560: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
1570: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1580: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1590: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
15a0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72  ringObj(SSL_aler
15b0: 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f  t_type_string_lo
15c0: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20  ng(ret), -1));. 
15d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
15e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
15f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1600: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1610: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
1620: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e  state_string_lon
1630: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54  g(ssl), -1));..T
1640: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1650: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1660: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
1670: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c  tringObj("info",
1680: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   -1));.    }..  
1690: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
16a0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
16b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
16c0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
16d0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
16e0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
16f0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
1700: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
1710: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65  --. *. * Message
1770: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
1780: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70  *.Monitors SSL p
1790: 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73  rotocol messages
17a0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
17b0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
17c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
17d0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
17e0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ---. */.#ifndef 
1840: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54  OPENSSL_NO_SSL_T
1850: 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64  RACE.static void
1860: 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b  .MessageCallback
1870: 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e  (int write_p, in
1880: 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63  t version, int c
1890: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e  ontent_type, con
18a0: 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69  st void *buf, si
18b0: 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73  ze_t len, SSL *s
18c0: 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  sl, void *arg) {
18d0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
18e0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
18f0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
1900: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
1910: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
1920: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
1930: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65  tr;.    char *ve
1940: 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49  r, *type;.    BI
1950: 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72  O *bio;.    char
1960: 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a   buffer[15000];.
1970: 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20      buffer[0] = 
1980: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
1990: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
19a0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
19b0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
19c0: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72  bj*)NULL)..retur
19d0: 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76  n;..    switch(v
19e0: 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f 50  ersion) {.#if OP
19f0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
1a00: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
1a10: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
1a20: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
1a30: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
1a40: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 53  SL2).    case SS
1a50: 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  L2_VERSION:..ver
1a60: 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65   = "SSLv2";..bre
1a70: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
1a80: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
1a90: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
1aa0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20  NSSL_NO_SSL3).  
1ab0: 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53    case SSL3_VERS
1ac0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c  ION:..ver = "SSL
1ad0: 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  v3";..break;.#en
1ae0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53  dif.    case TLS
1af0: 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  1_VERSION:..ver 
1b00: 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61  = "TLSv1";..brea
1b10: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31  k;.    case TLS1
1b20: 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  _1_VERSION:..ver
1b30: 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62   = "TLSv1.1";..b
1b40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b50: 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09  LS1_2_VERSION:..
1b60: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b  ver = "TLSv1.2";
1b70: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1b80: 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  e TLS1_3_VERSION
1b90: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1ba0: 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  3";..break;.    
1bb0: 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20 20 20  case 0:.        
1bc0: 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62  ver = "none";..b
1bd0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
1be0: 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f  t:..ver = "unkno
1bf0: 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  wn";..break;.   
1c00: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28   }..    switch (
1c10: 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a  content_type) {.
1c20: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1c30: 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d  _HEADER:..type =
1c40: 20 22 48 65 61 64 65 72 22 3b 0a 20 20 20 20 20   "Header";.     
1c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1c60: 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52  se SSL3_RT_INNER
1c70: 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09  _CONTENT_TYPE:..
1c80: 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f  type = "Inner Co
1c90: 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 20 20 20  ntent Type";.   
1ca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cb0: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41  case SSL3_RT_CHA
1cc0: 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a  NGE_CIPHER_SPEC:
1cd0: 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65  ..type = "Change
1ce0: 20 43 69 70 68 65 72 22 3b 0a 20 20 20 20 20 20   Cipher";.      
1cf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d00: 65 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a  e SSL3_RT_ALERT:
1d10: 0a 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22  ..type = "Alert"
1d20: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d30: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d40: 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79  T_HANDSHAKE:..ty
1d50: 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22  pe = "Handshake"
1d60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d70: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d80: 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41  T_APPLICATION_DA
1d90: 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70  TA:..type = "App
1da0: 20 44 61 74 61 22 3b 0a 20 20 20 20 20 20 20 20   Data";.        
1db0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1dc0: 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45  DTLS1_RT_HEARTBE
1dd0: 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61  AT:..type = "Hea
1de0: 72 74 62 65 61 74 22 3b 0a 20 20 20 20 20 20 20  rtbeat";.       
1df0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
1e00: 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e  ult:..type = "un
1e10: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20  known";.    }.. 
1e20: 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70     /* Needs comp
1e30: 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile time option 
1e40: 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63  "enable-ssl-trac
1e50: 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  e". */.    if ((
1e60: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio = BIO_new(BI
1e70: 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e  O_s_mem())) != N
1e80: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09  ULL) {..int n;..
1e90: 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f  SSL_trace(write_
1ea0: 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74  p, version, cont
1eb0: 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c  ent_type, buf, l
1ec0: 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a  en, ssl, (void *
1ed0: 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f  )bio);..n = BIO_
1ee0: 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72  read(bio, buffer
1ef0: 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e  , min(BIO_pendin
1f00: 67 28 62 69 6f 29 2c 20 31 34 39 39 39 29 29 3b  g(bio), 14999));
1f10: 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20  ..n = (n<0) ? 0 
1f20: 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20  : n;..buffer[n] 
1f30: 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f  = 0;..(void)BIO_
1f40: 66 6c 75 73 68 28 62 69 6f 29 3b 0a 20 09 42 49  flush(bio);. .BI
1f50: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20  O_free(bio);.   
1f60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
1f70: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
1f80: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
1f90: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1fa0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
1fb0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
1fc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1fd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1fe0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1ff0: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20  gObj("message", 
2000: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2010: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2020: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2030: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
2040: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
2050: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
2060: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
2070: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2080: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2090: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
20a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
20b0: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74  (write_p ? "Sent
20c0: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20  " : "Received", 
20d0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
20e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
20f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2100: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2110: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20  Obj(ver, -1));. 
2120: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2130: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2140: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2150: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70  NewStringObj(typ
2160: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  e, -1));.    Tcl
2170: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2180: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2190: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
21a0: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
21b0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
21c0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
21d0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
21e0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
21f0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
2200: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2210: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2220: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2230: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
2240: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61  -. *. * VerifyCa
22a0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
22b0: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72  Monitors SSL cer
22c0: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
22d0: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65  ion process. Use
22e0: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  d to control the
22f0: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65  . *.behavior whe
2300: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59  n the SSL_VERIFY
2310: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65  _PEER flag is se
2320: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  t. This is calle
2330: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20  d. *.whenever a 
2340: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69  certificate is i
2350: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69  nspected or deci
2360: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c  ded invalid. Cal
2370: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20  led for. *.each 
2380: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74  certificate in t
2390: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20  he cert chain.. 
23a0: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09  *. * Checks:. *.
23b0: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69  certificate chai
23c0: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61  n is checked sta
23d0: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64  rting with the d
23e0: 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c  eepest nesting l
23f0: 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72  evel. *.  (the r
2400: 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61  oot CA certifica
2410: 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75  te) and worked u
2420: 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65  pward to the pee
2430: 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e  r's certificate.
2440: 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72  . *.All signatur
2450: 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75  es are valid, cu
2460: 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69  rrent time is wi
2470: 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c  thin first and l
2480: 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d  ast validity tim
2490: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74  e.. *.Check that
24a0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
24b0: 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68   is issued by th
24c0: 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69  e issuer certifi
24d0: 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09  cate issuer.. *.
24e0: 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61  Check the revoca
24f0: 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20  tion status for 
2500: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65  each certificate
2510: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76  .. *.Check the v
2520: 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67  alidity of the g
2530: 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65  iven CRL and the
2540: 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e   cert revocation
2550: 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63   status.. *.Chec
2560: 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f  k the policies o
2570: 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66  f all the certif
2580: 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67  icates. *. * Arg
2590: 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f  s. *.preverify_o
25a0: 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  k indicates whet
25b0: 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63  her the certific
25c0: 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ate verification
25d0: 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e   passed (1) or n
25e0: 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73  ot (0). *. * Res
25f0: 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62  ults:. *.A callb
2600: 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65  ack bound to the
2610: 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75   socket may retu
2620: 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20  rn one of:. *.  
2630: 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74    0...- the cert
2640: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65  ificate is deeme
2650: 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20  d invalid, send 
2660: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09  verification. *.
2670: 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65  ...  failure ale
2680: 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20  rt to peer, and 
2690: 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68  terminate handsh
26a0: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09  ake.. *.    1...
26b0: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  - the certificat
26c0: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69  e is deemed vali
26d0: 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  d, continue with
26e0: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
26f0: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09     empty string.
2700: 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63  - no change to c
2710: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64  ertificate valid
2720: 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65  ation. *. * Side
2730: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
2740: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
2750: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
2760: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
2770: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
2780: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
2790: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
27a0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
27b0: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *. *---------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
2800: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79  tatic int.Verify
2810: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c  Callback(int ok,
2820: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20   X509_STORE_CTX 
2830: 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f  *ctx) {.    Tcl_
2840: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
2850: 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28   SSL   *ssl..= (
2860: 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f  SSL*)X509_STORE_
2870: 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28  CTX_get_ex_data(
2880: 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f  ctx, SSL_get_ex_
2890: 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f  data_X509_STORE_
28a0: 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20  CTX_idx());.    
28b0: 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58  X509  *cert..= X
28c0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
28d0: 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63  t_current_cert(c
28e0: 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a  tx);.    State *
28f0: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
2900: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64  e*)SSL_get_app_d
2910: 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63  ata(ssl);.    Tc
2920: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2930: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
2940: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70  erp;.    int dep
2950: 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  th..= X509_STORE
2960: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64  _CTX_get_error_d
2970: 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69  epth(ctx);.    i
2980: 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53  nt err..= X509_S
2990: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
29a0: 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70  or(ctx);..    dp
29b0: 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25  rintf("Verify: %
29c0: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66  d", ok);..    if
29d0: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
29e0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
29f0: 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65  LL) {..if (state
2a00: 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53  Ptr->vflags & SS
2a10: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
2a20: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
2a30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b  ..    return ok;
2a40: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
2a50: 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20  return 1;..}.   
2a60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
2a70: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
2a80: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  l */.    cmdPtr 
2a90: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
2aa0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  bj(statePtr->vcm
2ab0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
2ac0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2ad0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2ae0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2af0: 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29  j("verify", -1))
2b00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2b10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2b20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
2b30: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2b40: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
2b50: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
2b60: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
2b70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2b80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2b90: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
2ba0: 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a 20  ntObj(depth));. 
2bb0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2bc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2bd0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f  rp, cmdPtr, Tls_
2be0: 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72  NewX509Obj(inter
2bf0: 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 54  p, cert));.    T
2c00: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2c10: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2c20: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
2c30: 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20  ntObj(ok));.    
2c40: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c50: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2c60: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   cmdPtr,..Tcl_Ne
2c70: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
2c80: 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  *)X509_verify_ce
2c90: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
2ca0: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  err), -1));..   
2cb0: 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20   /* Prevent I/O 
2cc0: 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69  while callback i
2cd0: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f  s in progress */
2ce0: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72  .    /* statePtr
2cf0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
2d00: 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a  CL_CALLBACK; */.
2d10: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
2d20: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
2d30: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
2d40: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
2d50: 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c     ok = EvalCall
2d60: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2d70: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2d80: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2d90: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
2da0: 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e     /* statePtr->
2db0: 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54  flags &= ~(TLS_T
2dc0: 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f  CL_CALLBACK); */
2dd0: 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b  .    return(ok);
2de0: 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20  ./* By default, 
2df0: 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69  leave verificati
2e00: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f  on unchanged. */
2e10: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2e60: 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d  . * Tls_Error --
2e70: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  . *. *.Calls cal
2e80: 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74 20  lback with list 
2e90: 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a  of errors.. *. *
2ea0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
2eb0: 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20  *.The err field 
2ec0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  of the currently
2ed0: 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65   operative State
2ee0: 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20   is set. *.  to 
2ef0: 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62  a string describ
2f00: 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f  ing the SSL nego
2f10: 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20  tiation failure 
2f20: 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  reason. *. *----
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2f70: 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72   */.void.Tls_Err
2f80: 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  or(State *stateP
2f90: 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 7b  tr, char *msg) {
2fa0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
2fb0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
2fc0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
2fd0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c  Tcl_Obj *cmdPtr,
2fe0: 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 75   *listPtr;.    u
2ff0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72  nsigned long err
3000: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
3010: 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20  err = msg;..    
3020: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
3030: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
3040: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
3050: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
3060: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20  )..return;..    
3070: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
3080: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20  d to eval */.   
3090: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
30a0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
30b0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
30c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
30d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
30e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
30f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65  _NewStringObj("e
3100: 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20  rror", -1));.   
3110: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3120: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3130: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
3140: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3150: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
3160: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
3170: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66  f), -1));.    if
3180: 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b   (msg != NULL) {
3190: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
31a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
31b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
31c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c  ewStringObj(msg,
31d0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c   -1));..    } el
31e0: 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54 63  se if ((msg = Tc
31f0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
3200: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  bj(Tcl_GetObjRes
3210: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c  ult(interp), NUL
3220: 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  L)) != NULL) {..
3230: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3240: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3250: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3260: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d  StringObj(msg, -
3270: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  1));..    } else
3280: 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63   {..listPtr = Tc
3290: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
32a0: 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28  NULL);..while ((
32b0: 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72  err = ERR_get_er
32c0: 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09  ror()) != 0) {..
32d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
32e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
32f0: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63  erp, listPtr, Tc
3300: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45  l_NewStringObj(E
3310: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f  RR_reason_error_
3320: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29  string(err), -1)
3330: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f  );..}..Tcl_ListO
3340: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3350: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3360: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a  listPtr);.    }.
3370: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
3380: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
3390: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
33a0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
33b0: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
33c0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
33d0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
33e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
33f0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  cmdPtr);.}.../*.
3400: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3440: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c  -----. *. * KeyL
3450: 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  ogCallback --. *
3460: 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76  . *.Write receiv
3470: 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c  ed key data to l
3480: 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53  og file.. *. * S
3490: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
34a0: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
34f0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c  /.void KeyLogCal
3500: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
3510: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72  *ssl, const char
3520: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68   *line) {.    ch
3530: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76  ar *str = getenv
3540: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b  (SSLKEYLOGFILE);
3550: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a  .    FILE *fd;..
3560: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
3570: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
3580: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70  str) {..fd = fop
3590: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66  en(str, "a");..f
35a0: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e  printf(fd, "%s\n
35b0: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65  ",line);..fclose
35c0: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a  (fd);.    }.}...
35d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50  --------. *. * P
3620: 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b  assword Callback
3630: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
3640: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64   when a password
3650: 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b   for a private k
3660: 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69  ey loading/stori
3670: 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74  ng a PEM. *.cert
3680: 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e 63  ificate with enc
3690: 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63  ryption. Evals c
36a0: 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61  allback script a
36b0: 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68  nd returns. *.th
36c0: 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20  e result as the 
36d0: 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20  password string 
36e0: 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65  in buf.. *. * Re
36f0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
3700: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
3710: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
3720: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
3730: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  ). *. * Returns:
3740: 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a  . *.Password siz
3750: 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31  e in bytes or -1
3760: 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20   for an error.. 
3770: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
37c0: 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43  ic int.PasswordC
37d0: 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75  allback(char *bu
37e0: 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74  f, int size, int
37f0: 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75   rwflag, void *u
3800: 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74  data) {.    Stat
3810: 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53  e *statePtr.= (S
3820: 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20  tate *) udata;. 
3830: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
3840: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
3850: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
3860: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
3870: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20     int code;..  
3880: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
3890: 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  d");..    /* If 
38a0: 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65  no callback, use
38b0: 20 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63   default callbac
38c0: 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  k */.    if (sta
38d0: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
38e0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28  == NULL) {..if (
38f0: 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72  Tcl_EvalEx(inter
3900: 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72  p, "tls::passwor
3910: 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c  d", -1, TCL_EVAL
3920: 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f  _GLOBAL) == TCL_
3930: 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20  OK) {..    char 
3940: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20  *ret = (char *) 
3950: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
3960: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20  ult(interp);..  
3970: 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72    strncpy(buf, r
3980: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a  et, (size_t) siz
3990: 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  e);..    return 
39a0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29  (int)strlen(ret)
39b0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
39c0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20   return -1;..}. 
39d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
39e0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
39f0: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
3a00: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
3a10: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70  eObj(statePtr->p
3a20: 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63  assword);.    Tc
3a30: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3a40: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3a50: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
3a60: 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72  ringObj("passwor
3a70: 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  d", -1));.    Tc
3a80: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3a90: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3aa0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e  mdPtr, Tcl_NewIn
3ab0: 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20  tObj(rwflag));. 
3ac0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3ad0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3ae0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3af0: 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29  NewIntObj(size))
3b00: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  ;..    Tcl_Prese
3b10: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  rve((ClientData)
3b20: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63   interp);.    Tc
3b30: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
3b40: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
3b50: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
3b60: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
3b70: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
3b80: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
3b90: 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c  ;.    code = Tcl
3ba0: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
3bb0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45  p, cmdPtr, TCL_E
3bc0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20  VAL_GLOBAL);.   
3bd0: 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c   if (code != TCL
3be0: 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f  _OK) {.#if (TCL_
3bf0: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d  MAJOR_VERSION ==
3c00: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f   8) && (TCL_MINO
3c10: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09  R_VERSION < 6)..
3c20: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
3c30: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c  ror(interp);.#el
3c40: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  se..Tcl_Backgrou
3c50: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65  ndException(inte
3c60: 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69  rp, code);.#endi
3c70: 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  f.    }.    Tcl_
3c80: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
3c90: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52  Ptr);..    Tcl_R
3ca0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
3cb0: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a  ta) statePtr);..
3cc0: 20 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73      /* If succes
3cd0: 73 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20  sful, pass back 
3ce0: 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20  password string 
3cf0: 61 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66 20  and truncate if 
3d00: 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20  too long */.    
3d10: 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f  if (code == TCL_
3d20: 4f 4b 29 20 7b 0a 09 69 6e 74 20 6c 65 6e 3b 0a  OK) {..int len;.
3d30: 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68  .char *ret = (ch
3d40: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72  ar *) Tcl_GetStr
3d50: 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47  ingFromObj(Tcl_G
3d60: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
3d70: 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  rp), &len);..if 
3d80: 28 6c 65 6e 20 3e 20 73 69 7a 65 2d 31 29 20 7b  (len > size-1) {
3d90: 0a 09 20 20 20 20 6c 65 6e 20 3d 20 73 69 7a 65  ..    len = size
3da0: 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28  -1;..}..strncpy(
3db0: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f  buf, ret, (size_
3dc0: 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65  t) len);..buf[le
3dd0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f  n] = '\0';..Tcl_
3de0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
3df0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 72  ata) interp);..r
3e00: 65 74 75 72 6e 28 6c 65 6e 29 3b 0a 20 20 20 20  eturn(len);.    
3e10: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  }.    Tcl_Releas
3e20: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
3e30: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75  nterp);.    retu
3e40: 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  rn -1;.}.../*. *
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e90: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f  ---. *. * Sessio
3ea0: 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43  n Callback for C
3eb0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09  lients --. *. *.
3ec0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  Called when a ne
3ed0: 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64  w session is add
3ee0: 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e  ed to the cache.
3ef0: 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74   In TLS 1.3. *.t
3f00: 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69  his may be recei
3f10: 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ved multiple tim
3f20: 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e  es after the han
3f30: 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65  dshake. For. *.e
3f40: 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c  arlier versions,
3f50: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65   this will be re
3f60: 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68  ceived during th
3f70: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09  e handshake.. *.
3f80: 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66  This is the pref
3f90: 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74  erred way to obt
3fa0: 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20  ain a resumable 
3fb0: 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52  session.. *. * R
3fc0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
3fd0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3fe0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
3ff0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
4000: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  d). *. * Return 
4010: 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72  codes:. *.0 = er
4020: 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f  ror where sessio
4030: 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69  n will be immedi
4040: 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72  ately removed fr
4050: 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  om the internal 
4060: 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75  cache.. *.1 = su
4070: 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20  ccess where app 
4080: 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20  retains session 
4090: 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65  in session cache
40a0: 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20  , and must call 
40b0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65  SSL_SESSION_free
40c0: 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a  () when done.. *
40d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
4120: 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c  c int.SessionCal
4130: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
4140: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f  *ssl, SSL_SESSIO
4150: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20  N *session) {.  
4160: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
4170: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f  r = (State*)SSL_
4180: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53  get_app_data((SS
4190: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63  L *)ssl);.    Tc
41a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
41b0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
41c0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
41d0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f   *cmdPtr;.    co
41e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
41f0: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63  r *ticket;.    c
4200: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4210: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a  ar *session_id;.
4220: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b      size_t len2;
4230: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
4240: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72  t ulen;..    dpr
4250: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
4260: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4270: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
4280: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
4290: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
42a0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
42b0: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d  } else if (ssl =
42c0: 3d 20 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 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
42f0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4300: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
4310: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
4320: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
4330: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
4340: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4350: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4360: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
4370: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4380: 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29  ("session", -1))
4390: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
43a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
43b0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
43c0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
43d0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
43e0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
43f0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a  ->self), -1));..
4400: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69      /* Session i
4410: 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e  d */.    session
4420: 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
4430: 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e  N_get_id(session
4440: 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63  , &ulen);.    Tc
4450: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4460: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4470: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79  mdPtr, Tcl_NewBy
4480: 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69  teArrayObj(sessi
4490: 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65  on_id, (int) ule
44a0: 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73  n));..    /* Ses
44b0: 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a 20  sion ticket */. 
44c0: 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67     SSL_SESSION_g
44d0: 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69  et0_ticket(sessi
44e0: 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65  on, &ticket, &le
44f0: 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  n2);.    Tcl_Lis
4500: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4510: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4520: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
4530: 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69  ayObj(ticket, (i
4540: 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20  nt) len2));..   
4550: 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e   /* Lifetime - n
4560: 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
4570: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74   */.    Tcl_List
4580: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4590: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
45a0: 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a  ..Tcl_NewLongObj
45b0: 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53  ((long) SSL_SESS
45c0: 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c  ION_get_ticket_l
45d0: 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73  ifetime_hint(ses
45e0: 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a  sion)));..    /*
45f0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
4600: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
4610: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
4620: 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c  mdPtr);.    Eval
4630: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
4640: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
4650: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  r);.    Tcl_Decr
4660: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
4670: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
4680: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
46d0: 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b   * ALPN Callback
46e0: 20 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e 64   for Servers and
46f0: 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f   NPN Callback fo
4700: 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a  r Clients --. *.
4710: 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f   *.Perform proto
4720: 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68  col (http/1.1, h
4730: 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c  2, h3, etc.) sel
4740: 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20  ection for the. 
4750: 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65  *.incoming conne
4760: 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66  ction. Called af
4770: 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65  ter Hello and se
4780: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  rver callbacks..
4790: 20 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20 69   *.Where 'out' i
47a0: 73 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  s selected proto
47b0: 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73 20  col and 'in' is 
47c0: 74 68 65 20 70 65 65 72 20 61 64 76 65 72 74 69  the peer adverti
47d0: 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  sed list.. *. * 
47e0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
47f0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
4800: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
4810: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
4820: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
4830: 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54   codes:. *.SSL_T
4840: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c  LSEXT_ERR_OK: AL
4850: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  PN protocol sele
4860: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  cted. The connec
4870: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
4880: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
4890: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54  R_ALERT_FATAL: T
48a0: 68 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72  here was no over
48b0: 6c 61 70 20 62 65 74 77 65 65 6e 20 74 68 65 20  lap between the 
48c0: 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20  client's. *.    
48d0: 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e  supplied list an
48e0: 64 20 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e  d the server con
48f0: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20  figuration. The 
4900: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20  connection will 
4910: 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53  be aborted.. *.S
4920: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
4930: 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63  ACK: ALPN protoc
4940: 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c  ol not selected,
4950: 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e   e.g., because n
4960: 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72  o ALPN. *.    pr
4970: 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66  otocols are conf
4980: 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20  igured for this 
4990: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20  connection. The 
49a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
49b0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nues.. *. *-----
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4a00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c  */.static int.AL
4a10: 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  PNCallback(const
4a20: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74   SSL *ssl, const
4a30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4a40: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  *out, unsigned c
4a50: 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f  har *outlen,..co
4a60: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4a70: 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20  r *in, unsigned 
4a80: 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20  int inlen, void 
4a90: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
4aa0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
4ab0: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
4ac0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4ad0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
4ae0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
4af0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
4b00: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20  nt code, res;.. 
4b10: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
4b20: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
4b30: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  sl == NULL || ar
4b40: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g == NULL) {..re
4b50: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
4b60: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
4b70: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
4b80: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20  protocol */.    
4b90: 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e  if (SSL_select_n
4ba0: 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 6f  ext_proto(out, o
4bb0: 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 2d  utlen, statePtr-
4bc0: 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 74  >protos, statePt
4bd0: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09  r->protos_len,..
4be0: 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50  in, inlen) == OP
4bf0: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49  ENSSL_NPN_NEGOTI
4c00: 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 63  ATED) {../* Matc
4c10: 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 20  h found */..res 
4c20: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4c30: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
4c40: 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50  {../* OPENSSL_NP
4c50: 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 4e  N_NO_OVERLAP = N
4c60: 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 73  o overlap, so us
4c70: 65 20 66 69 72 73 74 20 69 74 65 6d 20 66 72 6f  e first item fro
4c80: 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63 6f  m client protoco
4c90: 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20 3d  l list */..res =
4ca0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4cb0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
4cc0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
4cd0: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  vcmd == (Tcl_Obj
4ce0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
4cf0: 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  n res;.    }..  
4d00: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
4d10: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20  and to eval */. 
4d20: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
4d30: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
4d40: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
4d50: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4d60: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4d70: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
4d80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70  ewStringObj("alp
4d90: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
4da0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4db0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4dc0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
4dd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
4de0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
4df0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
4e00: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
4e10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4e20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4e30: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
4e40: 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b  gObj(*out, -1));
4e50: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4e60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4e70: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
4e80: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
4e90: 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58  res == SSL_TLSEX
4ea0: 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20  T_ERR_OK));..   
4eb0: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
4ec0: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
4ed0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4ee0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69  t(cmdPtr);.    i
4ef0: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43  f ((code = EvalC
4f00: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
4f10: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
4f20: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d  )) > 1) {..res =
4f30: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4f40: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  NOACK;.    } els
4f50: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29  e if (code == 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 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
4f80: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
4f90: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4fa0: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20  ALERT_FATAL;.   
4fb0: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
4fc0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
4fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b  .    return res;
4fe0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
4ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5030: 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72  . * Advertise Pr
5040: 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b  otocols Callback
5050: 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63   for Next Protoc
5060: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28  ol Negotiation (
5070: 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65  NPN) in ServerHe
5080: 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c  llo --. *. *.cal
5090: 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73  led when a TLS s
50a0: 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69  erver needs a li
50b0: 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20  st of supported 
50c0: 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65  protocols for Ne
50d0: 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e  xt. *.Protocol N
50e0: 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20  egotiation.. *. 
50f0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
5100: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
5110: 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74  fects:. *. * Ret
5120: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
5130: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
5140: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65   NPN protocol se
5150: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  lected. The conn
5160: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
5170: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
5180: 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70  ERR_NOACK: NPN p
5190: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65  rotocol not sele
51a0: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  cted. The connec
51b0: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
51c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66  --------. */.#if
5210: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74  def USE_NPN.stat
5220: 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61  ic int.NPNCallba
5230: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
5240: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  l, const unsigne
5250: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e  d char **out, un
5260: 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c  signed int *outl
5270: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  en, void *arg) {
5280: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
5290: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
52a0: 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  rg;..    dprintf
52b0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
52c0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
52d0: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
52e0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
52f0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
5300: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
5310: 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73  et protocols lis
5320: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  t */.    if (sta
5330: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d  tePtr->protos !=
5340: 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d   NULL) {..*out =
5350: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
5360: 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74  s;..*outlen = st
5370: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
5380: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  en;.    } else {
5390: 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09  ..*out = NULL;..
53a0: 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65  *outlen = 0;..re
53b0: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
53c0: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
53d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f  .    return SSL_
53e0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d  TLSEXT_ERR_OK;.}
53f0: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d  .#endif.../*. *-
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5440: 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c  --. *. * SNI Cal
5450: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72  lback for Server
5460: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f  s --. *. *.Perfo
5470: 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53  rm server-side S
5480: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65  NI hostname sele
5490: 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65  ction after rece
54a0: 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73  iving SNI extens
54b0: 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74  ion. *.in Client
54c0: 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61   Hello. Called a
54d0: 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62  fter hello callb
54e0: 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41  ack but before A
54f0: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a  LPN callback.. *
5500: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
5510: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
5520: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
5530: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
5540: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
5550: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
5560: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5570: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69  : SNI hostname i
5580: 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20  s accepted. The 
5590: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
55a0: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
55b0: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
55c0: 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  TAL: SNI hostnam
55d0: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65  e is not accepte
55e0: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
55f0: 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72  n. *.    is abor
5600: 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72  ted. Default for
5610: 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44   alert is SSL_AD
5620: 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41  _UNRECOGNIZED_NA
5630: 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  ME.. *.SSL_TLSEX
5640: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e  T_ERR_ALERT_WARN
5650: 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  ING: SNI hostnam
5660: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65  e is not accepte
5670: 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74  d, warning alert
5680: 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f  . *.    sent (no
5690: 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54  t supported in T
56a0: 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e  LSv1.3). The con
56b0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
56c0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
56d0: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20  _ERR_NOACK: SNI 
56e0: 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20  hostname is not 
56f0: 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74  accepted and not
5700: 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20   acknowledged,. 
5710: 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e  *.    e.g. if SN
5720: 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63  I has not been c
5730: 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63  onfigured. The c
5740: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
5750: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ues.. *. *------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
57a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49  /.static int.SNI
57b0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
57c0: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c  SL *ssl, int *al
57d0: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  ert, void *arg) 
57e0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
57f0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
5800: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  arg;.    Tcl_Int
5810: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
5820: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
5830: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
5840: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  Ptr;.    int cod
5850: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 68 61 72  e, res;.    char
5860: 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e   *servername = N
5870: 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ULL;..    dprint
5880: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
5890: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
58a0: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c  L || arg == NULL
58b0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
58c0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
58d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
58e0: 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54  Only works for T
58f0: 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69  LS 1.2 and earli
5900: 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72  er */.    server
5910: 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73  name = SSL_get_s
5920: 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54  ervername(ssl, T
5930: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68  LSEXT_NAMETYPE_h
5940: 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69  ost_name);.    i
5950: 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c  f (!servername |
5960: 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20  | servername[0] 
5970: 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75  == '\0') {..retu
5980: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
5990: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
59a0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
59b0: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f  ->vcmd == (Tcl_O
59c0: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  bj*)NULL) {..ret
59d0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
59e0: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  RR_OK;.    }..  
59f0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
5a00: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20  and to eval */. 
5a10: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
5a20: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
5a30: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
5a40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5a50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5a60: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
5a70: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69  ewStringObj("sni
5a80: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
5a90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5aa0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
5ab0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
5ac0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
5ad0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
5ae0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
5af0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
5b00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5b10: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5b20: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
5b30: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c  Obj(servername ,
5b40: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45   -1));..    /* E
5b50: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
5b60: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
5b70: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
5b80: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63  Ptr);.    if ((c
5b90: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61  ode = EvalCallba
5ba0: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
5bb0: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20  Ptr, cmdPtr)) > 
5bc0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
5bd0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
5be0: 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72  _WARNING;..*aler
5bf0: 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43  t = SSL_AD_UNREC
5c00: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a  OGNIZED_NAME; /*
5c10: 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62   Not supported b
5c20: 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20  y TLS 1.3 */.   
5c30: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65   } else if (code
5c40: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20   == 1) {..res = 
5c50: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5c60: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  K;.    } else {.
5c70: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
5c80: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41  T_ERR_ALERT_FATA
5c90: 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  L;..*alert = SSL
5ca0: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44  _AD_UNRECOGNIZED
5cb0: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75  _NAME; /* Not su
5cc0: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31  pported by TLS 1
5cd0: 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  .3 */.    }.    
5ce0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5cf0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
5d00: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
5d10: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d50: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69  ------. *. * Cli
5d60: 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61  entHello Handsha
5d70: 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ke Callback for 
5d80: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a  Servers --. *. *
5d90: 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20  .Used by server 
5da0: 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73  to examine the s
5db0: 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63  erver name indic
5dc0: 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65  ation (SNI) exte
5dd0: 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65  nsion. *.provide
5de0: 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20  d by the client 
5df0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65  in order to sele
5e00: 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ct an appropriat
5e10: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f  e certificate to
5e20: 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64  . *.present, and
5e30: 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66   make other conf
5e40: 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74  iguration adjust
5e50: 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74  ments relevant t
5e60: 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a  o that server. *
5e70: 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f  .name and its co
5e80: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69  nfiguration. Thi
5e90: 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70  s includes swapp
5ea0: 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f  ing out the asso
5eb0: 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54  ciated. *.SSL_CT
5ec0: 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66  X pointer, modif
5ed0: 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27  ying the server'
5ee0: 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74  s list of permit
5ef0: 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73  ted TLS versions
5f00: 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68  ,. *.changing th
5f10: 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65  e server's ciphe
5f20: 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e  r list in respon
5f30: 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  se to the client
5f40: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20  's cipher list, 
5f50: 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62  etc.. *.Called b
5f60: 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c  efore SNI and AL
5f70: 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a  PN callbacks.. *
5f80: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
5f90: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
5fa0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
5fb0: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
5fc0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
5fd0: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
5fe0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
5ff0: 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74  RETRY: suspend t
6000: 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e  he handshake, an
6010: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20  d the handshake 
6020: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
6030: 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
6040: 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  . *.SSL_CLIENT_H
6050: 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c  ELLO_ERROR: fail
6060: 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63  ure, terminate c
6070: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61  onnection. Set a
6080: 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f  lert to error co
6090: 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  de.. *.SSL_CLIEN
60a0: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a  T_HELLO_SUCCESS:
60b0: 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d   success. *. *--
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6100: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
6110: 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 63  .HelloCallback(c
6120: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69  onst SSL *ssl, i
6130: 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20  nt *alert, void 
6140: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
6150: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
6160: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
6170: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
6180: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
6190: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
61a0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
61b0: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20  nt code, res;.  
61c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65    const char *se
61d0: 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f  rvername;.    co
61e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
61f0: 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74  r *p;.    size_t
6200: 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b   len, remaining;
6210: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
6220: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
6230: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
6240: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
6250: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
6260: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53  L_CLIENT_HELLO_S
6270: 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c  UCCESS;.    } el
6280: 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55  se if (ssl == NU
6290: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c  LL || arg == NUL
62a0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
62b0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
62c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
62d0: 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a  /* Get names */.
62e0: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69      if (!SSL_cli
62f0: 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65  ent_hello_get0_e
6300: 78 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54  xt(ssl, TLSEXT_T
6310: 59 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c  YPE_server_name,
6320: 20 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29   &p, &remaining)
6330: 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d   || remaining <=
6340: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20   2) {..*alert = 
6350: 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52  SSL_R_SSLV3_ALER
6360: 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45  T_ILLEGAL_PARAME
6370: 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  TER;..return SSL
6380: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6390: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
63a0: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c  /* Extract the l
63b0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 70  ength of the sup
63c0: 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61  plied list of na
63d0: 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  mes. */.    len 
63e0: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b  = (*(p++) << 8);
63f0: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b  .    len += *(p+
6400: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20  +);.    if (len 
6410: 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67  + 2 != remaining
6420: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
6430: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f  L_R_SSLV3_ALERT_
6440: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45  ILLEGAL_PARAMETE
6450: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
6460: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6470: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  R;.    }.    rem
6480: 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20  aining = len;.. 
6490: 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
64a0: 6e 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20  n practice only 
64b0: 68 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65  has a single ele
64c0: 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79  ment, so we only
64d0: 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69   consider the fi
64e0: 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20  rst one. */.    
64f0: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d  if (remaining ==
6500: 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c   0 || *p++ != TL
6510: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f  SEXT_NAMETYPE_ho
6520: 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65  st_name) {..*ale
6530: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6540: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f  _ALERT_INTERNAL_
6550: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53  ERROR;..return S
6560: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6570: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6580: 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20   remaining--;.. 
6590: 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e     /* Now we can
65a0: 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75   finally pull ou
65b0: 74 20 74 68 65 20 62 79 74 65 20 61 72 72 61 79  t the byte array
65c0: 20 77 69 74 68 20 74 68 65 20 61 63 74 75 61 6c   with the actual
65d0: 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20   hostname. */.  
65e0: 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20    if (remaining 
65f0: 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20  <= 2) {..*alert 
6600: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6610: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6620: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  OR;..return SSL_
6630: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6640: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  OR;.    }.    le
6650: 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38  n = (*(p++) << 8
6660: 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28  );.    len += *(
6670: 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65  p++);.    if (le
6680: 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e  n + 2 > remainin
6690: 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  g) {..*alert = S
66a0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
66b0: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b  _INTERNAL_ERROR;
66c0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
66d0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
66e0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
66f0: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  ning = len;.    
6700: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f  servername = (co
6710: 6e 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20  nst char *)p;.. 
6720: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
6730: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
6740: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
6750: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
6760: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
6770: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
6780: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
6790: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
67a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65  NewStringObj("he
67b0: 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  llo", -1));.    
67c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
67d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
67e0: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
67f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54  l_NewStringObj(T
6800: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
6810: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
6820: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ), -1));.    Tcl
6830: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6840: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
6850: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
6860: 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d  ingObj(servernam
6870: 65 2c 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a  e, (int) len));.
6880: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
6890: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
68a0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
68b0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
68c0: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
68d0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
68e0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
68f0: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
6900: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  es = SSL_CLIENT_
6910: 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61  HELLO_RETRY;..*a
6920: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
6930: 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 41  V1_ALERT_USER_CA
6940: 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65  NCELLED;.    } e
6950: 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20  lse if (code == 
6960: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
6970: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43  CLIENT_HELLO_SUC
6980: 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65  CESS;.    } else
6990: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c   {..res = SSL_CL
69a0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
69b0: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
69c0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
69d0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20  TERNAL_ERROR;.  
69e0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
69f0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
6a00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
6a10: 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
6a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20  ***********/./* 
6a30: 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20  Commands        
6a40: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
6a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
6a60: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
6a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6aa0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65  ----. *. * Ciphe
6ab0: 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74  rsObjCmd -- list
6ac0: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65   available ciphe
6ad0: 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  rs. *. *.This pr
6ae0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
6af0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
6b00: 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22  e "tls::ciphers"
6b10: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c   command. *.to l
6b20: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69  ist available ci
6b30: 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f  phers, based upo
6b40: 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  n protocol selec
6b50: 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ted.. *. * Resul
6b60: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
6b70: 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73  d Tcl result lis
6b80: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
6b90: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72  fects:. *.constr
6ba0: 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79  ucts and destroy
6bb0: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43  s SSL context (C
6bc0: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  TX). *. *-------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
6c10: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6c20: 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20  ar *protocols[] 
6c30: 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73 73  = {.."ssl2", "ss
6c40: 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74 6c  l3", "tls1", "tl
6c50: 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c  s1.1", "tls1.2",
6c60: 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a   "tls1.3", NULL.
6c70: 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c  };.enum protocol
6c80: 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32 2c   {.    TLS_SSL2,
6c90: 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54   TLS_SSL3, TLS_T
6ca0: 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 2c  LS1, TLS_TLS1_1,
6cb0: 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c 53   TLS_TLS1_2, TLS
6cc0: 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e  _TLS1_3, TLS_NON
6cd0: 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  E.};..static int
6ce0: 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 43  .CiphersObjCmd(C
6cf0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
6d00: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
6d10: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
6d20: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
6d30: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
6d40: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
6d50: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c   = NULL;.    SSL
6d60: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
6d70: 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d  ;.    SSL *ssl =
6d80: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b   NULL;.    STACK
6d90: 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20  _OF(SSL_CIPHER) 
6da0: 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  *sk;.    char *c
6db0: 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a  p, buf[BUFSIZ];.
6dc0: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76      int index, v
6dd0: 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f  erbose = 0, use_
6de0: 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 0a  supported = 0;..
6df0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
6e00: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
6e10: 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f  (objc < 2) || (o
6e20: 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c  bjc > 4)) {..Tcl
6e30: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6e40: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
6e50: 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73  protocol ?verbos
6e60: 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29  e? ?supported?")
6e70: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
6e80: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
6e90: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
6ea0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
6eb0: 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c  bjv[1], protocol
6ec0: 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30  s, "protocol", 0
6ed0: 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c  , &index) != TCL
6ee0: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
6ef0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6f00: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20      if ((objc > 
6f10: 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f  2) && Tcl_GetBoo
6f20: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
6f30: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65  rp, objv[2], &ve
6f40: 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b  rbose) != TCL_OK
6f50: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
6f60: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6f70: 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20   if ((objc > 3) 
6f80: 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  && Tcl_GetBoolea
6f90: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
6fa0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73   objv[3], &use_s
6fb0: 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c  upported) != TCL
6fc0: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
6fd0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6fe0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
6ff0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69  rror();..    swi
7000: 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f  tch ((enum proto
7010: 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61  col)index) {..ca
7020: 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66  se TLS_SSL2:.#if
7030: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
7040: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31  _NUMBER >= 0x101
7050: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65  00000L || define
7060: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65  d(NO_SSL2) || de
7070: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7080: 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f  _SSL2)..    Tcl_
7090: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
70a0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
70b0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
70c0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
70d0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
70e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
70f0: 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20  .#else..    ctx 
7100: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53  = SSL_CTX_new(SS
7110: 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62  Lv2_method()); b
7120: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
7130: 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66  se TLS_SSL3:.#if
7140: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33   defined(NO_SSL3
7150: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7160: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c  NSSL_NO_SSL3) ||
7170: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7180: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29  _NO_SSL3_METHOD)
7190: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
71a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
71b0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
71c0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
71d0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
71e0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
71f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
7200: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
7210: 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65  CTX_new(SSLv3_me
7220: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a  thod()); break;.
7230: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
7240: 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e  _TLS1:.#if defin
7250: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
7260: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7270: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
7280: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7290: 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  S1_METHOD)..    
72a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
72b0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
72c0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
72d0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
72e0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
72f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7300: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7310: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
7320: 77 28 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29  w(TLSv1_method()
7330: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
7340: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f  ..case TLS_TLS1_
7350: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  1:.#if defined(N
7360: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
7370: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7380: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
7390: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
73a0: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20  S1_1_METHOD)..  
73b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
73c0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
73d0: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
73e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
73f0: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
7400: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7410: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
7420: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
7430: 6e 65 77 28 54 4c 53 76 31 5f 31 5f 6d 65 74 68  new(TLSv1_1_meth
7440: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65  od()); break;.#e
7450: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
7460: 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_2:.#if defin
7470: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c  ed(NO_TLS1_2) ||
7480: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7490: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  _NO_TLS1_2) || d
74a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
74b0: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
74c0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
74d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
74e0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
74f0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
7500: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
7510: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
7520: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
7530: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
7540: 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 32 5f  CTX_new(TLSv1_2_
7550: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b  method()); break
7560: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54  ;.#endif..case T
7570: 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64  LS_TLS1_3:.#if d
7580: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
7590: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
75a0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
75b0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
75c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
75d0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
75e0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
75f0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
7600: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
7610: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
7620: 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43  .    ctx = SSL_C
7630: 54 58 5f 6e 65 77 28 54 4c 53 5f 6d 65 74 68 6f  TX_new(TLS_metho
7640: 64 28 29 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  d());..    SSL_C
7650: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f  TX_set_min_proto
7660: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
7670: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09  S1_3_VERSION);..
7680: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
7690: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  max_proto_versio
76a0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
76b0: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65  RSION);..    bre
76c0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61  ak;.#endif..defa
76d0: 75 6c 74 3a 0a 09 20 20 20 20 62 72 65 61 6b 3b  ult:..    break;
76e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63  .    }.    if (c
76f0: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  tx == NULL) {..T
7700: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7710: 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29  interp, REASON()
7720: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
7730: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7740: 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c  }..    ssl = SSL
7750: 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69  _new(ctx);.    i
7760: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20  f (ssl == NULL) 
7770: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
7780: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53  ult(interp, REAS
7790: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53  ON(), NULL);..SS
77a0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
77b0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
77c0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
77d0: 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f  * Use list and o
77e0: 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65  rder as would be
77f0: 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e   sent in a Clien
7800: 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76  tHello or all av
7810: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20  ailable ciphers 
7820: 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73  */.    if (use_s
7830: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20  upported) {..sk 
7840: 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f  = SSL_get1_suppo
7850: 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c  rted_ciphers(ssl
7860: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
7870: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69  .sk = SSL_get_ci
7880: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20  phers(ssl);.    
7890: 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d  }..    if (sk !=
78a0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76   NULL) {..if (!v
78b0: 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f  erbose) {..    o
78c0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
78d0: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
78e0: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69  ..    for (int i
78f0: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c   = 0; i < sk_SSL
7900: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b  _CIPHER_num(sk);
7910: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20   i++) {...const 
7920: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20  SSL_CIPHER *c = 
7930: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61  sk_SSL_CIPHER_va
7940: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66  lue(sk, i);...if
7950: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e   (c == NULL) con
7960: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70  tinue;..../* cip
7970: 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e  her name or (NON
7980: 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c  E) */...cp = SSL
7990: 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65  _CIPHER_get_name
79a0: 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d  (c);...if (cp ==
79b0: 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09   NULL) break;...
79c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
79d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
79e0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
79f0: 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31  StringObj(cp, -1
7a00: 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65  ));..    }...} e
7a10: 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74  lse {..    objPt
7a20: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
7a30: 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20  gObj("",0);..   
7a40: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
7a50: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48   i < sk_SSL_CIPH
7a60: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29  ER_num(sk); i++)
7a70: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43   {...const SSL_C
7a80: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53  IPHER *c = sk_SS
7a90: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73  L_CIPHER_value(s
7aa0: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d  k, i);...if (c =
7ab0: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65  = NULL) continue
7ac0: 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20  ;..../* textual 
7ad0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
7ae0: 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69  he cipher */...i
7af0: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65  f (SSL_CIPHER_de
7b00: 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66  scription(c, buf
7b10: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21  , sizeof(buf)) !
7b20: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20  = NULL) {...    
7b30: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28  Tcl_AppendToObj(
7b40: 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 69 6e  objPtr, buf, (in
7b50: 74 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b  t) strlen(buf));
7b60: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
7b70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62    Tcl_AppendToOb
7b80: 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f  j(objPtr, "UNKNO
7b90: 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09  WN\n", 8);...}..
7ba0: 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73      }..}..if (us
7bb0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09  e_supported) {..
7bc0: 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45      sk_SSL_CIPHE
7bd0: 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20  R_free(sk);..}. 
7be0: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65     }.    SSL_fre
7bf0: 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f  e(ssl);.    SSL_
7c00: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a  CTX_free(ctx);..
7c10: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
7c20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
7c30: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
7c40: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74   TCL_OK;..client
7c50: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
7c60: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  a;.}.../*. *----
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7cb0: 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f   *. * ProtocolsO
7cc0: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76  bjCmd -- list av
7cd0: 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c  ailable protocol
7ce0: 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  s. *. *.This pro
7cf0: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
7d00: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
7d10: 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73   "tls::protocols
7d20: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20  " command. *.to 
7d30: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70  list available p
7d40: 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20  rotocols.. *. * 
7d50: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
7d60: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
7d70: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  t list.. *. * Si
7d80: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e  de effects:. *.n
7d90: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
7da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
7de0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74  .static int.Prot
7df0: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65  ocolsObjCmd(Clie
7e00: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
7e10: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
7e20: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
7e30: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
7e40: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
7e50: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a  l_Obj *objPtr;..
7e60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
7e70: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
7e80: 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63  objc != 1) {..Tc
7e90: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
7ea0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
7eb0: 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  "");..return TCL
7ec0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
7ed0: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
7ee0: 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74  or();..    objPt
7ef0: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
7f00: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69  bj(0, NULL);..#i
7f10: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
7f20: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
7f30: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
7f40: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
7f50: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7f60: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c  NO_SSL2).    Tcl
7f70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
7f80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
7f90: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
7fa0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
7fb0: 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29  [TLS_SSL2], -1))
7fc0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
7fd0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
7fe0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
7ff0: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  SL_NO_SSL3) && !
8000: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8010: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a  NO_SSL3_METHOD).
8020: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8030: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8040: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8050: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
8060: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33  otocols[TLS_SSL3
8070: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
8080: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
8090: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
80a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
80b0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
80c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d  PENSSL_NO_TLS1_M
80d0: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
80e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
80f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
8100: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8110: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8120: 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a  LS_TLS1], -1));.
8130: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
8140: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  ned(NO_TLS1_1) &
8150: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8160: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  SL_NO_TLS1_1) &&
8170: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8180: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48  L_NO_TLS1_1_METH
8190: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  OD).    Tcl_List
81a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
81b0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
81c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
81d0: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
81e0: 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23  TLS1_1], -1));.#
81f0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
8200: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  ed(NO_TLS1_2) &&
8210: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8220: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20  L_NO_TLS1_2) && 
8230: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8240: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f  _NO_TLS1_2_METHO
8250: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  D).    Tcl_ListO
8260: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8270: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8280: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8290: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
82a0: 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65  LS1_2], -1));.#e
82b0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
82c0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
82d0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
82e0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
82f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
8300: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
8310: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
8320: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
8330: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c  ols[TLS_TLS1_3],
8340: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20   -1));.#endif.. 
8350: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
8360: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ult(interp, objP
8370: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
8380: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
8390: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
83a0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
83b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
83f0: 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62  *. * HandshakeOb
8400: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
8410: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  is command is us
8420: 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65  ed to verify whe
8430: 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61  ther the handsha
8440: 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20  ke is complete. 
8450: 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20  *.or not.. *. * 
8460: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
8470: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
8480: 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73  t. 1 means hands
8490: 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30  hake complete, 0
84a0: 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a   means pending..
84b0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
84c0: 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65  ts:. *.May force
84d0: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e   SSL negotiation
84e0: 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a   to take place..
84f0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
8500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8530: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
8540: 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b  tic int Handshak
8550: 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  eObjCmd(ClientDa
8560: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
8570: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8580: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
8590: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
85a0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
85b0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20  annel chan;     
85c0: 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65     /* The channe
85d0: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
85e0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  on. */.    State
85f0: 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20   *statePtr;     
8600: 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61     /* client sta
8610: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65  te for ssl socke
8620: 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  t */.    const c
8630: 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55  har *errStr = NU
8640: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20  LL;.    int ret 
8650: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72  = 1;.    int err
8660: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
8670: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
8680: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
8690: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
86a0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
86b0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
86c0: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
86d0: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
86e0: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
86f0: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d  r();..    chan =
8700: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
8710: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
8720: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8730: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c  v[1], NULL), NUL
8740: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
8750: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
8760: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
8770: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
8780: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
8790: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
87a0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
87b0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
87c0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
87d0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
87e0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
87f0: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
8800: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
8810: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
8820: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8830: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
8840: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
8850: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20  elName(chan),.. 
8860: 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c     "\": not a TL
8870: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
8880: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
8890: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
88a0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
88b0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
88c0: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
88d0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54  NULL);..return(T
88e0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
88f0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
8900: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74  (State *)Tcl_Get
8910: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
8920: 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  ata(chan);..    
8930: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67  dprintf("Calling
8940: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e   Tls_WaitForConn
8950: 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d  ect");.    ret =
8960: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e   Tls_WaitForConn
8970: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65  ect(statePtr, &e
8980: 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69  rr, 1);.    dpri
8990: 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72  ntf("Tls_WaitFor
89a0: 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64  Connect returned
89b0: 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20  : %i", ret);..  
89c0: 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26    if (ret < 0 &&
89d0: 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61   ((statePtr->fla
89e0: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59  gs & TLS_TCL_ASY
89f0: 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45  NC) && (err == E
8a00: 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69  AGAIN))) {..dpri
8a10: 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61  ntf("Async set a
8a20: 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22  nd err = EAGAIN"
8a30: 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20  );..ret = 0;.   
8a40: 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20   } else if (ret 
8a50: 3c 20 30 29 20 7b 0a 09 65 72 72 53 74 72 20 3d  < 0) {..errStr =
8a60: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a   statePtr->err;.
8a70: 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74  .Tcl_ResetResult
8a80: 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53  (interp);..Tcl_S
8a90: 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09  etErrno(err);...
8aa0: 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28  if (!errStr || (
8ab0: 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b  *errStr == 0)) {
8ac0: 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 54  ..    errStr = T
8ad0: 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e  cl_PosixError(in
8ae0: 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f  terp);..}...Tcl_
8af0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8b00: 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20  erp, "handshake 
8b10: 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74  failed: ", errSt
8b20: 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  r, (char *) NULL
8b30: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
8b40: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
8b50: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
8b60: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
8b70: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69   *) NULL);..dpri
8b80: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54  ntf("Returning T
8b90: 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61  CL_ERROR with ha
8ba0: 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20  ndshake failed: 
8bb0: 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72  %s", errStr);..r
8bc0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
8bd0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
8be0: 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a  if (err != 0) {.
8bf0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f  .    dprintf("Go
8c00: 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20  t an error with 
8c10: 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64  a completed hand
8c20: 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22  shake: err = %i"
8c30: 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20  , err);..}..ret 
8c40: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
8c50: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
8c60: 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64  ng TCL_OK with d
8c70: 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74  ata \"%i\"", ret
8c80: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
8c90: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
8ca0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65  Tcl_NewIntObj(re
8cb0: 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28  t));.    return(
8cc0: 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74  TCL_OK);..client
8cd0: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
8ce0: 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  a;.}../*. *-----
8cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8d30: 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d  *. * ImportObjCm
8d40: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
8d50: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
8d60: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
8d70: 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e  the "ssl" comman
8d80: 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20  d. *. *.The ssl 
8d90: 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53  command pushes S
8da0: 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79  SL over a (newly
8db0: 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20   connected) tcp 
8dc0: 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73  socket. *. * Res
8dd0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
8de0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
8df0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
8e00: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66  ts:. *.May modif
8e10: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  y the behavior o
8e20: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e  f an IO channel.
8e30: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
8e80: 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f  atic int.ImportO
8e90: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
8ea0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
8eb0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8ec0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
8ed0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
8ee0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
8ef0: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
8f00: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
8f10: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
8f20: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
8f30: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73  tr;../* client s
8f40: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63  tate for ssl soc
8f50: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ket */.    SSL_C
8f60: 54 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 20  TX *ctx.        
8f70: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
8f80: 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20  Obj *script.    
8f90: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
8fa0: 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72  Tcl_Obj *passwor
8fb0: 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  d.        = NULL
8fc0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76  ;.    Tcl_Obj *v
8fd0: 63 6d 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55  cmd.        = NU
8fe0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  LL;.    Tcl_DStr
8ff0: 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  ing upperChannel
9000: 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70  Translation, upp
9010: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
9020: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
9030: 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68  ncoding, upperCh
9040: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20  annelEOFChar;.  
9050: 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a    int idx, len;.
9060: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20      int flags.. 
9070: 20 20 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c         = TLS_TCL
9080: 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73  _INIT;.    int s
9090: 65 72 76 65 72 09 09 20 20 20 20 20 20 20 20 3d  erver..        =
90a0: 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63   0;./* is connec
90b0: 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72  tion incoming or
90c0: 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20   outgoing? */.  
90d0: 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09    char *keyfile.
90e0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
90f0: 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69      char *certfi
9100: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
9110: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  L;.    unsigned 
9120: 63 68 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55  char *key  .= NU
9130: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f  LL;.    int key_
9140: 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  len             
9150: 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73      = 0;.    uns
9160: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
9170: 20 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b           = NULL;
9180: 0a 20 20 20 20 69 6e 74 20 63 65 72 74 5f 6c 65  .    int cert_le
9190: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
91a0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
91b0: 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20  ciphers.        
91c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
91d0: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 09 20   *ciphersuites. 
91e0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
91f0: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09     char *CAfile.
9200: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9210: 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 09      char *CAdir.
9220: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9230: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72  .    char *DHpar
9240: 61 6d 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ams.        = NU
9250: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f  LL;.    char *mo
9260: 64 65 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e  del..        = N
9270: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  ULL;.    char *s
9280: 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20  ervername.      
9290: 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73    = NULL;./* hos
92a0: 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72  tname for Server
92b0: 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e   Name Indication
92c0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
92d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
92e0: 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a  sion_id = NULL;.
92f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70      Tcl_Obj *alp
9300: 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  n..= NULL;.    i
9310: 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c  nt ssl2 = 0, ssl
9320: 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  3 = 0;.    int t
9330: 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20  ls1 = 1, tls1_1 
9340: 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c  = 1, tls1_2 = 1,
9350: 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20   tls1_3 = 1;.   
9360: 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20   int proto = 0, 
9370: 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  level = -1;.    
9380: 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20  int verify = 0, 
9390: 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71  require = 0, req
93a0: 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68  uest = 1, post_h
93b0: 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20  andshake = 0;.. 
93c0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
93d0: 65 64 22 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53  ed");..#if OPENS
93e0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
93f0: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
9400: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
9410: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 20 26 26 20  SSL_NO_SSL2) && 
9420: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32  !defined(NO_SSL2
9430: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
9440: 53 53 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64  SSL3) && defined
9450: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66  (NO_TLS1) && def
9460: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
9470: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
9480: 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64  S1_2) && defined
9490: 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  (NO_TLS1_3).    
94a0: 73 73 6c 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66  ssl2 = 1;.#endif
94b0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4f 50  .#if !defined(OP
94c0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26  ENSSL_NO_SSL3) &
94d0: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  & !defined(NO_SS
94e0: 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  L3) && defined(N
94f0: 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e  O_SSL2) && defin
9500: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64  ed(NO_TLS1) && d
9510: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
9520: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
9530: 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e  TLS1_2) && defin
9540: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  ed(NO_TLS1_3).  
9550: 20 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64    ssl3 = 1;.#end
9560: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
9570: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
9580: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
9590: 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30  S1).    tls1 = 0
95a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
95b0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
95c0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
95d0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20  SL_NO_TLS1_1).  
95e0: 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65    tls1_1 = 0;.#e
95f0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
9600: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
9610: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
9620: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c  O_TLS1_2).    tl
9630: 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66  s1_2 = 0;.#endif
9640: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
9650: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e  TLS1_3) || defin
9660: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
9670: 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33  S1_3).    tls1_3
9680: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
9690: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20    if (objc < 2) 
96a0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
96b0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
96c0: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f  bjv, "channel ?o
96d0: 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75  ptions?");..retu
96e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
96f0: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
9700: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
9710: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
9720: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
9730: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
9740: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c  Obj(objv[1], NUL
9750: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
9760: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
9770: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
9780: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
9790: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
97a0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
97b0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
97c0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
97d0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
97e0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
97f0: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69  an);..    for (i
9800: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62  dx = 2; idx < ob
9810: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68  jc; idx++) {..ch
9820: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65  ar *opt = Tcl_Ge
9830: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
9840: 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b  bjv[idx], NULL);
9850: 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d  ...if (opt[0] !=
9860: 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b   '-')..    break
9870: 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70  ;...OPTOBJ("-alp
9880: 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53  n", alpn);..OPTS
9890: 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64  TR("-cadir", CAd
98a0: 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  ir);..OPTSTR("-c
98b0: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b  afile", CAfile);
98c0: 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74  ..OPTBYTE("-cert
98d0: 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65  ", cert, cert_le
98e0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65  n);..OPTSTR("-ce
98f0: 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c  rtfile", certfil
9900: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69  e);..OPTSTR("-ci
9910: 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b  pher", ciphers);
9920: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65  ..OPTSTR("-ciphe
9930: 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09  rs", ciphers);..
9940: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73  OPTSTR("-ciphers
9950: 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75  uites", ciphersu
9960: 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  ites);..OPTOBJ("
9970: 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70  -command", scrip
9980: 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68  t);..OPTSTR("-dh
9990: 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d  params", DHparam
99a0: 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b  s);..OPTBYTE("-k
99b0: 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65  ey", key, key_le
99c0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65  n);..OPTSTR("-ke
99d0: 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29  yfile", keyfile)
99e0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65  ;..OPTSTR("-mode
99f0: 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54  l", model);..OPT
9a00: 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c  OBJ("-password",
9a10: 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54   password);..OPT
9a20: 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64  BOOL("-post_hand
9a30: 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e  shake", post_han
9a40: 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f  dshake);..OPTBOO
9a50: 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65  L("-request", re
9a60: 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c  quest);..OPTBOOL
9a70: 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71  ("-require", req
9a80: 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22  uire);..OPTINT("
9a90: 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c  -securitylevel",
9aa0: 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f   level);..OPTBOO
9ab0: 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72  L("-server", ser
9ac0: 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ver);..OPTSTR("-
9ad0: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72  servername", ser
9ae0: 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54  vername);..OPTST
9af0: 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c  R("-session_id",
9b00: 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f   session_id);..O
9b10: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20  PTBOOL("-ssl2", 
9b20: 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  ssl2);..OPTBOOL(
9b30: 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a  "-ssl3", ssl3);.
9b40: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22  .OPTBOOL("-tls1"
9b50: 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f  , tls1);..OPTBOO
9b60: 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73  L("-tls1.1", tls
9b70: 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  1_1);..OPTBOOL("
9b80: 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32  -tls1.2", tls1_2
9b90: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
9ba0: 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a  s1.3", tls1_3);.
9bb0: 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61  .OPTOBJ("-valida
9bc0: 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64  tecommand", vcmd
9bd0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d  );..OPTOBJ("-vcm
9be0: 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54  d", vcmd);...OPT
9bf0: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d  BAD("option", "-
9c00: 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63  alpn, -cadir, -c
9c10: 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63  afile, -cert, -c
9c20: 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72  ertfile, -cipher
9c30: 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c  , -ciphersuites,
9c40: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61   -command, -dhpa
9c50: 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79  rams, -key, -key
9c60: 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70  file, -model, -p
9c70: 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68  assword, -post_h
9c80: 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65  andshake, -reque
9c90: 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73  st, -require, -s
9ca0: 65 63 75 72 69 74 79 6c 65 76 65 6c 2c 20 2d 73  ecuritylevel, -s
9cb0: 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61  erver, -serverna
9cc0: 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c  me, -session_id,
9cd0: 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d   -ssl2, -ssl3, -
9ce0: 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d  tls1, -tls1.1, -
9cf0: 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c  tls1.2, -tls1.3,
9d00: 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d   or -validatecom
9d10: 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  mand");...return
9d20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9d30: 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73  }.    if (reques
9d40: 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 53  t)..verify |= SS
9d50: 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f  L_VERIFY_CLIENT_
9d60: 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46  ONCE | SSL_VERIF
9d70: 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28  Y_PEER;.    if (
9d80: 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69  request && requi
9d90: 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53  re).verify |= SS
9da0: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
9db0: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20  _NO_PEER_CERT;. 
9dc0: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26     if (request &
9dd0: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  & post_handshake
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 50 4f 53 54 5f 48 41 4e 44  VERIFY_POST_HAND
9e00: 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76  SHAKE;.    if (v
9e10: 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 72  erify == 0)..ver
9e20: 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59  ify = SSL_VERIFY
9e30: 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74  _NONE;..    prot
9e40: 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53  o |= (ssl2 ? TLS
9e50: 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29  _PROTO_SSL2 : 0)
9e60: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
9e70: 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  ssl3 ? TLS_PROTO
9e80: 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20  _SSL3 : 0);.    
9e90: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f  proto |= (tls1 ?
9ea0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20   TLS_PROTO_TLS1 
9eb0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
9ec0: 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53  |= (tls1_1 ? TLS
9ed0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20  _PROTO_TLS1_1 : 
9ee0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
9ef0: 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50   (tls1_2 ? TLS_P
9f00: 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29  ROTO_TLS1_2 : 0)
9f10: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
9f20: 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f  tls1_3 ? TLS_PRO
9f30: 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a  TO_TLS1_3 : 0);.
9f40: 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f  .    /* reset to
9f50: 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73   NULL if blank s
9f60: 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a  tring provided *
9f70: 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26  /.    if (cert &
9f80: 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20  & !*cert)..     
9f90: 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20     cert.        
9fa0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
9fb0: 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20  key && !*key).. 
9fc0: 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20         key.     
9fd0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
9fe0: 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21  f (certfile && !
9ff0: 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20  *certfile)      
a000: 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55     certfile.= NU
a010: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66  LL;.    if (keyf
a020: 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65  ile && !*keyfile
a030: 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20  )..keyfile.     
a040: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a050: 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a  f (ciphers && !*
a060: 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20  ciphers).       
a070: 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20   ciphers.       
a080: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a090: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26  (ciphersuites &&
a0a0: 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29   !*ciphersuites)
a0b0: 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20   ciphersuites   
a0c0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a0d0: 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66  (CAfile && !*CAf
a0e0: 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66  ile).        CAf
a0f0: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
a100: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69  LL;.    if (CAdi
a110: 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 20  r && !*CAdir).  
a120: 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20 20        CAdir.    
a130: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a140: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20  if (DHparams && 
a150: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20  !*DHparams).    
a160: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20      DHparams    
a170: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20      = NULL;..   
a180: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74   /* new SSL stat
a190: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  e */.    statePt
a1a0: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63  r..= (State *) c
a1b0: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64  kalloc((unsigned
a1c0: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  ) sizeof(State))
a1d0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61  ;.    memset(sta
a1e0: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66  tePtr, 0, sizeof
a1f0: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73  (State));..    s
a200: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d  tatePtr->flags.=
a210: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74   flags;.    stat
a220: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69  ePtr->interp.= i
a230: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65  nterp;.    state
a240: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65  Ptr->vflags.= ve
a250: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50  rify;.    stateP
a260: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20  tr->err.= "";.. 
a270: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
a280: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20  cript */.    if 
a290: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69  (script) {..(voi
a2a0: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
a2b0: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20  FromObj(script, 
a2c0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
a2d0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
a2e0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72  ->callback = scr
a2f0: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  ipt;..    Tcl_In
a300: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
a310: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
a320: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
a330: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f   allocate passwo
a340: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61  rd */.    if (pa
a350: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64  ssword) {..(void
a360: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
a370: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c  romObj(password,
a380: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
a390: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
a3a0: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61  r->password = pa
a3b0: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c  ssword;..    Tcl
a3c0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
a3d0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
a3e0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
a3f0: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c   /* allocate val
a400: 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f  idate command */
a410: 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b  .    if (vcmd) {
a420: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
a430: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63  StringFromObj(vc
a440: 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  md, &len);..if (
a450: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
a460: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d  ePtr->vcmd = vcm
a470: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  d;..    Tcl_Incr
a480: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
a490: 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20  r->vcmd);..}.   
a4a0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65   }..    if (mode
a4b0: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e  l != NULL) {..in
a4c0: 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20  t mode;../* Get 
a4d0: 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74  the "model" cont
a4e0: 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54  ext */..chan = T
a4f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
a500: 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f  terp, model, &mo
a510: 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d  de);..if (chan =
a520: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
a530: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73  NULL) {..    Tls
a540: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
a550: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
a560: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a570: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b  ..}.../*.. * Mak
a580: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
a590: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
a5a0: 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63   channel.. */..c
a5b0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
a5c0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09  Channel(chan);..
a5d0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
a5e0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
a5f0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
a600: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
a610: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a620: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
a630: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
a640: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
a650: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20  ."\": not a TLS 
a660: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
a670: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
a680: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
a690: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
a6a0: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
a6b0: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
a6c0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
a6d0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
a6e0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a6f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a700: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65  }..ctx = ((State
a710: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
a720: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
a730: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d  an))->ctx;.    }
a740: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74   else {..if ((ct
a750: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61  x = CTX_Init(sta
a760: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70  tePtr, server, p
a770: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63  roto, keyfile, c
a780: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65  ertfile, key, ce
a790: 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20  rt, key_len,..  
a7a0: 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69    cert_len, CAdi
a7b0: 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65  r, CAfile, ciphe
a7c0: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  rs, ciphersuites
a7d0: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d  , level, DHparam
a7e0: 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  s)) == NULL) {..
a7f0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
a800: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
a810: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a820: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
a830: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
a840: 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20  ctx = ctx;..    
a850: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65  /*.     * We nee
a860: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
a870: 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  hat the channel 
a880: 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20  works in binary 
a890: 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20  (for the.     * 
a8a0: 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74  encryption not t
a8b0: 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29  o get goofed up)
a8c0: 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79  ..     * We only
a8d0: 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20   want to adjust 
a8e0: 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e  the buffering in
a8f0: 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73   pre-v2 channels
a900: 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65  , where.     * e
a910: 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74  ach channel in t
a920: 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69  he stack maintai
a930: 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66  ned its own buff
a940: 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ers..     */.   
a950: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
a960: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
a970: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
a980: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
a990: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
a9a0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
a9b0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
a9c0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
a9d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
a9e0: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
a9f0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
aa00: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
aa10: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
aa20: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22  chan, "-eofchar"
aa30: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
aa40: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
aa50: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
aa60: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
aa70: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70  "-encoding", &up
aa80: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
aa90: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ng);.    Tcl_Get
aaa0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
aab0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72  terp, chan, "-tr
aac0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70  anslation", &upp
aad0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
aae0: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47  tion);.    Tcl_G
aaf0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ab00: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
ab10: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65  blocking", &uppe
ab20: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
ab30: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
ab40: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ab50: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e  rp, chan, "-tran
ab60: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72  slation", "binar
ab70: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  y");.    Tcl_Set
ab80: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ab90: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c  terp, chan, "-bl
aba0: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29  ocking", "true")
abb0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ;.    dprintf("C
abc0: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61  onsuming Tcl cha
abd0: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65  nnel %s", Tcl_Ge
abe0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
abf0: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  n));.    statePt
ac00: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74  r->self = Tcl_St
ac10: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ackChannel(inter
ac20: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  p, Tls_ChannelTy
ac30: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74  pe(), (ClientDat
ac40: 61 29 20 73 74 61 74 65 50 74 72 2c 20 28 54 43  a) statePtr, (TC
ac50: 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c  L_READABLE | TCL
ac60: 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e  _WRITABLE), chan
ac70: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
ac80: 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20  Created channel 
ac90: 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47  named %s", Tcl_G
aca0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
acb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a  atePtr->self));.
acc0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
acd0: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
ace0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
acf0: 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f  ./*.. * No use o
ad00: 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79  f Tcl_Eventually
ad10: 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20  Free because no 
ad20: 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65  possible Tcl_Pre
ad30: 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73  serve... */..Tls
ad40: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
ad50: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72  tatePtr);..retur
ad60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
ad70: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43   }..    Tcl_SetC
ad80: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
ad90: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
ada0: 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  elf, "-translati
adb0: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  on", Tcl_DString
adc0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
add0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29  nelTranslation))
ade0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
adf0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
ae00: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
ae10: 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20  f, "-encoding", 
ae20: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
ae30: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
ae40: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63  coding));.    Tc
ae50: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
ae60: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
ae70: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66  Ptr->self, "-eof
ae80: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69  char", Tcl_DStri
ae90: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
aea0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a  annelEOFChar));.
aeb0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
aec0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
aed0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
aee0: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63   "-blocking", Tc
aef0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
af00: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
af10: 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a  king));..    /*.
af20: 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69       * SSL Initi
af30: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a  alization.     *
af40: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
af50: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74  ssl = SSL_new(st
af60: 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20  atePtr->ctx);.  
af70: 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72 2d    if (!statePtr-
af80: 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20  >ssl) {../* SSL 
af90: 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f  library error */
afa0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
afb0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c  lt(interp, "coul
afc0: 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73  dn't construct s
afd0: 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52  sl session: ", R
afe0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
aff0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
b000: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
b010: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
b020: 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20  MPORT", "INIT", 
b030: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b040: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46  *) NULL);..Tls_F
b050: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
b060: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
b070: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
b080: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73  ..    /* Set hos
b090: 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f  t server name */
b0a0: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e  .    if (servern
b0b0: 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20  ame) {../* Sets 
b0c0: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20  the server name 
b0d0: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29  indication (SNI)
b0e0: 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20   in ClientHello 
b0f0: 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a  extension */../*
b100: 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68   Per RFC 6066, h
b110: 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43  ostname is a ASC
b120: 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  II encoded strin
b130: 67 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  g. */..if (!SSL_
b140: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f  set_tlsext_host_
b150: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  name(statePtr->s
b160: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20  sl, servername) 
b170: 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20  && require) {.. 
b180: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
b190: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74  ult(interp, "set
b1a0: 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e 61  ting TLS host na
b1b0: 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69  me extension fai
b1c0: 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  led", (char *) N
b1d0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
b1e0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
b1f0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
b200: 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 49  RT", "SNI", "FAI
b210: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
b220: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
b230: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
b240: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
b250: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b260: 7d 0a 0a 09 2f 2a 20 43 6f 6e 66 69 67 75 72 65  }.../* Configure
b270: 20 73 65 72 76 65 72 20 68 6f 73 74 20 6e 61 6d   server host nam
b280: 65 20 63 68 65 63 6b 73 20 69 6e 20 74 68 65 20  e checks in the 
b290: 53 53 4c 20 63 6c 69 65 6e 74 2e 20 53 65 74 20  SSL client. Set 
b2a0: 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 74 6f 0a  DNS hostname to.
b2b0: 09 20 20 20 6e 61 6d 65 20 66 6f 72 20 70 65 65  .   name for pee
b2c0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 63 68  r certificate ch
b2d0: 65 63 6b 73 2e 20 53 53 4c 5f 73 65 74 31 5f 68  ecks. SSL_set1_h
b2e0: 6f 73 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69  ost has limitati
b2f0: 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53  ons. */..if (!SS
b300: 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74  L_add1_host(stat
b310: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65  ePtr->ssl, serve
b320: 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54  rname)) {..    T
b330: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b340: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67  interp, "setting
b350: 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66   DNS host name f
b360: 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29  ailed", (char *)
b370: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
b380: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b390: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
b3a0: 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45  PORT", "HOSTNAME
b3b0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b3c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b3d0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b3e0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b3f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b400: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
b410: 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65      /* Resume se
b420: 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20  ssion id */.    
b430: 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26  if (session_id &
b440: 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e  & strlen(session
b450: 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f  _id) <= SSL_MAX_
b460: 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20  SID_CTX_LENGTH) 
b470: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65  {../* SSL_set_se
b480: 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28  ssion() */..if (
b490: 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74  !SSL_SESSION_set
b4a0: 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c  1_id_context(SSL
b4b0: 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61  _get_session(sta
b4c0: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73  tePtr->ssl), ses
b4d0: 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e  sion_id, (unsign
b4e0: 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73  ed int) strlen(s
b4f0: 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09  ession_id))) {..
b500: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b510: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65  sult(interp, "Re
b520: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20  sume session id 
b530: 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22  ", session_id, "
b540: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20   failed", (char 
b550: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b560: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b570: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b580: 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f  IMPORT", "SESSIO
b590: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  N", "FAILED", (c
b5a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  har *) NULL);.  
b5b0: 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72            Tls_Fr
b5c0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
b5d0: 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ePtr);.         
b5e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b5f0: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ROR;..}.    }.. 
b600: 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09     if (alpn) {..
b610: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c  /* Convert a TCL
b620: 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f   list into a pro
b630: 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69  tocol-list in wi
b640: 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e  re-format */..un
b650: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f  signed char *pro
b660: 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e  tos, *p;..unsign
b670: 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65  ed int protos_le
b680: 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c  n = 0;..int i, l
b690: 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62  en, cnt;..Tcl_Ob
b6a0: 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28  j **list;...if (
b6b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
b6c0: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61  ements(interp, a
b6d0: 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74  lpn, &cnt, &list
b6e0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
b6f0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
b700: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
b710: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b720: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
b730: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65  Determine the me
b740: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f  mory required fo
b750: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  r the protocol-l
b760: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d  ist */..for (i =
b770: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b   0; i < cnt; i++
b780: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74  ) {..    Tcl_Get
b790: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69  StringFromObj(li
b7a0: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20  st[i], &len);.. 
b7b0: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35     if (len > 255
b7c0: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
b7d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b7e0: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61  ALPN protocol na
b7f0: 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63  me too long", (c
b800: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
b810: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
b820: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
b830: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22  "IMPORT", "ALPN"
b840: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
b850: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c  r *) NULL);...Tl
b860: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
b870: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74  statePtr);...ret
b880: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b890: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f      }..    proto
b8a0: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e  s_len += 1 + len
b8b0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20  ;..}.../* Build 
b8c0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f  the complete pro
b8d0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70  tocol-list */..p
b8e0: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28  rotos = ckalloc(
b8f0: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a  protos_len);../*
b900: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20   protocol-lists 
b910: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74  consist of 8-bit
b920: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64   length-prefixed
b930: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a  , byte strings *
b940: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 70  /..for (i = 0, p
b950: 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63   = protos; i < c
b960: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; i++) {..    
b970: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f  char *str = Tcl_
b980: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
b990: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b  (list[i], &len);
b9a0: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e  ..    *p++ = len
b9b0: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ;..    memcpy(p,
b9c0: 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20   str, len);..   
b9d0: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09   p += len;..}...
b9e0: 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f  /* SSL_set_alpn_
b9f0: 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63  protos makes a c
ba00: 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f  opy of the proto
ba10: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20  col-list */../* 
ba20: 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74  Note: This funct
ba30: 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68  ions reverses th
ba40: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63  e return value c
ba50: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66  onvention */..if
ba60: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70   (SSL_set_alpn_p
ba70: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e  rotos(statePtr->
ba80: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f  ssl, protos, pro
ba90: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20  tos_len)) {..   
baa0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
bab0: 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65  t(interp, "faile
bac0: 64 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 72  d to set ALPN pr
bad0: 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20  otocols", (char 
bae0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
baf0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
bb00: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
bb10: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c  IMPORT", "ALPN",
bb20: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
bb30: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
bb40: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
bb50: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
bb60: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29    ckfree(protos)
bb70: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
bb80: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
bb90: 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73   Store protocols
bba0: 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50   list */..stateP
bbb0: 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f  tr->protos = pro
bbc0: 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  tos;..statePtr->
bbd0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f  protos_len = pro
bbe0: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65  tos_len;.    } e
bbf0: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d  lse {..statePtr-
bc00: 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a  >protos = NULL;.
bc10: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
bc20: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  s_len = 0;.    }
bc30: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
bc40: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20  SSL Callbacks.  
bc50: 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65     */.    SSL_se
bc60: 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65  t_app_data(state
bc70: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20  Ptr->ssl, (void 
bc80: 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20  *)statePtr);./* 
bc90: 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73  point back to us
bca0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f   */.    SSL_set_
bcb0: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d  verify(statePtr-
bcc0: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65  >ssl, verify, Ve
bcd0: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  rifyCallback);. 
bce0: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f     SSL_set_info_
bcf0: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
bd00: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c  r->ssl, InfoCall
bd10: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  back);..    /* C
bd20: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65  allback for obse
bd30: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d  rving protocol m
bd40: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64  essages */.#ifnd
bd50: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ef OPENSSL_NO_SS
bd60: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76  L_TRACE.    /* v
bd70: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  oid SSL_CTX_set_
bd80: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67  msg_callback_arg
bd90: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
bda0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
bdb0: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f  );.    void SSL_
bdc0: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  CTX_set_msg_call
bdd0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
bde0: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  tx, MessageCallb
bdf0: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c  ack); */.    SSL
be00: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
be10: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  k_arg(statePtr->
be20: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ssl, (void *)sta
be30: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f  tePtr);.    SSL_
be40: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
be50: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
be60: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29  MessageCallback)
be70: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
be80: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e   Create Tcl_Chan
be90: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20  nel BIO Handler 
bea0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
beb0: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  >p_bio.= BIO_new
bec0: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42  _tcl(statePtr, B
bed0: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20  IO_NOCLOSE);.   
bee0: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d   statePtr->bio.=
bef0: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73   BIO_new(BIO_f_s
bf00: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28  sl());..    if (
bf10: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65  server) {../* Se
bf20: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a  rver callbacks *
bf30: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74  /..SSL_CTX_set_t
bf40: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65  lsext_servername
bf50: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63  _arg(statePtr->c
bf60: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
bf70: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  ePtr);..SSL_CTX_
bf80: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65  set_tlsext_serve
bf90: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73  rname_callback(s
bfa0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e  tatePtr->ctx, SN
bfb0: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c  ICallback);..SSL
bfc0: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
bfd0: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74  hello_cb(statePt
bfe0: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c  r->ctx, HelloCal
bff0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
c000: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73  tatePtr);..if (s
c010: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
c020: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
c030: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e  SSL_CTX_set_alpn
c040: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65  _select_cb(state
c050: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61  Ptr->ctx, ALPNCa
c060: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
c070: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65  statePtr);.#ifde
c080: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69  f USE_NPN..    i
c090: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26  f (tls1_2 == 0 &
c0a0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b  & tls1_3 == 0) {
c0b0: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e  ...SSL_CTX_set_n
c0c0: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72  ext_protos_adver
c0d0: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74  tised_cb(statePt
c0e0: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62  r->ctx, NPNCallb
c0f0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
c100: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23  tePtr);..    }.#
c110: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e  endif..}.../* En
c120: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73  able server to s
c130: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74  end cert request
c140: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65   after handshake
c150: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20   (TLS 1.3 only) 
c160: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f  */../* A write o
c170: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61  peration must ta
c180: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65  ke place for the
c190: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71   Certificate Req
c1a0: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73  uest to be..   s
c1b0: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  ent to the clien
c1c0: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64  t, this can be d
c1d0: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f  one with SSL_do_
c1e0: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a  handshake(). */.
c1f0: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20  .if (request && 
c200: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20  post_handshake) 
c210: 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66  {..    SSL_verif
c220: 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61  y_client_post_ha
c230: 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72  ndshake(statePtr
c240: 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ->ssl);..}.../* 
c250: 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20  Set server mode 
c260: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c  */..statePtr->fl
c270: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53  ags |= TLS_TCL_S
c280: 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f  ERVER;..SSL_set_
c290: 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 61  accept_state(sta
c2a0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
c2b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c   } else {../* Cl
c2c0: 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a  ient callbacks *
c2d0: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
c2e0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
c2f0: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26  protos != NULL &
c300: 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26  & tls1_2 == 0 &&
c310: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a   tls1_3 == 0) {.
c320: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
c330: 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65  _next_proto_sele
c340: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ct_cb(statePtr->
c350: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63  ctx, ALPNCallbac
c360: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
c370: 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  Ptr);..}.#endif.
c380: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63  ../* Session cac
c390: 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  hing */..SSL_CTX
c3a0: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63  _set_session_cac
c3b0: 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  he_mode(statePtr
c3c0: 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f  ->ctx, SSL_SESS_
c3d0: 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53  CACHE_CLIENT | S
c3e0: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f  SL_SESS_CACHE_NO
c3f0: 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29  _INTERNAL_STORE)
c400: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f  ;..SSL_CTX_sess_
c410: 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65  set_new_cb(state
c420: 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f  Ptr->ctx, Sessio
c430: 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a  nCallback);.../*
c440: 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e   Enable post han
c450: 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63  dshake Authentic
c460: 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e  ation extension.
c470: 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e   TLS 1.3 only, n
c480: 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69  ot http/2. */..i
c490: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
c4a0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a  st_handshake) {.
c4b0: 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73  .    SSL_set_pos
c4c0: 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68  t_handshake_auth
c4d0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c4e0: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20  1);..}.../* Set 
c4f0: 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09  client mode */..
c500: 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f  SSL_set_connect_
c510: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  state(statePtr->
c520: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ssl);.    }.    
c530: 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74  SSL_set_bio(stat
c540: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65  ePtr->ssl, state
c550: 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74  Ptr->p_bio, stat
c560: 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20  ePtr->p_bio);.  
c570: 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74    BIO_set_ssl(st
c580: 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61  atePtr->bio, sta
c590: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f  tePtr->ssl, BIO_
c5a0: 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f  NOCLOSE);..    /
c5b0: 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20  *.     * End of 
c5c0: 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f  SSL Init.     */
c5d0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65  .    dprintf("Re
c5e0: 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c  turning %s", Tcl
c5f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
c600: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29  statePtr->self))
c610: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ;.    Tcl_SetRes
c620: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
c630: 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e  r *) Tcl_GetChan
c640: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
c650: 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c  ->self), TCL_VOL
c660: 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74  ATILE);..    ret
c670: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
c680: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
c690: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Data;.}.../*. *-
c6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6e0: 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72  --. *. * Unimpor
c6f0: 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  tObjCmd --. *. *
c700: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
c710: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65  is invoked to re
c720: 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74  move the topmost
c730: 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e   channel filter.
c740: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
c750: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
c760: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
c770: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
c780: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20  .May modify the 
c790: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49  behavior of an I
c7a0: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  O channel.. *. *
c7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7f0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
c800: 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d  nt.UnimportObjCm
c810: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
c820: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
c830: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
c840: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
c850: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
c860: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
c870: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68  chan;../* The ch
c880: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
c890: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20  ode on. */..    
c8a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
c8b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
c8c0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
c8d0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
c8e0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
c8f0: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20  nnel");..return 
c900: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
c910: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
c920: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
c930: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
c940: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c  g(objv[1]), NULL
c950: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
c960: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
c970: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
c980: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
c990: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
c9a0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
c9b0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
c9c0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
c9d0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
c9e0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20  annel(chan);..  
c9f0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
ca00: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
ca10: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
ca20: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
ca30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ca40: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
ca50: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
ca60: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
ca70: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
ca80: 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09  annel", NULL);..
ca90: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
caa0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
cab0: 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20  S", "UNIMPORT", 
cac0: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
cad0: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
cae0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
caf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
cb00: 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74      if (Tcl_Unst
cb10: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ackChannel(inter
cb20: 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f  p, chan) == TCL_
cb30: 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e  ERROR) {..return
cb40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
cb50: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  }..    return TC
cb60: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
cb70: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
cb80: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
cb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
cbd0: 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63   * CTX_Init -- c
cbe0: 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43  onstruct a SSL_C
cbf0: 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20  TX instance. *. 
cc00: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
cc10: 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e  valid SSL_CTX in
cc20: 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a  stance or NULL..
cc30: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
cc40: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74  ts:. *.construct
cc50: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43  s SSL context (C
cc60: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  TX). *. *-------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
ccb0: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20  .static SSL_CTX 
ccc0: 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65  *.CTX_Init(State
ccd0: 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20   *statePtr, int 
cce0: 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72  isServer, int pr
ccf0: 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69  oto, char *keyfi
cd00: 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69  le, char *certfi
cd10: 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  le,.    unsigned
cd20: 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69   char *key, unsi
cd30: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c  gned char *cert,
cd40: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e   int key_len, in
cd50: 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72  t cert_len, char
cd60: 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61   *CAdir,.    cha
cd70: 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20  r *CAfile, char 
cd80: 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a  *ciphers, char *
cd90: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e  ciphersuites, in
cda0: 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44  t level, char *D
cdb0: 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54  Hparams) {.    T
cdc0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
cdd0: 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p = statePtr->in
cde0: 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54  terp;.    SSL_CT
cdf0: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  X *ctx = NULL;. 
ce00: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
ce10: 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  s;.    Tcl_DStri
ce20: 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20  ng ds1;.    int 
ce30: 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  off = 0;.    int
ce40: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65   load_private_ke
ce50: 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  y;.    const SSL
ce60: 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b  _METHOD *method;
ce70: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
ce80: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
ce90: 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c   (!proto) {..Tcl
cea0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ceb0: 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20  terp, "no valid 
cec0: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65  protocol selecte
ced0: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  d", NULL);..retu
cee0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
cef0: 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53      /* create SS
cf00: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66  L context */.#if
cf10: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
cf20: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31  _NUMBER >= 0x101
cf30: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65  00000L || define
cf40: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65  d(NO_SSL2) || de
cf50: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
cf60: 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45  _SSL2).    if (E
cf70: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
cf80: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b  S_PROTO_SSL2)) {
cf90: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
cfa0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32  lt(interp, "SSL2
cfb0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
cfc0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
cfd0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
cfe0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
cff0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
d000: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
d010: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20  SSL_NO_SSL3).   
d020: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
d030: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
d040: 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  L3)) {..Tcl_Appe
d050: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d060: 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20   "SSL3 protocol 
d070: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
d080: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d090: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
d0a0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
d0b0: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
d0c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d0d0: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  1).    if (ENABL
d0e0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
d0f0: 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63  OTO_TLS1)) {..Tc
d100: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d110: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20  nterp, "TLS 1.0 
d120: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
d130: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
d140: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d150: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
d160: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
d170: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
d180: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
d190: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
d1a0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
d1b0: 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c  _TLS1_1)) {..Tcl
d1c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d1d0: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70  terp, "TLS 1.1 p
d1e0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d1f0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
d200: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d210: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
d220: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
d230: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
d240: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20  SSL_NO_TLS1_2). 
d250: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
d260: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
d270: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f  TLS1_2)) {..Tcl_
d280: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d290: 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72  erp, "TLS 1.2 pr
d2a0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d2b0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
d2c0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
d2d0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
d2e0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
d2f0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
d300: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
d310: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
d320: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
d330: 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41  LS1_3)) {..Tcl_A
d340: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d350: 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f  rp, "TLS 1.3 pro
d360: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
d370: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ted", NULL);..re
d380: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d390: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 69  .#endif..    swi
d3a0: 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69  tch (proto) {.#i
d3b0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
d3c0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
d3d0: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
d3e0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
d3f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d400: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73  NO_SSL2).    cas
d410: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  e TLS_PROTO_SSL2
d420: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
d430: 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72  rver ? SSLv2_ser
d440: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53  ver_method() : S
d450: 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  SLv2_client_meth
d460: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
d470: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
d480: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  d(NO_SSL3) && !d
d490: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d4a0: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
d4b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
d4c0: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  SL3_METHOD).    
d4d0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  case TLS_PROTO_S
d4e0: 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  SL3:..method = i
d4f0: 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f  sServer ? SSLv3_
d500: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
d510: 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d  : SSLv3_client_m
d520: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
d530: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
d540: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26  ined(NO_TLS1) &&
d550: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d560: 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  L_NO_TLS1) && !d
d570: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d580: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20  O_TLS1_METHOD). 
d590: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
d5a0: 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20  O_TLS1:..method 
d5b0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
d5c0: 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  v1_server_method
d5d0: 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e  () : TLSv1_clien
d5e0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
d5f0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
d600: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
d610: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
d620: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
d630: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d640: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f  ENSSL_NO_TLS1_1_
d650: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65  METHOD).    case
d660: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d670: 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  1:..method = isS
d680: 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f  erver ? TLSv1_1_
d690: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
d6a0: 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74  : TLSv1_1_client
d6b0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
d6c0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
d6d0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
d6e0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d6f0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
d700: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d710: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d  NSSL_NO_TLS1_2_M
d720: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
d730: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
d740: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
d750: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73  rver ? TLSv1_2_s
d760: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
d770: 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f   TLSv1_2_client_
d780: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
d790: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
d7a0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
d7b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d7c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
d7d0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
d7e0: 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55  TO_TLS1_3:../* U
d7f0: 73 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d  se the generic m
d800: 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72  ethod and constr
d810: 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72  aint range after
d820: 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61   context is crea
d830: 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d  ted */..method =
d840: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f   isServer ? TLS_
d850: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
d860: 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74  : TLS_client_met
d870: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
d880: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
d890: 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65  t:../* Negotiate
d8a0: 20 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62   highest availab
d8b0: 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69  le SSL/TLS versi
d8c0: 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20  on */..method = 
d8d0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73  isServer ? TLS_s
d8e0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
d8f0: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68   TLS_client_meth
d900: 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  od();.#if OPENSS
d910: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
d920: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26   < 0x10100000L &
d930: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  & !defined(NO_SS
d940: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L2) && !defined(
d950: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
d960: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
d970: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d980: 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a  TO_SSL2)   ? 0 :
d990: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32   SSL_OP_NO_SSLv2
d9a0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
d9b0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
d9c0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d9d0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66  SSL_NO_SSL3)..of
d9e0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
d9f0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
da00: 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c  SL3)   ? 0 : SSL
da10: 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23  _OP_NO_SSLv3);.#
da20: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
da30: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  ed(NO_TLS1) && !
da40: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
da50: 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d  NO_TLS1)..off |=
da60: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
da70: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29   TLS_PROTO_TLS1)
da80: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f     ? 0 : SSL_OP_
da90: 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69  NO_TLSv1);.#endi
daa0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
dab0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
dac0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
dad0: 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d  _TLS1_1)..off |=
dae0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
daf0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
db00: 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f  1) ? 0 : SSL_OP_
db10: 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e  NO_TLSv1_1);.#en
db20: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
db30: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
db40: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
db50: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20  NO_TLS1_2)..off 
db60: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
db70: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
db80: 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1_2) ? 0 : SSL_O
db90: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23  P_NO_TLSv1_2);.#
dba0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
dbb0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
dbc0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
dbd0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66  L_NO_TLS1_3)..of
dbe0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
dbf0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
dc00: 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_3) ? 0 : SSL
dc10: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b  _OP_NO_TLSv1_3);
dc20: 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a  .#endif..break;.
dc30: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63      }..    ERR_c
dc40: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20  lear_error();.. 
dc50: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
dc60: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20  _new(method);.  
dc70: 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72    if (!ctx) {..r
dc80: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20  eturn(NULL);.   
dc90: 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65   }..    if (gete
dca0: 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45  nv(SSLKEYLOGFILE
dcb0: 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  )) {..SSL_CTX_se
dcc0: 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63  t_keylog_callbac
dcd0: 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c  k(ctx, KeyLogCal
dce0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23  lback);.    }..#
dcf0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
dd00: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
dd10: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
dd20: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72  S1_3).    if (pr
dd30: 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f  oto == TLS_PROTO
dd40: 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f  _TLS1_3) {..SSL_
dd50: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
dd60: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
dd70: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
dd80: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78  .SSL_CTX_set_max
dd90: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
dda0: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49  tx, TLS1_3_VERSI
ddb0: 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ON);.    }.#endi
ddc0: 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20  f..    /* Force 
ddd0: 63 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e  cipher selection
dde0: 20 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72   order by server
ddf0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53   */.    if (!isS
de00: 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54  erver) {..SSL_CT
de10: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
de20: 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52  x, SSL_OP_CIPHER
de30: 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e  _SERVER_PREFEREN
de40: 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  CE);.    }..    
de50: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f  SSL_CTX_set_app_
de60: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a  data(ctx, (void*
de70: 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d  )interp);./* rem
de80: 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70  ember the interp
de90: 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c  reter */.    SSL
dea0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
deb0: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c  (ctx, SSL_OP_ALL
dec0: 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75  );./* all SSL bu
ded0: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f  g workarounds */
dee0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
def0: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66  _options(ctx, of
df00: 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20  f);../* disable 
df10: 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e  protocol version
df20: 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  s */.#if OPENSSL
df30: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
df40: 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20  < 0x10101000L.  
df50: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f    SSL_CTX_set_mo
df60: 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45  de(ctx, SSL_MODE
df70: 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a  _AUTO_RETRY);./*
df80: 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64   handle new hand
df90: 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72  shakes in backgr
dfa0: 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66 61  ound. On by defa
dfb0: 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31  ult in OpenSSL 1
dfc0: 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  .1.1. */.#endif.
dfd0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73      SSL_CTX_sess
dfe0: 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28  _set_cache_size(
dff0: 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20  ctx, 128);..    
e000: 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 69  /* Set user defi
e010: 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 70  ned ciphers, cip
e020: 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20  her suites, and 
e030: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a  security level *
e040: 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65  /.    if ((ciphe
e050: 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21  rs != NULL) && !
e060: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68  SSL_CTX_set_ciph
e070: 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70  er_list(ctx, cip
e080: 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70  hers)) {..Tcl_Ap
e090: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e0a0: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 20  p, "Set ciphers 
e0b0: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64  failed: No valid
e0c0: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72   ciphers", (char
e0d0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
e0e0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e0f0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
e100: 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68   }.    if ((ciph
e110: 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c  ersuites != NULL
e120: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
e130: 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63  t_ciphersuites(c
e140: 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  tx, ciphersuites
e150: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
e160: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e170: 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65  Set cipher suite
e180: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c  s failed: No val
e190: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68  id ciphers", (ch
e1a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
e1b0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e1c0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
e1d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
e1e0: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
e1f0: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c  */.    if (level
e200: 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c   > -1 && level <
e210: 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65   6) {../* SSL_se
e220: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
e230: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
e240: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28  _security_level(
e250: 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20  ctx, level);.   
e260: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73   }..    /* set s
e270: 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f  ome callbacks */
e280: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e290: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f  _default_passwd_
e2a0: 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64  cb(ctx, Password
e2b0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53  Callback);.    S
e2c0: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
e2d0: 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65  lt_passwd_cb_use
e2e0: 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64  rdata(ctx, (void
e2f0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20   *)statePtr);.. 
e300: 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66     /* read a Dif
e310: 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61  fie-Hellman para
e320: 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20  meters file, or 
e330: 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  use the built-in
e340: 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f   one */.#ifdef O
e350: 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20  PENSSL_NO_DH.   
e360: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d   if (DHparams !=
e370: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
e380: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e390: 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72  p, "DH parameter
e3a0: 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61   support not ava
e3b0: 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a  ilable", (char *
e3c0: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
e3d0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
e3e0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
e3f0: 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48  .#else.    {..DH
e400: 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72  * dh;..if (DHpar
e410: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ams != NULL) {..
e420: 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20      BIO *bio;.. 
e430: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
e440: 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69  it(&ds);..    bi
e450: 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65  o = BIO_new_file
e460: 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26  (F2N(DHparams, &
e470: 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20  ds), "r");..    
e480: 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63  if (!bio) {...Tc
e490: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e4a0: 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  s);...Tcl_Append
e4b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e4c0: 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44  Could not find D
e4d0: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c  H parameters fil
e4e0: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
e4f0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
e500: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
e510: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a  n NULL;..    }..
e520: 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65  .    dh = PEM_re
e530: 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28  ad_bio_DHparams(
e540: 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  bio, NULL, NULL,
e550: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f   NULL);..    BIO
e560: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20  _free(bio);..   
e570: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
e580: 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28  (&ds);..    if (
e590: 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70  !dh) {...Tcl_App
e5a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e5b0: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61  , "Could not rea
e5c0: 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20  d DH parameters 
e5d0: 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61  from file", (cha
e5e0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
e5f0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e600: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
e610: 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b  .    }..} else {
e620: 0a 09 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64  ..    dh = get_d
e630: 68 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53  hParams();..}..S
e640: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64  SL_CTX_set_tmp_d
e650: 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f  h(ctx, dh);..DH_
e660: 66 72 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a  free(dh);.    }.
e670: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73  #endif..    /* s
e680: 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61  et our certifica
e690: 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70  te */.    load_p
e6a0: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a  rivate_key = 0;.
e6b0: 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65      if (certfile
e6c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61   != NULL) {..loa
e6d0: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20  d_private_key = 
e6e0: 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  1;...Tcl_DString
e6f0: 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20  Init(&ds);...if 
e700: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
e710: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74  tificate_file(ct
e720: 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c  x, F2N(certfile,
e730: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54   &ds), SSL_FILET
e740: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
e750: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
e760: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
e770: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e780: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
e790: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69  e to set certifi
e7a0: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72  cate file ", cer
e7b0: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09  tfile, ": ",....
e7c0: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28       REASON(), (
e7d0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
e7e0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
e7f0: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
e800: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20  rn NULL;..}.    
e810: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20  } else if (cert 
e820: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64  != NULL) {..load
e830: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31  _private_key = 1
e840: 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ;..if (SSL_CTX_u
e850: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41  se_certificate_A
e860: 53 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65  SN1(ctx, cert_le
e870: 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b  n, cert) <= 0) {
e880: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
e890: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
e8a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e8b0: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
e8c0: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69  e to set certifi
e8d0: 63 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20  cate: ",....    
e8e0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
e8f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
e900: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
e910: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
e920: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
e930: 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d  se {..certfile =
e940: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74   (char*)X509_get
e950: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69  _default_cert_fi
e960: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f  le();...if (SSL_
e970: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
e980: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65  ate_file(ctx, ce
e990: 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45  rtfile, SSL_FILE
e9a0: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
e9b0: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c  {.#if 0..    Tcl
e9c0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
e9d0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  );..    Tcl_Appe
e9e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e9f0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20   "unable to use 
ea00: 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63  default certific
ea10: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74  ate file ", cert
ea20: 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20  file, ": ",.... 
ea30: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63      REASON(), (c
ea40: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
ea50: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
ea60: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
ea70: 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09  n NULL;.#endif..
ea80: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ea90: 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20  set our private 
eaa0: 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c  key */.    if (l
eab0: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29  oad_private_key)
eac0: 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20   {..if (keyfile 
ead0: 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d  == NULL && key =
eae0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b  = NULL) {..    k
eaf0: 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c  eyfile = certfil
eb00: 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66  e;..}...if (keyf
eb10: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
eb20: 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70      /* get the p
eb30: 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63  rivate key assoc
eb40: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
eb50: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
eb60: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20      if (keyfile 
eb70: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79  == NULL) {...key
eb80: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b  file = certfile;
eb90: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
eba0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72   (SSL_CTX_use_Pr
ebb0: 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74  ivateKey_file(ct
ebc0: 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20  x, F2N(keyfile, 
ebd0: 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59  &ds), SSL_FILETY
ebe0: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a  PE_PEM) <= 0) {.
ebf0: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
ec00: 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75  e(&ds);.../* flu
ec10: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73  sh the passphras
ec20: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65  e which might be
ec30: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73   left in the res
ec40: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74  ult */...Tcl_Set
ec50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e  Result(interp, N
ec60: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ULL, TCL_STATIC)
ec70: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
ec80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
ec90: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c  able to set publ
eca0: 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b  ic key file ", k
ecb0: 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09  eyfile, " ",....
ecc0: 20 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28           REASON(
ecd0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
ece0: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
ecf0: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
ed00: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20   NULL;..    }.. 
ed10: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
ed20: 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73  ee(&ds);...} els
ed30: 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c  e if (key != NUL
ed40: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53  L) {..    if (SS
ed50: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74  L_CTX_use_Privat
ed60: 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b  eKey_ASN1(EVP_PK
ed70: 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79  EY_RSA, ctx, key
ed80: 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20  ,key_len) <= 0) 
ed90: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  {...Tcl_DStringF
eda0: 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66  ree(&ds);.../* f
edb0: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72  lush the passphr
edc0: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20  ase which might 
edd0: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72  be left in the r
ede0: 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53  esult */...Tcl_S
edf0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
ee00: 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49   NULL, TCL_STATI
ee10: 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  C);...Tcl_Append
ee20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ee30: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75  unable to set pu
ee40: 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41  blic key: ", REA
ee50: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
ee60: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
ee70: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
ee80: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
ee90: 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20  }..}../* Now we 
eea0: 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20  know that a key 
eeb0: 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65  and cert have be
eec0: 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09  en set against..
eed0: 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65   * the SSL conte
eee0: 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  xt */..if (!SSL_
eef0: 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74  CTX_check_privat
ef00: 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20  e_key(ctx)) {.. 
ef10: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ef20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69  ult(interp, "pri
ef30: 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f  vate key does no
ef40: 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74  t match the cert
ef50: 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b  ificate public k
ef60: 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68  ey",....     (ch
ef70: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
ef80: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
ef90: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
efa0: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a   NULL;..}.    }.
efb0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69  .    /* Set veri
efc0: 66 69 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a  fication CAs */.
efd0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
efe0: 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63  nit(&ds);.    Tc
eff0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
f000: 73 31 29 3b 0a 20 20 20 20 69 66 20 28 21 53 53  s1);.    if (!SS
f010: 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66  L_CTX_load_verif
f020: 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c  y_locations(ctx,
f030: 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73   F2N(CAfile, &ds
f040: 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 26 64  ), F2N(CAdir, &d
f050: 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54  s1)) ||..!SSL_CT
f060: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65  X_set_default_ve
f070: 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29  rify_paths(ctx))
f080: 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 53   {.#if 0..Tcl_DS
f090: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
f0a0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
f0b0: 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27  (&ds1);../* Don'
f0c0: 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 65  t currently care
f0d0: 20 69 66 20 74 68 69 73 20 66 61 69 6c 73 20 2a   if this fails *
f0e0: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  /..Tcl_AppendRes
f0f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c  ult(interp, "SSL
f100: 20 64 65 66 61 75 6c 74 20 76 65 72 69 66 79 20   default verify 
f110: 70 61 74 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e  paths: ", REASON
f120: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
f130: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
f140: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
f150: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  NULL;.#endif.   
f160: 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73   }..    /* https
f170: 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  ://sourceforge.n
f180: 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37  et/p/tls/bugs/57
f190: 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a  / */.    /* XXX:
f1a0: 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73  TODO: Let the us
f1b0: 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73  er supply values
f1c0: 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66   here instead of
f1d0: 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
f1e0: 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69  exists on the fi
f1f0: 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20  lesystem */.    
f200: 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55  if (CAfile != NU
f210: 4c 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28  LL) {..STACK_OF(
f220: 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74  X509_NAME) *cert
f230: 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64  Names = SSL_load
f240: 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28  _client_CA_file(
f250: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
f260: 29 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65  );..if (certName
f270: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  s != NULL) {..  
f280: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c    SSL_CTX_set_cl
f290: 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78  ient_CA_list(ctx
f2a0: 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d  , certNames);..}
f2b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
f2c0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
f2d0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
f2e0: 67 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20  gFree(&ds1);.   
f2f0: 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c   return ctx;.}..
f300: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
f310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
f350: 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20  StatusObjCmd -- 
f360: 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61  return certifica
f370: 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64  te for connected
f380: 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73   peer.. *. * Res
f390: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
f3a0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
f3b0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
f3c0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
f3d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
f3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f410: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
f420: 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d   int.StatusObjCm
f430: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
f440: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
f450: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
f460: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
f470: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
f480: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
f490: 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70  Ptr;.    X509 *p
f4a0: 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  eer;.    Tcl_Obj
f4b0: 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63   *objPtr;.    Tc
f4c0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a  l_Channel chan;.
f4d0: 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65      char *channe
f4e0: 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b  lName, *ciphers;
f4f0: 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20  .    int mode;. 
f500: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
f510: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20  d char *proto;. 
f520: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
f530: 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64  len;.    int nid
f540: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
f550: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73  Called");..    s
f560: 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09  witch (objc) {..
f570: 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63 68 61  case 2:..    cha
f580: 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47  nnelName = Tcl_G
f590: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f5a0: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a  objv[1], NULL);.
f5b0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61  .    break;...ca
f5c0: 73 65 20 33 3a 0a 09 20 20 20 20 69 66 20 28 21  se 3:..    if (!
f5d0: 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 74 53  strcmp (Tcl_GetS
f5e0: 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c  tring (objv[1]),
f5f0: 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09   "-local")) {...
f600: 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63  channelName = Tc
f610: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f620: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c  bj(objv[2], NULL
f630: 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  );...break;..   
f640: 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65 20   }..    /* else 
f650: 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e  fall-through ...
f660: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
f670: 5f 5f 47 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f  __GNUC__)..    _
f680: 5f 61 74 74 72 69 62 75 74 65 5f 5f 28 28 66 61  _attribute__((fa
f690: 6c 6c 74 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e  llthrough));.#en
f6a0: 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20  dif..default:.. 
f6b0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f6c0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
f6d0: 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63  bjv, "?-local? c
f6e0: 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72  hannel");..    r
f6f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f700: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
f710: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
f720: 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65  l(interp, channe
f730: 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20  lName, &mode);. 
f740: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
f750: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
f760: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
f770: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
f780: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
f790: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
f7a0: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
f7b0: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
f7c0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
f7d0: 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28  (chan);.    if (
f7e0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
f7f0: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
f800: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
f810: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
f820: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
f830: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
f840: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
f850: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f  chan),..."\": no
f860: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
f870: 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  , NULL);..Tcl_Se
f880: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
f890: 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55  p, "TLS", "STATU
f8a0: 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  S", "CHANNEL", "
f8b0: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
f8c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
f8d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
f8e0: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20   }.    statePtr 
f8f0: 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f  = (State *) Tcl_
f900: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
f910: 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20  ceData(chan);.. 
f920: 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66     /* Get certif
f930: 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f  icate for peer o
f940: 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66  r self */.    if
f950: 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
f960: 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70  peer = SSL_get_p
f970: 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28  eer_certificate(
f980: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
f990: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65      } else {..pe
f9a0: 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72  er = SSL_get_cer
f9b0: 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74  tificate(statePt
f9c0: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20  r->ssl);.    }. 
f9d0: 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63     /* Get X509 c
f9e0: 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20  ertificate info 
f9f0: 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29  */.    if (peer)
fa00: 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73   {..objPtr = Tls
fa10: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
fa20: 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28  rp, peer);..if (
fa30: 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20  objc == 2) {..  
fa40: 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72    X509_free(peer
fa50: 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e  );..    peer = N
fa60: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
fa70: 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54  se {..objPtr = T
fa80: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
fa90: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20   NULL);.    }.. 
faa0: 20 20 20 2f 2a 20 50 65 65 72 20 63 65 72 74 20     /* Peer cert 
fab0: 63 68 61 69 6e 20 28 63 6c 69 65 6e 74 20 6f 6e  chain (client on
fac0: 6c 79 29 20 2a 2f 0a 20 20 20 20 53 54 41 43 4b  ly) */.    STACK
fad0: 5f 4f 46 28 58 35 30 39 29 2a 20 73 73 6c 5f 63  _OF(X509)* ssl_c
fae0: 65 72 74 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70  erts = SSL_get_p
faf0: 65 65 72 5f 63 65 72 74 5f 63 68 61 69 6e 28 73  eer_cert_chain(s
fb00: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
fb10: 20 20 20 69 66 20 28 73 73 6c 5f 63 65 72 74 73     if (ssl_certs
fb20: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58   == NULL || sk_X
fb30: 35 30 39 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74  509_num(ssl_cert
fb40: 73 29 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f  s) == 0) {..Tcl_
fb50: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
fb60: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41  erp, "TLS", "STA
fb70: 54 55 53 22 2c 20 22 43 45 52 54 49 46 49 43 41  TUS", "CERTIFICA
fb80: 54 45 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  TE", (char *) NU
fb90: 4c 4c 29 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65  LL);..Tcl_IncrRe
fba0: 66 43 6f 75 6e 74 28 6f 62 6a 50 74 72 29 3b 0a  fCount(objPtr);.
fbb0: 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
fbc0: 74 28 6f 62 6a 50 74 72 29 3b 0a 09 72 65 74 75  t(objPtr);..retu
fbd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fbe0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72    }..    /* Peer
fbf0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 63 6c   name */.    Tcl
fc00: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
fc10: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
fc20: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
fc30: 69 6e 67 4f 62 6a 28 22 70 65 65 72 6e 61 6d 65  ingObj("peername
fc40: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
fc50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
fc60: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
fc70: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
fc80: 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 30 5f  ingObj(SSL_get0_
fc90: 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74  peername(statePt
fca0: 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a  r->ssl), -1));..
fcb0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
fcc0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
fcd0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
fce0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
fcf0: 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20  bits", -1));.   
fd00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
fd10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
fd20: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
fd30: 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74 5f  wIntObj(SSL_get_
fd40: 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74  cipher_bits(stat
fd50: 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29  ePtr->ssl, NULL)
fd60: 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73  ));..    ciphers
fd70: 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65   = (char*)SSL_ge
fd80: 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74  t_cipher(statePt
fd90: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20  r->ssl);.    if 
fda0: 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c  ((ciphers != NUL
fdb0: 4c 29 20 26 26 20 28 73 74 72 63 6d 70 28 63 69  L) && (strcmp(ci
fdc0: 70 68 65 72 73 2c 20 22 28 4e 4f 4e 45 29 22 29  phers, "(NONE)")
fdd0: 20 21 3d 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4c   != 0)) {..Tcl_L
fde0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
fdf0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
fe00: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
fe10: 67 4f 62 6a 28 22 63 69 70 68 65 72 22 2c 20 2d  gObj("cipher", -
fe20: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
fe30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
fe40: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
fe50: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
fe60: 63 69 70 68 65 72 73 2c 20 2d 31 29 29 3b 0a 20  ciphers, -1));. 
fe70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72     }..    /* Ver
fe80: 69 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72  ify the X509 cer
fe90: 74 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74  tificate present
fea0: 65 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a  ed by the peer *
feb0: 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  /.    Tcl_ListOb
fec0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
fed0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
fee0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
fef0: 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 20  "verifyResult", 
ff00: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
ff10: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ff20: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
ff30: 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r,..Tcl_NewStrin
ff40: 67 4f 62 6a 28 58 35 30 39 5f 76 65 72 69 66 79  gObj(X509_verify
ff50: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
ff60: 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ng(SSL_get_verif
ff70: 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74  y_result(statePt
ff80: 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 29 3b 0a  r->ssl)), -1));.
ff90: 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d  .    /* Verify m
ffa0: 6f 64 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c  ode */.    Tcl_L
ffb0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
ffc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
ffd0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
ffe0: 67 4f 62 6a 28 22 76 65 72 69 66 79 4d 6f 64 65  gObj("verifyMode
fff0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 2f 2a 20  ", -1));.    /* 
10000 53 53 4c 5f 43 54 58 5f 67 65 74 5f 76 65 72 69  SSL_CTX_get_veri
10010 66 79 5f 6d 6f 64 65 28 63 74 78 29 20 2a 2f 0a  fy_mode(ctx) */.
10020 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67      mode = SSL_g
10030 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73  et_verify_mode(s
10040 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
10050 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53     if (mode && S
10060 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20  SL_VERIFY_NONE) 
10070 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
10080 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10090 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
100a0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 6f  NewStringObj("no
100b0 6e 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d  ne", -1));.    }
100c0 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a   else {..Tcl_Obj
100d0 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54   *listObjPtr = T
100e0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
100f0 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64   NULL);..if (mod
10100 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
10110 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c  PEER) {..    Tcl
10120 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10130 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
10140 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
10150 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72  wStringObj("peer
10160 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
10170 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
10180 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
10190 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20  EER_CERT) {..   
101a0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
101b0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
101c0 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
101d0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
101e0 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20  fail if no peer 
101f0 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  cert", -1));..}.
10200 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
10210 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f  _VERIFY_CLIENT_O
10220 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  NCE) {..    Tcl_
10230 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10240 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
10250 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
10260 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e  StringObj("clien
10270 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09  t once", -1));..
10280 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  }..if (mode && S
10290 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48  SL_VERIFY_POST_H
102a0 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20  ANDSHAKE) {..   
102b0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
102c0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
102d0 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
102e0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
102f0 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c  post handshake",
10300 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c   -1));..}..Tcl_L
10310 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10320 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
10330 74 72 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 3b  tr, listObjPtr);
10340 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
10350 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68  erify mode depth
10360 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74   */.    Tcl_List
10370 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10380 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10390 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
103a0 6a 28 22 76 65 72 69 66 79 44 65 70 74 68 22 2c  j("verifyDepth",
103b0 20 2d 31 29 29 3b 0a 20 20 20 20 2f 2a 20 53 53   -1));.    /* SS
103c0 4c 5f 43 54 58 5f 67 65 74 5f 76 65 72 69 66 79  L_CTX_get_verify
103d0 5f 64 65 70 74 68 28 63 74 78 29 20 2a 2f 0a 20  _depth(ctx) */. 
103e0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
103f0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10400 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10410 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65  NewIntObj(SSL_ge
10420 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 73  t_verify_depth(s
10430 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 29 3b  tatePtr->ssl)));
10440 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20  ..    /* Report 
10450 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
10460 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
10470 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61  t of the negotia
10480 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  tion */.    SSL_
10490 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74  get0_alpn_select
104a0 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ed(statePtr->ssl
104b0 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b  , &proto, &len);
104c0 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
104d0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
104e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
104f0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10500 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20  alpn", -1));.   
10510 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10520 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10530 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10540 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
10550 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20   *)proto, (int) 
10560 6c 65 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  len));.    Tcl_L
10570 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10580 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
10590 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
105a0 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f 6c 22 2c  gObj("protocol",
105b0 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
105c0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
105d0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
105e0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
105f0 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72  gObj(SSL_get_ver
10600 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73  sion(statePtr->s
10610 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  sl), -1));..    
10620 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e  /* Valid for non
10630 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61  -RSA signature a
10640 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20  nd TLS 1.3 */.  
10650 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
10660 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10670 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10680 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67  ewStringObj("sig
10690 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69  natureHashAlgori
106a0 74 68 6d 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  thm", -1));.    
106b0 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20  if (objc == 2 ? 
106c0 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67  SSL_get_peer_sig
106d0 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65  nature_nid(state
106e0 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 20  Ptr->ssl, &nid) 
106f0 3a 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74  : SSL_get_signat
10700 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ure_nid(statePtr
10710 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a  ->ssl, &nid)) {.
10720 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10730 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10740 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10750 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e  wStringObj(OBJ_n
10760 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29  id2ln(nid), -1))
10770 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
10780 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10790 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
107a0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
107b0 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31  StringObj("", -1
107c0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ));.    }.    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 73 69 67 6e 61 74 75  ringObj("signatu
10810 72 65 54 79 70 65 22 2c 20 2d 31 29 29 3b 0a 20  reType", -1));. 
10820 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
10830 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f   ? SSL_get_peer_
10840 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e  signature_type_n
10850 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
10860 2c 20 26 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65  , &nid) : SSL_ge
10870 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65  t_signature_type
10880 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73  _nid(statePtr->s
10890 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a 09 54 63  sl, &nid)) {..Tc
108a0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
108b0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
108c0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
108d0 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e 69 64 32  ringObj(OBJ_nid2
108e0 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29 3b 0a 20  ln(nid), -1));. 
108f0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
10900 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10910 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
10920 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10930 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31 29 29 3b  ingObj("", -1));
10940 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
10950 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
10960 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
10970 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10980 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63  ..clientData = c
10990 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f  lientData;.}.../
109a0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
109b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109e0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f  -------. *. * Co
109f0 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
10a00 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e  md -- return con
10a10 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f  nection info fro
10a20 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a  m OpenSSL.. *. *
10a30 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c   Results:. *.A l
10a40 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  ist of connectio
10a50 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d  n info.  *. *---
10a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10aa0 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
10ab0 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
10ac0 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
10ad0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
10ae0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10af0 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
10b00 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
10b10 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
10b20 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
10b30 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
10b40 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
10b50 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
10b60 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73  tr;../* client s
10b70 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63  tate for ssl soc
10b80 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  ket */.    Tcl_O
10b90 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20  bj *objPtr;.    
10ba0 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a  const SSL *ssl;.
10bb0 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49      const SSL_CI
10bc0 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20  PHER *cipher;.  
10bd0 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53    const SSL_SESS
10be0 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20  ION *session;.  
10bf0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
10c00 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20   char *proto;.  
10c10 20 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a 0a 20 20    long mode;..  
10c20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29    if (objc != 2)
10c30 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
10c40 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
10c50 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29  objv, "channel")
10c60 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ;..return(TCL_ER
10c70 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ROR);.    }..   
10c80 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
10c90 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
10ca0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10cb0 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c  Obj(objv[1], NUL
10cc0 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
10cd0 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
10ce0 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
10cf0 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
10d00 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OR);.    }..    
10d10 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
10d20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
10d30 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
10d40 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
10d50 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
10d60 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
10d70 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
10d80 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
10d90 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
10da0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10db0 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
10dc0 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
10dd0 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
10de0 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
10df0 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
10e00 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53  ", NULL);..Tcl_S
10e10 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
10e20 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e  rp, "TLS", "CONN
10e30 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45  ECTION", "CHANNE
10e40 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
10e50 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
10e60 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
10e70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62  );.    }..    ob
10e80 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
10e90 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
10ea0 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69  .    /* Connecti
10eb0 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73  on info */.    s
10ec0 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
10ed0 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
10ee0 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
10ef0 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73  an);.    ssl = s
10f00 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20  tatePtr->ssl;.  
10f10 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c    if (ssl != NUL
10f20 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74  L) {../* connect
10f30 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 54 63  ion state */..Tc
10f40 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10f50 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10f60 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10f70 72 69 6e 67 4f 62 6a 28 22 73 74 61 74 65 22 2c  ringObj("state",
10f80 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
10f90 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10fa0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10fb0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10fc0 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69  j(SSL_state_stri
10fd0 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31  ng_long(ssl), -1
10fe0 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49  ));.../* Get SNI
10ff0 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65   requested serve
11000 72 20 6e 61 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c  r name */..Tcl_L
11010 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11020 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
11030 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
11040 67 4f 62 6a 28 22 73 65 72 76 65 72 6e 61 6d 65  gObj("servername
11050 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
11060 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
11070 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
11080 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
11090 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73 65 72 76  Obj(SSL_get_serv
110a0 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45  ername(ssl, TLSE
110b0 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74  XT_NAMETYPE_host
110c0 5f 6e 61 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 09  _name), -1));...
110d0 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20  /* Get protocol 
110e0 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  */..Tcl_ListObjA
110f0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11100 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11110 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70  _NewStringObj("p
11120 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a  rotocol", -1));.
11130 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
11140 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11150 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
11160 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67  wStringObj(SSL_g
11170 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c  et_version(ssl),
11180 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65   -1));.../* Rene
11190 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65  gotiation allowe
111a0 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  d */..Tcl_ListOb
111b0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
111c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
111d0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
111e0 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c  "renegotiation",
111f0 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
11200 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11210 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11220 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11230 6a 28 0a 09 20 20 20 20 53 53 4c 5f 67 65 74 5f  j(..    SSL_get_
11240 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61  secure_renegotia
11250 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c  tion_support(ssl
11260 29 20 3f 20 22 73 75 70 70 6f 72 74 65 64 22 20  ) ? "supported" 
11270 3a 20 22 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  : "not supported
11280 22 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65  ", -1));.../* Ge
11290 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c  t security level
112a0 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   */..Tcl_ListObj
112b0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
112c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
112d0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
112e0 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20  securitylevel", 
112f0 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
11300 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11310 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11320 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53  Tcl_NewIntObj(SS
11330 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c  L_get_security_l
11340 65 76 65 6c 28 73 73 6c 29 29 29 3b 0a 0a 09 2f  evel(ssl)));.../
11350 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a  * Session info *
11360 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
11370 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11380 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11390 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65  NewStringObj("se
113a0 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d  ssion_reused", -
113b0 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
113c0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
113d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
113e0 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
113f0 28 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75  (SSL_session_reu
11400 73 65 64 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a  sed(ssl)));.../*
11410 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20   Is server info 
11420 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  */..Tcl_ListObjA
11430 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11440 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11450 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69  _NewStringObj("i
11460 73 5f 73 65 72 76 65 72 22 2c 20 2d 31 29 29 3b  s_server", -1));
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 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c  ewBooleanObj(SSL
114b0 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29  _is_server(ssl))
114c0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
114d0 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a   Cipher info */.
114e0 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c      cipher = SSL
114f0 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70  _get_current_cip
11500 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66  her(ssl);.    if
11510 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c   (cipher != NULL
11520 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55  ) {..char buf[BU
11530 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e  FSIZ] = {0};..in
11540 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73  t bits, alg_bits
11550 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
11560 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11570 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11580 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
11590 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54  ipher", -1));..T
115a0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
115b0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
115c0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
115d0 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50  tringObj(SSL_CIP
115e0 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70  HER_get_name(cip
115f0 68 65 72 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  her), -1));..Tcl
11600 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11610 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11620 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11630 69 6e 67 4f 62 6a 28 22 73 74 61 6e 64 61 72 64  ingObj("standard
11640 5f 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54  _name", -1));..T
11650 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11660 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11670 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
11680 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50  tringObj(SSL_CIP
11690 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d  HER_standard_nam
116a0 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b  e(cipher), -1));
116b0 0a 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49  ...bits = SSL_CI
116c0 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69  PHER_get_bits(ci
116d0 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29  pher, &alg_bits)
116e0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
116f0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11700 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11710 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65  NewStringObj("se
11720 63 72 65 74 5f 62 69 74 73 22 2c 20 2d 31 29 29  cret_bits", -1))
11730 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
11740 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11750 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11760 4e 65 77 49 6e 74 4f 62 6a 28 62 69 74 73 29 29  NewIntObj(bits))
11770 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
11780 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11790 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
117a0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c  NewStringObj("al
117b0 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 2d  gorithm_bits", -
117c0 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
117d0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
117e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
117f0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6c 67  cl_NewIntObj(alg
11800 5f 62 69 74 73 29 29 3b 0a 09 2f 2a 20 61 6c 67  _bits));../* alg
11810 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20  _bits is actual 
11820 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e  key secret bits.
11830 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64   If use bits and
11840 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74   secret (algorit
11850 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c  hm) bits differ,
11860 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66  ..   the rest of
11870 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69   the bits are fi
11880 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69  xed, i.e. for li
11890 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70  mited export cip
118a0 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29  hers (bits < 56)
118b0 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   */..Tcl_ListObj
118c0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
118d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
118e0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
118f0 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31  min_version", -1
11900 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
11910 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11920 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
11930 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
11940 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65  SL_CIPHER_get_ve
11950 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d  rsion(cipher), -
11960 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70  1));.../* Get Op
11970 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49  enSSL-specific I
11980 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a  D, not IANA ID *
11990 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  /..Tcl_ListObjAp
119a0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
119b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
119c0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 64  NewStringObj("id
119d0 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
119e0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
119f0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
11a00 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
11a10 28 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45  ((int) SSL_CIPHE
11a20 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 29  R_get_id(cipher)
11a30 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 49  ));...if (SSL_CI
11a40 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e  PHER_description
11a50 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69  (cipher, buf, si
11a60 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55  zeof(buf)) != NU
11a70 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  LL) {..    Tcl_L
11a80 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11a90 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
11aa0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
11ab0 67 4f 62 6a 28 22 64 65 73 63 72 69 70 74 69 6f  gObj("descriptio
11ac0 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54  n", -1));..    T
11ad0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11ae0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11af0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
11b00 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31  tringObj(buf, -1
11b10 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  ));..}.    }..  
11b20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66    /* Session inf
11b30 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e  o */.    session
11b40 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69   = SSL_get_sessi
11b50 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20  on(ssl);.    if 
11b60 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c  (session != NULL
11b70 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67  ) {..const unsig
11b80 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74  ned char *ticket
11b90 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a  ;..size_t len2;.
11ba0 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c  .unsigned int ul
11bb0 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67  en;..const unsig
11bc0 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f  ned char *sessio
11bd0 6e 5f 69 64 3b 0a 09 63 68 61 72 20 62 75 66 66  n_id;..char buff
11be0 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45  er[SSL_MAX_MASTE
11bf0 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a  R_KEY_LENGTH];..
11c00 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73  ./* Report the s
11c10 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
11c20 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
11c30 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61  the ALPN negotia
11c40 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53  tion */..SSL_SES
11c50 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73  SION_get0_alpn_s
11c60 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c  elected(session,
11c70 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b   &proto, &len2);
11c80 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
11c90 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11ca0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11cb0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70  ewStringObj("alp
11cc0 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  n", -1));..Tcl_L
11cd0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11ce0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
11cf0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
11d00 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f  gObj((char *)pro
11d10 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29  to, (int) len2))
11d20 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
11d30 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
11d40 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
11d50 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74  of the NPN negot
11d60 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66  iation */.#ifdef
11d70 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65   USE_NPN..SSL_ge
11d80 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65  t0_next_proto_ne
11d90 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70  gotiated(ssl, &p
11da0 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 54  roto, &ulen);..T
11db0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11dc0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11dd0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
11de0 74 72 69 6e 67 4f 62 6a 28 22 6e 70 6e 22 2c 20  tringObj("npn", 
11df0 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
11e00 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11e10 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11e20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11e30 28 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20  ((char *)proto, 
11e40 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 23 65  (int) ulen));.#e
11e50 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61  ndif.../* Resuma
11e60 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09  ble session */..
11e70 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11e80 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11e90 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
11ea0 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 73 75 6d  StringObj("resum
11eb0 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63  able", -1));..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 49 6e  bjPtr, Tcl_NewIn
11ef0 74 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e  tObj(SSL_SESSION
11f00 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65  _is_resumable(se
11f10 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53  ssion)));.../* S
11f20 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d  ession start tim
11f30 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  e (seconds since
11f40 20 65 70 6f 63 68 29 20 2a 2f 0a 09 54 63 6c 5f   epoch) */..Tcl_
11f50 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11f60 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11f70 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11f80 6e 67 4f 62 6a 28 22 73 74 61 72 74 5f 74 69 6d  ngObj("start_tim
11f90 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  e", -1));..Tcl_L
11fa0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11fb0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
11fc0 74 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f  tr, Tcl_NewLongO
11fd0 62 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  bj(SSL_SESSION_g
11fe0 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29  et_time(session)
11ff0 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74  ));.../* Timeout
12000 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58   value - SSL_CTX
12010 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e  _get_timeout (in
12020 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 54 63   seconds) */..Tc
12030 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12040 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
12050 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
12060 72 69 6e 67 4f 62 6a 28 22 74 69 6d 65 6f 75 74  ringObj("timeout
12070 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
12080 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12090 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
120a0 72 2c 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62  r, Tcl_NewLongOb
120b0 6a 28 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  j(SSL_SESSION_ge
120c0 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f  t_timeout(sessio
120d0 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  n)));.../* Sessi
120e0 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69  on ticket lifeti
120f0 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f  me hint (in seco
12100 6e 64 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  nds) */..Tcl_Lis
12110 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12120 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
12130 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
12140 62 6a 28 22 6c 69 66 65 74 69 6d 65 22 2c 20 2d  bj("lifetime", -
12150 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
12160 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
12170 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
12180 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53  cl_NewLongObj(SS
12190 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
121a0 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69  cket_lifetime_hi
121b0 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a  nt(session)));..
121c0 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a  ./* Session id *
121d0 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
121e0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
121f0 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65  id(session, &ule
12200 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  n);..Tcl_ListObj
12210 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
12220 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
12230 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
12240 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 2d 31 29  session_id", -1)
12250 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
12260 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
12270 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
12280 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
12290 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e  (session_id, (in
122a0 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 09 2f 2a 20  t) ulen));.../* 
122b0 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d  Session ticket -
122c0 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a   client only */.
122d0 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  .SSL_SESSION_get
122e0 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e  0_ticket(session
122f0 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32  , &ticket, &len2
12300 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
12310 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
12320 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
12330 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
12340 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20  ession_ticket", 
12350 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
12360 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12370 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12380 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
12390 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69 6e 74  Obj(ticket, (int
123a0 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20 54  ) len2));.../* T
123b0 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a  icket app data *
123c0 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
123d0 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61  et0_ticket_appda
123e0 74 61 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  ta(session, &tic
123f0 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63  ket, &len2);..Tc
12400 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12410 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
12420 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
12430 72 69 6e 67 4f 62 6a 28 22 74 69 63 6b 65 74 5f  ringObj("ticket_
12440 61 70 70 5f 64 61 74 61 22 2c 20 2d 31 29 29 3b  app_data", -1));
12450 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
12460 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
12470 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
12480 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74  ewByteArrayObj(t
12490 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e  icket, (int) len
124a0 32 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61  2));.../* Get ma
124b0 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e  ster key */..len
124c0 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  2 = SSL_SESSION_
124d0 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73  get_master_key(s
124e0 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20  ession, buffer, 
124f0 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b  SSL_MAX_MASTER_K
12500 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 54 63 6c  EY_LENGTH);..Tcl
12510 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12520 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
12530 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
12540 69 6e 67 4f 62 6a 28 22 6d 61 73 74 65 72 5f 6b  ingObj("master_k
12550 65 79 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  ey", -1));..Tcl_
12560 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
12570 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
12580 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
12590 41 72 72 61 79 4f 62 6a 28 62 75 66 66 65 72 2c  ArrayObj(buffer,
125a0 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 20   (int) len2));. 
125b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
125c0 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f  pression info */
125d0 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20  .    if (ssl != 
125e0 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48  NULL) {.#ifdef H
125f0 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53  AVE_SSL_COMPRESS
12600 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f  ION..const COMP_
12610 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65  METHOD *comp, *e
12620 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c  xpn;..comp = SSL
12630 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d  _get_current_com
12640 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09  pression(ssl);..
12650 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63  expn = SSL_get_c
12660 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e  urrent_expansion
12670 28 73 73 6c 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73  (ssl);...Tcl_Lis
12680 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12690 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
126a0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
126b0 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22  bj("compression"
126c0 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
126d0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
126e0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
126f0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
12700 62 6a 28 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f  bj(comp ? SSL_CO
12710 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70  MP_get_name(comp
12720 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29 29  ) : "NONE", -1))
12730 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
12740 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12750 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
12760 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78  NewStringObj("ex
12770 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  pansion", -1));.
12780 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
12790 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
127a0 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
127b0 77 53 74 72 69 6e 67 4f 62 6a 28 65 78 70 6e 20  wStringObj(expn 
127c0 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e  ? SSL_COMP_get_n
127d0 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 4e 4f 4e  ame(expn) : "NON
127e0 45 22 2c 20 2d 31 29 29 3b 0a 23 65 6c 73 65 0a  E", -1));.#else.
127f0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
12800 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12810 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
12820 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70  wStringObj("comp
12830 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  ression", -1));.
12840 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
12850 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12860 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
12870 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45  wStringObj("NONE
12880 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
12890 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
128a0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
128b0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
128c0 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c  Obj("expansion",
128d0 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
128e0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
128f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12900 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12910 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29 3b 0a  j("NONE", -1));.
12920 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
12930 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f    /* Server info
12940 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53   */.    mode = S
12950 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69  SL_CTX_get_sessi
12960 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74  on_cache_mode(st
12970 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20  atePtr->ctx);.  
12980 20 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c    if (mode & SSL
12990 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29  _SESS_CACHE_OFF)
129a0 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 6f 66 66   {..proto = "off
129b0 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ";.    } else if
129c0 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
129d0 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20  S_CACHE_CLIENT) 
129e0 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 63 6c 69 65  {..proto = "clie
129f0 6e 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  nt";.    } else 
12a00 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
12a10 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52  ESS_CACHE_SERVER
12a20 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 73 65  ) {..proto = "se
12a30 72 76 65 72 22 3b 0a 20 20 20 20 7d 20 65 6c 73  rver";.    } els
12a40 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
12a50 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48  _SESS_CACHE_BOTH
12a60 29 20 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 62 6f  ) {..proto = "bo
12a70 74 68 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  th";.    } else 
12a80 7b 0a 09 70 72 6f 74 6f 20 3d 20 22 75 6e 6b 6e  {..proto = "unkn
12a90 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  own";.    }.    
12aa0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12ab0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12ac0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
12ad0 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69  StringObj("sessi
12ae0 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20  on_cache_mode", 
12af0 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
12b00 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12b10 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
12b20 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
12b30 4f 62 6a 28 70 72 6f 74 6f 2c 20 2d 31 29 29 3b  Obj(proto, -1));
12b40 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
12b50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
12b60 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
12b70 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65  rn TCL_OK;..clie
12b80 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
12b90 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ata;.}.../*. *--
12ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12be0 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f  -. *. * VersionO
12bf0 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
12c00 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
12c10 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a  rom OpenSSL.. *.
12c20 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
12c30 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
12c40 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
12c50 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
12c60 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
12c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
12cb0 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69  static int.Versi
12cc0 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  onObjCmd(ClientD
12cd0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
12ce0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12cf0 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
12d00 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
12d10 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  v[]) {.    Tcl_O
12d20 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20  bj *objPtr;..   
12d30 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
12d40 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20  ");..    objPtr 
12d50 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
12d60 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  bj(OPENSSL_VERSI
12d70 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20  ON_TEXT, -1);.  
12d80 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
12d90 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
12da0 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
12db0 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
12dc0 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
12dd0 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a  ;..objc = objc;.
12de0 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a  .objv = objv;.}.
12df0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
12e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
12e40 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d   MiscObjCmd -- m
12e50 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a  isc commands. *.
12e60 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
12e70 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
12e80 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
12e90 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
12ea0 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
12eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
12ef0 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f  static int.MiscO
12f00 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
12f10 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
12f20 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
12f30 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
12f40 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
12f50 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  ) {.    static c
12f60 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61  onst char *comma
12f70 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22  nds [] = { "req"
12f80 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c  , "strreq", NULL
12f90 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d   };.    enum com
12fa0 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f  mand { C_REQ, C_
12fb0 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20  STRREQ, C_DUMMY 
12fc0 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c 20  };.    int cmd, 
12fd0 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20  isStr;.    char 
12fe0 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a  buffer[16384];..
12ff0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
13000 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
13010 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
13020 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
13030 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
13040 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73  subcommand ?args
13050 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
13060 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
13070 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64    if (Tcl_GetInd
13080 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
13090 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61  , objv[1], comma
130a0 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20  nds, "command", 
130b0 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f  0,&cmd) != TCL_O
130c0 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
130d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
130e0 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
130f0 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72  or();..    isStr
13100 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52   = (cmd == C_STR
13110 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68  REQ);.    switch
13120 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29   ((enum command)
13130 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f   cmd) {..case C_
13140 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52  REQ:..case C_STR
13150 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f  REQ: {..    EVP_
13160 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b  PKEY *pkey=NULL;
13170 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74  ..    X509 *cert
13180 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39  =NULL;..    X509
13190 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c  _NAME *name=NULL
131a0 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  ;..    Tcl_Obj *
131b0 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 69 6e 74  *listv;..    int
131c0 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20   listc,i;...    
131d0 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a  BIO *out=NULL;..
131e0 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22  .    char *k_C="
131f0 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d  ",*k_ST="",*k_L=
13200 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55  "",*k_O="",*k_OU
13210 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f  ="",*k_CN="",*k_
13220 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63  Email="";..    c
13230 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d  har *keyout,*pem
13240 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69  out,*str;..    i
13250 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61  nt keysize,seria
13260 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23  l=0,days=365;..#
13270 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
13280 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
13290 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47  000000L..    BIG
132a0 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b  NUM *bne = NULL;
132b0 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d  ..    RSA *rsa =
132c0 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20   NULL;.#else..  
132d0 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a    EVP_PKEY_CTX *
132e0 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64  ctx = NULL;.#end
132f0 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62  if...    if ((ob
13300 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36  jc<5) || (objc>6
13310 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67  )) {...Tcl_Wrong
13320 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
13330 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a  2, objv, "keysiz
13340 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69  e keyfile certfi
13350 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72  le ?info?");...r
13360 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13370 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
13380 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
13390 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
133a0 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21  [2], &keysize) !
133b0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65  = TCL_OK) {...re
133c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
133d0 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f  .    }..    keyo
133e0 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
133f0 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20  (objv[3]);..    
13400 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74  pemout=Tcl_GetSt
13410 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09  ring(objv[4]);..
13420 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b      if (isStr) {
13430 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e  ...Tcl_SetVar(in
13440 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30  terp,keyout,"",0
13450 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28  );...Tcl_SetVar(
13460 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22  interp,pemout,""
13470 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ,0);..    }...  
13480 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b    if (objc>=6) {
13490 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f  ...if (Tcl_ListO
134a0 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
134b0 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09  terp, objv[5],..
134c0 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76  ..&listc, &listv
134d0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
134e0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
134f0 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66  ERROR;...}....if
13500 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30   ((listc%2) != 0
13510 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  ) {...    Tcl_Se
13520 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
13530 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74  Information list
13540 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20   must have even 
13550 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
13560 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  nts",NULL);...  
13570 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13580 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69  OR;...}...for (i
13590 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d  =0; i<listc; i+=
135a0 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54  2) {...    str=T
135b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
135c0 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66  tv[i]);...    if
135d0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61   (strcmp(str,"da
135e0 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  ys")==0) {....if
135f0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
13600 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
13610 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43  [i+1],&days)!=TC
13620 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74  L_OK)....    ret
13630 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
13640 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
13650 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69  strcmp(str,"seri
13660 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  al")==0) {....if
13670 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
13680 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
13690 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d  [i+1],&serial)!=
136a0 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72  TCL_OK)....    r
136b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
136c0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
136d0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22   (strcmp(str,"C"
136e0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54  )==0) {....k_C=T
136f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
13700 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
13710 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
13720 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20  p(str,"ST")==0) 
13730 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65  {....k_ST=Tcl_Ge
13740 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
13750 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
13760 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
13770 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ,"L")==0) {....k
13780 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  _L=Tcl_GetString
13790 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
137a0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
137b0 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d  trcmp(str,"O")==
137c0 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f  0) {....k_O=Tcl_
137d0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
137e0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
137f0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
13800 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09  tr,"OU")==0) {..
13810 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74  ..k_OU=Tcl_GetSt
13820 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
13830 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
13840 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
13850 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43  N")==0) {....k_C
13860 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  N=Tcl_GetString(
13870 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13880 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13890 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22  rcmp(str,"Email"
138a0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61  )==0) {....k_Ema
138b0 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  il=Tcl_GetString
138c0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
138d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09      } else {....
138e0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
138f0 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61  terp,"Unknown pa
13900 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a  rameter",NULL);.
13910 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
13920 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d  ROR;...    }...}
13930 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45  ..    }..#if OPE
13940 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
13950 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
13960 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f  L..    bne = BN_
13970 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20  new();..    rsa 
13980 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20  = RSA_new();..  
13990 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45    pkey = EVP_PKE
139a0 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66  Y_new();..    if
139b0 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (bne == NULL ||
139c0 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20   rsa == NULL || 
139d0 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  pkey == NULL || 
139e0 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65  !BN_set_word(bne
139f0 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52  ,RSA_F4) ||...!R
13a00 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f  SA_generate_key_
13a10 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c  ex(rsa, keysize,
13a20 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21   bne, NULL) || !
13a30 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f  EVP_PKEY_assign_
13a40 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20  RSA(pkey, rsa)) 
13a50 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  {...EVP_PKEY_fre
13a60 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53  e(pkey);.../* RS
13a70 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65  A_free(rsa); fre
13a80 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66  ed by EVP_PKEY_f
13a90 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65  ree */...BN_free
13aa0 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20  (bne);.#else..  
13ab0 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41    pkey = EVP_RSA
13ac0 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69  _gen((unsigned i
13ad0 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20  nt) keysize);.. 
13ae0 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45     ctx = EVP_PKE
13af0 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e  Y_CTX_new(pkey,N
13b00 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70  ULL);..    if (p
13b10 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63  key == NULL || c
13b20 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45  tx == NULL || !E
13b30 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69  VP_PKEY_keygen_i
13b40 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45  nit(ctx) ||...!E
13b50 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f  VP_PKEY_CTX_set_
13b60 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28  rsa_keygen_bits(
13b70 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c  ctx, keysize) ||
13b80 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65   !EVP_PKEY_keyge
13b90 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b  n(ctx, &pkey)) {
13ba0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
13bb0 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b  (pkey);...EVP_PK
13bc0 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  EY_CTX_free(ctx)
13bd0 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53  ;.#endif...Tcl_S
13be0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
13bf0 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
13c00 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e  g private key",N
13c10 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  ULL);...return T
13c20 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
13c30 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73   else {...if (is
13c40 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74  Str) {...    out
13c50 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d  =BIO_new(BIO_s_m
13c60 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d  em());...    PEM
13c70 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61  _write_bio_Priva
13c80 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e  teKey(out,pkey,N
13c90 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c  ULL,NULL,0,NULL,
13ca0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42  NULL);...    i=B
13cb0 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66  IO_read(out,buff
13cc0 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72  er,sizeof(buffer
13cd0 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69  )-1);...    i=(i
13ce0 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20  <0) ? 0 : i;... 
13cf0 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30     buffer[i]='\0
13d00 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  ';...    Tcl_Set
13d10 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75  Var(interp,keyou
13d20 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20  t,buffer,0);... 
13d30 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74     BIO_flush(out
13d40 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
13d50 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65  e(out);...} else
13d60 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
13d70 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
13d80 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72  ));...    BIO_wr
13d90 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74  ite_filename(out
13da0 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20  ,keyout);...    
13db0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72  PEM_write_bio_Pr
13dc0 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65  ivateKey(out,pke
13dd0 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55  y,NULL,NULL,0,NU
13de0 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  LL,NULL);...    
13df0 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f  /* PEM_write_bio
13e00 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f  _RSAPrivateKey(o
13e10 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e  ut, rsa, NULL, N
13e20 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55  ULL, 0, NULL, NU
13e30 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49  LL); */...    BI
13e40 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b  O_free_all(out);
13e50 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65  .. .}....if ((ce
13e60 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d  rt=X509_new())==
13e70 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63  NULL) {...    Tc
13e80 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
13e90 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61  rp,"Error genera
13ea0 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ting certificate
13eb0 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b   request",NULL);
13ec0 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
13ed0 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
13ee0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
13ef0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
13f00 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72  000L...    BN_fr
13f10 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
13f20 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c  ..    return(TCL
13f30 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09  _ERROR);...}....
13f40 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e  X509_set_version
13f50 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31  (cert,2);...ASN1
13f60 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30  _INTEGER_set(X50
13f70 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62  9_get_serialNumb
13f80 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29  er(cert),serial)
13f90 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f  ;...X509_gmtime_
13fa0 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f  adj(X509_getm_no
13fb0 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29  tBefore(cert),0)
13fc0 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f  ;...X509_gmtime_
13fd0 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f  adj(X509_getm_no
13fe0 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f  tAfter(cert),(lo
13ff0 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73  ng)60*60*24*days
14000 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75  );...X509_set_pu
14010 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b  bkey(cert,pkey);
14020 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65  ....name=X509_ge
14030 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63  t_subject_name(c
14040 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41  ert);....X509_NA
14050 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
14060 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42  txt(name,"C", MB
14070 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
14080 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
14090 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c   *) k_C, -1, -1,
140a0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
140b0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
140c0 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53  t(name,"ST", MBS
140d0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
140e0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
140f0 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c  *) k_ST, -1, -1,
14100 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
14110 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
14120 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54  t(name,"L", MBST
14130 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
14140 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14150 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30  ) k_L, -1, -1, 0
14160 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
14170 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
14180 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49  name,"O", MBSTRI
14190 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
141a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
141b0 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_O, -1, -1, 0);
141c0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
141d0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
141e0 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e  me,"OU", MBSTRIN
141f0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
14200 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
14210 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _OU, -1, -1, 0);
14220 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
14230 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
14240 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e  me,"CN", MBSTRIN
14250 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
14260 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
14270 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _CN, -1, -1, 0);
14280 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
14290 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
142a0 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54  me,"Email", MBST
142b0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
142c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
142d0 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d  ) k_Email, -1, -
142e0 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73  1, 0);....X509_s
142f0 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28  et_subject_name(
14300 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69  cert,name);....i
14310 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65  f (!X509_sign(ce
14320 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32  rt,pkey,EVP_sha2
14330 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58  56())) {...    X
14340 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
14350 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66  ..    EVP_PKEY_f
14360 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f  ree(pkey);.#if O
14370 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
14380 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
14390 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65  00L...    BN_fre
143a0 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09  e(bne);.#endif..
143b0 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
143c0 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
143d0 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69   signing certifi
143e0 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  cate",NULL);... 
143f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14400 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ROR;...}....if (
14410 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f  isStr) {...    o
14420 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
14430 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50  _mem());...    P
14440 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30  EM_write_bio_X50
14450 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20  9(out,cert);... 
14460 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75     i=BIO_read(ou
14470 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28  t,buffer,sizeof(
14480 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20  buffer)-1);...  
14490 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20    i=(i<0) ? 0 : 
144a0 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b  i;...    buffer[
144b0 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54  i]='\0';...    T
144c0 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
144d0 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30  ,pemout,buffer,0
144e0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75  );...    BIO_flu
144f0 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42  sh(out);...    B
14500 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09  IO_free(out);...
14510 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f  } else {...    o
14520 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
14530 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20  _file());...    
14540 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61  BIO_write_filena
14550 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a  me(out,pemout);.
14560 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
14570 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72  bio_X509(out,cer
14580 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
14590 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d  ee_all(out);...}
145a0 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65  ....X509_free(ce
145b0 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  rt);...EVP_PKEY_
145c0 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
145d0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
145e0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
145f0 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62  000L...BN_free(b
14600 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20  ne);.#endif..   
14610 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20   }..}..break;.  
14620 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61    default:..brea
14630 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  k;.    }.    ret
14640 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
14650 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
14660 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a  Data;.}.../*****
14670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
14680 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20  ./* Init        
14690 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
146a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
146b0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
146c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146f0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
14700 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a  ls_Free --. *. *
14710 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
14720 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61  cleans up when a
14730 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
14740 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20  d channel. *.is 
14750 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72  closed and its r
14760 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
14770 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a  alls below 1. *.
14780 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e   * Results:. *.n
14790 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
147a0 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73  ffects:. *.Frees
147b0 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20   all the state. 
147c0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
147d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14800 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
14810 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a  .Tls_Free(char *
14820 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20  blockPtr) {.    
14830 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
14840 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b  = (State *)block
14850 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  Ptr;..    dprint
14860 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
14870 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74    Tls_Clean(stat
14880 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65  ePtr);.    ckfre
14890 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c  e(blockPtr);.}..
148a0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
148b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
148f0 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a  Tls_Clean --. *.
14900 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
14910 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e  e cleans up when
14920 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
14930 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69  sed channel. *.i
14940 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73  s closed and its
14950 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
14960 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20   falls below 1. 
14970 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09   This should. *.
14980 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72  be called synchr
14990 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43  onously by the C
149a0 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e  loseProc, not in
149b0 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c   the. *.Eventual
149c0 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e  lyFree callback.
149d0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
149e0 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.none. *. * Si
149f0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46  de effects:. *.F
14a00 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61  rees all the sta
14a10 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  te. *. *--------
14a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
14a60 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53  void Tls_Clean(S
14a70 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20  tate *statePtr) 
14a80 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  {.    dprintf("C
14a90 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
14aa0 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73  .     * we're as
14ab0 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74  suming here that
14ac0 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68   we're single-th
14ad0 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20  readed.     */. 
14ae0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
14af0 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54  >timer != (Tcl_T
14b00 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29  imerToken) NULL)
14b10 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69   {..Tcl_DeleteTi
14b20 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65  merHandler(state
14b30 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74  Ptr->timer);..st
14b40 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20  atePtr->timer = 
14b50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
14b60 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70   if (statePtr->p
14b70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65  rotos) {..ckfree
14b80 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
14b90 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  s);..statePtr->p
14ba0 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rotos = NULL;.  
14bb0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
14bc0 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a  ePtr->bio) {../*
14bd0 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20   This will call 
14be0 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75  SSL_shutdown. Bu
14bf0 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70  g 1414045 */..dp
14c00 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f  rintf("BIO_free_
14c10 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50  all(%p)", stateP
14c20 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66  tr->bio);..BIO_f
14c30 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72  ree_all(statePtr
14c40 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74  ->bio);..statePt
14c50 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  r->bio = NULL;. 
14c60 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
14c70 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64  tePtr->ssl) {..d
14c80 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65  printf("SSL_free
14c90 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d  (%p)", statePtr-
14ca0 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65  >ssl);..SSL_free
14cb0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
14cc0 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20  ..statePtr->ssl 
14cd0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
14ce0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
14cf0 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  ctx) {..SSL_CTX_
14d00 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63  free(statePtr->c
14d10 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  tx);..statePtr->
14d20 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
14d30 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
14d40 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a  tr->callback) {.
14d50 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
14d60 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  t(statePtr->call
14d70 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72  back);..statePtr
14d80 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c  ->callback = NUL
14d90 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
14da0 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
14db0 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  ord) {..Tcl_Decr
14dc0 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
14dd0 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73  r->password);..s
14de0 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
14df0 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
14e00 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
14e10 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44  ->vcmd) {..Tcl_D
14e20 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ecrRefCount(stat
14e30 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74  ePtr->vcmd);..st
14e40 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e  atePtr->vcmd = N
14e50 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
14e60 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
14e70 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  ng");.}.../*. *-
14e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ec0 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69  --. *. * Tls_Ini
14ed0 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  t --. *. *.This 
14ee0 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69  is a package ini
14ef0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
14f00 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20  edure, which is 
14f10 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c  called. *.by Tcl
14f20 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61   when this packa
14f30 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65  ge is to be adde
14f40 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65  d to an interpre
14f50 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ter.. *. * Resul
14f60 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75  ts:  Ssl configu
14f70 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20  red and loaded. 
14f80 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
14f90 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68  s:. *. create th
14fa0 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69  e ssl command, i
14fb0 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f  nitialize ssl co
14fc0 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ntext. *. *-----
14fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
15010 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74  */.DLLEXPORT int
15020 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e   Tls_Init(Tcl_In
15030 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a  terp *interp) {.
15040 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74      const char t
15050 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b  lsTclInitScript[
15060 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22  ] = {.#include "
15070 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30  tls.tcl.h"..0x00
15080 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72  .    };..    dpr
15090 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
150a0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57  .    /*.     * W
150b0 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 54  e only support T
150c0 63 6c 20 38 2e 34 20 6f 72 20 6e 65 77 65 72 0a  cl 8.4 or newer.
150d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28       */.    if (
150e0 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f  .#ifdef USE_TCL_
150f0 53 54 55 42 53 0a 09 54 63 6c 5f 49 6e 69 74 53  STUBS..Tcl_InitS
15100 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
15110 34 22 2c 20 30 29 0a 23 65 6c 73 65 0a 09 54 63  4", 0).#else..Tc
15120 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74  l_PkgRequire(int
15130 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 38 2e 34  erp, "Tcl", "8.4
15140 2d 22 2c 20 30 29 0a 23 65 6e 64 69 66 0a 09 20  -", 0).#endif.. 
15150 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
15160 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15170 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73    }..    if (Tls
15180 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43  LibInit(0) != TC
15190 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70  L_OK) {..Tcl_App
151a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
151b0 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69  , "could not ini
151c0 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72  tialize SSL libr
151d0 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ary", NULL);..re
151e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
151f0 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43      }..    Tcl_C
15200 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
15210 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69  interp, "tls::ci
15220 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f  phers", CiphersO
15230 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
15240 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
15250 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
15260 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
15270 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
15280 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65  erp, "tls::conne
15290 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69  ction", Connecti
152a0 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43  onInfoObjCmd, (C
152b0 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
152c0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
152d0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
152e0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
152f0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
15300 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61  ::handshake", Ha
15310 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28  ndshakeObjCmd, (
15320 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
15330 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
15340 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
15350 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
15360 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
15370 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f  s::import", Impo
15380 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  rtObjCmd, (Clien
15390 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
153a0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
153b0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
153c0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
153d0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e  interp, "tls::un
153e0 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72  import", Unimpor
153f0 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tObjCmd, (Client
15400 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
15410 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
15420 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
15430 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
15440 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61  nterp, "tls::sta
15450 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43  tus", StatusObjC
15460 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
15470 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
15480 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
15490 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
154a0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
154b0 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22  , "tls::version"
154c0 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c  , VersionObjCmd,
154d0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
154e0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
154f0 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15500 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15510 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15520 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63  tls::misc", Misc
15530 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
15540 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
15550 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
15560 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
15570 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
15580 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74  terp, "tls::prot
15590 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c  ocols", Protocol
155a0 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  sObjCmd, (Client
155b0 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
155c0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
155d0 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69  ULL);..    if (i
155e0 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76  nterp) {..Tcl_Ev
155f0 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63  al(interp, tlsTc
15600 6c 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20  lInitScript);.  
15610 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28    }..    return(
15620 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69  Tcl_PkgProvide(i
15630 6e 74 65 72 70 2c 20 22 74 6c 73 22 2c 20 50 41  nterp, "tls", PA
15640 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 29 3b  CKAGE_VERSION));
15650 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
15660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
15690 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49  . *. *.Tls_SafeI
156a0 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d  nit --. *. *.---
156b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
156e0 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65  *.Standard proce
156f0 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79  dure required by
15700 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74   'load'.. *.Init
15710 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74  ializes this ext
15720 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66  ension for a saf
15730 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20  e interpreter.. 
15740 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
15750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15770 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65  --*. *. *.Side e
15780 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f  ffects:. *..As o
15790 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a  f 'Tls_Init'. *.
157a0 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41   *.Result:. *..A
157b0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72   standard Tcl er
157c0 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d  ror code.. *. *-
157d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15800 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58  -----*. */.DLLEX
15810 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66  PORT int Tls_Saf
15820 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
15830 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20   *interp) {.    
15840 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
15850 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c  );.    return(Tl
15860 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b  s_Init(interp));
15870 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
15880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
158b0 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69  . *. *.TlsLibIni
158c0 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d  t --. *. *.-----
158d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09  -----------*. *.
15900 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20  Initializes SSL 
15910 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72  library once per
15920 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09   application. *.
15930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15960 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66  *. *. *.Side eff
15970 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61  ects:. *..initia
15980 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72  lizes SSL librar
15990 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a  y. *. *.Result:.
159a0 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d   *..none. *. *--
159b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159e0 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ----*. */.static
159f0 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28   int TlsLibInit(
15a00 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  int uninitialize
15a10 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  ) {.    static i
15a20 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  nt initialized =
15a30 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74   0;.    int stat
15a40 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66  us = TCL_OK;.#if
15a50 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
15a60 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
15a70 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
15a80 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d  ).    size_t num
15a90 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a  _locks;.#endif..
15aa0 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61      if (uninitia
15ab0 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e  lize) {..if (!in
15ac0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20  itialized) {..  
15ad0 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64    dprintf("Asked
15ae0 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   to uninitialize
15af0 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74  , but we are not
15b00 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a   initialized");.
15b10 0a 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c  ..    return(TCL
15b20 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e  _OK);..}...dprin
15b30 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69  tf("Asked to uni
15b40 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69  nitialize");..#i
15b50 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
15b60 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
15b70 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
15b80 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63  S)..Tcl_MutexLoc
15b90 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69  k(&init_mx);...i
15ba0 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20  f (locks) {..   
15bb0 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20   free(locks);.. 
15bc0 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b     locks = NULL;
15bd0 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74  ..    locksCount
15be0 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a   = 0;..}.#endif.
15bf0 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30  .initialized = 0
15c00 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
15c10 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
15c20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
15c30 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74  HREADS)..Tcl_Mut
15c40 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d  exUnlock(&init_m
15c50 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74  x);.#endif...ret
15c60 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20  urn(TCL_OK);.   
15c70 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74   }..    if (init
15c80 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69  ialized) {..dpri
15c90 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74  ntf("Called, but
15ca0 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61   using cached va
15cb0 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 28 73  lue");..return(s
15cc0 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  tatus);.    }.. 
15cd0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
15ce0 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  ed");..#if defin
15cf0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
15d00 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
15d10 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
15d20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69  Tcl_MutexLock(&i
15d30 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a  nit_mx);.#endif.
15d40 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20      initialized 
15d50 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 1;..#if define
15d60 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
15d70 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
15d80 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e  L_THREADS).    n
15d90 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20  um_locks = 1;.  
15da0 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28    locksCount = (
15db0 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a  int) num_locks;.
15dc0 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c      locks = mall
15dd0 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73  oc(sizeof(*locks
15de0 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a  ) * num_locks);.
15df0 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73      memset(locks
15e00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63  , 0, sizeof(*loc
15e10 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29  ks) * num_locks)
15e20 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
15e30 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48   Initialize BOTH
15e40 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c   libcrypto and l
15e50 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50  ibssl. */.    OP
15e60 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f  ENSSL_init_ssl(O
15e70 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44  PENSSL_INIT_LOAD
15e80 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f  _SSL_STRINGS | O
15e90 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44  PENSSL_INIT_LOAD
15ea0 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a  _CRYPTO_STRINGS.
15eb0 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f  .| OPENSSL_INIT_
15ec0 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20  ADD_ALL_CIPHERS 
15ed0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41  | OPENSSL_INIT_A
15ee0 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20  DD_ALL_DIGESTS, 
15ef0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f  NULL);..    BIO_
15f00 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29  new_tcl(NULL, 0)
15f10 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a  ;..#if 0.    /*.
15f20 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a       * XXX:TODO:
15f30 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64   Remove this cod
15f40 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74  e and replace it
15f50 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20   with a check.  
15f60 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20     * for enough 
15f70 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e  entropy and do n
15f80 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  ot try to create
15f90 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20   our own.     * 
15fa0 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79  terrible entropy
15fb0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a  .     */.    /*.
15fc0 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20       * Seed the 
15fd0 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65  random number ge
15fe0 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53  nerator in the S
15ff0 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20  SL library,.    
16000 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f   * using the do/
16010 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20  while construct 
16020 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62  because of the b
16030 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20  ug note in the. 
16040 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41      * OpenSSL FA
16050 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e  Q at http://www.
16060 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70  openssl.org/supp
16070 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45  ort/faq.html#USE
16080 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  R1.     *.     *
16090 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65   The crux of the
160a0 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74   problem is that
160b0 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20   Solaris 7 does 
160c0 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20  not have a.     
160d0 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72  * /dev/random or
160e0 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65   /dev/urandom de
160f0 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f  vice so it canno
16100 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a  t gather enough.
16110 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66       * entropy f
16120 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65  rom the RAND_see
16130 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69  d() when TLS ini
16140 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66  tializes and ref
16150 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67  uses.     * to g
16160 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69  o further. Earli
16170 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f  er versions of O
16180 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f  penSSL carried o
16190 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20  n regardless..  
161a0 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28     */.    srand(
161b0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74  (unsigned int) t
161c0 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e  ime((time_t *) N
161d0 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a  ULL));.    do {.
161e0 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c  .for (i = 0; i <
161f0 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20   16; i++) {..   
16200 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31   rnd_seed[i] = 1
16210 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30   + (char) (255.0
16220 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f   * rand()/(RAND_
16230 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52  MAX+1.0));..}..R
16240 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65  AND_seed(rnd_see
16250 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65  d, sizeof(rnd_se
16260 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c  ed));.    } whil
16270 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29  e (RAND_status()
16280 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a   != 1);.#endif..
16290 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
162a0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
162b0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
162c0 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55  ADS)..Tcl_MutexU
162d0 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b  nlock(&init_mx);
162e0 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e  .#endif...return
162f0 28 73 74 61 74 75 73 29 3b 0a 7d 0a              (status);.}.