Hex Artifact Content

Artifact d05c00dc5bafde8d6b140f210107035aad4f258e35085f0bae927bb1df2d5023:


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 2f 2a 2a 2a 2a 2a 2a 2a  ADS */../*******
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
09a0: 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20  * Callbacks     
09b0: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0c 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 6d 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 2d 2d 2d  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: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
0fd0: 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f  .InfoCallback(co
0fe0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e  nst SSL *ssl, in
0ff0: 74 20 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74  t where, int ret
1000: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
1010: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
1020: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61  *)SSL_get_app_da
1030: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a  ta((SSL *)ssl);.
1040: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
1050: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
1060: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
1070: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
1080: 20 20 20 20 63 68 61 72 20 2a 6d 61 6a 6f 72 3b      char *major;
1090: 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b 0a 0a 20   char *minor;.. 
10a0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
10b0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
10c0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
10d0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
10e0: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 23  ULL)..return;..#
10f0: 69 66 20 30 0a 20 20 20 20 69 66 20 28 77 68 65  if 0.    if (whe
1100: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
1110: 54 29 20 7b 0a 09 73 65 76 20 3d 20 53 53 4c 5f  T) {..sev = SSL_
1120: 61 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e  alert_type_strin
1130: 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 09 69 66  g_long(ret);..if
1140: 20 28 73 74 72 63 6d 70 28 73 65 76 2c 20 22 66   (strcmp(sev, "f
1150: 61 74 61 6c 22 29 3d 3d 30 29 20 7b 09 2f 2a 20  atal")==0) {./* 
1160: 4d 61 70 20 74 6f 20 65 72 72 6f 72 20 2a 2f 0a  Map to error */.
1170: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73  .    Tls_Error(s
1180: 74 61 74 65 50 74 72 2c 20 53 53 4c 5f 45 52 52  tatePtr, SSL_ERR
1190: 4f 52 28 73 73 6c 2c 20 30 29 29 3b 0a 09 20 20  OR(ssl, 0));..  
11a0: 20 20 72 65 74 75 72 6e 3b 0a 09 7d 0a 20 20 20    return;..}.   
11b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69   }.#endif..    i
11c0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
11d0: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52  B_HANDSHAKE_STAR
11e0: 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68  T) {..major = "h
11f0: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f  andshake";..mino
1200: 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20  r = "start";.   
1210: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72   } else if (wher
1220: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53  e & SSL_CB_HANDS
1230: 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61  HAKE_DONE) {..ma
1240: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65  jor = "handshake
1250: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e  ";..minor = "don
1260: 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  e";.    } else {
1270: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53  ..if (where & SS
1280: 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a  L_CB_ALERT)..maj
1290: 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65  or = "alert";..e
12a0: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
12b0: 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09  SSL_ST_CONNECT).
12c0: 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74  major = "connect
12d0: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
12e0: 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45  re & SSL_ST_ACCE
12f0: 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63  PT)..major = "ac
1300: 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09  cept";..else....
1310: 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77  .major = "unknow
1320: 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20  n";...if (where 
1330: 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09  & SSL_CB_READ)..
1340: 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a  minor = "read";.
1350: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
1360: 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09  & SSL_CB_WRITE).
1370: 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22  .minor = "write"
1380: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1390: 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29  e & SSL_CB_LOOP)
13a0: 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22  ..minor = "loop"
13b0: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
13c0: 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29  e & SSL_CB_EXIT)
13d0: 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22  ..minor = "exit"
13e0: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f  ;..else.....mino
13f0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20  r = "unknown";. 
1400: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
1410: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
1420: 76 61 6c 20 66 72 6f 6d 20 63 61 6c 6c 62 61 63  val from callbac
1430: 6b 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  k */.    cmdPtr 
1440: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
1450: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
1460: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  lback);.    Tcl_
1470: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1480: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1490: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
14a0: 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31  ngObj("info", -1
14b0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
14c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
14d0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
14e0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
14f0: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
1500: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
1510: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
1520: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1530: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1540: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
1550: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
1560: 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ajor, -1));.    
1570: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1580: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1590: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
15a0: 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c  StringObj(minor,
15b0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20 28   -1));..    if (
15c0: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41  where & SSL_CB_A
15d0: 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69 73  LERT) {..Tcl_Lis
15e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
15f0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1600: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1610: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72  ringObj(SSL_aler
1620: 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c 6f  t_desc_string_lo
1630: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 09  ng(ret), -1));..
1640: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1650: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1660: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
1670: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
1680: 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 74  SL_alert_type_st
1690: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20  ring_long(ret), 
16a0: 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  -1));.    } else
16b0: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
16c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
16d0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
16e0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
16f0: 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72  bj(SSL_state_str
1700: 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d  ing_long(ssl), -
1710: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
1720: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1730: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1740: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1750: 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20  "info", -1));.  
1760: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c    }..    /* Eval
1770: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
1780: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
1790: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
17a0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62  );.    EvalCallb
17b0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
17c0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20  ePtr, cmdPtr);. 
17d0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
17e0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c  unt(cmdPtr);.}..
17f0: 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
1840: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d  VerifyCallback -
1850: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73  -. *. *.Monitors
1860: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65   SSL certificate
1870: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63   validation proc
1880: 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e  ess. Used to con
1890: 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61  trol the. *.beha
18a0: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53  vior when the SS
18b0: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c  L_VERIFY_PEER fl
18c0: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
18d0: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65  is called. *.whe
18e0: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63  never a certific
18f0: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64  ate is inspected
1900: 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61   or decided inva
1910: 6c 69 64 2e 0a 20 2a 0a 20 2a 20 43 68 65 63 6b  lid.. *. * Check
1920: 73 3a 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74  s:. *.certificat
1930: 65 20 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b  e chain is check
1940: 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  ed starting with
1950: 20 74 68 65 20 64 65 65 70 65 73 74 20 6e 65 73   the deepest nes
1960: 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20  ting level. *.  
1970: 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72  (the root CA cer
1980: 74 69 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f  tificate) and wo
1990: 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f 20 74  rked upward to t
19a0: 68 65 20 70 65 65 72 27 73 20 63 65 72 74 69 66  he peer's certif
19b0: 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69  icate.. *.All si
19c0: 67 6e 61 74 75 72 65 73 20 61 72 65 20 76 61 6c  gnatures are val
19d0: 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65  id, current time
19e0: 20 69 73 20 77 69 74 68 69 6e 20 66 69 72 73 74   is within first
19f0: 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69   and last validi
1a00: 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63  ty time.. *.Chec
1a10: 6b 20 74 68 61 74 20 74 68 65 20 63 65 72 74 69  k that the certi
1a20: 66 69 63 61 74 65 20 69 73 20 69 73 73 75 65 64  ficate is issued
1a30: 20 62 79 20 74 68 65 20 69 73 73 75 65 72 20 63   by the issuer c
1a40: 65 72 74 69 66 69 63 61 74 65 20 69 73 73 75 65  ertificate issue
1a50: 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20  r.. *.Check the 
1a60: 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75  revocation statu
1a70: 73 20 66 6f 72 20 65 61 63 68 20 63 65 72 74 69  s for each certi
1a80: 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b  ficate.. *.Check
1a90: 20 74 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66   the validity of
1aa0: 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61   the given CRL a
1ab0: 6e 64 20 74 68 65 20 63 65 72 74 20 72 65 76 6f  nd the cert revo
1ac0: 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20  cation status.. 
1ad0: 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69  *.Check the poli
1ae0: 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20  cies of all the 
1af0: 63 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a  certificates. *.
1b00: 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65   * Args. *.preve
1b10: 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65  rify_ok indicate
1b20: 73 20 77 68 65 74 68 65 72 20 74 68 65 20 63 65  s whether the ce
1b30: 72 74 69 66 69 63 61 74 65 20 76 65 72 69 66 69  rtificate verifi
1b40: 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31  cation passed (1
1b50: 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a  ) or not (0). *.
1b60: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
1b70: 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20   callback bound 
1b80: 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61  to the socket ma
1b90: 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a  y return one of:
1ba0: 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68  . *.    0...- th
1bb0: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  e certificate is
1bc0: 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c   deemed invalid,
1bd0: 20 73 65 6e 64 20 76 65 72 69 66 69 63 61 74 69   send verificati
1be0: 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75  on. *....  failu
1bf0: 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72  re alert to peer
1c00: 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20  , and terminate 
1c10: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20  handshake.. *.  
1c20: 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72 74    1...- the cert
1c30: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65  ificate is deeme
1c40: 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75  d valid, continu
1c50: 65 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65  e with handshake
1c60: 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73  .. *.    empty s
1c70: 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67  tring.- no chang
1c80: 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 65  e to certificate
1c90: 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20   validation. *. 
1ca0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
1cb0: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64   *.The err field
1cc0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c   of the currentl
1cd0: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74  y operative Stat
1ce0: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f  e is set. *.  to
1cf0: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69   a string descri
1d00: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67  bing the SSL neg
1d10: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  otiation failure
1d20: 20 72 65 61 73 6f 6e 0a 20 2a 2d 2d 2d 2d 2d 2d   reason. *------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1d70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72  /.static int.Ver
1d80: 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20  ifyCallback(int 
1d90: 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f 43  ok, X509_STORE_C
1da0: 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20 54  TX *ctx) {.    T
1db0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
1dc0: 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 09      SSL   *ssl..
1dd0: 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f  = (SSL*)X509_STO
1de0: 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 61  RE_CTX_get_ex_da
1df0: 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f  ta(ctx, SSL_get_
1e00: 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 4f  ex_data_X509_STO
1e10: 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a 20  RE_CTX_idx());. 
1e20: 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 09     X509  *cert..
1e30: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58  = X509_STORE_CTX
1e40: 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72  _get_current_cer
1e50: 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74  t(ctx);.    Stat
1e60: 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53  e *statePtr.= (S
1e70: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70  tate*)SSL_get_ap
1e80: 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20  p_data(ssl);.   
1e90: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1ea0: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
1eb0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20  interp;.    int 
1ec0: 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54  depth..= X509_ST
1ed0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f  ORE_CTX_get_erro
1ee0: 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20  r_depth(ctx);.  
1ef0: 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30    int err..= X50
1f00: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f  9_STORE_CTX_get_
1f10: 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20  error(ctx);..   
1f20: 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79   dprintf("Verify
1f30: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20  : %d", ok);..   
1f40: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
1f50: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
1f60: 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74  )NULL) {..if (st
1f70: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26  atePtr->vflags &
1f80: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
1f90: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
1fa0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
1fb0: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ok;..} else {.. 
1fc0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a     return 1;..}.
1fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
1fe0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
1ff0: 65 76 61 6c 20 66 72 6f 6d 20 63 61 6c 6c 62 61  eval from callba
2000: 63 6b 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  ck */.    cmdPtr
2010: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
2020: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
2030: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
2040: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2050: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2060: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2070: 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29  bj("verify", -1)
2080: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2090: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
20a0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
20b0: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  .Tcl_NewStringOb
20c0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
20d0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
20e0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
20f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2100: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2110: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2120: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a  IntObj(depth));.
2130: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2140: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2150: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73  erp, cmdPtr, Tls
2160: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
2170: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20  rp, cert));.    
2180: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2190: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
21a0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
21b0: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20  IntObj(ok));.   
21c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
21d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
21e0: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
21f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
2200: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63  r*)X509_verify_c
2210: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
2220: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  (err), -1));..  
2230: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67    statePtr->flag
2240: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c  s |= TLS_TCL_CAL
2250: 4c 42 41 43 4b 3b 0a 0a 20 20 20 20 2f 2a 20 45  LBACK;..    /* E
2260: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
2270: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
2280: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
2290: 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45  Ptr);.    ok = E
22a0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
22b0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
22c0: 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  dPtr);.    Tcl_D
22d0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
22e0: 74 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50  tr);..    stateP
22f0: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54  tr->flags &= ~(T
2300: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29  LS_TCL_CALLBACK)
2310: 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29  ;.    return(ok)
2320: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c  ;./* By default,
2330: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74   leave verificat
2340: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a  ion unchanged..*
2350: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  /.}.../*. *-----
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
23a0: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d  *. * Tls_Error -
23b0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  -. *. *.Calls ca
23c0: 6c 6c 62 61 63 6b 20 77 69 74 68 20 24 66 64 20  llback with $fd 
23d0: 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f 20 74 68  and $msg - so th
23e0: 65 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 64  e callback can d
23f0: 65 63 69 64 65 0a 20 2a 09 77 68 61 74 20 74 6f  ecide. *.what to
2400: 20 64 6f 20 77 69 74 68 20 65 72 72 6f 72 73 2e   do with errors.
2410: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
2420: 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20  cts:. *.The err 
2430: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72  field of the cur
2440: 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65  rently operative
2450: 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a   State is set. *
2460: 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64  .  to a string d
2470: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53  escribing the SS
2480: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61  L negotiation fa
2490: 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d  ilure reason. *-
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24e0: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f  --. */.void.Tls_
24f0: 45 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61  Error(State *sta
2500: 74 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67  tePtr, char *msg
2510: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  ) {.    Tcl_Inte
2520: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
2530: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
2540: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
2550: 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  tr;..    dprintf
2560: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
2570: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
2580: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f  allback == (Tcl_
2590: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75  Obj*)NULL)..retu
25a0: 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 6d 73 67  rn;..    if (msg
25b0: 20 26 26 20 2a 6d 73 67 29 20 7b 0a 09 54 63 6c   && *msg) {..Tcl
25c0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
25d0: 74 65 72 70 2c 20 22 53 53 4c 22 2c 20 6d 73 67  terp, "SSL", msg
25e0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
25f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6d  .    } else {..m
2600: 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  sg = Tcl_GetStri
2610: 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65  ngFromObj(Tcl_Ge
2620: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2630: 70 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  p), NULL);.    }
2640: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65  .    statePtr->e
2650: 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69  rr = msg;..    i
2660: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
2670: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
2680: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72  j*)NULL) {..char
2690: 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73   buf[BUFSIZ];..s
26a0: 70 72 69 6e 74 66 28 62 75 66 2c 20 22 53 53 4c  printf(buf, "SSL
26b0: 20 63 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a   channel \"%s\":
26c0: 20 65 72 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20   error: %s",..  
26d0: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
26e0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
26f0: 65 6c 66 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c  elf), msg);..Tcl
2700: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
2710: 70 2c 20 62 75 66 2c 20 54 43 4c 5f 56 4f 4c 41  p, buf, TCL_VOLA
2720: 54 49 4c 45 29 3b 0a 23 69 66 20 28 54 43 4c 5f  TILE);.#if (TCL_
2730: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d  MAJOR_VERSION ==
2740: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f   8) && (TCL_MINO
2750: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09  R_VERSION < 6)..
2760: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
2770: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c  ror(interp);.#el
2780: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  se..Tcl_Backgrou
2790: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65  ndException(inte
27a0: 72 70 2c 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  rp, TCL_ERROR);.
27b0: 23 65 6e 64 69 66 0a 09 72 65 74 75 72 6e 3b 0a  #endif..return;.
27c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
27d0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
27e0: 65 76 61 6c 20 66 72 6f 6d 20 63 61 6c 6c 62 61  eval from callba
27f0: 63 6b 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  ck */.    cmdPtr
2800: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
2810: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
2820: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c  llback);.    Tcl
2830: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2840: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2850: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2860: 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20  ingObj("error", 
2870: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2880: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2890: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
28a0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
28b0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
28c0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
28d0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
28e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
28f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2900: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2910: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2920: 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  (msg, -1));..   
2930: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
2940: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
2950: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
2960: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45  t(cmdPtr);.    E
2970: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
2980: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
2990: 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  dPtr);.    Tcl_D
29a0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
29b0: 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  tr);.}.../*. *--
29c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a00: 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61  -. *. * KeyLogCa
2a10: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
2a20: 57 72 69 74 65 20 72 65 63 65 69 76 65 64 20 6b  Write received k
2a30: 65 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66  ey data to log f
2a40: 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ile.. *. * Side 
2a50: 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65  effects:. *.none
2a60: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2aa0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
2ab0: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63  KeyLogCallback(c
2ac0: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63  onst SSL *ssl, c
2ad0: 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29  onst char *line)
2ae0: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72   {.    char *str
2af0: 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59   = getenv(SSLKEY
2b00: 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49  LOGFILE);.    FI
2b10: 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69 66 20 28  LE *fd;.    if (
2b20: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70  str) {..fd = fop
2b30: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66  en(str, "a");..f
2b40: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e  printf(fd, "%s\n
2b50: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65  ",line);..fclose
2b60: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a  (fd);.    }.}...
2b70: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50  --------. *. * P
2bc0: 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b  assword Callback
2bd0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
2be0: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64   when a password
2bf0: 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e   is needed to un
2c00: 70 61 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d  pack RSA and PEM
2c10: 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61 6c 73 20   keys.. *.Evals 
2c20: 61 6e 79 20 62 6f 75 6e 64 20 70 61 73 73 77 6f  any bound passwo
2c30: 72 64 20 73 63 72 69 70 74 20 61 6e 64 20 72 65  rd script and re
2c40: 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74  turns the result
2c50: 20 61 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77   as. *.the passw
2c60: 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20 2a 2d 2d  ord string.. *--
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cb0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
2cc0: 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63  .PasswordCallbac
2cd0: 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74  k(char *buf, int
2ce0: 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 72 69 66   size, int verif
2cf0: 79 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20  y, void *udata) 
2d00: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
2d10: 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a  tePtr.= (State *
2d20: 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c  ) udata;.    Tcl
2d30: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
2d40: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
2d50: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
2d60: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
2d70: 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69   code;..    dpri
2d80: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
2d90: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
2da0: 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55  ->password == NU
2db0: 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45  LL) {..if (Tcl_E
2dc0: 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74  valEx(interp, "t
2dd0: 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d  ls::password", -
2de0: 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  1, TCL_EVAL_GLOB
2df0: 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  AL) == TCL_OK) {
2e00: 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65 74 20  ..    char *ret 
2e10: 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47  = (char *) Tcl_G
2e20: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
2e30: 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72  nterp);..    str
2e40: 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28  ncpy(buf, ret, (
2e50: 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09  size_t) size);..
2e60: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29      return (int)
2e70: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20  strlen(ret);..} 
2e80: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75  else {..    retu
2e90: 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a  rn -1;..}.    }.
2ea0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
2eb0: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 66  ommand to eval f
2ec0: 72 6f 6d 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  rom callback */.
2ed0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
2ee0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
2ef0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
2f00: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
2f10: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
2f20: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  ) interp);.    T
2f30: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
2f40: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
2f50: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  r);..    /* Eval
2f60: 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 73 75   callback and su
2f70: 63 63 65 73 73 20 66 6f 72 20 6f 6b 2c 20 61 62  ccess for ok, ab
2f80: 6f 72 74 20 66 6f 72 20 65 72 72 6f 72 2c 20 63  ort for error, c
2f90: 6f 6e 74 69 6e 75 65 20 66 6f 72 20 63 6f 6e 74  ontinue for cont
2fa0: 69 6e 75 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  inue */.    Tcl_
2fb0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
2fc0: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d  Ptr);.    code =
2fd0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
2fe0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2ff0: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b  CL_EVAL_GLOBAL);
3000: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d  .    if (code !=
3010: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28   TCL_OK) {.#if (
3020: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
3030: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f  N == 8) && (TCL_
3040: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20  MINOR_VERSION < 
3050: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  6)..Tcl_Backgrou
3060: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ndError(interp);
3070: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b  .#else..Tcl_Back
3080: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28  groundException(
3090: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23  interp, code);.#
30a0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
30b0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
30c0: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54  (cmdPtr);..    T
30d0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
30e0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
30f0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 6f 64 65  );..    if (code
3100: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63   == TCL_OK) {..c
3110: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72  har *ret = (char
3120: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   *) Tcl_GetStrin
3130: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  gResult(interp);
3140: 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 72 65 74  ..if (strlen(ret
3150: 29 20 3c 20 73 69 7a 65 20 2d 20 31 29 20 7b 0a  ) < size - 1) {.
3160: 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66  .    strncpy(buf
3170: 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20  , ret, (size_t) 
3180: 73 69 7a 65 29 3b 0a 09 20 20 20 20 54 63 6c 5f  size);..    Tcl_
3190: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
31a0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 20  ata) interp);.. 
31b0: 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73     return (int)s
31c0: 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 0a 20  trlen(ret);..}. 
31d0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c     }.    Tcl_Rel
31e0: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61  ease((ClientData
31f0: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72  ) interp);.    r
3200: 65 74 75 72 6e 20 2d 31 3b 0a 09 76 65 72 69 66  eturn -1;..verif
3210: 79 20 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 0c 0a  y = verify;.}...
3220: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
3270: 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20  ession Callback 
3280: 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20  for Clients --. 
3290: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e  *. *.Called when
32a0: 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69   a new session i
32b0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  s added to the c
32c0: 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33  ache. In TLS 1.3
32d0: 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20  . *.this may be 
32e0: 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c  received multipl
32f0: 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 68  e times after th
3300: 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72  e handshake. For
3310: 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73  . *.earlier vers
3320: 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  ions, this will 
3330: 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 69  be received duri
3340: 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  ng the handshake
3350: 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 65  .. *.This is the
3360: 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 74   preferred way t
3370: 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d  o obtain a resum
3380: 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a  able session.. *
3390: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
33a0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
33b0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
33c0: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
33d0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
33e0: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30  turn codes:. *.0
33f0: 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 73   = error where s
3400: 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69  ession will be i
3410: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76  mmediately remov
3420: 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  ed from the inte
3430: 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31  rnal cache.. *.1
3440: 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 65   = success where
3450: 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 73   app retains ses
3460: 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20  sion in session 
3470: 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20  cache, and must 
3480: 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e  call SSL_SESSION
3490: 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e  _free() when don
34a0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
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 0a 20 2a 2f 0a  -----------. */.
34f0: 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69  static int.Sessi
3500: 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  onCallback(const
3510: 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53   SSL *ssl, SSL_S
3520: 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29  ESSION *session)
3530: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
3540: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
3550: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74  )SSL_get_app_dat
3560: 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20  a((SSL *)ssl);. 
3570: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
3580: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
3590: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
35a0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
35b0: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
35c0: 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a  d char *ticket;.
35d0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
35e0: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
35f0: 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20  _id;.    size_t 
3600: 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e  len2;.    unsign
3610: 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20  ed int ulen;..  
3620: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
3630: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
3640: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
3650: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
3660: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
3670: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
3680: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
3690: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ssl == NULL) {..
36a0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
36b0: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
36c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
36d0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
36e0: 6c 20 66 72 6f 6d 20 63 61 6c 6c 62 61 63 6b 20  l from callback 
36f0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
3700: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
3710: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
3720: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ack);.    Tcl_Li
3730: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3740: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
3750: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
3760: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d  Obj("session", -
3770: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73  1));..    /* Ses
3780: 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73  sion id */.    s
3790: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f  ession_id = SSL_
37a0: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73  SESSION_get_id(s
37b0: 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a  ession, &ulen);.
37c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
37d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
37e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
37f0: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
3800: 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e  (session_id, (in
3810: 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20  t) ulen));..    
3820: 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
3830: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53  t */.    SSL_SES
3840: 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74  SION_get0_ticket
3850: 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65  (session, &ticke
3860: 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54  t, &len2);.    T
3870: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3880: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3890: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
38a0: 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b  yteArrayObj(tick
38b0: 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 29  et, (int) len2))
38c0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69  ;..    /* Lifeti
38d0: 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73  me - number of s
38e0: 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63  econds */.    Tc
38f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3900: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3910: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c  mdPtr,..Tcl_NewL
3920: 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53  ongObj((long) SS
3930: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
3940: 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69  cket_lifetime_hi
3950: 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a  nt(session)));..
3960: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
3970: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
3980: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
3990: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
39a0: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69    EvalCallback(i
39b0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
39c0: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63   cmdPtr);.    Tc
39d0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
39e0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
39f0: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  rn 0;.}.../*. *-
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61  --. *. * ALPN Ca
3a50: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65  llback for Serve
3a60: 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62  rs and NPN Callb
3a70: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20  ack for Clients 
3a80: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d  --. *. *.Perform
3a90: 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f   protocol (http/
3aa0: 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63  1.1, h2, h3, etc
3ab0: 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72  .) selection for
3ac0: 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67   the. *.incoming
3ad0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c   connection. Cal
3ae0: 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20  led after Hello 
3af0: 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62  and server callb
3b00: 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27  acks.. *.Where '
3b10: 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 64  out' is selected
3b20: 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69   protocol and 'i
3b30: 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20 61  n' is the peer a
3b40: 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a  dvertised list..
3b50: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
3b60: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
3b70: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
3b80: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
3b90: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
3ba0: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
3bb0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
3bc0: 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f  OK: ALPN protoco
3bd0: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20  l selected. The 
3be0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
3bf0: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
3c00: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
3c10: 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e  TAL: There was n
3c20: 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  o overlap betwee
3c30: 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20  n the client's. 
3c40: 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c  *.    supplied l
3c50: 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 76  ist and the serv
3c60: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  er configuration
3c70: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
3c80: 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64   will be aborted
3c90: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
3ca0: 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20  ERR_NOACK: ALPN 
3cb0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c  protocol not sel
3cc0: 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63  ected, e.g., bec
3cd0: 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09  ause no ALPN. *.
3ce0: 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72      protocols ar
3cf0: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  e configured for
3d00: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
3d10: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
3d20: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20   continues.. *. 
3d30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d70: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
3d80: 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b  int.ALPNCallback
3d90: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
3da0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3db0: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69  char **out, unsi
3dc0: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65  gned char *outle
3dd0: 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n,..const unsign
3de0: 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73  ed char *in, uns
3df0: 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c  igned int inlen,
3e00: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
3e10: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
3e20: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
3e30: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
3e40: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
3e50: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
3e60: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
3e70: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72  .    int code, r
3e80: 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  es;..    dprintf
3e90: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
3ea0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
3eb0: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
3ec0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
3ed0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
3ee0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
3ef0: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a  elect protocol *
3f00: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65  /.    if (SSL_se
3f10: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28  lect_next_proto(
3f20: 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61  out, outlen, sta
3f30: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73  tePtr->protos, s
3f40: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f  tatePtr->protos_
3f50: 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29  len,..in, inlen)
3f60: 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f   == OPENSSL_NPN_
3f70: 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f  NEGOTIATED) {../
3f80: 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f  * Match found */
3f90: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
3fa0: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
3fb0: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e   else {../* OPEN
3fc0: 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c  SSL_NPN_NO_OVERL
3fd0: 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c  AP = No overlap,
3fe0: 20 73 6f 20 75 73 65 20 66 69 72 73 74 20 69 74   so use first it
3ff0: 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70  em from client p
4000: 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a  rotocol list */.
4010: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
4020: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
4030: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74   }..    if (stat
4040: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54  ePtr->vcmd == (T
4050: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
4060: 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 20  .return res;.   
4070: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
4080: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
4090: 6c 20 66 72 6f 6d 20 63 61 6c 6c 62 61 63 6b 20  l from callback 
40a0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
40b0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
40c0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
40d0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
40e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
40f0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
4100: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4110: 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20  "alpn", -1));.  
4120: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4130: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4140: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
4150: 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f 75 74  ewStringObj(*out
4160: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
4170: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
4180: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
4190: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
41a0: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28  dPtr);.    if ((
41b0: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62  code = EvalCallb
41c0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
41d0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e  ePtr, cmdPtr)) >
41e0: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
41f0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
4200: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  K;.    } else if
4210: 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09   (code == 1) {..
4220: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
4230: 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65  _ERR_OK;.    } e
4240: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c  lse {..res = SSL
4250: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
4260: 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20  T_FATAL;.    }. 
4270: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
4280: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
4290: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c   return res;.}..
42a0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
42b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
42f0: 41 64 76 65 72 74 69 73 65 20 50 72 6f 74 6f 63  Advertise Protoc
4300: 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ols Callback for
4310: 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e   Next Protocol N
4320: 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29  egotiation (NPN)
4330: 20 69 6e 20 53 65 72 76 65 72 48 65 6c 6c 6f 20   in ServerHello 
4340: 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20  --. *. *.called 
4350: 77 68 65 6e 20 61 20 54 4c 53 20 73 65 72 76 65  when a TLS serve
4360: 72 20 6e 65 65 64 73 20 61 20 6c 69 73 74 20 6f  r needs a list o
4370: 66 20 73 75 70 70 6f 72 74 65 64 20 70 72 6f 74  f supported prot
4380: 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20  ocols for Next. 
4390: 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74  *.Protocol Negot
43a0: 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65  iation.. *. * Re
43b0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
43c0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
43d0: 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  s:. *. * Return 
43e0: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c  codes:. *.SSL_TL
43f0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e  SEXT_ERR_OK: NPN
4400: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74   protocol select
4410: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
4420: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
4430: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
4440: 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f  NOACK: NPN proto
4450: 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64  col not selected
4460: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4470: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20   continues.. *. 
4480: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20  ----. */.#ifdef 
44d0: 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69  USE_NPN.static i
44e0: 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63  nt.NPNCallback(c
44f0: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63  onst SSL *ssl, c
4500: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4510: 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e  ar **out, unsign
4520: 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20  ed int *outlen, 
4530: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20  void *arg) {.   
4540: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
4550: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a   = (State*)arg;.
4560: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
4570: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
4580: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (ssl == NULL || 
4590: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  arg == NULL) {..
45a0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
45b0: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
45c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70   }..    /* Set p
45d0: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f  rotocols list */
45e0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
45f0: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c  r->protos != NUL
4600: 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61  L) {..*out = sta
4610: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09  tePtr->protos;..
4620: 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 74 65 50  *outlen = stateP
4630: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a  tr->protos_len;.
4640: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f      } else {..*o
4650: 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74  ut = NULL;..*out
4660: 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e  len = 0;..return
4670: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4680: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  NOACK;.    }.   
4690: 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45   return SSL_TLSE
46a0: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e  XT_ERR_OK;.}.#en
46b0: 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  dif.../*. *-----
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4700: 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63  *. * SNI Callbac
4710: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d  k for Servers --
4720: 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73  . *. *.Perform s
4730: 65 72 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68  erver-side SNI h
4740: 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f  ostname selectio
4750: 6e 20 61 66 74 65 72 20 72 65 63 65 69 76 69 6e  n after receivin
4760: 67 20 53 4e 49 20 68 65 61 64 65 72 2e 0a 20 2a  g SNI header.. *
4770: 09 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65  .Called after he
4780: 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74  llo callback but
4790: 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c   before ALPN cal
47a0: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73  lback.. *. * Res
47b0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
47c0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
47d0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
47e0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
47f0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
4800: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  des:. *.SSL_TLSE
4810: 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68  XT_ERR_OK: SNI h
4820: 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70  ostname is accep
4830: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
4840: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
4850: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
4860: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e  _ALERT_FATAL: SN
4870: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f  I hostname is no
4880: 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20  t accepted. The 
4890: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20  connection. *.  
48a0: 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65    is aborted. De
48b0: 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20  fault for alert 
48c0: 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f  is SSL_AD_UNRECO
48d0: 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09  GNIZED_NAME.. *.
48e0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
48f0: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e  LERT_WARNING: SN
4900: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f  I hostname is no
4910: 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e  t accepted, warn
4920: 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20  ing alert. *.   
4930: 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f   sent (not suppo
4940: 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29  rted in TLSv1.3)
4950: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4960: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
4970: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
4980: 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  ACK: SNI hostnam
4990: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65  e is not accepte
49a0: 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77  d and not acknow
49b0: 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65  ledged,. *.    e
49c0: 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e  .g. if SNI has n
49d0: 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  ot been configur
49e0: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
49f0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
4a00: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a40: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
4a50: 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63  c int.SNICallbac
4a60: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
4a70: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f  , int *alert, vo
4a80: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
4a90: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
4aa0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
4ab0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4ac0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
4ad0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
4ae0: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
4af0: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
4b00: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65  .    char *serve
4b10: 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  rname = NULL;.. 
4b20: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
4b30: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
4b40: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  sl == NULL || ar
4b50: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g == NULL) {..re
4b60: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
4b70: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
4b80: 0a 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65  ..    servername
4b90: 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65   = SSL_get_serve
4ba0: 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58  rname(ssl, TLSEX
4bb0: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
4bc0: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21  name);.    if (!
4bd0: 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65  servername || se
4be0: 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27  rvername[0] == '
4bf0: 5c 30 27 29 20 7b 0a 20 20 20 20 20 20 20 20 72  \0') {.        r
4c00: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
4c10: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
4c20: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
4c30: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
4c40: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
4c50: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
4c60: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  T_ERR_OK;.    }.
4c70: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
4c80: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 66  ommand to eval f
4c90: 72 6f 6d 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  rom callback */.
4ca0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
4cb0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
4cc0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
4cd0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4ce0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4cf0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
4d00: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e  NewStringObj("sn
4d10: 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  i", -1));.    Tc
4d20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4d30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4d40: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
4d50: 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61  ringObj(serverna
4d60: 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  me , -1));..    
4d70: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
4d80: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
4d90: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
4da0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66  (cmdPtr);.    if
4db0: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61   ((code = EvalCa
4dc0: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
4dd0: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
4de0: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20  ) > 1) {..res = 
4df0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
4e00: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a  LERT_WARNING;..*
4e10: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55  alert = SSL_AD_U
4e20: 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45  NRECOGNIZED_NAME
4e30: 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74  ; /* Not support
4e40: 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f  ed by TLS 1.3 */
4e50: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
4e60: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65  code == 1) {..re
4e70: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
4e80: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  RR_OK;.    } els
4e90: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  e {..res = SSL_T
4ea0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
4eb0: 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d  FATAL;..*alert =
4ec0: 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e   SSL_AD_UNRECOGN
4ed0: 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f  IZED_NAME; /* No
4ee0: 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 54  t supported by T
4ef0: 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a  LS 1.3 */.    }.
4f00: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
4f10: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
4f20: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
4f30: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
4f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
4f80: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e   ClientHello Han
4f90: 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20  dshake Callback 
4fa0: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20  for Servers --. 
4fb0: 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 73 65 72  *. *.Used by ser
4fc0: 76 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74  ver to examine t
4fd0: 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69  he server name i
4fe0: 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20  ndication (SNI) 
4ff0: 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f  extension. *.pro
5000: 76 69 64 65 64 20 62 79 20 74 68 65 20 63 6c 69  vided by the cli
5010: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
5020: 73 65 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70  select an approp
5030: 72 69 61 74 65 20 63 65 72 74 69 66 69 63 61 74  riate certificat
5040: 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c  e to. *.present,
5050: 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20   and make other 
5060: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64  configuration ad
5070: 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61  justments releva
5080: 6e 74 20 74 6f 20 74 68 61 74 20 73 65 72 76 65  nt to that serve
5090: 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74  r. *.name and it
50a0: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  s configuration.
50b0: 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73   This includes s
50c0: 77 61 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20  wapping out the 
50d0: 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53  associated. *.SS
50e0: 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d  L_CTX pointer, m
50f0: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 65 72  odifying the ser
5100: 76 65 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65  ver's list of pe
5110: 72 6d 69 74 74 65 64 20 54 4c 53 20 76 65 72 73  rmitted TLS vers
5120: 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e  ions,. *.changin
5130: 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20 63  g the server's c
5140: 69 70 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65  ipher list in re
5150: 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c  sponse to the cl
5160: 69 65 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69  ient's cipher li
5170: 73 74 2c 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c  st, etc.. *.Call
5180: 65 64 20 62 65 66 6f 72 65 20 53 4e 49 20 61 6e  ed before SNI an
5190: 64 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73  d ALPN callbacks
51a0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
51b0: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
51c0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
51d0: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
51e0: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
51f0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
5200: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   *.SSL_CLIENT_HE
5210: 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 75 73 70 65  LLO_RETRY: suspe
5220: 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  nd the handshake
5230: 2c 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68  , and the handsh
5240: 61 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  ake function wil
5250: 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  l return immedia
5260: 74 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45  tely. *.SSL_CLIE
5270: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20  NT_HELLO_ERROR: 
5280: 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61  failure, termina
5290: 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53  te connection. S
52a0: 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f  et alert to erro
52b0: 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43  r code.. *.SSL_C
52c0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43  LIENT_HELLO_SUCC
52d0: 45 53 53 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a  ESS: success. *.
52e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
52f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5320: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
5330: 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61   int.HelloCallba
5340: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
5350: 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76  l, int *alert, v
5360: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
5370: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
5380: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20  = (State*)arg;. 
5390: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
53a0: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
53b0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
53c0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
53d0: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73     int code, res
53e0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
53f0: 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20   *servername;.  
5400: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
5410: 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69   char *p;.    si
5420: 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e  ze_t len, remain
5430: 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ing;..    dprint
5440: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
5450: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
5460: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  vcmd == (Tcl_Obj
5470: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
5480: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
5490: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20  LO_SUCCESS;.    
54a0: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d  } else if (ssl =
54b0: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
54c0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
54d0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
54e0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  O_ERROR;.    }..
54f0: 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73      /* Get names
5500: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c   */.    if (!SSL
5510: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65  _client_hello_ge
5520: 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c 53 45  t0_ext(ssl, TLSE
5530: 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72 5f 6e  XT_TYPE_server_n
5540: 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e  ame, &p, &remain
5550: 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e  ing) || remainin
5560: 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72  g <= 2) {..*aler
5570: 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f  t = SSL_R_SSLV3_
5580: 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41  ALERT_ILLEGAL_PA
5590: 52 41 4d 45 54 45 52 3b 0a 20 20 20 20 20 20 20  RAMETER;.       
55a0: 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45   return SSL_CLIE
55b0: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
55c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78      }..    /* Ex
55d0: 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67 74 68  tract the length
55e0: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
55f0: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20   list of names. 
5600: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28  */.    len = (*(
5610: 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20  p++) << 8);.    
5620: 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20  len += *(p++);. 
5630: 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 21     if (len + 2 !
5640: 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09  = remaining) {..
5650: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53  *alert = SSL_R_S
5660: 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47  SLV3_ALERT_ILLEG
5670: 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 20 20  AL_PARAMETER;.  
5680: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c        return SSL
5690: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
56a0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
56b0: 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a  emaining = len;.
56c0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74  .    /* The list
56d0: 20 69 6e 20 70 72 61 63 74 69 63 65 20 6f 6e 6c   in practice onl
56e0: 79 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20 65  y has a single e
56f0: 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e  lement, so we on
5700: 6c 79 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  ly consider the 
5710: 66 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20  first one. */.  
5720: 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20    if (remaining 
5730: 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20  == 0 || *p++ != 
5740: 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f  TLSEXT_NAMETYPE_
5750: 68 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61  host_name) {..*a
5760: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
5770: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41  V1_ALERT_INTERNA
5780: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
5790: 20 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45   return SSL_CLIE
57a0: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
57b0: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e      }.    remain
57c0: 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e  ing--;..    /* N
57d0: 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c  ow we can finall
57e0: 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62  y pull out the b
57f0: 79 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74  yte array with t
5800: 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61  he actual hostna
5810: 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72  me. */.    if (r
5820: 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b  emaining <= 2) {
5830: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
5840: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54  _TLSV1_ALERT_INT
5850: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  ERNAL_ERROR;.   
5860: 20 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f       return SSL_
5870: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
5880: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  OR;.    }.    le
5890: 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38  n = (*(p++) << 8
58a0: 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28  );.    len += *(
58b0: 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65  p++);.    if (le
58c0: 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e  n + 2 > remainin
58d0: 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  g) {..*alert = S
58e0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
58f0: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b  _INTERNAL_ERROR;
5900: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5910: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
5920: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
5930: 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65    remaining = le
5940: 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d  n;.    servernam
5950: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
5960: 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  *)p;..    /* Cre
5970: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
5980: 76 61 6c 20 66 72 6f 6d 20 63 61 6c 6c 62 61 63  val from callbac
5990: 6b 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  k */.    cmdPtr 
59a0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
59b0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  bj(statePtr->vcm
59c0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
59d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
59e0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
59f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5a00: 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b  j("hello", -1));
5a10: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
5a20: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
5a30: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
5a40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
5a50: 65 72 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 29  ervername, (int)
5a60: 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20   len));..    /* 
5a70: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
5a80: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
5a90: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
5aa0: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28  dPtr);.    if ((
5ab0: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62  code = EvalCallb
5ac0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
5ad0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e  ePtr, cmdPtr)) >
5ae0: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
5af0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45  _CLIENT_HELLO_RE
5b00: 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  TRY;..*alert = S
5b10: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
5b20: 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b  _USER_CANCELLED;
5b30: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
5b40: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65  code == 1) {..re
5b50: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  s = SSL_CLIENT_H
5b60: 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20  ELLO_SUCCESS;.  
5b70: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
5b80: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
5b90: 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72  LO_ERROR;..*aler
5ba0: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f  t = SSL_R_TLSV1_
5bb0: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45  ALERT_INTERNAL_E
5bc0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
5bd0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5be0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
5bf0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
5c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c10: 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73  ***/./* Commands
5c20: 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a           */./***
5c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c40: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  */../*. *-------
5c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5c90: 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64   * CiphersObjCmd
5ca0: 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62   -- list availab
5cb0: 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a  le ciphers. *. *
5cc0: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
5cd0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72  is invoked to pr
5ce0: 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a  ocess the "tls::
5cf0: 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64  ciphers" command
5d00: 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69  . *.to list avai
5d10: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62  lable ciphers, b
5d20: 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63  ased upon protoc
5d30: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a  ol selected.. *.
5d40: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
5d50: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
5d60: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  sult list.. *. *
5d70: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
5d80: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64  *.constructs and
5d90: 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f   destroys SSL co
5da0: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20  ntext (CTX). *. 
5db0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5df0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
5e00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74  const char *prot
5e10: 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73  ocols[] = {.."ss
5e20: 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c  l2", "ssl3", "tl
5e30: 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22  s1", "tls1.1", "
5e40: 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33  tls1.2", "tls1.3
5e50: 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20  ", NULL.};.enum 
5e60: 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54  protocol {.    T
5e70: 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c  LS_SSL2, TLS_SSL
5e80: 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53  3, TLS_TLS1, TLS
5e90: 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53  _TLS1_1, TLS_TLS
5ea0: 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c  1_2, TLS_TLS1_3,
5eb0: 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74   TLS_NONE.};..st
5ec0: 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73  atic int.Ciphers
5ed0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
5ee0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
5ef0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5f00: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
5f10: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
5f20: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ]) {.    Tcl_Obj
5f30: 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b   *objPtr = NULL;
5f40: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74  .    SSL_CTX *ct
5f50: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53  x = NULL;.    SS
5f60: 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20  L *ssl = NULL;. 
5f70: 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f     STACK_OF(SSL_
5f80: 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20  CIPHER) *sk;.   
5f90: 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b 42   char *cp, buf[B
5fa0: 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20  UFSIZ];.    int 
5fb0: 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d  index, verbose =
5fc0: 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 65   0, use_supporte
5fd0: 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  d = 0;..    dpri
5fe0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
5ff0: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20      if ((objc < 
6000: 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29  2) || (objc > 4)
6010: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
6020: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
6030: 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c   objv, "protocol
6040: 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70   ?verbose? ?supp
6050: 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72  orted?");..retur
6060: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6070: 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47   }.    if (Tcl_G
6080: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
6090: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
60a0: 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74  protocols, "prot
60b0: 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78  ocol", 0, &index
60c0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
60d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
60e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
60f0: 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63  (objc > 2) && Tc
6100: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
6110: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
6120: 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21  [2], &verbose) !
6130: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
6140: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6150: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62     }.    if ((ob
6160: 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47  jc > 3) && Tcl_G
6170: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
6180: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
6190: 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64  , &use_supported
61a0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
61b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
61c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
61d0: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
61e0: 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e  .    switch ((en
61f0: 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65  um protocol)inde
6200: 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53  x) {..case TLS_S
6210: 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c  SL2:.#if OPENSSL
6220: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
6230: 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c  >= 0x10100000L |
6240: 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  | defined(NO_SSL
6250: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
6260: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09  ENSSL_NO_SSL2)..
6270: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
6280: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
6290: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
62a0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
62b0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
62c0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
62d0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
62e0: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54      ctx = SSL_CT
62f0: 58 5f 6e 65 77 28 53 53 4c 76 32 5f 6d 65 74 68  X_new(SSLv2_meth
6300: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65  od()); break;.#e
6310: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53  ndif..case TLS_S
6320: 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  SL3:.#if defined
6330: 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66  (NO_SSL3) || def
6340: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
6350: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL3) || defined
6360: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
6370: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63  _METHOD)..    Tc
6380: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6390: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73  nterp, protocols
63a0: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74  [index], ": prot
63b0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
63c0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ed", NULL);..   
63d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
63e0: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74  R;.#else..    ct
63f0: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28  x = SSL_CTX_new(
6400: 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29 29 3b  SSLv3_method());
6410: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
6420: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23  case TLS_TLS1:.#
6430: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
6440: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  S1) || defined(O
6450: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20  PENSSL_NO_TLS1) 
6460: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
6470: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f  SL_NO_TLS1_METHO
6480: 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  D)..    Tcl_Appe
6490: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
64a0: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
64b0: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
64c0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
64d0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
64e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
64f0: 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53  se..    ctx = SS
6500: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f  L_CTX_new(TLSv1_
6510: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b  method()); break
6520: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54  ;.#endif..case T
6530: 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64  LS_TLS1_1:.#if d
6540: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
6550: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
6560: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20  NSSL_NO_TLS1_1) 
6570: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
6580: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54  SL_NO_TLS1_1_MET
6590: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70  HOD)..    Tcl_Ap
65a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
65b0: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
65c0: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
65d0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
65e0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
65f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
6600: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20  else..    ctx = 
6610: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76  SSL_CTX_new(TLSv
6620: 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62  1_1_method()); b
6630: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
6640: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23  se TLS_TLS1_2:.#
6650: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
6660: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
6670: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
6680: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
6690: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
66a0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63  _METHOD)..    Tc
66b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
66c0: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73  nterp, protocols
66d0: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74  [index], ": prot
66e0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
66f0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ed", NULL);..   
6700: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6710: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74  R;.#else..    ct
6720: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28  x = SSL_CTX_new(
6730: 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29  TLSv1_2_method()
6740: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
6750: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f  ..case TLS_TLS1_
6760: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  3:.#if defined(N
6770: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66  O_TLS1_3) || def
6780: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
6790: 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 63 6c  TLS1_3)..    Tcl
67a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
67b0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
67c0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
67d0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
67e0: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  d", NULL);..    
67f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6800: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78  ;.#else..    ctx
6810: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54   = SSL_CTX_new(T
6820: 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b 0a 20 20  LS_method());.  
6830: 20 20 20 20 20 20 20 20 20 20 53 53 4c 5f 43 54            SSL_CT
6840: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
6850: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53  version(ctx, TLS
6860: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20  1_3_VERSION);.. 
6870: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
6880: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  ax_proto_version
6890: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
68a0: 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61  SION);..    brea
68b0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75  k;.#endif..defau
68c0: 6c 74 3a 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  lt:..    break;.
68d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 74      }.    if (ct
68e0: 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  x == NULL) {..Tc
68f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6900: 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c  nterp, REASON(),
6910: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
6920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6930: 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f  ..    ssl = SSL_
6940: 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66  new(ctx);.    if
6950: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (ssl == NULL) {
6960: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
6970: 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f  lt(interp, REASO
6980: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  N(), NULL);..SSL
6990: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
69a0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
69b0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
69c0: 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72   Use list and or
69d0: 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20  der as would be 
69e0: 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74  sent in a Client
69f0: 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61  Hello or all ava
6a00: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a  ilable ciphers *
6a10: 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75  /.    if (use_su
6a20: 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d  pported) {..sk =
6a30: 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72   SSL_get1_suppor
6a40: 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29  ted_ciphers(ssl)
6a50: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
6a60: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70  sk = SSL_get_cip
6a70: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d  hers(ssl);.    }
6a80: 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20  ..    if (sk != 
6a90: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65  NULL) {..if (!ve
6aa0: 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f 62  rbose) {..    ob
6ab0: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
6ac0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
6ad0: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20  .    for (int i 
6ae0: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f  = 0; i < sk_SSL_
6af0: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20  CIPHER_num(sk); 
6b00: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53  i++) {...const S
6b10: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73  SL_CIPHER *c = s
6b20: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
6b30: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20  ue(sk, i);...if 
6b40: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74  (c == NULL) cont
6b50: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68  inue;..../* ciph
6b60: 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45  er name or (NONE
6b70: 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f  ) */...cp = SSL_
6b80: 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28  CIPHER_get_name(
6b90: 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20  c);...if (cp == 
6ba0: 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54  NULL) break;...T
6bb0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6bc0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6bd0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
6be0: 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29  tringObj(cp, -1)
6bf0: 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c  );..    }...} el
6c00: 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72  se {..    objPtr
6c10: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
6c20: 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20  Obj("",0);..    
6c30: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20  for (int i = 0; 
6c40: 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  i < sk_SSL_CIPHE
6c50: 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20  R_num(sk); i++) 
6c60: 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49  {...const SSL_CI
6c70: 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c  PHER *c = sk_SSL
6c80: 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b  _CIPHER_value(sk
6c90: 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d  , i);...if (c ==
6ca0: 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b   NULL) continue;
6cb0: 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64  ..../* textual d
6cc0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
6cd0: 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66  e cipher */...if
6ce0: 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73   (SSL_CIPHER_des
6cf0: 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c  cription(c, buf,
6d00: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d   sizeof(buf)) !=
6d10: 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54   NULL) {...    T
6d20: 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f  cl_AppendToObj(o
6d30: 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 69 6e 74  bjPtr, buf, (int
6d40: 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a  ) strlen(buf));.
6d50: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
6d60: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a   Tcl_AppendToObj
6d70: 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57  (objPtr, "UNKNOW
6d80: 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20  N\n", 8);...}.. 
6d90: 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65     }..}..if (use
6da0: 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20  _supported) {.. 
6db0: 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52     sk_SSL_CIPHER
6dc0: 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20  _free(sk);..}.  
6dd0: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65    }.    SSL_free
6de0: 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43  (ssl);.    SSL_C
6df0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20  TX_free(ctx);.. 
6e00: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
6e10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ult(interp, objP
6e20: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
6e30: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
6e40: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
6e50: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
6ea0: 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62  *. * ProtocolsOb
6eb0: 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61  jCmd -- list ava
6ec0: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73  ilable protocols
6ed0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
6ee0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
6ef0: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
6f00: 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22  "tls::protocols"
6f10: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c   command. *.to l
6f20: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72  ist available pr
6f30: 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52  otocols.. *. * R
6f40: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
6f50: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
6f60: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64   list.. *. * Sid
6f70: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f  e effects:. *.no
6f80: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
6fd0: 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f  static int.Proto
6fe0: 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  colsObjCmd(Clien
6ff0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
7000: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
7010: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
7020: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
7030: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
7040: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20  _Obj *objPtr;.. 
7050: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
7060: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
7070: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c  bjc != 1) {..Tcl
7080: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
7090: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
70a0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
70b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
70c0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
70d0: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
70e0: 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c  L);..#if OPENSSL
70f0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
7100: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
7110: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
7120: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
7130: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
7140: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
7150: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
7160: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
7170: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
7180: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32  otocols[TLS_SSL2
7190: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
71a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
71b0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
71c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
71d0: 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  3).    Tcl_ListO
71e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
71f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
7200: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7210: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53  (protocols[TLS_S
7220: 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  SL3], -1));.#end
7230: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
7240: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
7250: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7260: 54 4c 53 31 29 0a 20 20 20 20 54 63 6c 5f 4c 69  TLS1).    Tcl_Li
7270: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
7280: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
7290: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
72a0: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
72b0: 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23  S_TLS1], -1));.#
72c0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
72d0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  ed(NO_TLS1_1) &&
72e0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
72f0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20  L_NO_TLS1_1).   
7300: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
7310: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
7320: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
7330: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
7340: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d  cols[TLS_TLS1_1]
7350: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
7360: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
7370: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
7380: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7390: 53 31 5f 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69  S1_2).    Tcl_Li
73a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
73b0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
73c0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
73d0: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
73e0: 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b  S_TLS1_2], -1));
73f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
7400: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
7410: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
7420: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
7430: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
7440: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
7450: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
7460: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
7470: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f  tocols[TLS_TLS1_
7480: 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  3], -1));.#endif
7490: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
74a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
74b0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
74c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65  rn TCL_OK;..clie
74d0: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
74e0: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ata;.}.../*. *--
74f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7530: 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b  -. *. * Handshak
7540: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  eObjCmd --. *. *
7550: 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73  .This command is
7560: 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20   used to verify 
7570: 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64  whether the hand
7580: 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74  shake is complet
7590: 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a  e. *.or not.. *.
75a0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
75b0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
75c0: 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61  sult. 1 means ha
75d0: 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65  ndshake complete
75e0: 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e  , 0 means pendin
75f0: 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  g.. *. * Side ef
7600: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f  fects:. *.May fo
7610: 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74  rce SSL negotiat
7620: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63  ion to take plac
7630: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
7640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
7680: 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73  static int Hands
7690: 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  hakeObjCmd(Clien
76a0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
76b0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
76c0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
76d0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
76e0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
76f0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20  _Channel chan;  
7700: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61        /* The cha
7710: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f  nnel to set a mo
7720: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74  de on. */.    St
7730: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20  ate *statePtr;  
7740: 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20        /* client 
7750: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f  state for ssl so
7760: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  cket */.    cons
7770: 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d  t char *errStr =
7780: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72   NULL;.    int r
7790: 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20  et = 1;.    int 
77a0: 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70  err = 0;..    dp
77b0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
77c0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
77d0: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
77e0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
77f0: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
7800: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43  el");..return(TC
7810: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a  L_ERROR);.    }.
7820: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
7830: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
7840: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
7850: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
7860: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20   NULL), NULL);. 
7870: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
7880: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
7890: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c  L) {..return(TCL
78a0: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a  _ERROR);.    }..
78b0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
78c0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
78d0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
78e0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
78f0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
7900: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  el(chan);.    if
7910: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
7920: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
7930: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
7940: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
7950: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
7960: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
7970: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
7980: 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f  e(chan), "\": no
7990: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
79a0: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
79b0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20  (TCL_ERROR);.   
79c0: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20   }.    statePtr 
79d0: 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47  = (State *)Tcl_G
79e0: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
79f0: 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20  eData(chan);..  
7a00: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69    dprintf("Calli
7a10: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  ng Tls_WaitForCo
7a20: 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74  nnect");.    ret
7a30: 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f   = Tls_WaitForCo
7a40: 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20  nnect(statePtr, 
7a50: 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70  &err, 1);.    dp
7a60: 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46  rintf("Tls_WaitF
7a70: 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e  orConnect return
7a80: 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a  ed: %i", ret);..
7a90: 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20      if (ret < 0 
7aa0: 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66  && ((statePtr->f
7ab0: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41  lags & TLS_TCL_A
7ac0: 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d  SYNC) && (err ==
7ad0: 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70   EAGAIN))) {..dp
7ae0: 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74  rintf("Async set
7af0: 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49   and err = EAGAI
7b00: 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20  N");..ret = 0;. 
7b10: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65     } else if (re
7b20: 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 53 74 72  t < 0) {..errStr
7b30: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72   = statePtr->err
7b40: 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75  ;..Tcl_ResetResu
7b50: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c  lt(interp);..Tcl
7b60: 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a  _SetErrno(err);.
7b70: 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c  ..if (!errStr ||
7b80: 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29   (*errStr == 0))
7b90: 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d   {..    errStr =
7ba0: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28   Tcl_PosixError(
7bb0: 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63  interp);..}...Tc
7bc0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7bd0: 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b  nterp, "handshak
7be0: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72  e failed: ", err
7bf0: 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  Str, (char *) NU
7c00: 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52  LL);..dprintf("R
7c10: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52  eturning TCL_ERR
7c20: 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b  OR with handshak
7c30: 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65  e failed: %s", e
7c40: 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28  rrStr);..return(
7c50: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
7c60: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72  } else {..if (er
7c70: 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64  r != 0) {..    d
7c80: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65  printf("Got an e
7c90: 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70  rror with a comp
7ca0: 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a  leted handshake:
7cb0: 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29   err = %i", err)
7cc0: 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20  ;..}..ret = 1;. 
7cd0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
7ce0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
7cf0: 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22  _OK with data \"
7d00: 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20  %i\"", ret);.   
7d10: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
7d20: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
7d30: 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20  wIntObj(ret));. 
7d40: 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b     return(TCL_OK
7d50: 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d  );..clientData =
7d60: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a   clientData;.}..
7d70: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
7d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 49  --------. *. * I
7dc0: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20  mportObjCmd --. 
7dd0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
7de0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ure is invoked t
7df0: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73  o process the "s
7e00: 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20  sl" command. *. 
7e10: 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e  *.The ssl comman
7e20: 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65  d pushes SSL ove
7e30: 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65  r a (newly conne
7e40: 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74  cted) tcp socket
7e50: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
7e60: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
7e70: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
7e80: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
7e90: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20  .May modify the 
7ea0: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49  behavior of an I
7eb0: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  O channel.. *. *
7ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f00: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
7f10: 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28  nt.ImportObjCmd(
7f20: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
7f30: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
7f40: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
7f50: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
7f60: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
7f70: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
7f80: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e  an;../* The chan
7f90: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
7fa0: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61  e on. */.    Sta
7fb0: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f  te *statePtr;../
7fc0: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66  * client state f
7fd0: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f  or ssl socket */
7fe0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74  .    SSL_CTX *ct
7ff0: 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  x.        = NULL
8000: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73  ;.    Tcl_Obj *s
8010: 63 72 69 70 74 09 20 20 20 20 20 20 20 20 3d 20  cript.        = 
8020: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
8030: 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20  j *password.    
8040: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
8050: 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 20 20  Tcl_Obj *vcmd.  
8060: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
8070: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70    Tcl_DString up
8080: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
8090: 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e  ation, upperChan
80a0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70  nelBlocking, upp
80b0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
80c0: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
80d0: 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20  OFChar;.    int 
80e0: 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e  idx, len;.    in
80f0: 74 20 66 6c 61 67 73 09 09 20 20 20 20 20 20 20  t flags..       
8100: 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b   = TLS_TCL_INIT;
8110: 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 09  .    int server.
8120: 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a  .        = 0;./*
8130: 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69   is connection i
8140: 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f  ncoming or outgo
8150: 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72  ing? */.    char
8160: 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20   *keyfile.      
8170: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68    = NULL;.    ch
8180: 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20  ar *certfile.   
8190: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
81a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
81b0: 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20  key  .= NULL;.  
81c0: 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20    int key_len   
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
81e0: 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  0;.    unsigned 
81f0: 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 20 20  char *cert      
8200: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
8210: 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20  nt cert_len     
8220: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a             = 0;.
8230: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72      char *cipher
8240: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  s.        = NULL
8250: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
8260: 65 72 73 75 69 74 65 73 09 20 20 20 20 20 20 20  ersuites.       
8270: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61   = NULL;.    cha
8280: 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20  r *CAfile.      
8290: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68    = NULL;.    ch
82a0: 61 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 20  ar *CAdir..     
82b0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
82c0: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20  har *DHparams.  
82d0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
82e0: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20    char *model.. 
82f0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
8300: 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e     char *servern
8310: 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ame.        = NU
8320: 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20  LL;./* hostname 
8330: 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20  for Server Name 
8340: 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  Indication */.  
8350: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
8360: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69   char *session_i
8370: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  d = NULL;.    Tc
8380: 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e  l_Obj *alpn..= N
8390: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c  ULL;.    int ssl
83a0: 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b  2 = 0, ssl3 = 0;
83b0: 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20  .    int tls1 = 
83c0: 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74  1, tls1_1 = 1, t
83d0: 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f  ls1_2 = 1, tls1_
83e0: 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70  3 = 1;.    int p
83f0: 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20  roto = 0, level 
8400: 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65  = -1;.    int ve
8410: 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72  rify = 0, requir
8420: 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d  e = 0, request =
8430: 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   1, post_handsha
8440: 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72  ke = 0;..    dpr
8450: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
8460: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
8470: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
8480: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65  10100000L && !de
8490: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
84a0: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e  _SSL2) && !defin
84b0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64  ed(NO_SSL2) && d
84c0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
84d0: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
84e0: 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  S1) && defined(N
84f0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66  O_TLS1_1) && def
8500: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
8510: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
8520: 53 31 5f 33 29 0a 20 20 20 20 73 73 6c 32 20 3d  S1_3).    ssl2 =
8530: 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21   1;.#endif.#if !
8540: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8550: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
8560: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26  ined(NO_SSL3) &&
8570: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
8580: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
8590: 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e 65 64  TLS1) && defined
85a0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64  (NO_TLS1_1) && d
85b0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
85c0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
85d0: 54 4c 53 31 5f 33 29 0a 20 20 20 20 73 73 6c 33  TLS1_3).    ssl3
85e0: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 1;.#endif.#if
85f0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
8600: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
8610: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20  NSSL_NO_TLS1).  
8620: 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64    tls1 = 0;.#end
8630: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
8640: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
8650: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8660: 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31  TLS1_1).    tls1
8670: 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  _1 = 0;.#endif.#
8680: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
8690: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
86a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
86b0: 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d  _2).    tls1_2 =
86c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
86d0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
86e0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
86f0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
8700: 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a      tls1_3 = 0;.
8710: 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28  #endif..    if (
8720: 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
8730: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
8740: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
8750: 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73  channel ?options
8760: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
8770: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
8780: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
8790: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
87a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
87b0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e  omObj(objv[1], N
87c0: 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  ULL), NULL);.   
87d0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
87e0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
87f0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
8800: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
8810: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
8820: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
8830: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
8840: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
8850: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
8860: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20  chan);..    for 
8870: 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20  (idx = 2; idx < 
8880: 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  objc; idx++) {..
8890: 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f  char *opt = Tcl_
88a0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
88b0: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c  (objv[idx], NULL
88c0: 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20  );...if (opt[0] 
88d0: 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65  != '-')..    bre
88e0: 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61  ak;...OPTOBJ("-a
88f0: 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50  lpn", alpn);..OP
8900: 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43  TSTR("-cadir", C
8910: 41 64 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 22  Adir);..OPTSTR("
8920: 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65  -cafile", CAfile
8930: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72  );..OPTSTR("-cer
8940: 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65  tfile", certfile
8950: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70  );..OPTSTR("-cip
8960: 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a  her", ciphers);.
8970: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
8980: 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f  s", ciphers);..O
8990: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75  PTSTR("-ciphersu
89a0: 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69  ites", ciphersui
89b0: 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  tes);..OPTOBJ("-
89c0: 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74  command", script
89d0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70  );..OPTSTR("-dhp
89e0: 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73  arams", DHparams
89f0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79  );..OPTSTR("-key
8a00: 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b  file", keyfile);
8a10: 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c  ..OPTSTR("-model
8a20: 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f  ", model);..OPTO
8a30: 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20  BJ("-password", 
8a40: 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42  password);..OPTB
8a50: 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73  OOL("-post_hands
8a60: 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64  hake", post_hand
8a70: 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c  shake);..OPTBOOL
8a80: 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71  ("-require", req
8a90: 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uire);..OPTBOOL(
8aa0: 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75  "-request", requ
8ab0: 65 73 74 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d  est);..OPTINT("-
8ac0: 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20  securitylevel", 
8ad0: 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c  level);..OPTBOOL
8ae0: 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76  ("-server", serv
8af0: 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73  er);..OPTSTR("-s
8b00: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76  ervername", serv
8b10: 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52  ername);..OPTSTR
8b20: 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20  ("-session_id", 
8b30: 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50  session_id);..OP
8b40: 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73  TBOOL("-ssl2", s
8b50: 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  sl2);..OPTBOOL("
8b60: 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09  -ssl3", ssl3);..
8b70: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c  OPTBOOL("-tls1",
8b80: 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c   tls1);..OPTBOOL
8b90: 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31  ("-tls1.1", tls1
8ba0: 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  _1);..OPTBOOL("-
8bb0: 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29  tls1.2", tls1_2)
8bc0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
8bd0: 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09  1.3", tls1_3);..
8be0: 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74  OPTOBJ("-validat
8bf0: 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29  ecommand", vcmd)
8c00: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64  ;..OPTOBJ("-vcmd
8c10: 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 42 59  ", vcmd);..OPTBY
8c20: 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74  TE("-cert", cert
8c30: 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50  , cert_len);..OP
8c40: 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65  TBYTE("-key", ke
8c50: 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 0a 09 4f  y, key_len);...O
8c60: 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20  PTBAD("option", 
8c70: 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20  "-alpn, -cadir, 
8c80: 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20  -cafile, -cert, 
8c90: 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68  -certfile, -ciph
8ca0: 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65  er, -ciphersuite
8cb0: 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68  s, -command, -dh
8cc0: 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b  params, -key, -k
8cd0: 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20  eyfile, -model, 
8ce0: 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 65 71 75  -password, -requ
8cf0: 69 72 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d  ire, -request, -
8d00: 73 65 63 75 72 69 74 79 6c 65 76 65 6c 2c 20 2d  securitylevel, -
8d10: 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e  server, -servern
8d20: 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64  ame, -session_id
8d30: 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20  , -ssl2, -ssl3, 
8d40: 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20  -tls1, -tls1.1, 
8d50: 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33  -tls1.2, -tls1.3
8d60: 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f  , or -validateco
8d70: 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72  mmand");...retur
8d80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8d90: 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65   }.    if (reque
8da0: 73 74 29 09 20 20 20 20 76 65 72 69 66 79 20 7c  st).    verify |
8db0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49  = SSL_VERIFY_CLI
8dc0: 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56  ENT_ONCE | SSL_V
8dd0: 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20  ERIFY_PEER;.    
8de0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72  if (request && r
8df0: 65 71 75 69 72 65 29 20 76 65 72 69 66 79 20 7c  equire) verify |
8e00: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49  = SSL_VERIFY_FAI
8e10: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52  L_IF_NO_PEER_CER
8e20: 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65  T;.    if (reque
8e30: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
8e40: 68 61 6b 65 29 20 20 76 65 72 69 66 79 20 7c 3d  hake)  verify |=
8e50: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54   SSL_VERIFY_POST
8e60: 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20  _HANDSHAKE;.    
8e70: 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29  if (verify == 0)
8e80: 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45  .verify = SSL_VE
8e90: 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20  RIFY_NONE;..    
8ea0: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f  proto |= (ssl2 ?
8eb0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20   TLS_PROTO_SSL2 
8ec0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
8ed0: 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50  |= (ssl3 ? TLS_P
8ee0: 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a  ROTO_SSL3 : 0);.
8ef0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
8f00: 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  s1 ? TLS_PROTO_T
8f10: 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  LS1 : 0);.    pr
8f20: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f  oto |= (tls1_1 ?
8f30: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
8f40: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  1 : 0);.    prot
8f50: 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54  o |= (tls1_2 ? T
8f60: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20  LS_PROTO_TLS1_2 
8f70: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
8f80: 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53  |= (tls1_3 ? TLS
8f90: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20  _PROTO_TLS1_3 : 
8fa0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65  0);..    /* rese
8fb0: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61  t to NULL if bla
8fc0: 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64  nk string provid
8fd0: 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65  ed */.    if (ce
8fe0: 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20  rt && !*cert).. 
8ff0: 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20         cert.    
9000: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9010: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79  if (key && !*key
9020: 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20  )..        key. 
9030: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
9040: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20     if (certfile 
9050: 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20  && !*certfile)  
9060: 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09         certfile.
9070: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
9080: 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79  keyfile && !*key
9090: 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20  file)..keyfile. 
90a0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
90b0: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26     if (ciphers &
90c0: 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20  & !*ciphers).   
90d0: 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20       ciphers.   
90e0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
90f0: 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65   if (ciphersuite
9100: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69  s && !*ciphersui
9110: 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65  tes) ciphersuite
9120: 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  s    = NULL;.   
9130: 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21   if (CAfile && !
9140: 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20  *CAfile).       
9150: 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20   CAfile.        
9160: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
9170: 43 41 64 69 72 20 26 26 20 21 2a 43 41 64 69 72  CAdir && !*CAdir
9180: 29 09 20 20 20 20 20 20 20 20 43 41 64 69 72 09  ).        CAdir.
9190: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
91a0: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
91b0: 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09   && !*DHparams).
91c0: 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73          DHparams
91d0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
91e0: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20  .    /* new SSL 
91f0: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61  state */.    sta
9200: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20  tePtr..= (State 
9210: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69  *) ckalloc((unsi
9220: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61  gned) sizeof(Sta
9230: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  te));.    memset
9240: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69  (statePtr, 0, si
9250: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20  zeof(State));.. 
9260: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
9270: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs.= flags;.    
9280: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
9290: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73  .= interp;.    s
92a0: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09  tatePtr->vflags.
92b0: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74  = verify;.    st
92c0: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22  atePtr->err.= ""
92d0: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  ;..    /* alloca
92e0: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20  te script */.   
92f0: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09   if (script) {..
9300: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
9310: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69  ringFromObj(scri
9320: 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  pt, &len);..if (
9330: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
9340: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
9350: 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63   script;..    Tc
9360: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
9370: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
9380: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  k);..}.    }..  
9390: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61    /* allocate pa
93a0: 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66  ssword */.    if
93b0: 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28   (password) {..(
93c0: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72  void) Tcl_GetStr
93d0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77  ingFromObj(passw
93e0: 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ord, &len);..if 
93f0: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
9400: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
9410: 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20  = password;..   
9420: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
9430: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
9440: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  word);..}.    }.
9450: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
9460: 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e   validate comman
9470: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d  d */.    if (vcm
9480: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  d) {..(void) Tcl
9490: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
94a0: 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09  j(vcmd, &len);..
94b0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
94c0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
94d0: 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f   vcmd;..    Tcl_
94e0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
94f0: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d  tePtr->vcmd);..}
9500: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
9510: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b  model != NULL) {
9520: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20  ..int mode;../* 
9530: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20  Get the "model" 
9540: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e  context */..chan
9550: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
9560: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c  l(interp, model,
9570: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68   &mode);..if (ch
9580: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
9590: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20  el) NULL) {..   
95a0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
95b0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
95c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
95d0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  ROR;..}.../*.. *
95e0: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
95f0: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
9600: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a  most channel.. *
9610: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  /..chan = Tcl_Ge
9620: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
9630: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43  );..if (Tcl_GetC
9640: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
9650: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
9660: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63  ype()) {..    Tc
9670: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9680: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
9690: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
96a0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
96b0: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
96c0: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  TLS channel", NU
96d0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
96e0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
96f0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
9700: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
9710: 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20  ..ctx = ((State 
9720: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
9730: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61  InstanceData(cha
9740: 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20  n))->ctx;.    } 
9750: 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78  else {..if ((ctx
9760: 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74   = CTX_Init(stat
9770: 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72  ePtr, server, pr
9780: 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65  oto, keyfile, ce
9790: 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72  rtfile, key, cer
97a0: 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20  t, key_len,..   
97b0: 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72   cert_len, CAdir
97c0: 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72  , CAfile, cipher
97d0: 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c  s, ciphersuites,
97e0: 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73   level, DHparams
97f0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  )) == NULL) {.. 
9800: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
9810: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
9820: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9830: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
9840: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63  .    statePtr->c
9850: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f  tx = ctx;..    /
9860: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64  *.     * We need
9870: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
9880: 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77  at the channel w
9890: 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28  orks in binary (
98a0: 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65  for the.     * e
98b0: 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f  ncryption not to
98c0: 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e   get goofed up).
98d0: 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20  .     * We only 
98e0: 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74  want to adjust t
98f0: 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20  he buffering in 
9900: 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c  pre-v2 channels,
9910: 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61   where.     * ea
9920: 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68  ch channel in th
9930: 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e  e stack maintain
9940: 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65  ed its own buffe
9950: 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  rs..     */.    
9960: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
9970: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
9980: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54  nslation);.    T
9990: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
99a0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
99b0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44  king);.    Tcl_D
99c0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
99d0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
99e0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
99f0: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
9a00: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  nelEncoding);.  
9a10: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
9a20: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
9a30: 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c  han, "-eofchar",
9a40: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f   &upperChannelEO
9a50: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f  FChar);.    Tcl_
9a60: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
9a70: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
9a80: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70  -encoding", &upp
9a90: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
9aa0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  g);.    Tcl_GetC
9ab0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
9ac0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
9ad0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65  nslation", &uppe
9ae0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
9af0: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ion);.    Tcl_Ge
9b00: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
9b10: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62  nterp, chan, "-b
9b20: 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72  locking", &upper
9b30: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
9b40: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
9b50: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
9b60: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73  p, chan, "-trans
9b70: 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79  lation", "binary
9b80: 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ");.    Tcl_SetC
9b90: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
9ba0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f  erp, chan, "-blo
9bb0: 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b  cking", "true");
9bc0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f  .    dprintf("Co
9bd0: 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e  nsuming Tcl chan
9be0: 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74  nel %s", Tcl_Get
9bf0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
9c00: 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  ));.    statePtr
9c10: 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61  ->self = Tcl_Sta
9c20: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  ckChannel(interp
9c30: 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  , Tls_ChannelTyp
9c40: 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  e(), (ClientData
9c50: 29 20 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c  ) statePtr, (TCL
9c60: 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f  _READABLE | TCL_
9c70: 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29  WRITABLE), chan)
9c80: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ;.    dprintf("C
9c90: 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e  reated channel n
9ca0: 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65  amed %s", Tcl_Ge
9cb0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
9cc0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20  tePtr->self));. 
9cd0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
9ce0: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68  >self == (Tcl_Ch
9cf0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
9d00: 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66  /*.. * No use of
9d10: 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46   Tcl_EventuallyF
9d20: 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70  ree because no p
9d30: 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73  ossible Tcl_Pres
9d40: 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f  erve... */..Tls_
9d50: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
9d60: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e  atePtr);..return
9d70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9d80: 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  }..    Tcl_SetCh
9d90: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
9da0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
9db0: 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  lf, "-translatio
9dc0: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  n", Tcl_DStringV
9dd0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
9de0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b  elTranslation));
9df0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
9e00: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
9e10: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
9e20: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54  , "-encoding", T
9e30: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
9e40: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
9e50: 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c  oding));.    Tcl
9e60: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
9e70: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  n(interp, stateP
9e80: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63  tr->self, "-eofc
9e90: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  har", Tcl_DStrin
9ea0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
9eb0: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20  nnelEOFChar));. 
9ec0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
9ed0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
9ee0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
9ef0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c  "-blocking", Tcl
9f00: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
9f10: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
9f20: 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ing));..    /*. 
9f30: 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61      * SSL Initia
9f40: 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f  lization.     */
9f50: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73  .    statePtr->s
9f60: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61  sl = SSL_new(sta
9f70: 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20  tePtr->ctx);.   
9f80: 20 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e   if (!statePtr->
9f90: 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c  ssl) {../* SSL l
9fa0: 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a  ibrary error */.
9fb0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
9fc0: 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64  t(interp, "could
9fd0: 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73  n't construct ss
9fe0: 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45  l session: ", RE
9ff0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
a000: 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65   NULL);..Tls_Fre
a010: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
a020: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  Ptr);..return TC
a030: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
a040: 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20      /* Set host 
a050: 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20  server name */. 
a060: 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d     if (servernam
a070: 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68  e) {../* Sets th
a080: 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e  e server name in
a090: 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 69  dication (SNI) i
a0a0: 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78  n ClientHello ex
a0b0: 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 69 66 20 28  tension */..if (
a0c0: 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f  !SSL_set_tlsext_
a0d0: 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50  host_name(stateP
a0e0: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e  tr->ssl, servern
a0f0: 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29  ame) && require)
a100: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
a110: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a120: 20 22 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f   "setting TLS ho
a130: 73 74 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f  st name extensio
a140: 6e 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72  n failed", (char
a150: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20   *) NULL);.     
a160: 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65 65 28         Tls_Free(
a170: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
a180: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
a190: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a1a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 09 2f 2a  ;.        }.../*
a1b0: 20 43 6f 6e 66 69 67 75 72 65 20 73 65 72 76 65   Configure serve
a1c0: 72 20 68 6f 73 74 20 6e 61 6d 65 20 63 68 65 63  r host name chec
a1d0: 6b 73 20 69 6e 20 74 68 65 20 53 53 4c 20 63 6c  ks in the SSL cl
a1e0: 69 65 6e 74 2e 20 53 65 74 20 44 4e 53 20 68 6f  ient. Set DNS ho
a1f0: 73 74 6e 61 6d 65 20 74 6f 0a 09 20 20 20 6e 61  stname to..   na
a200: 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74  me for peer cert
a210: 69 66 69 63 61 74 65 20 63 68 65 63 6b 73 2e 20  ificate checks. 
a220: 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 68 61  SSL_set1_host ha
a230: 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a  s limitations. *
a240: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31  /..if (!SSL_add1
a250: 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e  _host(statePtr->
a260: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  ssl, servername)
a270: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
a280: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a290: 2c 20 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68  , "setting DNS h
a2a0: 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22  ost name failed"
a2b0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
a2c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6c  ;.            Tl
a2d0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
a2e0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 20  statePtr);.     
a2f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
a300: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
a310: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65  }..    /* Resume
a320: 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20   session id */. 
a330: 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69     if (session_i
a340: 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73  d && strlen(sess
a350: 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d  ion_id) <= SSL_M
a360: 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54  AX_SID_CTX_LENGT
a370: 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74  H) {../* SSL_set
a380: 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69  _session() */..i
a390: 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  f (!SSL_SESSION_
a3a0: 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28  set1_id_context(
a3b0: 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28  SSL_get_session(
a3c0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20  statePtr->ssl), 
a3d0: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73  session_id, (uns
a3e0: 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65  igned int) strle
a3f0: 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20  n(session_id))) 
a400: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
a410: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a420: 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20  "Resume session 
a430: 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64  id ", session_id
a440: 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 63 68  , " failed", (ch
a450: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  ar *) NULL);.   
a460: 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72 65           Tls_Fre
a470: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
a480: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ptr);.          
a490: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a4a0: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
a4b0: 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f    if (alpn) {../
a4c0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20  * Convert a TCL 
a4d0: 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74  list into a prot
a4e0: 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72  ocol-list in wir
a4f0: 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73  e-format */..uns
a500: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74  igned char *prot
a510: 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65  os, *p;..unsigne
a520: 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e  d int protos_len
a530: 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65   = 0;..int i, le
a540: 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a  n, cnt;..Tcl_Obj
a550: 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54   **list;...if (T
a560: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65  cl_ListObjGetEle
a570: 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c  ments(interp, al
a580: 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29  pn, &cnt, &list)
a590: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
a5a0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
a5b0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
a5c0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a5d0: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  ERROR;..}.../* D
a5e0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d  etermine the mem
a5f0: 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72  ory required for
a600: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69   the protocol-li
a610: 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20  st */..for (i = 
a620: 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29  0; i < cnt; i++)
a630: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53   {..    Tcl_GetS
a640: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73  tringFromObj(lis
a650: 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20  t[i], &len);..  
a660: 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29    if (len > 255)
a670: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52   {...Tcl_AppendR
a680: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41  esult(interp, "A
a690: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d  LPN protocol nam
a6a0: 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68  e too long", (ch
a6b0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54  ar *) NULL);...T
a6c0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
a6d0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65   statePtr);...re
a6e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a6f0: 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74  .    }..    prot
a700: 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65  os_len += 1 + le
a710: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64  n;..}.../* Build
a720: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72   the complete pr
a730: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09  otocol-list */..
a740: 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63  protos = ckalloc
a750: 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f  (protos_len);../
a760: 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73  * protocol-lists
a770: 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69   consist of 8-bi
a780: 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65  t length-prefixe
a790: 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20  d, byte strings 
a7a0: 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20  */..for (i = 0, 
a7b0: 70 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20  p = protos; i < 
a7c0: 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20  cnt; i++) {..   
a7d0: 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c   char *str = Tcl
a7e0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a7f0: 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29  j(list[i], &len)
a800: 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65  ;..    *p++ = le
a810: 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70  n;..    memcpy(p
a820: 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20  , str, len);..  
a830: 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a    p += len;..}..
a840: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e  ./* SSL_set_alpn
a850: 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20  _protos makes a 
a860: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74  copy of the prot
a870: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a  ocol-list */../*
a880: 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63   Note: This func
a890: 74 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74  tions reverses t
a8a0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
a8b0: 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69  convention */..i
a8c0: 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f  f (SSL_set_alpn_
a8d0: 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d  protos(statePtr-
a8e0: 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72  >ssl, protos, pr
a8f0: 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20  otos_len)) {..  
a900: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a910: 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c  lt(interp, "fail
a920: 65 64 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70  ed to set ALPN p
a930: 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72  rotocols", (char
a940: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
a950: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
a960: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
a970: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29    ckfree(protos)
a980: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
a990: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
a9a0: 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73   Store protocols
a9b0: 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50   list */..stateP
a9c0: 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f  tr->protos = pro
a9d0: 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  tos;..statePtr->
a9e0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f  protos_len = pro
a9f0: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65  tos_len;.    } e
aa00: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d  lse {..statePtr-
aa10: 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a  >protos = NULL;.
aa20: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
aa30: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  s_len = 0;.    }
aa40: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
aa50: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20  SSL Callbacks.  
aa60: 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65     */.    SSL_se
aa70: 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65  t_app_data(state
aa80: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20  Ptr->ssl, (void 
aa90: 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20  *)statePtr);./* 
aaa0: 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73  point back to us
aab0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f   */.    SSL_set_
aac0: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d  verify(statePtr-
aad0: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65  >ssl, verify, Ve
aae0: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  rifyCallback);. 
aaf0: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f     SSL_set_info_
ab00: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
ab10: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c  r->ssl, InfoCall
ab20: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  back);..    /* C
ab30: 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65  reate Tcl_Channe
ab40: 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f  l BIO Handler */
ab50: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70  .    statePtr->p
ab60: 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74  _bio.= BIO_new_t
ab70: 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f  cl(statePtr, BIO
ab80: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73  _NOCLOSE);.    s
ab90: 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42  tatePtr->bio.= B
aba0: 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c  IO_new(BIO_f_ssl
abb0: 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65  ());..    if (se
abc0: 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76  rver) {../* Serv
abd0: 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  er callbacks */.
abe0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73  .SSL_CTX_set_tls
abf0: 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61  ext_servername_a
ac00: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  rg(statePtr->ctx
ac10: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
ac20: 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  tr);..SSL_CTX_se
ac30: 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e  t_tlsext_servern
ac40: 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  ame_callback(sta
ac50: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43  tePtr->ctx, SNIC
ac60: 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43  allback);..SSL_C
ac70: 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65  TX_set_client_he
ac80: 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d  llo_cb(statePtr-
ac90: 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62  >ctx, HelloCallb
aca0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
acb0: 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61  tePtr);..if (sta
acc0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d  tePtr->protos !=
acd0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53   NULL) {..    SS
ace0: 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73  L_CTX_set_alpn_s
acf0: 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74  elect_cb(statePt
ad00: 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c  r->ctx, ALPNCall
ad10: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
ad20: 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20  atePtr);.#ifdef 
ad30: 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 53 53 4c  USE_NPN..    SSL
ad40: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72  _CTX_set_next_pr
ad50: 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f  otos_advertised_
ad60: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
ad70: 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28  , NPNCallback, (
ad80: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
ad90: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a  ;.#endif..}.../*
ada0: 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74   Enable server t
adb0: 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65 71 75  o send cert requ
adc0: 65 73 74 20 61 66 74 65 72 20 68 61 6e 64 73 68  est after handsh
add0: 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c  ake (TLS 1.3 onl
ade0: 79 29 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65  y) */..if (reque
adf0: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
ae00: 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c  hake) {..    SSL
ae10: 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70  _verify_client_p
ae20: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74  ost_handshake(st
ae30: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d  atePtr->ssl);..}
ae40: 0a 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  ...statePtr->fla
ae50: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45  gs |= TLS_TCL_SE
ae60: 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61  RVER;..SSL_set_a
ae70: 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74  ccept_state(stat
ae80: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
ae90: 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69  } else {../* Cli
aea0: 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f  ent callbacks */
aeb0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
aec0: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20  protos != NULL) 
aed0: 7b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  {.#ifdef USE_NPN
aee0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
aef0: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c  t_next_proto_sel
af00: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d  ect_cb(statePtr-
af10: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61  >ctx, ALPNCallba
af20: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
af30: 65 50 74 72 29 3b 0a 23 65 6e 64 69 66 0a 09 7d  ePtr);.#endif..}
af40: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63  ../* Session cac
af50: 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  hing */..SSL_CTX
af60: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63  _set_session_cac
af70: 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  he_mode(statePtr
af80: 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f  ->ctx, SSL_SESS_
af90: 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53  CACHE_CLIENT | S
afa0: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f  SL_SESS_CACHE_NO
afb0: 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29  _INTERNAL_STORE)
afc0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f  ;..SSL_CTX_sess_
afd0: 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65  set_new_cb(state
afe0: 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f  Ptr->ctx, Sessio
aff0: 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a  nCallback);.../*
b000: 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e   Enable post han
b010: 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63  dshake Authentic
b020: 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e  ation extension.
b030: 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e   TLS 1.3 only, n
b040: 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69  ot http/2. */..i
b050: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
b060: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a  st_handshake) {.
b070: 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73  .    SSL_set_pos
b080: 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68  t_handshake_auth
b090: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
b0a0: 31 29 3b 0a 09 7d 0a 0a 09 53 53 4c 5f 73 65 74  1);..}...SSL_set
b0b0: 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73  _connect_state(s
b0c0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
b0d0: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74     }.    SSL_set
b0e0: 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73  _bio(statePtr->s
b0f0: 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f  sl, statePtr->p_
b100: 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70  bio, statePtr->p
b110: 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73  _bio);.    BIO_s
b120: 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d  et_ssl(statePtr-
b130: 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e  >bio, statePtr->
b140: 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45  ssl, BIO_NOCLOSE
b150: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
b160: 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69  * End of SSL Ini
b170: 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70  t.     */.    dp
b180: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
b190: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   %s", Tcl_GetCha
b1a0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
b1b0: 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54  r->self));.    T
b1c0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
b1d0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63  erp, (char *) Tc
b1e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
b1f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
b200: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
b210: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b220: 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  _OK;..clientData
b230: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
b240: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
b250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
b290: 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64  * UnimportObjCmd
b2a0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
b2b0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
b2c0: 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ked to remove th
b2d0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
b2e0: 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20  l filter.. *. * 
b2f0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
b300: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
b310: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
b320: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f  fects:. *.May mo
b330: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  dify the behavio
b340: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e  r of an IO chann
b350: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
b360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
b3a0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d  .static int.Unim
b3b0: 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  portObjCmd(Clien
b3c0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
b3d0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
b3e0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
b3f0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
b400: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
b410: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
b420: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
b430: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e  o set a mode on.
b440: 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
b450: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
b460: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
b470: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
b480: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
b490: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b  bjv, "channel");
b4a0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
b4b0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  OR;.    }..    c
b4c0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
b4d0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
b4e0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
b4f0: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
b500: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
b510: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
b520: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
b530: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
b540: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
b550: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
b560: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
b570: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
b580: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
b590: 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54  han);..    if (T
b5a0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
b5b0: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
b5c0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
b5d0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
b5e0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
b5f0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
b600: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
b610: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74  han),..."\": not
b620: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
b630: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
b640: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
b650: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e  ..    if (Tcl_Un
b660: 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  stackChannel(int
b670: 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43  erp, chan) == TC
b680: 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75  L_ERROR) {..retu
b690: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b6a0: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
b6b0: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
b6c0: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
b6d0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
b6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
b720: 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d  *. * CTX_Init --
b730: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c   construct a SSL
b740: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a  _CTX instance. *
b750: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
b760: 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20  A valid SSL_CTX 
b770: 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c  instance or NULL
b780: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
b790: 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75  ects:. *.constru
b7a0: 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  cts SSL context 
b7b0: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  (CTX). *. *-----
b7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
b800: 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54  */.static SSL_CT
b810: 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61  X *.CTX_Init(Sta
b820: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e  te *statePtr, in
b830: 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20  t isServer, int 
b840: 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79  proto, char *key
b850: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74  file, char *cert
b860: 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e  file,.    unsign
b870: 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e  ed char *key, un
b880: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72  signed char *cer
b890: 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20  t, int key_len, 
b8a0: 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68  int cert_len, ch
b8b0: 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63  ar *CAdir,.    c
b8c0: 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61  har *CAfile, cha
b8d0: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72  r *ciphers, char
b8e0: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20   *ciphersuites, 
b8f0: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20  int level, char 
b900: 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20  *DHparams) {.   
b910: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
b920: 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp = statePtr->
b930: 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f  interp;.    SSL_
b940: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b  CTX *ctx = NULL;
b950: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
b960: 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74   ds;.    Tcl_DSt
b970: 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e  ring ds1;.    in
b980: 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69  t off = 0;.    i
b990: 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  nt load_private_
b9a0: 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  key;.    const S
b9b0: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f  SL_METHOD *metho
b9c0: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
b9d0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
b9e0: 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54  if (!proto) {..T
b9f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ba00: 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69  interp, "no vali
ba10: 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  d protocol selec
ba20: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ted", NULL);..re
ba30: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
ba40: 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20  ..    /* create 
ba50: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  SSL context */.#
ba60: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
ba70: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31  ON_NUMBER >= 0x1
ba80: 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69  0100000L || defi
ba90: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20  ned(NO_SSL2) || 
baa0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
bab0: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20  NO_SSL2).    if 
bac0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
bad0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29  TLS_PROTO_SSL2))
bae0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
baf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53  sult(interp, "SS
bb00: 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  L2 protocol not 
bb10: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
bb20: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
bb30: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
bb40: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  f defined(NO_SSL
bb50: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
bb60: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20  ENSSL_NO_SSL3). 
bb70: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
bb80: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
bb90: 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70  SSL3)) {..Tcl_Ap
bba0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
bbb0: 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f  p, "SSL3 protoco
bbc0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
bbd0: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
bbe0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
bbf0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
bc00: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
bc10: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
bc20: 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41  LS1).    if (ENA
bc30: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
bc40: 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09  PROTO_TLS1)) {..
bc50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
bc60: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
bc70: 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  0 protocol not s
bc80: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
bc90: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
bca0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
bcb0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
bcc0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
bcd0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
bce0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
bcf0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
bd00: 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54  TO_TLS1_1)) {..T
bd10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
bd20: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31  interp, "TLS 1.1
bd30: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
bd40: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
bd50: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
bd60: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
bd70: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
bd80: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
bd90: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
bda0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
bdb0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
bdc0: 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63  O_TLS1_2)) {..Tc
bdd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
bde0: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20  nterp, "TLS 1.2 
bdf0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
be00: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
be10: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
be20: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
be30: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
be40: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
be50: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
be60: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
be70: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
be80: 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c  _TLS1_3)) {..Tcl
be90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
bea0: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70  terp, "TLS 1.3 p
beb0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
bec0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
bed0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
bee0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73   }.#endif..    s
bef0: 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a  witch (proto) {.
bf00: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
bf10: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
bf20: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
bf30: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
bf40: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
bf50: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63  L_NO_SSL2).    c
bf60: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ase TLS_PROTO_SS
bf70: 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  L2:..method = is
bf80: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73  Server ? SSLv2_s
bf90: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
bfa0: 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65   SSLv2_client_me
bfb0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
bfc0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
bfd0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
bfe0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
bff0: 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  _NO_SSL3) && !de
c000: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
c010: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20  _SSL3_METHOD).  
c020: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
c030: 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d  _SSL3:..method =
c040: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76   isServer ? SSLv
c050: 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  3_server_method(
c060: 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74  ) : SSLv3_client
c070: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
c080: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
c090: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
c0a0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
c0b0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20  SSL_NO_TLS1) && 
c0c0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
c0d0: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29  _NO_TLS1_METHOD)
c0e0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
c0f0: 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f  OTO_TLS1:..metho
c100: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
c110: 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68  LSv1_server_meth
c120: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69  od() : TLSv1_cli
c130: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
c140: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
c150: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
c160: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_1) && !defined
c170: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
c180: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
c190: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
c1a0: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61  1_METHOD).    ca
c1b0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
c1c0: 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  1_1:..method = i
c1d0: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
c1e0: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  1_server_method(
c1f0: 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65  ) : TLSv1_1_clie
c200: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
c210: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
c220: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
c230: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
c240: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
c250: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
c260: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
c270: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
c280: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
c290: 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  _2:..method = is
c2a0: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32  Server ? TLSv1_2
c2b0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
c2c0: 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e   : TLSv1_2_clien
c2d0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
c2e0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
c2f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
c300: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
c310: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
c320: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
c330: 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a  ROTO_TLS1_3:../*
c340: 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 69 63   Use the generic
c350: 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73   method and cons
c360: 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74  traint range aft
c370: 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72  er context is cr
c380: 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64  eated */..method
c390: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
c3a0: 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  S_server_method(
c3b0: 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d  ) : TLS_client_m
c3c0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
c3d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
c3e0: 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61  ult:../* Negotia
c3f0: 74 65 20 68 69 67 68 65 73 74 20 61 76 61 69 6c  te highest avail
c400: 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72  able SSL/TLS ver
c410: 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20  sion */..method 
c420: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
c430: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
c440: 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65   : TLS_client_me
c450: 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e  thod();.#if OPEN
c460: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
c470: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
c480: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
c490: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
c4a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
c4b0: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  2)..off |= (ENAB
c4c0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
c4d0: 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30  ROTO_SSL2)   ? 0
c4e0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c   : SSL_OP_NO_SSL
c4f0: 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v2);.#endif.#if 
c500: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
c510: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
c520: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09  ENSSL_NO_SSL3)..
c530: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
c540: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
c550: 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53  _SSL3)   ? 0 : S
c560: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b  SL_OP_NO_SSLv3);
c570: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
c580: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26  ined(NO_TLS1) &&
c590: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
c5a0: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20  L_NO_TLS1)..off 
c5b0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
c5c0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
c5d0: 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1)   ? 0 : SSL_O
c5e0: 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e  P_NO_TLSv1);.#en
c5f0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
c600: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  (NO_TLS1_1) && !
c610: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
c620: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20  NO_TLS1_1)..off 
c630: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
c640: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
c650: 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1_1) ? 0 : SSL_O
c660: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23  P_NO_TLSv1_1);.#
c670: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
c680: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  ed(NO_TLS1_2) &&
c690: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
c6a0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66  L_NO_TLS1_2)..of
c6b0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
c6c0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
c6d0: 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_2) ? 0 : SSL
c6e0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b  _OP_NO_TLSv1_2);
c6f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
c700: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
c710: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
c720: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09  SSL_NO_TLS1_3)..
c730: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
c740: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
c750: 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53  _TLS1_3) ? 0 : S
c760: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33  SL_OP_NO_TLSv1_3
c770: 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b  );.#endif..break
c780: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
c790: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
c7a0: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54      ctx = SSL_CT
c7b0: 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 0a  X_new(method);..
c7c0: 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a      if (!ctx) {.
c7d0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20  .return(NULL);. 
c7e0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65     }..    if (ge
c7f0: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49  tenv(SSLKEYLOGFI
c800: 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  LE)) {..SSL_CTX_
c810: 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62  set_keylog_callb
c820: 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43  ack(ctx, KeyLogC
c830: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a  allback);.    }.
c840: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
c850: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
c860: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
c870: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28  TLS1_3).    if (
c880: 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f  proto == TLS_PRO
c890: 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53  TO_TLS1_3) {..SS
c8a0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72  L_CTX_set_min_pr
c8b0: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
c8c0: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
c8d0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  ;..SSL_CTX_set_m
c8e0: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  ax_proto_version
c8f0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
c900: 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  SION);.    }.#en
c910: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63  dif..    /* Forc
c920: 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 69  e cipher selecti
c930: 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 76  on order by serv
c940: 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69  er */.    if (!i
c950: 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f  sServer) {..SSL_
c960: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
c970: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48  ctx, SSL_OP_CIPH
c980: 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52  ER_SERVER_PREFER
c990: 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ENCE);.    }..  
c9a0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70    SSL_CTX_set_ap
c9b0: 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69  p_data(ctx, (voi
c9c0: 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72  d*)interp);./* r
c9d0: 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65  emember the inte
c9e0: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53  rpreter */.    S
c9f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
ca00: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41  ns(ctx, SSL_OP_A
ca10: 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20  LL);./* all SSL 
ca20: 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20  bug workarounds 
ca30: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
ca40: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
ca50: 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c  off);../* disabl
ca60: 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69  e protocol versi
ca70: 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53  ons */.#if OPENS
ca80: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
ca90: 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a  R < 0x10101000L.
caa0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
cab0: 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f  mode(ctx, SSL_MO
cac0: 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09  DE_AUTO_RETRY);.
cad0: 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61  /* handle new ha
cae0: 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b  ndshakes in back
caf0: 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65  ground. On by de
cb00: 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c  fault in OpenSSL
cb10: 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69   1.1.1. */.#endi
cb20: 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  f.    SSL_CTX_se
cb30: 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a  ss_set_cache_siz
cb40: 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20  e(ctx, 128);..  
cb50: 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65    /* Set user de
cb60: 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63  fined ciphers, c
cb70: 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e  ipher suites, an
cb80: 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c  d security level
cb90: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70   */.    if ((cip
cba0: 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26  hers != NULL) &&
cbb0: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69   !SSL_CTX_set_ci
cbc0: 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63  pher_list(ctx, c
cbd0: 69 70 68 65 72 73 29 29 20 7b 0a 09 20 20 20 20  iphers)) {..    
cbe0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
cbf0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69  (interp, "Set ci
cc00: 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f  phers failed: No
cc10: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c   valid ciphers",
cc20: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
cc30: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
cc40: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
cc50: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
cc60: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72  .    if ((cipher
cc70: 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20  suites != NULL) 
cc80: 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f  && !SSL_CTX_set_
cc90: 63 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78  ciphersuites(ctx
cca0: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29  , ciphersuites))
ccb0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
ccc0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ccd0: 20 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69   "Set cipher sui
cce0: 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76  tes failed: No v
ccf0: 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28  alid ciphers", (
cd00: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
cd10: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
cd20: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
cd30: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
cd40: 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72      /* Set secur
cd50: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  ity level */.   
cd60: 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20   if (level > -1 
cd70: 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a  && level < 6) {.
cd80: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75  ./* SSL_set_secu
cd90: 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53  rity_level */..S
cda0: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72  SL_CTX_set_secur
cdb0: 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c  ity_level(ctx, l
cdc0: 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  evel);.    }..  
cdd0: 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61    /* set some ca
cde0: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53  llbacks */.    S
cdf0: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
ce00: 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78  lt_passwd_cb(ctx
ce10: 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61  , PasswordCallba
ce20: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  ck);.    SSL_CTX
ce30: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73  _set_default_pas
ce40: 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28  swd_cb_userdata(
ce50: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
ce60: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
ce70: 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65  read a Diffie-He
ce80: 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73  llman parameters
ce90: 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68   file, or use th
cea0: 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a  e built-in one *
ceb0: 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c  /.#ifdef OPENSSL
cec0: 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44  _NO_DH.    if (D
ced0: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29  Hparams != NULL)
cee0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
cef0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48  sult(interp, "DH
cf00: 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f   parameter suppo
cf10: 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rt not available
cf20: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
cf30: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
cf40: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
cf50: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  ULL;.    }.#else
cf60: 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a  .    {..DH* dh;.
cf70: 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d  .if (DHparams !=
cf80: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49   NULL) {..    BI
cf90: 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c  O *bio;..    Tcl
cfa0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
cfb0: 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49  );..    bio = BI
cfc0: 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44  O_new_file(F2N(D
cfd0: 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22  Hparams, &ds), "
cfe0: 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62  r");..    if (!b
cff0: 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72  io) {...Tcl_DStr
d000: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09  ingFree(&ds);...
d010: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d020: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20  (interp, "Could 
d030: 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61  not find DH para
d040: 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63  meters file", (c
d050: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
d060: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
d070: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
d080: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64  ;..    }...    d
d090: 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f  h = PEM_read_bio
d0a0: 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e  _DHparams(bio, N
d0b0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
d0c0: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ;..    BIO_free(
d0d0: 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44  bio);..    Tcl_D
d0e0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
d0f0: 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b  ..    if (!dh) {
d100: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
d110: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75  ult(interp, "Cou
d120: 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70  ld not read DH p
d130: 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66  arameters from f
d140: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ile", (char *) N
d150: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
d160: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
d170: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
d180: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
d190: 64 68 20 3d 20 67 65 74 5f 64 68 50 61 72 61 6d  dh = get_dhParam
d1a0: 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58  s();..}..SSL_CTX
d1b0: 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c  _set_tmp_dh(ctx,
d1c0: 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28 64   dh);..DH_free(d
d1d0: 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  h);.    }.#endif
d1e0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72  ..    /* set our
d1f0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
d200: 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65      load_private
d210: 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  _key = 0;.    if
d220: 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55   (certfile != NU
d230: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
d240: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54  ate_key = 1;...T
d250: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
d260: 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43  ds);...if (SSL_C
d270: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61  TX_use_certifica
d280: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  te_file(ctx, F2N
d290: 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c  (certfile, &ds),
d2a0: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
d2b0: 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20  M) <= 0) {..    
d2c0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
d2d0: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41  &ds);..    Tcl_A
d2e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d2f0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
d300: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66  et certificate f
d310: 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c  ile ", certfile,
d320: 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52   ": ",....     R
d330: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
d340: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
d350: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
d360: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
d370: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  L;..}.    } else
d380: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c   if (cert != NUL
d390: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61  L) {..load_priva
d3a0: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20  te_key = 1;..if 
d3b0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
d3c0: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74  tificate_ASN1(ct
d3d0: 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72  x, cert_len, cer
d3e0: 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20  t) <= 0) {..    
d3f0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
d400: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41  &ds);..    Tcl_A
d410: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d420: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
d430: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20  et certificate: 
d440: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f  ",....     REASO
d450: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
d460: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
d470: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
d480: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
d490: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
d4a0: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72  certfile = (char
d4b0: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75  *)X509_get_defau
d4c0: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a  lt_cert_file();.
d4d0: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
d4e0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
d4f0: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65  le(ctx, certfile
d500: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
d510: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20  EM) <= 0) {.#if 
d520: 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  0..    Tcl_DStri
d530: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
d540: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
d550: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
d560: 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c  le to use defaul
d570: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
d580: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
d590: 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45  ": ",....     RE
d5a0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
d5b0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
d5c0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
d5d0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
d5e0: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20  ;.#endif..}.    
d5f0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  }..    /* set ou
d600: 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f  r private key */
d610: 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72  .    if (load_pr
d620: 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66  ivate_key) {..if
d630: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c   (keyfile == NUL
d640: 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c  L && key == NULL
d650: 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65  ) {..    keyfile
d660: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a   = certfile;..}.
d670: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d  ..if (keyfile !=
d680: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a   NULL) {..    /*
d690: 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65   get the private
d6a0: 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
d6b0: 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66  with this certif
d6c0: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66  icate */..    if
d6d0: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c   (keyfile == NUL
d6e0: 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d  L) {...keyfile =
d6f0: 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20   certfile;..    
d700: 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f  }...    if (SSL_
d710: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b  CTX_use_PrivateK
d720: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  ey_file(ctx, F2N
d730: 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20  (keyfile, &ds), 
d740: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
d750: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f  ) <= 0) {...Tcl_
d760: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
d770: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65  ;.../* flush the
d780: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63   passphrase whic
d790: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  h might be left 
d7a0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
d7b0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
d7c0: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54  (interp, NULL, T
d7d0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63  CL_STATIC);...Tc
d7e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d7f0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
d800: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79  o set public key
d810: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65   file ", keyfile
d820: 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20 20  , " ",....      
d830: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68     REASON(), (ch
d840: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
d850: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
d860: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
d870: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
d880: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
d890: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  );...} else if (
d8a0: 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  key != NULL) {..
d8b0: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f      if (SSL_CTX_
d8c0: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41  use_PrivateKey_A
d8d0: 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41  SN1(EVP_PKEY_RSA
d8e0: 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c  , ctx, key,key_l
d8f0: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63  en) <= 0) {...Tc
d900: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
d910: 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74  s);.../* flush t
d920: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68  he passphrase wh
d930: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66  ich might be lef
d940: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
d950: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  */...Tcl_SetResu
d960: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c  lt(interp, NULL,
d970: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09   TCL_STATIC);...
d980: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d990: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
d9a0: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b   to set public k
d9b0: 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  ey: ", REASON(),
d9c0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d9d0: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
d9e0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
d9f0: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ULL;..    }..}..
da00: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74  /* Now we know t
da10: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65  hat a key and ce
da20: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74  rt have been set
da30: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65   against.. * the
da40: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a   SSL context */.
da50: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68  .if (!SSL_CTX_ch
da60: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28  eck_private_key(
da70: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ctx)) {..    Tcl
da80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
da90: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b  terp, "private k
daa0: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
dab0: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  h the certificat
dac0: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09  e public key",..
dad0: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20  ..     (char *) 
dae0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
daf0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
db00: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
db10: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
db20: 2a 20 53 65 74 20 76 65 72 69 66 69 63 61 74 69  * Set verificati
db30: 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63  on CAs */.    Tc
db40: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
db50: 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  s);.    Tcl_DStr
db60: 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20  ingInit(&ds1);. 
db70: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
db80: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61  load_verify_loca
db90: 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43  tions(ctx, F2N(C
dba0: 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e  Afile, &ds), F2N
dbb0: 28 43 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c  (CAdir, &ds1)) |
dbc0: 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f  |..!SSL_CTX_set_
dbd0: 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70  default_verify_p
dbe0: 61 74 68 73 28 63 74 78 29 29 20 7b 0a 23 69 66  aths(ctx)) {.#if
dbf0: 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46   0..Tcl_DStringF
dc00: 72 65 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44  ree(&ds);..Tcl_D
dc10: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29  StringFree(&ds1)
dc20: 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72  ;../* Don't curr
dc30: 65 6e 74 6c 79 20 63 61 72 65 20 69 66 20 74 68  ently care if th
dc40: 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c  is fails */..Tcl
dc50: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
dc60: 74 65 72 70 2c 20 22 53 53 4c 20 64 65 66 61 75  terp, "SSL defau
dc70: 6c 74 20 76 65 72 69 66 79 20 70 61 74 68 73 3a  lt verify paths:
dc80: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63   ", REASON(), (c
dc90: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
dca0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
dcb0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
dcc0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
dcd0: 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75    /* https://sou
dce0: 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74  rceforge.net/p/t
dcf0: 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20  ls/bugs/57/ */. 
dd00: 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20     /* XXX:TODO: 
dd10: 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70  Let the user sup
dd20: 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20  ply values here 
dd30: 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74  instead of somet
dd40: 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73  hing that exists
dd50: 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   on the filesyst
dd60: 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41  em */.    if (CA
dd70: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
dd80: 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e  .STACK_OF(X509_N
dd90: 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20  AME) *certNames 
dda0: 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e  = SSL_load_clien
ddb0: 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41  t_CA_file(F2N(CA
ddc0: 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66  file, &ds));..if
ddd0: 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e   (certNames != N
dde0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  ULL) {..    SSL_
ddf0: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43  CTX_set_client_C
de00: 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74  A_list(ctx, cert
de10: 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d  Names);..}.    }
de20: 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
de30: 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20  gFree(&ds);.    
de40: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
de50: 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72  &ds1);.    retur
de60: 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  n ctx;.}.../*. *
de70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
deb0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73  ---. *. * Status
dec0: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e  ObjCmd -- return
ded0: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72   certificate for
dee0: 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e   connected peer.
def0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
df00: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
df10: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
df20: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
df30: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
df40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
df80: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53   */.static int.S
df90: 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65  tatusObjCmd(Clie
dfa0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
dfb0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
dfc0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
dfd0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
dfe0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74  objv[]) {.    St
dff0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20  ate *statePtr;. 
e000: 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20     X509 *peer;. 
e010: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
e020: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  tr;.    Tcl_Chan
e030: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68  nel chan;.    ch
e040: 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  ar *channelName,
e050: 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69   *ciphers;.    i
e060: 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt mode;.    con
e070: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
e080: 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73   *proto;.    uns
e090: 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20  igned int len;. 
e0a0: 20 20 20 69 6e 74 20 6e 69 64 3b 0a 0a 20 20 20     int nid;..   
e0b0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
e0c0: 22 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20  ");..    switch 
e0d0: 28 6f 62 6a 63 29 20 7b 0a 09 63 61 73 65 20 32  (objc) {..case 2
e0e0: 3a 0a 09 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61  :..    channelNa
e0f0: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
e100: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
e110: 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62  ], NULL);..    b
e120: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 33 3a 0a  reak;...case 3:.
e130: 09 20 20 20 20 69 66 20 28 21 73 74 72 63 6d 70  .    if (!strcmp
e140: 20 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 20   (Tcl_GetString 
e150: 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63  (objv[1]), "-loc
e160: 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 6e 6e 65  al")) {...channe
e170: 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  lName = Tcl_GetS
e180: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
e190: 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 09 62  v[2], NULL);...b
e1a0: 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20  reak;..    }..  
e1b0: 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 2d 74    /* else fall-t
e1c0: 68 72 6f 75 67 68 20 2e 2e 2e 20 2a 2f 0a 23 69  hrough ... */.#i
e1d0: 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43  f defined(__GNUC
e1e0: 5f 5f 29 0a 09 20 20 20 20 5f 5f 61 74 74 72 69  __)..    __attri
e1f0: 62 75 74 65 5f 5f 28 28 66 61 6c 6c 74 68 72 6f  bute__((fallthro
e200: 75 67 68 29 29 3b 0a 23 65 6e 64 69 66 0a 09 64  ugh));.#endif..d
e210: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c  efault:..    Tcl
e220: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
e230: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
e240: 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c  ?-local? channel
e250: 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ");..    return 
e260: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e270: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
e280: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
e290: 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  rp, channelName,
e2a0: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20   &mode);.    if 
e2b0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
e2c0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
e2d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e2e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4d  ;.    }.    /* M
e2f0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
e300: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
e310: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
e320: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
e330: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
e340: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ;.    if (Tcl_Ge
e350: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
e360: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
e370: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f  lType()) {..Tcl_
e380: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e390: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
e3a0: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
e3b0: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
e3c0: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c  ..."\": not a TL
e3d0: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
e3e0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
e3f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
e400: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
e410: 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e  e *) Tcl_GetChan
e420: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
e430: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 6f  chan);.    if (o
e440: 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65  bjc == 2) {..pee
e450: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  r = SSL_get_peer
e460: 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61  _certificate(sta
e470: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
e480: 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20   } else {..peer 
e490: 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66  = SSL_get_certif
e4a0: 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  icate(statePtr->
e4b0: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ssl);.    }.    
e4c0: 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a  if (peer) {..obj
e4d0: 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30  Ptr = Tls_NewX50
e4e0: 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65  9Obj(interp, pee
e4f0: 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d  r);..if (objc ==
e500: 20 32 29 20 7b 20 58 35 30 39 5f 66 72 65 65 28   2) { X509_free(
e510: 70 65 65 72 29 3b 20 7d 0a 20 20 20 20 7d 20 65  peer); }.    } e
e520: 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20  lse {..objPtr = 
e530: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
e540: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a  , NULL);.    }..
e550: 20 20 20 20 2f 2a 20 50 65 65 72 20 63 65 72 74      /* Peer cert
e560: 20 63 68 61 69 6e 20 28 63 6c 69 65 6e 74 20 6f   chain (client o
e570: 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 53 54 41 43  nly) */.    STAC
e580: 4b 5f 4f 46 28 58 35 30 39 29 2a 20 73 73 6c 5f  K_OF(X509)* ssl_
e590: 63 65 72 74 73 20 3d 20 53 53 4c 5f 67 65 74 5f  certs = SSL_get_
e5a0: 70 65 65 72 5f 63 65 72 74 5f 63 68 61 69 6e 28  peer_cert_chain(
e5b0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
e5c0: 20 20 20 20 69 66 20 28 21 70 65 65 72 20 26 26      if (!peer &&
e5d0: 20 28 73 73 6c 5f 63 65 72 74 73 20 3d 3d 20 4e   (ssl_certs == N
e5e0: 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30 39 5f 6e  ULL || sk_X509_n
e5f0: 75 6d 28 73 73 6c 5f 63 65 72 74 73 29 20 3d 3d  um(ssl_certs) ==
e600: 20 30 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 54   0)) {..return T
e610: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
e620: 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d  .    /* Peer nam
e630: 65 20 66 72 6f 6d 20 63 65 72 74 20 2a 2f 0a 20  e from cert */. 
e640: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
e650: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
e660: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
e670: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65  NewStringObj("pe
e680: 65 72 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20  ername", -1));. 
e690: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
e6a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
e6b0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
e6c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c  NewStringObj(SSL
e6d0: 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73  _get0_peername(s
e6e0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d  tatePtr->ssl), -
e6f0: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69  1));..    Tcl_Li
e700: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
e710: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
e720: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
e730: 4f 62 6a 28 22 73 62 69 74 73 22 2c 20 2d 31 29  Obj("sbits", -1)
e740: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
e750: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
e760: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
e770: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53  Tcl_NewIntObj(SS
e780: 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74  L_get_cipher_bit
e790: 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  s(statePtr->ssl,
e7a0: 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63   NULL)));..    c
e7b0: 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29  iphers = (char*)
e7c0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73  SSL_get_cipher(s
e7d0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
e7e0: 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20     if ((ciphers 
e7f0: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28 73 74 72  != NULL) && (str
e800: 63 6d 70 28 63 69 70 68 65 72 73 2c 20 22 28 4e  cmp(ciphers, "(N
e810: 4f 4e 45 29 22 29 20 21 3d 20 30 29 29 20 7b 0a  ONE)") != 0)) {.
e820: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
e830: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
e840: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
e850: 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68  wStringObj("ciph
e860: 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  er", -1));..Tcl_
e870: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
e880: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
e890: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
e8a0: 6e 67 4f 62 6a 28 63 69 70 68 65 72 73 2c 20 2d  ngObj(ciphers, -
e8b0: 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  1));.    }..    
e8c0: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35  /* Verify the X5
e8d0: 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70  09 certificate p
e8e0: 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20  resented by the 
e8f0: 70 65 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  peer */.    Tcl_
e900: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
e910: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
e920: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
e930: 6e 67 4f 62 6a 28 22 76 65 72 69 66 69 63 61 74  ngObj("verificat
e940: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ion", -1));.    
e950: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
e960: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
e970: 20 6f 62 6a 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   objPtr,..Tcl_Ne
e980: 77 53 74 72 69 6e 67 4f 62 6a 28 58 35 30 39 5f  wStringObj(X509_
e990: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f  verify_cert_erro
e9a0: 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74  r_string(SSL_get
e9b0: 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73  _verify_result(s
e9c0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20  tatePtr->ssl)), 
e9d0: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  -1));..    /* Re
e9e0: 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
e9f0: 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
ea00: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65  result of the ne
ea10: 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  gotiation */.   
ea20: 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73   SSL_get0_alpn_s
ea30: 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72  elected(statePtr
ea40: 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  ->ssl, &proto, &
ea50: 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  len);.    Tcl_Li
ea60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ea70: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
ea80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
ea90: 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29  Obj("alpn", -1))
eaa0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
eab0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
eac0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
ead0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
eae0: 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28  (char *)proto, (
eaf0: 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 20 20 20 20  int) len));.    
eb00: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
eb10: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
eb20: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
eb30: 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f  StringObj("proto
eb40: 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  col", -1));.    
eb50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
eb60: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
eb70: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
eb80: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65  StringObj(SSL_ge
eb90: 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50  t_version(stateP
eba0: 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a  tr->ssl), -1));.
ebb0: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f  .    /* Valid fo
ebc0: 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74  r non-RSA signat
ebd0: 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20  ure and TLS 1.3 
ebe0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  */.    Tcl_ListO
ebf0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
ec00: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
ec10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
ec20: 28 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41  ("signatureHashA
ec30: 6c 67 6f 72 69 74 68 6d 22 2c 20 2d 31 29 29 3b  lgorithm", -1));
ec40: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
ec50: 20 32 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65   2 ? SSL_get_pee
ec60: 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28  r_signature_nid(
ec70: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
ec80: 6e 69 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73  nid) : SSL_get_s
ec90: 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61  ignature_nid(sta
eca0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64  tePtr->ssl, &nid
ecb0: 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  )) {..Tcl_ListOb
ecc0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
ecd0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
ece0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
ecf0: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c  OBJ_nid2ln(nid),
ed00: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73   -1));.    } els
ed10: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  e {..Tcl_ListObj
ed20: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
ed30: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
ed40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
ed50: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20  ", -1));.    }. 
ed60: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
ed70: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
ed80: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
ed90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69  NewStringObj("si
eda0: 67 6e 61 74 75 72 65 5f 74 79 70 65 22 2c 20 2d  gnature_type", -
edb0: 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a  1));.    if (obj
edc0: 63 20 3d 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74  c == 2 ? SSL_get
edd0: 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f  _peer_signature_
ede0: 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74  type_nid(statePt
edf0: 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20  r->ssl, &nid) : 
ee00: 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72  SSL_get_signatur
ee10: 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65  e_type_nid(state
ee20: 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29  Ptr->ssl, &nid))
ee30: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
ee40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
ee50: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
ee60: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42  _NewStringObj(OB
ee70: 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d  J_nid2ln(nid), -
ee80: 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  1));.    } else 
ee90: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
eea0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
eeb0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
eec0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c  NewStringObj("",
eed0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   -1));.    }..  
eee0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
eef0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
ef00: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
ef10: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
ef20: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
ef30: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
ef40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
ef80: 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  . * ConnectionIn
ef90: 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  foObjCmd -- retu
efa0: 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  rn connection in
efb0: 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e  fo from OpenSSL.
efc0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
efd0: 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e   *.A list of con
efe0: 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a  nection info.  *
eff0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
f000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f030: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
f040: 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f  ic int Connectio
f050: 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65  nInfoObjCmd(Clie
f060: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
f070: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
f080: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
f090: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
f0a0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
f0b0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09  l_Channel chan;.
f0c0: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20  ./* The channel 
f0d0: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e  to set a mode on
f0e0: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a  . */.    State *
f0f0: 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c  statePtr;../* cl
f100: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73  ient state for s
f110: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20  sl socket */.   
f120: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
f130: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20  ;.    const SSL 
f140: 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20  *ssl;.    const 
f150: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68  SSL_CIPHER *ciph
f160: 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53  er;.    const SS
f170: 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69  L_SESSION *sessi
f180: 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  on;.    const un
f190: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f  signed char *pro
f1a0: 74 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 6d 6f 64  to;.    long mod
f1b0: 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  e;..    if (objc
f1c0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
f1d0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
f1e0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
f1f0: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28  nnel");..return(
f200: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
f210: 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  }..    chan = Tc
f220: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
f230: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
f240: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
f250: 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b  ], NULL), NULL);
f260: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
f270: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
f280: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54  ULL) {..return(T
f290: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
f2a0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
f2b0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
f2c0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
f2d0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
f2e0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
f2f0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
f300: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
f310: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
f320: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
f330: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
f340: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f350: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
f360: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
f370: 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20  ame(chan), "\": 
f380: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
f390: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  l", NULL);..retu
f3a0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
f3b0: 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72     }..    objPtr
f3c0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
f3d0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  j(0, NULL);..   
f3e0: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
f3f0: 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  nfo */.    state
f400: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54  Ptr = (State *)T
f410: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
f420: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b  tanceData(chan);
f430: 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65  .    ssl = state
f440: 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66  Ptr->ssl;.    if
f450: 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b   (ssl != NULL) {
f460: 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ../* connection 
f470: 73 74 61 74 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69  state */..Tcl_Li
f480: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f490: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
f4a0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
f4b0: 4f 62 6a 28 22 73 74 61 74 65 22 2c 20 2d 31 29  Obj("state", -1)
f4c0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
f4d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
f4e0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
f4f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
f500: 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c  L_state_string_l
f510: 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a  ong(ssl), -1));.
f520: 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71  ../* Get SNI req
f530: 75 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61  uested server na
f540: 6d 65 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  me */..Tcl_ListO
f550: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f560: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
f570: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
f580: 28 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 2d  ("servername", -
f590: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
f5a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f5b0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
f5c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f5d0: 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61  SSL_get_serverna
f5e0: 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e  me(ssl, TLSEXT_N
f5f0: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d  AMETYPE_host_nam
f600: 65 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47  e), -1));.../* G
f610: 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09  et protocol */..
f620: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f630: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
f640: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
f650: 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f  StringObj("proto
f660: 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  col", -1));..Tcl
f670: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
f680: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
f690: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
f6a0: 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 76  ingObj(SSL_get_v
f6b0: 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29  ersion(ssl), -1)
f6c0: 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69  );.../* Renegoti
f6d0: 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f  ation allowed */
f6e0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
f6f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
f700: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
f710: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 6e  ewStringObj("ren
f720: 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 2d 31 29  egotiation", -1)
f730: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
f740: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
f750: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
f760: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09  _NewStringObj(..
f770: 20 20 20 20 53 53 4c 5f 67 65 74 5f 73 65 63 75      SSL_get_secu
f780: 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e  re_renegotiation
f790: 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 20 3f 20  _support(ssl) ? 
f7a0: 22 73 75 70 70 6f 72 74 65 64 22 20 3a 20 22 6e  "supported" : "n
f7b0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 2d  ot supported", -
f7c0: 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65  1));.../* Get se
f7d0: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a  curity level */.
f7e0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
f7f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f800: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
f810: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 75  wStringObj("secu
f820: 72 69 74 79 6c 65 76 65 6c 22 2c 20 2d 31 29 29  ritylevel", -1))
f830: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
f840: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
f850: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
f860: 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65  NewIntObj(SSL_ge
f870: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
f880: 28 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 53 65  (ssl)));.../* Se
f890: 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 54  ssion info */..T
f8a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f8b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
f8c0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
f8d0: 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f  tringObj("sessio
f8e0: 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31 29 29 3b  n_reused", -1));
f8f0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
f900: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
f910: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
f920: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c  ewBooleanObj(SSL
f930: 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28  _session_reused(
f940: 73 73 6c 29 29 29 3b 0a 0a 09 2f 2a 20 49 73 20  ssl)));.../* Is 
f950: 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09  server info */..
f960: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f970: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
f980: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
f990: 53 74 72 69 6e 67 4f 62 6a 28 22 69 73 5f 73 65  StringObj("is_se
f9a0: 72 76 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63  rver", -1));..Tc
f9b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f9c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
f9d0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f  bjPtr, Tcl_NewBo
f9e0: 6f 6c 65 61 6e 4f 62 6a 28 53 53 4c 5f 69 73 5f  oleanObj(SSL_is_
f9f0: 73 65 72 76 65 72 28 73 73 6c 29 29 29 3b 0a 20  server(ssl)));. 
fa00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70     }..    /* Cip
fa10: 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  her info */.    
fa20: 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74  cipher = SSL_get
fa30: 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28  _current_cipher(
fa40: 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69  ssl);.    if (ci
fa50: 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  pher != NULL) {.
fa60: 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a  .char buf[BUFSIZ
fa70: 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69  ] = {0};..int bi
fa80: 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09  ts, alg_bits;...
fa90: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
faa0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
fab0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
fac0: 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65  StringObj("ciphe
fad0: 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  r", -1));..Tcl_L
fae0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
faf0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
fb00: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
fb10: 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f  gObj(SSL_CIPHER_
fb20: 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29  get_name(cipher)
fb30: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
fb40: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
fb50: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
fb60: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fb70: 62 6a 28 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d  bj("standard_nam
fb80: 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  e", -1));..Tcl_L
fb90: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
fba0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
fbb0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
fbc0: 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f  gObj(SSL_CIPHER_
fbd0: 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69  standard_name(ci
fbe0: 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 62  pher), -1));...b
fbf0: 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52  its = SSL_CIPHER
fc00: 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72  _get_bits(cipher
fc10: 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 54  , &alg_bits);..T
fc20: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
fc30: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
fc40: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
fc50: 74 72 69 6e 67 4f 62 6a 28 22 62 69 74 73 22 2c  tringObj("bits",
fc60: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
fc70: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fc80: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fc90: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62   Tcl_NewIntObj(b
fca0: 69 74 73 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74  its));..Tcl_List
fcb0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fcc0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fcd0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
fce0: 6a 28 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c  j("secret_bits",
fcf0: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
fd00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fd10: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fd20: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61   Tcl_NewIntObj(a
fd30: 6c 67 5f 62 69 74 73 29 29 3b 0a 09 2f 2a 20 61  lg_bits));../* a
fd40: 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61  lg_bits is actua
fd50: 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74  l key secret bit
fd60: 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61  s. If use bits a
fd70: 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72  nd secret (algor
fd80: 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65  ithm) bits diffe
fd90: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 74 68  r,.           th
fda0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69  e rest of the bi
fdb0: 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e  ts are fixed, i.
fdc0: 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65  e. for limited e
fdd0: 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62  xport ciphers (b
fde0: 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 09 54 63  its < 56) */..Tc
fdf0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
fe00: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
fe10: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
fe20: 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 5f 76 65 72  ringObj("min_ver
fe30: 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63  sion", -1));..Tc
fe40: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
fe50: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
fe60: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
fe70: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48  ringObj(SSL_CIPH
fe80: 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63  ER_get_version(c
fe90: 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09  ipher), -1));...
fea0: 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73  /* Get OpenSSL-s
feb0: 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20  pecific ID, not 
fec0: 49 41 4e 41 20 49 44 20 2a 2f 0a 09 54 63 6c 5f  IANA ID */..Tcl_
fed0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
fee0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
fef0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
ff00: 6e 67 4f 62 6a 28 22 69 64 22 2c 20 2d 31 29 29  ngObj("id", -1))
ff10: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
ff20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
ff30: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
ff40: 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 20  NewIntObj((int) 
ff50: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69  SSL_CIPHER_get_i
ff60: 64 28 63 69 70 68 65 72 29 29 29 3b 0a 0a 09 69  d(cipher)));...i
ff70: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65  f (SSL_CIPHER_de
ff80: 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72  scription(cipher
ff90: 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75  , buf, sizeof(bu
ffa0: 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  f)) != NULL) {..
ffb0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
ffc0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
ffd0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
ffe0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 64  _NewStringObj("d
fff0: 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 2d 31 29  escription", -1)
10000 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
10010 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10020 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10030 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10040 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 09 7d 0a  j(buf, -1));..}.
10050 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
10060 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
10070 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f    session = SSL_
10080 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29  get_session(ssl)
10090 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  ;.    if (sessio
100a0 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f  n != NULL) {..co
100b0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
100c0 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65  r *ticket;..size
100d0 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e  _t len2;..unsign
100e0 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f  ed int ulen;..co
100f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
10100 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 09  r *session_id;..
10110 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f  char buffer[SSL_
10120 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c  MAX_MASTER_KEY_L
10130 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70  ENGTH];.../* Rep
10140 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
10150 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
10160 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50  esult of the ALP
10170 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f  N negotiation */
10180 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  ..SSL_SESSION_ge
10190 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64  t0_alpn_selected
101a0 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f  (session, &proto
101b0 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c  , &len2);..Tcl_L
101c0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
101d0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
101e0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
101f0 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29  gObj("alpn", -1)
10200 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
10210 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10220 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
10230 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
10240 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e  har *)proto, (in
10250 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20  t) len2));.../* 
10260 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
10270 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
10280 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
10290 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  NPN negotiation 
102a0 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
102b0 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74  N..SSL_get0_next
102c0 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65  _proto_negotiate
102d0 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  d(ssl, &proto, &
102e0 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74  ulen);..Tcl_List
102f0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10300 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10310 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10320 6a 28 22 6e 70 6e 22 2c 20 2d 31 29 29 3b 0a 09  j("npn", -1));..
10330 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10340 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10350 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
10360 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20  StringObj((char 
10370 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 75  *)proto, (int) u
10380 6c 65 6e 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  len));.#endif...
10390 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73  /* Resumable ses
103a0 73 69 6f 6e 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  sion */..Tcl_Lis
103b0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
103c0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
103d0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
103e0 62 6a 28 22 72 65 73 75 6d 61 62 6c 65 22 2c 20  bj("resumable", 
103f0 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
10400 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10410 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10420 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53  Tcl_NewIntObj(SS
10430 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73  L_SESSION_is_res
10440 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29  umable(session))
10450 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
10460 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f  start time (seco
10470 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29  nds since epoch)
10480 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   */..Tcl_ListObj
10490 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
104a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
104b0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
104c0 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 2d 31 29  start_time", -1)
104d0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
104e0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
104f0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
10500 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f  _NewLongObj(SSL_
10510 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65  SESSION_get_time
10520 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f  (session)));.../
10530 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  * Timeout value 
10540 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69  - SSL_CTX_get_ti
10550 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64  meout (in second
10560 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  s) */..Tcl_ListO
10570 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10580 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10590 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
105a0 28 22 74 69 6d 65 6f 75 74 22 2c 20 2d 31 29 29  ("timeout", -1))
105b0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
105c0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
105d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
105e0 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53  NewLongObj(SSL_S
105f0 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f  ESSION_get_timeo
10600 75 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a  ut(session)));..
10610 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b  ./* Session tick
10620 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74  et lifetime hint
10630 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f   (in seconds) */
10640 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
10650 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10660 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10670 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6c 69 66  ewStringObj("lif
10680 65 74 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54  etime", -1));..T
10690 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
106a0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
106b0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c  objPtr, Tcl_NewL
106c0 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49  ongObj(SSL_SESSI
106d0 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69  ON_get_ticket_li
106e0 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73  fetime_hint(sess
106f0 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73  ion)));.../* Ses
10700 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 73 65 73 73  sion id */..sess
10710 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
10720 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73  SION_get_id(sess
10730 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 63  ion, &ulen);..Tc
10740 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10750 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10760 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10770 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e  ringObj("session
10780 5f 69 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  _id", -1));..Tcl
10790 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
107a0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
107b0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74  jPtr, Tcl_NewByt
107c0 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f  eArrayObj(sessio
107d0 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e  n_id, (int) ulen
107e0 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
107f0 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74   ticket - client
10800 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45   only */..SSL_SE
10810 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
10820 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  t(session, &tick
10830 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c  et, &len2);..Tcl
10840 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10850 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
10860 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10870 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f  ingObj("session_
10880 74 69 63 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 09  ticket", -1));..
10890 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
108a0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
108b0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
108c0 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63  ByteArrayObj(tic
108d0 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29  ket, (int) len2)
108e0 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61  );.../* Ticket a
108f0 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 53 4c 5f  pp data */..SSL_
10900 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
10910 6b 65 74 5f 61 70 70 64 61 74 61 28 73 65 73 73  ket_appdata(sess
10920 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
10930 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  en2);..Tcl_ListO
10940 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10950 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10960 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10970 28 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74  ("ticket_app_dat
10980 61 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  a", -1));..Tcl_L
10990 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
109a0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
109b0 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
109c0 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20  rrayObj(ticket, 
109d0 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09  (int) len2));...
109e0 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65  /* Get master ke
109f0 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c  y */..len2 = SSL
10a00 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73  _SESSION_get_mas
10a10 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c  ter_key(session,
10a20 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58   buffer, SSL_MAX
10a30 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47  _MASTER_KEY_LENG
10a40 54 48 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  TH);..Tcl_ListOb
10a50 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10a60 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
10a70 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10a80 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 2d 31  "master_key", -1
10a90 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
10aa0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10ab0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
10ac0 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
10ad0 6a 28 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20  j(buffer, (int) 
10ae0 6c 65 6e 32 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  len2));.    }.. 
10af0 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f     /* Compressio
10b00 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66  n info */.    if
10b10 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b   (ssl != NULL) {
10b20 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c  .#ifdef HAVE_SSL
10b30 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f  _COMPRESSION..co
10b40 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20  nst COMP_METHOD 
10b50 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63  *comp, *expn;..c
10b60 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  omp = SSL_get_cu
10b70 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f  rrent_compressio
10b80 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20  n(ssl);..expn = 
10b90 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
10ba0 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a  expansion(ssl);.
10bb0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
10bc0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10bd0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10be0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d  ewStringObj("com
10bf0 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b  pression", -1));
10c00 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
10c10 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
10c20 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
10c30 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 6f 6d 70  ewStringObj(comp
10c40 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f   ? SSL_COMP_get_
10c50 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 4e 4f  name(comp) : "NO
10c60 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  NE", -1));..Tcl_
10c70 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10c80 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
10c90 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10ca0 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e  ngObj("expansion
10cb0 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
10cc0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10cd0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
10ce0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10cf0 4f 62 6a 28 65 78 70 6e 20 3f 20 53 53 4c 5f 43  Obj(expn ? SSL_C
10d00 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70  OMP_get_name(exp
10d10 6e 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29  n) : "NONE", -1)
10d20 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 4c 69  );.#else..Tcl_Li
10d30 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10d40 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
10d50 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10d60 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e  Obj("compression
10d70 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
10d80 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10d90 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
10da0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
10db0 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29  Obj("NONE", -1))
10dc0 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
10dd0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10de0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10df0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78  NewStringObj("ex
10e00 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  pansion", -1));.
10e10 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10e20 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10e30 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10e40 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45  wStringObj("NONE
10e50 22 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ", -1));.#endif.
10e60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
10e70 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  rver info */.   
10e80 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f   mode = SSL_CTX_
10e90 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68  get_session_cach
10ea0 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d  e_mode(statePtr-
10eb0 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 6d  >ctx);.    if (m
10ec0 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
10ed0 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 70 72 6f  ACHE_OFF) {..pro
10ee0 74 6f 20 3d 20 22 6f 66 66 22 3b 0a 20 20 20 20  to = "off";.    
10ef0 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20  } else if (mode 
10f00 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
10f10 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 70 72 6f 74  _CLIENT) {..prot
10f20 6f 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 20 20  o = "client";.  
10f30 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64    } else if (mod
10f40 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  e & SSL_SESS_CAC
10f50 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 70 72  HE_SERVER) {..pr
10f60 6f 74 6f 20 3d 20 22 73 65 72 76 65 72 22 3b 0a  oto = "server";.
10f70 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6d      } else if (m
10f80 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
10f90 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 70 72  ACHE_BOTH) {..pr
10fa0 6f 74 6f 20 3d 20 22 62 6f 74 68 22 3b 0a 20 20  oto = "both";.  
10fb0 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 72 6f 74    } else {..prot
10fc0 6f 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20  o = "unknown";. 
10fd0 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73     }.    Tcl_Lis
10fe0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10ff0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
11000 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11010 62 6a 28 22 73 65 73 73 69 6f 6e 5f 63 61 63 68  bj("session_cach
11020 65 5f 6d 6f 64 65 22 2c 20 2d 31 29 29 3b 0a 20  e_mode", -1));. 
11030 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
11040 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11050 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
11060 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
11070 74 6f 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54  to, -1));..    T
11080 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11090 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
110a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
110b0 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20  OK;..clientData 
110c0 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a  = clientData;.}.
110d0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
110e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
110f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
11120 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d   VersionObjCmd -
11130 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e  - return version
11140 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65   string from Ope
11150 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nSSL.. *. * Resu
11160 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
11170 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
11180 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
11190 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
111a0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
111b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
111c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
111d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
111e0 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
111f0 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  int.VersionObjCm
11200 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
11210 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
11220 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
11230 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
11240 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
11250 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
11260 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  Ptr;..    dprint
11270 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
11280 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
11290 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e  ewStringObj(OPEN
112a0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54  SSL_VERSION_TEXT
112b0 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53  , -1);.    Tcl_S
112c0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
112d0 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20  rp, objPtr);..  
112e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
112f0 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63  ..clientData = c
11300 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63  lientData;..objc
11310 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d   = objc;..objv =
11320 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a   objv;.}.../*. *
11330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11370 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62  ---. *. * MiscOb
11380 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d  jCmd -- misc com
11390 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75  mands. *. * Resu
113a0 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
113b0 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
113c0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
113d0 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
113e0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
113f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11420 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
11430 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43  int.MiscObjCmd(C
11440 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
11450 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
11460 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
11470 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
11480 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
11490 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
114a0 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20  ar *commands [] 
114b0 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72  = { "req", "strr
114c0 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20  eq", NULL };.   
114d0 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20   enum command { 
114e0 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c  C_REQ, C_STRREQ,
114f0 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20   C_DUMMY };.    
11500 69 6e 74 20 63 6d 64 2c 20 69 73 53 74 72 3b 0a  int cmd, isStr;.
11510 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
11520 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72  16384];..    dpr
11530 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
11540 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
11550 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
11560 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
11570 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d  , objv, "subcomm
11580 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72  and ?args?");..r
11590 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
115a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54  .    }.    if (T
115b0 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
115c0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
115d0 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63  1], commands, "c
115e0 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29  ommand", 0,&cmd)
115f0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
11600 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11610 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 53 74  .    }..    isSt
11620 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54  r = (cmd == C_ST
11630 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63  RREQ);.    switc
11640 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64  h ((enum command
11650 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43  ) cmd) {..case C
11660 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54  _REQ:..case C_ST
11670 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50  RREQ: {..    EVP
11680 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c  _PKEY *pkey=NULL
11690 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72  ;..    X509 *cer
116a0 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30  t=NULL;..    X50
116b0 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c  9_NAME *name=NUL
116c0 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20  L;..    Tcl_Obj 
116d0 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 69 6e  **listv;..    in
116e0 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20  t listc,i;...   
116f0 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a   BIO *out=NULL;.
11700 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d  ..    char *k_C=
11710 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c  "",*k_ST="",*k_L
11720 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f  ="",*k_O="",*k_O
11730 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b  U="",*k_CN="",*k
11740 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20  _Email="";..    
11750 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65  char *keyout,*pe
11760 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20  mout,*str;..    
11770 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69  int keysize,seri
11780 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a  al=0,days=365;..
11790 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
117a0 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
117b0 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49  0000000L..    BI
117c0 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c  GNUM *bne = NULL
117d0 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20  ;..    RSA *rsa 
117e0 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20  = NULL;.#else.. 
117f0 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20     EVP_PKEY_CTX 
11800 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e  *ctx = NULL;.#en
11810 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f  dif...    if ((o
11820 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e  bjc<5) || (objc>
11830 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e  6)) {...Tcl_Wron
11840 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
11850 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69   2, objv, "keysi
11860 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66  ze keyfile certf
11870 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09  ile ?info?");...
11880 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11890 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
118a0 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
118b0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
118c0 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20  v[2], &keysize) 
118d0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72  != TCL_OK) {...r
118e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
118f0 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79  ..    }..    key
11900 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  out=Tcl_GetStrin
11910 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20  g(objv[3]);..   
11920 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53   pemout=Tcl_GetS
11930 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a  tring(objv[4]);.
11940 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20  .    if (isStr) 
11950 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69  {...Tcl_SetVar(i
11960 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c  nterp,keyout,"",
11970 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72  0);...Tcl_SetVar
11980 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22  (interp,pemout,"
11990 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  ",0);..    }... 
119a0 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20     if (objc>=6) 
119b0 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74  {...if (Tcl_List
119c0 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69  ObjGetElements(i
119d0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a  nterp, objv[5],.
119e0 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74  ...&listc, &list
119f0 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  v) != TCL_OK) {.
11a00 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
11a10 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69  _ERROR;...}....i
11a20 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20  f ((listc%2) != 
11a30 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  0) {...    Tcl_S
11a40 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
11a50 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73  "Information lis
11a60 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e  t must have even
11a70 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
11a80 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ents",NULL);... 
11a90 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11aa0 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28  ROR;...}...for (
11ab0 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b  i=0; i<listc; i+
11ac0 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d  =2) {...    str=
11ad0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
11ae0 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69  stv[i]);...    i
11af0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64  f (strcmp(str,"d
11b00 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69  ays")==0) {....i
11b10 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
11b20 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74  mObj(interp,list
11b30 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54  v[i+1],&days)!=T
11b40 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65  CL_OK)....    re
11b50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11b60 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
11b70 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72  (strcmp(str,"ser
11b80 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69  ial")==0) {....i
11b90 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
11ba0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74  mObj(interp,list
11bb0 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21  v[i+1],&serial)!
11bc0 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20  =TCL_OK)....    
11bd0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11be0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
11bf0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
11c00 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d  ")==0) {....k_C=
11c10 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
11c20 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
11c30 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
11c40 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29  mp(str,"ST")==0)
11c50 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47   {....k_ST=Tcl_G
11c60 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
11c70 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
11c80 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
11c90 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09  r,"L")==0) {....
11ca0 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  k_L=Tcl_GetStrin
11cb0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
11cc0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
11cd0 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d  strcmp(str,"O")=
11ce0 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c  =0) {....k_O=Tcl
11cf0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
11d00 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
11d10 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
11d20 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a  str,"OU")==0) {.
11d30 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53  ...k_OU=Tcl_GetS
11d40 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
11d50 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
11d60 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
11d70 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  CN")==0) {....k_
11d80 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  CN=Tcl_GetString
11d90 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
11da0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
11db0 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c  trcmp(str,"Email
11dc0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d  ")==0) {....k_Em
11dd0 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  ail=Tcl_GetStrin
11de0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
11df0 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
11e00 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
11e10 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70  nterp,"Unknown p
11e20 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b  arameter",NULL);
11e30 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ....return TCL_E
11e40 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09  RROR;...    }...
11e50 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50  }..    }..#if OP
11e60 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
11e70 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
11e80 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e  0L..    bne = BN
11e90 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61  _new();..    rsa
11ea0 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20   = RSA_new();.. 
11eb0 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b     pkey = EVP_PK
11ec0 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69  EY_new();..    i
11ed0 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c  f (bne == NULL |
11ee0 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  | rsa == NULL ||
11ef0 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   pkey == NULL ||
11f00 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e   !BN_set_word(bn
11f10 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21  e,RSA_F4) ||...!
11f20 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79  RSA_generate_key
11f30 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65  _ex(rsa, keysize
11f40 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20  , bne, NULL) || 
11f50 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e  !EVP_PKEY_assign
11f60 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29  _RSA(pkey, rsa))
11f70 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72   {...EVP_PKEY_fr
11f80 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52  ee(pkey);.../* R
11f90 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72  SA_free(rsa); fr
11fa0 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f  eed by EVP_PKEY_
11fb0 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65  free */...BN_fre
11fc0 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20  e(bne);.#else.. 
11fd0 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53     pkey = EVP_RS
11fe0 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20  A_gen((unsigned 
11ff0 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09  int) keysize);..
12000 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b      ctx = EVP_PK
12010 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c  EY_CTX_new(pkey,
12020 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28  NULL);..    if (
12030 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  pkey == NULL || 
12040 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21  ctx == NULL || !
12050 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f  EVP_PKEY_keygen_
12060 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21  init(ctx) ||...!
12070 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74  EVP_PKEY_CTX_set
12080 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73  _rsa_keygen_bits
12090 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c  (ctx, keysize) |
120a0 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67  | !EVP_PKEY_keyg
120b0 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20  en(ctx, &pkey)) 
120c0 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  {...EVP_PKEY_fre
120d0 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50  e(pkey);...EVP_P
120e0 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78  KEY_CTX_free(ctx
120f0 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f  );.#endif...Tcl_
12100 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
12110 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69  ,"Error generati
12120 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c  ng private key",
12130 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20  NULL);...return 
12140 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
12150 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69  } else {...if (i
12160 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75  sStr) {...    ou
12170 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
12180 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45  mem());...    PE
12190 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76  M_write_bio_Priv
121a0 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c  ateKey(out,pkey,
121b0 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c  NULL,NULL,0,NULL
121c0 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d  ,NULL);...    i=
121d0 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66  BIO_read(out,buf
121e0 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65  fer,sizeof(buffe
121f0 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28  r)-1);...    i=(
12200 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09  i<0) ? 0 : i;...
12210 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c      buffer[i]='\
12220 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  0';...    Tcl_Se
12230 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f  tVar(interp,keyo
12240 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09  ut,buffer,0);...
12250 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75      BIO_flush(ou
12260 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
12270 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73  ee(out);...} els
12280 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  e {...    out=BI
12290 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65  O_new(BIO_s_file
122a0 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77  ());...    BIO_w
122b0 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75  rite_filename(ou
122c0 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20  t,keyout);...   
122d0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50   PEM_write_bio_P
122e0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b  rivateKey(out,pk
122f0 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e  ey,NULL,NULL,0,N
12300 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  ULL,NULL);...   
12310 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69   /* PEM_write_bi
12320 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28  o_RSAPrivateKey(
12330 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20  out, rsa, NULL, 
12340 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e  NULL, 0, NULL, N
12350 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42  ULL); */...    B
12360 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29  IO_free_all(out)
12370 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63  ;.. .}....if ((c
12380 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d  ert=X509_new())=
12390 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54  =NULL) {...    T
123a0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
123b0 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72  erp,"Error gener
123c0 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  ating certificat
123d0 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29  e request",NULL)
123e0 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59  ;...    EVP_PKEY
123f0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66  _free(pkey);.#if
12400 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
12410 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
12420 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66  0000L...    BN_f
12430 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66  ree(bne);.#endif
12440 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43  ...    return(TC
12450 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09  L_ERROR);...}...
12460 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f  .X509_set_versio
12470 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e  n(cert,2);...ASN
12480 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35  1_INTEGER_set(X5
12490 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d  09_get_serialNum
124a0 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c  ber(cert),serial
124b0 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65  );...X509_gmtime
124c0 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e  _adj(X509_getm_n
124d0 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30  otBefore(cert),0
124e0 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65  );...X509_gmtime
124f0 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e  _adj(X509_getm_n
12500 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c  otAfter(cert),(l
12510 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79  ong)60*60*24*day
12520 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70  s);...X509_set_p
12530 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29  ubkey(cert,pkey)
12540 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67  ;....name=X509_g
12550 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28  et_subject_name(
12560 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e  cert);....X509_N
12570 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
12580 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d  _txt(name,"C", M
12590 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
125a0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
125b0 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31  r *) k_C, -1, -1
125c0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
125d0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
125e0 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42  xt(name,"ST", MB
125f0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
12600 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
12610 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31   *) k_ST, -1, -1
12620 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
12630 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
12640 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53  xt(name,"L", MBS
12650 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
12660 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
12670 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20  *) k_L, -1, -1, 
12680 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
12690 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
126a0 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52  (name,"O", MBSTR
126b0 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
126c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
126d0 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29   k_O, -1, -1, 0)
126e0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
126f0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
12700 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49  ame,"OU", MBSTRI
12710 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
12720 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
12730 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_OU, -1, -1, 0)
12740 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
12750 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
12760 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49  ame,"CN", MBSTRI
12770 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
12780 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
12790 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_CN, -1, -1, 0)
127a0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
127b0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
127c0 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53  ame,"Email", MBS
127d0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
127e0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
127f0 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20  *) k_Email, -1, 
12800 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f  -1, 0);....X509_
12810 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65  set_subject_name
12820 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09  (cert,name);....
12830 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63  if (!X509_sign(c
12840 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61  ert,pkey,EVP_sha
12850 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20  256())) {...    
12860 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
12870 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
12880 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
12890 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
128a0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
128b0 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72  000L...    BN_fr
128c0 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
128d0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
128e0 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
128f0 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66  r signing certif
12900 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09  icate",NULL);...
12910 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12920 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  RROR;...}....if 
12930 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20  (isStr) {...    
12940 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  out=BIO_new(BIO_
12950 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20  s_mem());...    
12960 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35  PEM_write_bio_X5
12970 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09  09(out,cert);...
12980 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f      i=BIO_read(o
12990 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66  ut,buffer,sizeof
129a0 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20  (buffer)-1);... 
129b0 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a     i=(i<0) ? 0 :
129c0 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72   i;...    buffer
129d0 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20  [i]='\0';...    
129e0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
129f0 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c  p,pemout,buffer,
12a00 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c  0);...    BIO_fl
12a10 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20  ush(out);...    
12a20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09  BIO_free(out);..
12a30 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20  .} else {...    
12a40 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  out=BIO_new(BIO_
12a50 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20  s_file());...   
12a60 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e   BIO_write_filen
12a70 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b  ame(out,pemout);
12a80 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
12a90 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65  _bio_X509(out,ce
12aa0 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  rt);...    BIO_f
12ab0 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09  ree_all(out);...
12ac0 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63  }....X509_free(c
12ad0 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59  ert);...EVP_PKEY
12ae0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66  _free(pkey);.#if
12af0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
12b00 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
12b10 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28  0000L...BN_free(
12b20 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20  bne);.#endif..  
12b30 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20    }..}..break;. 
12b40 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65     default:..bre
12b50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ak;.    }.    re
12b60 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
12b70 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
12b80 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a  tData;.}.../****
12b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ba0 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20  /./* Init       
12bb0 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a        */./******
12bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
12bd0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
12be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
12c20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20  Tls_Free --. *. 
12c30 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
12c40 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20   cleans up when 
12c50 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73  a SSL socket bas
12c60 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73  ed channel. *.is
12c70 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20   closed and its 
12c80 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
12c90 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a  falls below 1. *
12ca0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
12cb0 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  none. *. * Side 
12cc0 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65  effects:. *.Free
12cd0 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a  s all the state.
12ce0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
12cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d20 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
12d30 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20  d.Tls_Free(char 
12d40 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20  *blockPtr) {.   
12d50 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
12d60 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63   = (State *)bloc
12d70 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  kPtr;..    dprin
12d80 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
12d90 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61     Tls_Clean(sta
12da0 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72  tePtr);.    ckfr
12db0 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a  ee(blockPtr);.}.
12dc0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
12dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
12e10 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a   Tls_Clean --. *
12e20 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
12e30 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65  re cleans up whe
12e40 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  n a SSL socket b
12e50 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09  ased channel. *.
12e60 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74  is closed and it
12e70 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
12e80 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e  t falls below 1.
12e90 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a    This should. *
12ea0 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68  .be called synch
12eb0 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20  ronously by the 
12ec0 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69  CloseProc, not i
12ed0 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61  n the. *.Eventua
12ee0 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b  llyFree callback
12ef0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
12f00 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.none. *. * S
12f10 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
12f20 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74  Frees all the st
12f30 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ate. *. *-------
12f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
12f80 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28  .void Tls_Clean(
12f90 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29  State *statePtr)
12fa0 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22   {.    dprintf("
12fb0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f  Called");..    /
12fc0 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61  *.     * we're a
12fd0 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61  ssuming here tha
12fe0 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74  t we're single-t
12ff0 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a  hreaded.     */.
13000 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
13010 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f  ->timer != (Tcl_
13020 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
13030 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54  ) {..Tcl_DeleteT
13040 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74  imerHandler(stat
13050 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73  ePtr->timer);..s
13060 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
13070 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
13080 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
13090 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65  protos) {..ckfre
130a0 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  e(statePtr->prot
130b0 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  os);..statePtr->
130c0 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20  protos = NULL;. 
130d0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
130e0 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f  tePtr->bio) {../
130f0 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c  * This will call
13100 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42   SSL_shutdown. B
13110 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64  ug 1414045 */..d
13120 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65  printf("BIO_free
13130 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65  _all(%p)", state
13140 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f  Ptr->bio);..BIO_
13150 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74  free_all(statePt
13160 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50  r->bio);..stateP
13170 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a  tr->bio = NULL;.
13180 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
13190 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09  atePtr->ssl) {..
131a0 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65  dprintf("SSL_fre
131b0 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72  e(%p)", statePtr
131c0 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65  ->ssl);..SSL_fre
131d0 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
131e0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ;..statePtr->ssl
131f0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
13200 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
13210 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58  >ctx) {..SSL_CTX
13220 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  _free(statePtr->
13230 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ctx);..statePtr-
13240 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  >ctx = NULL;.   
13250 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
13260 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b  Ptr->callback) {
13270 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
13280 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  nt(statePtr->cal
13290 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74  lback);..statePt
132a0 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55  r->callback = NU
132b0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
132c0 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73   (statePtr->pass
132d0 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63  word) {..Tcl_Dec
132e0 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
132f0 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09  tr->password);..
13300 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
13310 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  rd = NULL;.    }
13320 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
13330 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f  r->vcmd) {..Tcl_
13340 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
13350 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73  tePtr->vcmd);..s
13360 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20  tatePtr->vcmd = 
13370 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
13380 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
13390 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  ing");.}.../*. *
133a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133e0 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e  ---. *. * Tls_In
133f0 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  it --. *. *.This
13400 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e   is a package in
13410 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
13420 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73  cedure, which is
13430 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63   called. *.by Tc
13440 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b  l when this pack
13450 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64  age is to be add
13460 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72  ed to an interpr
13470 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  eter.. *. * Resu
13480 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67  lts:  Ssl config
13490 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a  ured and loaded.
134a0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
134b0 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74  ts:. *. create t
134c0 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20  he ssl command, 
134d0 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63  initialize ssl c
134e0 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ontext. *. *----
134f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
13530 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e   */.DLLEXPORT in
13540 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49  t Tls_Init(Tcl_I
13550 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
13560 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13570 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74  tlsTclInitScript
13580 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20  [] = {.#include 
13590 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30  "tls.tcl.h"..0x0
135a0 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70  0.    };..    dp
135b0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
135c0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
135d0 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
135e0 54 63 6c 20 38 2e 34 20 6f 72 20 6e 65 77 65 72  Tcl 8.4 or newer
135f0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20  .     */.    if 
13600 28 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c  (.#ifdef USE_TCL
13610 5f 53 54 55 42 53 0a 09 54 63 6c 5f 49 6e 69 74  _STUBS..Tcl_Init
13620 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38  Stubs(interp, "8
13630 2e 34 22 2c 20 30 29 0a 23 65 6c 73 65 0a 09 54  .4", 0).#else..T
13640 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e  cl_PkgRequire(in
13650 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 38 2e  terp, "Tcl", "8.
13660 34 2d 22 2c 20 30 29 0a 23 65 6e 64 69 66 0a 09  4-", 0).#endif..
13670 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
13680 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13690 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c     }..    if (Tl
136a0 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54  sLibInit(0) != T
136b0 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70  CL_OK) {..Tcl_Ap
136c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
136d0 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e  p, "could not in
136e0 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62  itialize SSL lib
136f0 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rary", NULL);..r
13700 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13710 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
13720 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
13730 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63  (interp, "tls::c
13740 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73  iphers", Ciphers
13750 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
13760 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
13770 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
13780 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
13790 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
137a0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e  terp, "tls::conn
137b0 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74  ection", Connect
137c0 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28  ionInfoObjCmd, (
137d0 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
137e0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
137f0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
13800 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
13810 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
13820 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48  s::handshake", H
13830 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20  andshakeObjCmd, 
13840 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
13850 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
13860 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
13870 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
13880 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
13890 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70  ls::import", Imp
138a0 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ortObjCmd, (Clie
138b0 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
138c0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
138d0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
138e0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
138f0 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75  (interp, "tls::u
13900 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f  nimport", Unimpo
13910 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  rtObjCmd, (Clien
13920 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
13930 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
13940 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
13950 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
13960 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74  interp, "tls::st
13970 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a  atus", StatusObj
13980 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
13990 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
139a0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
139b0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
139c0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
139d0 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e  p, "tls::version
139e0 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64  ", VersionObjCmd
139f0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
13a00 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
13a10 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
13a20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
13a30 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
13a40 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73  "tls::misc", Mis
13a50 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  cObjCmd, (Client
13a60 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
13a70 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
13a80 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
13a90 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
13aa0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f  nterp, "tls::pro
13ab0 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f  tocols", Protoco
13ac0 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  lsObjCmd, (Clien
13ad0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
13ae0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
13af0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28  NULL);..    if (
13b00 69 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45  interp) {..Tcl_E
13b10 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54  val(interp, tlsT
13b20 63 6c 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20  clInitScript);. 
13b30 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
13b40 28 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28  (Tcl_PkgProvide(
13b50 69 6e 74 65 72 70 2c 20 22 74 6c 73 22 2c 20 50  interp, "tls", P
13b60 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 29  ACKAGE_VERSION))
13b70 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
13b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bb0 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65  *. *. *.Tls_Safe
13bc0 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d  Init --. *. *.--
13bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
13c00 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63   *.Standard proc
13c10 65 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62  edure required b
13c20 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69  y 'load'.. *.Ini
13c30 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78  tializes this ex
13c40 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61  tension for a sa
13c50 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  fe interpreter..
13c60 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
13c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c90 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20  ---*. *. *.Side 
13ca0 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20  effects:. *..As 
13cb0 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a  of 'Tls_Init'. *
13cc0 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
13cd0 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65  A standard Tcl e
13ce0 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a  rror code.. *. *
13cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d20 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45  ------*. */.DLLE
13d30 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61  XPORT int Tls_Sa
13d40 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
13d50 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
13d60 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
13d70 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54  ");.    return(T
13d80 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29  ls_Init(interp))
13d90 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
13da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13dd0 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e  *. *. *.TlsLibIn
13de0 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d  it --. *. *.----
13df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
13e20 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c  .Initializes SSL
13e30 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65   library once pe
13e40 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a  r application. *
13e50 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
13e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e80 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66  -*. *. *.Side ef
13e90 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69  fects:. *..initi
13ea0 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61  alizes SSL libra
13eb0 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a  ry. *. *.Result:
13ec0 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d  . *..none. *. *-
13ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f00 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69  -----*. */.stati
13f10 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74  c int TlsLibInit
13f20 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a  (int uninitializ
13f30 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  e) {.    static 
13f40 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  int initialized 
13f50 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61  = 0;.    int sta
13f60 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69  tus = TCL_OK;.#i
13f70 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
13f80 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
13f90 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
13fa0 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75  S).    size_t nu
13fb0 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a  m_locks;.#endif.
13fc0 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69  .    if (uniniti
13fd0 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 20  alize) {.       
13fe0 20 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65   if (!initialize
13ff0 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d) {.           
14000 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20   dprintf("Asked 
14010 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c  to uninitialize,
14020 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20   but we are not 
14030 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a  initialized");..
14040 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
14050 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20  rn(TCL_OK);.    
14060 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 64      }..        d
14070 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
14080 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b   uninitialize");
14090 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
140a0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
140b0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
140c0 52 45 41 44 53 29 0a 20 20 20 20 20 20 20 20 54  READS).        T
140d0 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e  cl_MutexLock(&in
140e0 69 74 5f 6d 78 29 3b 0a 0a 20 20 20 20 20 20 20  it_mx);..       
140f0 20 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 20 20   if (locks) {.  
14100 20 20 20 20 20 20 20 20 20 20 66 72 65 65 28 6c            free(l
14110 6f 63 6b 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ocks);.         
14120 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b     locks = NULL;
14130 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  .            loc
14140 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ksCount = 0;.   
14150 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
14160 20 20 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65        initialize
14170 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69  d = 0;..#if defi
14180 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
14190 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
141a0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
141b0 20 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e       Tcl_MutexUn
141c0 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  lock(&init_mx);.
141d0 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20  #endif..        
141e0 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a  return(TCL_OK);.
141f0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69      }..    if (i
14200 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 20 20  nitialized) {.  
14210 20 20 20 20 20 20 64 70 72 69 6e 74 66 28 22 43        dprintf("C
14220 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67  alled, but using
14230 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b   cached value");
14240 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 28  .        return(
14250 73 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a  status);.    }..
14260 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
14270 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69  led");..#if defi
14280 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
14290 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
142a0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
142b0 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26   Tcl_MutexLock(&
142c0 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
142d0 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64  .    initialized
142e0 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e   = 1;..#if defin
142f0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
14300 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
14310 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
14320 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20  num_locks = 1;. 
14330 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20     locksCount = 
14340 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b  (int) num_locks;
14350 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c  .    locks = mal
14360 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b  loc(sizeof(*lock
14370 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b  s) * num_locks);
14380 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b  .    memset(lock
14390 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f  s, 0, sizeof(*lo
143a0 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73  cks) * num_locks
143b0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  );.#endif..    /
143c0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54  * Initialize BOT
143d0 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20  H libcrypto and 
143e0 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f  libssl. */.    O
143f0 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28  PENSSL_init_ssl(
14400 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
14410 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20  D_SSL_STRINGS | 
14420 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
14430 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53  D_CRYPTO_STRINGS
14440 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  ..| OPENSSL_INIT
14450 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53  _ADD_ALL_CIPHERS
14460 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f   | OPENSSL_INIT_
14470 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c  ADD_ALL_DIGESTS,
14480 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f   NULL);..    BIO
14490 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30  _new_tcl(NULL, 0
144a0 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a  );..#if 0.    /*
144b0 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f  .     * XXX:TODO
144c0 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f  : Remove this co
144d0 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69  de and replace i
144e0 74 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20  t with a check. 
144f0 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68      * for enough
14500 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20   entropy and do 
14510 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74  not try to creat
14520 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a  e our own.     *
14530 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70   terrible entrop
14540 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a  y.     */.    /*
14550 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65  .     * Seed the
14560 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67   random number g
14570 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20  enerator in the 
14580 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20  SSL library,.   
14590 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f    * using the do
145a0 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74  /while construct
145b0 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
145c0 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a  bug note in the.
145d0 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46       * OpenSSL F
145e0 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77  AQ at http://www
145f0 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70  .openssl.org/sup
14600 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53  port/faq.html#US
14610 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  ER1.     *.     
14620 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68  * The crux of th
14630 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61  e problem is tha
14640 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73  t Solaris 7 does
14650 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20   not have a.    
14660 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f   * /dev/random o
14670 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64  r /dev/urandom d
14680 65 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e  evice so it cann
14690 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68  ot gather enough
146a0 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20  .     * entropy 
146b0 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65  from the RAND_se
146c0 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e  ed() when TLS in
146d0 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65  itializes and re
146e0 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20  fuses.     * to 
146f0 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c  go further. Earl
14700 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ier versions of 
14710 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20  OpenSSL carried 
14720 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20  on regardless.. 
14730 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64      */.    srand
14740 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20  ((unsigned int) 
14750 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20  time((time_t *) 
14760 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b  NULL));.    do {
14770 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
14780 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20  < 16; i++) {..  
14790 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20    rnd_seed[i] = 
147a0 31 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e  1 + (char) (255.
147b0 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44  0 * rand()/(RAND
147c0 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09  _MAX+1.0));..}..
147d0 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65  RAND_seed(rnd_se
147e0 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73  ed, sizeof(rnd_s
147f0 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69  eed));.    } whi
14800 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28  le (RAND_status(
14810 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a  ) != 1);.#endif.
14820 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
14830 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
14840 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
14850 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78  EADS)..Tcl_Mutex
14860 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  Unlock(&init_mx)
14870 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72  ;.#endif...retur
14880 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a           n(status);.}.